{
  "issues": [
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3527",
      "id": 3997213328,
      "node_id": "I_kwDOKFkxdc7uQKKQ",
      "number": 3527,
      "title": "Niri can't open video card device on Hyper-v / os error 11",
      "user": {
        "login": "Greu",
        "id": 2707156,
        "node_id": "MDQ6VXNlcjI3MDcxNTY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2707156?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Greu",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191960,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJL2A",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:application",
          "name": "not niri:application",
          "color": "bbbbbb",
          "default": false,
          "description": "Issues in applications"
        },
        "1": {
          "id": 10168192027,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJMGw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:hardware",
          "name": "not niri:hardware",
          "color": "bbbbbb",
          "default": false,
          "description": "Driver and hardware bugs"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2026-02-26T18:53:49Z",
      "updated_at": "2026-02-27T08:53:46Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When installing NixOS in a Microsoft Hyper-v virtual machine, Niri is not able to start because of a video card issue. With the exact same setup, Hyprland has no issue.\n\n## Probable cause\n\n```text\n2026-02-26T17:52:36.277955Z DEBUG niri::backend::tty: device changed: 57857\n2026-02-26T17:52:36.278026Z  WARN niri::backend::tty: unknown device; trying to add\n2026-02-26T17:52:36.278032Z DEBUG niri::backend::tty: adding device: 57857 \"/dev/dri/card1\"\n2026-02-26T17:52:36.278042Z DEBUG niri::backend::tty: this is the primary node\n2026-02-26T17:52:36.278428Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2026-02-26T17:52:36.278474Z DEBUG niri::backend::tty: pausing session\n```\n\n## Reproduction\n1. Enable Hyper-V in Windows\n2. Create a VM in Hyper-V\na. New -> New Virtual Machine Wizard\nb. Name your machine\nc. Selection Generation 2\nd. Choose a memory amount\ne. Select default switch for networking\nf. Create virtual disk for the VM\ng. Installation options: Select a NixOS 25.11 iso\n3. Right click on the new VM > Settings > Security > Uncheck \"Enable secure boot\"\n4. Start the VM and install NixOS without any desktop.\n5. Reboot and enter a TTY.\n6. Edit NixOS `/etc/nixos/configuration.nix` by adding these two lines\n```text\n  programs.hyprland.enable = true;\n  programs.niri.enable = true;\n```\n7. `sudo nixos-rebuild switch`\n8. Type `hyprland`, notice that Hyprland is starting without issue. Press SUPER+M to close hyprland\n9. Type `niri` (or niri-session same result). Notice the screen is frozen, Niri is unresponsive.\n10. You can go to another like TTY2 (CTRL+ALT+F2) and `pkill niri` to unlock TTY1.\n\n<details><summary>Niri config</summary>\nDefault Niri config, nothing has been changed.\n\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://yalter.github.io/niri/Configuration:-Introduction\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://yalter.github.io/niri/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            // layout \"us,ru\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n\n            // If this section is empty, niri will fetch xkb settings\n            // from org.freedesktop.locale1. You can control these using\n            // localectl set-x11-keymap.\n        }\n\n        // Enable numlock on startup, omitting this setting disables it.\n        numlock\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    // All commented-out settings here are examples, not defaults.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        // drag false\n        // drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // scroll-button-lock\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n/-output \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@120.030\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 2\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=1280 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 16\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        //\n        // The focus ring only draws around the active window, so the only place\n        // where you can see its inactive-color is on other monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#c7ff7f\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#9b0000\"\n\n        // Gradients can use a few different interpolation color spaces.\n        // For example, this is a pastel rainbow gradient via in=\"oklch longer hue\".\n        //\n        // active-gradient from=\"#e5989b\" to=\"#ffb4a2\" angle=45 relative-to=\"workspace-view\" in=\"oklch longer hue\"\n\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        //\n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        //\n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\nspawn-at-startup \"waybar\"\n\n// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:\n// spawn-sh-at-startup \"qs -c ~/source/qs/MyAwesomeShell\"\n\nhotkey-overlay {\n    // Uncomment this line to disable the \"Important Hotkeys\" pop-up at startup.\n    // skip-at-startup\n}\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://yalter.github.io/niri/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+T hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"alacritty\"; }\n    Mod+D hotkey-overlay-title=\"Run an Application: fuzzel\" { spawn \"fuzzel\"; }\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\n\n    // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.\n    // For example, this is a standard bind to toggle the screen reader (orca).\n    Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    // Using spawn-sh allows to pass multiple arguments together with the command.\n    // \"-l 1.0\" limits the volume to 100%.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\"; }\n\n    // Example media keys mapping using playerctl.\n    // This will work with any MPRIS-enabled media player.\n    XF86AudioPlay        allow-when-locked=true { spawn-sh \"playerctl play-pause\"; }\n    XF86AudioStop        allow-when-locked=true { spawn-sh \"playerctl stop\"; }\n    XF86AudioPrev        allow-when-locked=true { spawn-sh \"playerctl previous\"; }\n    XF86AudioNext        allow-when-locked=true { spawn-sh \"playerctl next\"; }\n\n    // Example brightness key mappings for brightnessctl.\n    // You can use regular spawn with multiple arguments too (to avoid going through \"sh\"),\n    // but you need to manually put each argument in separate \"\" quotes.\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"+10%\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"10%-\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+O repeat=false { toggle-overview; }\n\n    Mod+Q repeat=false { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    // Cycling through the presets in reverse order is also possible.\n    // Mod+R { switch-preset-column-width-back; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n\n```\n</details> \n\n<details><summary>NixOS config</summary>\nDefault Nixos config, just two lines have been added to enable Niri and Hyprland. \n\n```nix\n# Edit this configuration file to define what should be installed on\n# your system.  Help is available in the configuration.nix(5) man page\n# and in the NixOS manual (accessible by running ‘nixos-help’).\n\n{ config, pkgs, ... }:\n\n{\n  imports =\n    [ # Include the results of the hardware scan.\n      ./hardware-configuration.nix\n    ];\n\n  # Bootloader.\n  boot.loader.systemd-boot.enable = true;\n  boot.loader.efi.canTouchEfiVariables = true;\n\n  # Use latest kernel.\n  boot.kernelPackages = pkgs.linuxPackages_latest;\n\n  networking.hostName = \"nixos\"; # Define your hostname.\n  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.\n\n  # Configure network proxy if necessary\n  # networking.proxy.default = \"http://user:password@proxy:port/\";\n  # networking.proxy.noProxy = \"127.0.0.1,localhost,internal.domain\";\n\n  # Enable networking\n  networking.networkmanager.enable = true;\n\n  # Set your time zone.\n  time.timeZone = \"America/Toronto\";\n\n  # Select internationalisation properties.\n  i18n.defaultLocale = \"en_US.UTF-8\";\n\n  i18n.extraLocaleSettings = {\n    LC_ADDRESS = \"en_US.UTF-8\";\n    LC_IDENTIFICATION = \"en_US.UTF-8\";\n    LC_MEASUREMENT = \"en_US.UTF-8\";\n    LC_MONETARY = \"en_US.UTF-8\";\n    LC_NAME = \"en_US.UTF-8\";\n    LC_NUMERIC = \"en_US.UTF-8\";\n    LC_PAPER = \"en_US.UTF-8\";\n    LC_TELEPHONE = \"en_US.UTF-8\";\n    LC_TIME = \"en_US.UTF-8\";\n  };\n\n  # Configure keymap in X11\n  services.xserver.xkb = {\n    layout = \"us\";\n    variant = \"\";\n  };\n\n  # Define a user account. Don't forget to set a password with ‘passwd’.\n  users.users.myuser= {\n    isNormalUser = true;\n    extraGroups = [ \"networkmanager\" \"wheel\" ];\n    packages = with pkgs; [];\n  };\n\n  # Allow unfree packages\n  nixpkgs.config.allowUnfree = true;\n\n  # List packages installed in system profile. To search, run:\n  # $ nix search wget\n  environment.systemPackages = with pkgs; [\n  #  vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.\n  #  wget\n     cifs-utils\n  ];\n\n  # Some programs need SUID wrappers, can be configured further or are\n  # started in user sessions.\n  # programs.mtr.enable = true;\n  # programs.gnupg.agent = {\n  #   enable = true;\n  #   enableSSHSupport = true;\n  # };\n\n  # List services that you want to enable:\n\n  # Enable the OpenSSH daemon.\n  # services.openssh.enable = true;\n\n  # Open ports in the firewall.\n  # networking.firewall.allowedTCPPorts = [ ... ];\n  # networking.firewall.allowedUDPPorts = [ ... ];\n  # Or disable the firewall altogether.\n  # networking.firewall.enable = false;\n\n  # This value determines the NixOS release from which the default\n  # settings for stateful data, like file locations and database versions\n  # on your system were taken. It‘s perfectly fine and recommended to leave\n  # this value at the release version of the first install of this system.\n  # Before changing this value read the documentation for this option\n  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).\n  system.stateVersion = \"25.11\"; # Did you read the comment?\n\n  # THESE TWO LINES HAVE BEEN ADDED\n  programs.hyprland.enable = true;\n  programs.niri.enable = true;\n}\n\n\n```\n\n</details> \n<details><summary>NixOS hardware</summary>\n\n```nix\n# Do not modify this file!  It was generated by ‘nixos-generate-config’\n# and may be overwritten by future invocations.  Please make changes\n# to /etc/nixos/configuration.nix instead.\n{ config, lib, pkgs, modulesPath, ... }:\n\n{\n  imports = [ ];\n\n  boot.initrd.availableKernelModules = [ \"sd_mod\" \"sr_mod\" ];\n  boot.initrd.kernelModules = [ ];\n  boot.kernelModules = [ ];\n  boot.extraModulePackages = [ ];\n\n  fileSystems.\"/\" =\n    { device = \"/dev/disk/by-uuid/079af662-4ff3-4c62-bd0a-8f85c29f71f5\";\n      fsType = \"ext4\";\n    };\n\n  fileSystems.\"/boot\" =\n    { device = \"/dev/disk/by-uuid/6468-4881\";\n      fsType = \"vfat\";\n      options = [ \"fmask=0077\" \"dmask=0077\" ];\n    };\n\n  swapDevices = [ ];\n\n  nixpkgs.hostPlatform = lib.mkDefault \"x86_64-linux\";\n  virtualisation.hypervGuest.enable = true;\n}\n\n```\n\n</details> \n\n<details><summary>Niri logs</summary>\n\n```text\nFeb 26 12:52:15 nixos systemd[1063]: Created slice User Background Tasks Slice.\nFeb 26 12:52:15 nixos systemd[1063]: Starting Cleanup of User's Temporary Files and Directories...\nFeb 26 12:52:15 nixos systemd[1063]: Finished Cleanup of User's Temporary Files and Directories.\nFeb 26 12:52:33 nixos systemd[1063]: Reached target Session services which should run early before the graphical session is brought up.\nFeb 26 12:52:33 nixos systemd[1063]: Starting A scrollable-tiling Wayland compositor...\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.733017Z  WARN niri: running as a session but WAYLAND_DISPLAY is set, removing it\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.733067Z  INFO niri: starting version 25.11 (Nixpkgs)\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.753859Z DEBUG niri_config: loaded config from \"/home/myuser/.config/niri/config.kdl\"\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.767051Z  WARN niri::backend::tty: error getting the render node for the primary GPU; proceeding anyway\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.767100Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/card1\"\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.777437Z DEBUG niri::backend::tty: adding device: 57857 \"/dev/dri/card1\"\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.777475Z DEBUG niri::backend::tty: this is the primary node\nFeb 26 12:52:33 nixos niri[1377]: pci id for fd 27: 1414:0006, driver (null)\nFeb 26 12:52:33 nixos niri[1377]: pci id for fd 26: 1414:0006, driver (null)\nFeb 26 12:52:33 nixos niri[1377]: pci id for fd 28: 1414:0006, driver (null)\nFeb 26 12:52:33 nixos niri[1377]: pci id for fd 26: 1414:0006, driver (null)\nFeb 26 12:52:33 nixos niri[1377]: pci id for fd 28: 1414:0006, driver (null)\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.801114Z DEBUG niri::backend::tty: failed to initialize renderer, falling back to primary gpu: software EGL renderers are skipped\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.801241Z  WARN niri::backend::tty: error adding primary node device, display-only devices may not work: no allocator available for device\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.801281Z  INFO niri: listening on Wayland socket: wayland-1\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.801287Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.1377.sock\nFeb 26 12:52:33 nixos niri[1377]: 2026-02-26T17:52:33.801587Z  WARN niri::utils::xwayland::satellite: error spawning xwayland-satellite at \"xwayland-satellite\", disabling integration: No such file or directory (os error 2)\nFeb 26 12:52:33 nixos systemctl[1381]: Environment variable $DISPLAY not set, ignoring.\nFeb 26 12:52:33 nixos systemd[1063]: Started A scrollable-tiling Wayland compositor.\nFeb 26 12:52:33 nixos systemd[1063]: Reached target Current graphical user session.\nFeb 26 12:52:33 nixos systemd[1063]: Starting Certificate and Key Storage...\nFeb 26 12:52:33 nixos systemd[1063]: Starting Secret Storage Service...\nFeb 26 12:52:33 nixos systemd[1063]: Started Certificate and Key Storage.\nFeb 26 12:52:33 nixos systemd[1063]: Started Secret Storage Service.\nFeb 26 12:52:33 nixos systemd[1063]: Reached target Startup of XDG autostart applications.\nFeb 26 12:52:36 nixos niri[1377]: 2026-02-26T17:52:36.277955Z DEBUG niri::backend::tty: device changed: 57857\nFeb 26 12:52:36 nixos niri[1377]: 2026-02-26T17:52:36.278026Z  WARN niri::backend::tty: unknown device; trying to add\nFeb 26 12:52:36 nixos niri[1377]: 2026-02-26T17:52:36.278032Z DEBUG niri::backend::tty: adding device: 57857 \"/dev/dri/card1\"\nFeb 26 12:52:36 nixos niri[1377]: 2026-02-26T17:52:36.278042Z DEBUG niri::backend::tty: this is the primary node\nFeb 26 12:52:36 nixos niri[1377]: 2026-02-26T17:52:36.278428Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\nFeb 26 12:52:36 nixos niri[1377]: 2026-02-26T17:52:36.278474Z DEBUG niri::backend::tty: pausing session\nFeb 26 12:52:38 nixos niri[1377]: 2026-02-26T17:52:38.802329Z  INFO niri::utils::signals::platform: quitting due to receiving signal SIGTERM\nFeb 26 12:52:38 nixos niri[1377]: 2026-02-26T17:52:38.802461Z DEBUG niri::utils::watcher: exiting watcher thread for Regular { user_path: \"/home/myuser/.config/niri/config.kdl\", system_path: \"/etc/niri/config.kdl\" }\nFeb 26 12:52:38 nixos systemd[1063]: Stopped target Startup of XDG autostart applications.\nFeb 26 12:52:38 nixos systemd[1063]: Stopping Secret Storage Service...\nFeb 26 12:52:38 nixos systemd[1063]: Stopped Secret Storage Service.\nFeb 26 12:52:38 nixos systemd[1063]: Stopped target Current graphical user session.\nFeb 26 12:52:38 nixos systemd[1063]: Stopped target Session services which should run early before the graphical session is brought up.\n\n```\n</details> \n\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: Niri 25.11 (nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS 25.11\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Mesa llvmpipe (LLVM 21.1.7, 256 bits)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen Threadripper PRO 5945WXs (12) @ 4.54 GHz\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3527/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3514",
      "id": 3991246129,
      "node_id": "I_kwDOKFkxdc7t5ZUx",
      "number": 3514,
      "title": "Black screen when starting gammastep after suspending",
      "user": {
        "login": "godalming123",
        "id": 68993177,
        "node_id": "MDQ6VXNlcjY4OTkzMTc3",
        "avatar_url": "https://avatars.githubusercontent.com/u/68993177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/godalming123",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        },
        "1": {
          "id": 10168191960,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJL2A",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:application",
          "name": "not niri:application",
          "color": "bbbbbb",
          "default": false,
          "description": "Issues in applications"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2026-02-25T19:10:56Z",
      "updated_at": "2026-02-25T20:39:06Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nWhen I suspend with `systemctl suspend`, press the power button to resume, and then run `gammastep -m wayland -O 3500 -b 0.3`, the screen goes black for roughly a second.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n<details><summary>Config</summary>\n\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://yalter.github.io/niri/Configuration:-Introduction\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://yalter.github.io/niri/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            // layout \"us,ru\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n\n            // If this section is empty, niri will fetch xkb settings\n            // from org.freedesktop.locale1. You can control these using\n            // localectl set-x11-keymap.\n        }\n\n        // Enable numlock on startup, omitting this setting disables it.\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    // All commented-out settings here are examples, not defaults.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        // drag false\n        // drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // scroll-button-lock\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n/-output \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@120.030\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 2\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=1280 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 16\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"always\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        off\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        //\n        // The focus ring only draws around the active window, so the only place\n        // where you can see its inactive-color is on other monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#c7ff7f\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#9b0000\"\n\n        // Gradients can use a few different interpolation color spaces.\n        // For example, this is a pastel rainbow gradient via in=\"oklch longer hue\".\n        //\n        // active-gradient from=\"#e5989b\" to=\"#ffb4a2\" angle=45 relative-to=\"workspace-view\" in=\"oklch longer hue\"\n\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        //\n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        //\n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        left 0\n        right 0\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\nspawn-at-startup \"waybar\"\n\n// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:\n// spawn-sh-at-startup \"qs -c ~/source/qs/MyAwesomeShell\"\n\nhotkey-overlay {\n    // Uncomment this line to disable the \"Important Hotkeys\" pop-up at startup.\n    // skip-at-startup\n}\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://yalter.github.io/niri/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+T hotkey-overlay-title=\"Open a Terminal: ghostty\" { spawn \"ghostty\"; }\n    Mod+D hotkey-overlay-title=\"Run an Application: fuzzel\" { spawn \"fuzzel\"; }\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\n\n    // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.\n    // For example, this is a standard bind to toggle the screen reader (orca).\n    Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    // Using spawn-sh allows to pass multiple arguments together with the command.\n    // \"-l 1.0\" limits the volume to 100%.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\"; }\n\n    // Example media keys mapping using playerctl.\n    // This will work with any MPRIS-enabled media player.\n    XF86AudioPlay        allow-when-locked=true { spawn-sh \"playerctl play-pause\"; }\n    XF86AudioStop        allow-when-locked=true { spawn-sh \"playerctl stop\"; }\n    XF86AudioPrev        allow-when-locked=true { spawn-sh \"playerctl previous\"; }\n    XF86AudioNext        allow-when-locked=true { spawn-sh \"playerctl next\"; }\n\n    // Example brightness key mappings for brightnessctl.\n    // You can use regular spawn with multiple arguments too (to avoid going through \"sh\"),\n    // but you need to manually put each argument in separate \"\" quotes.\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"+10%\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"10%-\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+O repeat=false { toggle-overview; }\n\n    Mod+Q repeat=false { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-or-workspace-down; }\n    Mod+K     { focus-window-or-workspace-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    // Cycling through the presets in reverse order is also possible.\n    // Mod+R { switch-preset-column-width-back; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-window-to-edges; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n```\n\n</details> \n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Fedora 43 workstation\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD integrated graphics\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 3750H\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3514/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3511",
      "id": 3991005947,
      "node_id": "I_kwDOKFkxdc7t4er7",
      "number": 3511,
      "title": "DaVinci Resolve on niri/Wayland: false \"GPU memory full\" + black preview (CUDA/OpenGL interop)",
      "user": {
        "login": "gustavolendimuth",
        "id": 37625398,
        "node_id": "MDQ6VXNlcjM3NjI1Mzk4",
        "avatar_url": "https://avatars.githubusercontent.com/u/37625398?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gustavolendimuth",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        },
        "1": {
          "id": 10168187240,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5aA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/nvidia",
          "name": "nvidia",
          "color": "76b900",
          "default": false,
          "description": "NVIDIA issues"
        },
        "2": {
          "id": 10168191960,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJL2A",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:application",
          "name": "not niri:application",
          "color": "bbbbbb",
          "default": false,
          "description": "Issues in applications"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-02-25T18:19:40Z",
      "updated_at": "2026-02-26T09:34:15Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\nOn Arch Linux with **niri (Wayland)**, DaVinci Resolve can show a false \"GPU memory is full\" error and a black preview monitor, even with plenty of free VRAM.\n\n### Environment\n- DaVinci Resolve: `20.3.2.0009`\n- GPU: `NVIDIA GeForce GTX 1650 (4 GB)`\n- Driver: `590.48.01`\n- Session: Wayland (`niri`)\n- Distro: Arch Linux\n\n### Symptoms\n- Resolve popup: \"Your GPU memory is full\"\n- Source/Timeline viewer goes black\n- `nvidia-smi` still reports low VRAM use (example: ~300 MiB / 4096 MiB)\n\n### Relevant logs\n`~/.local/share/DaVinciResolve/logs/ResolveDebug.txt` repeatedly shows:\n- `OpenGL context is not running on the GPU marked as Main Display GPU.`\n- `Failed to register OpenGL object for CUDA interop: cudaErrorUnknown.`\n- `Out-of-memory exception caught, purging memory: Packer OpenGL interop failed.`\n\n### Workaround that fixed it for me\nLaunch Resolve with X11/GLX + NVIDIA-specific env vars:\n\n```bash\nenv \\\n  QT_QPA_PLATFORM=xcb \\\n  QT_XCB_GL_INTEGRATION=glx \\\n  __GLX_VENDOR_LIBRARY_NAME=nvidia \\\n  __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/10_nvidia.json \\\n  __NV_PRIME_RENDER_OFFLOAD=1 \\\n  __VK_LAYER_NV_optimus=NVIDIA_only \\\n  DRI_PRIME=1 \\\n  /opt/resolve/bin/resolve\n```\n\nAfter launching this way, the interop errors stop and preview works again.\n\n### Question\nCould this be a niri/Wayland OpenGL-CUDA interop mismatch, or is there a compositor-side setting that could avoid this workaround?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3511/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3509",
      "id": 3990204285,
      "node_id": "I_kwDOKFkxdc7t1a99",
      "number": 3509,
      "title": "niri does not detect monitor change when waking from sleep",
      "user": {
        "login": "cycomanic",
        "id": 1154946,
        "node_id": "MDQ6VXNlcjExNTQ5NDY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1154946?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cycomanic",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        },
        "1": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2026-02-25T15:40:23Z",
      "updated_at": "2026-02-26T16:37:25Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I noticed that a monitor change is not detected when the laptop is asleep when one monitor is disconnected and another is connected. \n\nI move my laptop between home and work. At both locations do I have a monitor attached via USB3 (plus another monitor via HDMI at work).  Today I moved the laptop after putting it asleep. When the laptop woke up again (at the new location) it did not recognise that a different monitor had been connected. \n\nSymptoms:\n- wrong settings (position and scaling) of my home monitor stayed applied (although resolution changed)\n- niri msg outputs shows the monitor information of the home monitor\n\nI'm using manufacture, serial number type monitor selection (except for the internal display) in my config\n```\noutput \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1200@60.0\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1.0\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=0 y=0\n}\n\noutput \"Dell Inc. DELL S3225QC 3FFF444\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"3840x2160@60.0\"\n\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1.25\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=-1920 y=0\n}\n\noutput \"Dell Inc. DELL S2722DZ 1B2J3H3\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"2560x1440@60.0\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1.0\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    //position x=1707 y=0\n}\n\noutput \"Dell Inc. DELL U2415 08DXD5243HUL\" {\n  mode \"1920x1200@60.0\"\n  scale 1.0 \n  transform \"90\"\n  layout  {\n    always-center-single-column \n    default-column-width { proportion 1.0; }\n  }\n}\n```\n\nBelow is the log:\n```\nFeb 25 10:48:47 cachyos-work niri[1402]: 2026-02-25T09:48:47.972859Z  INFO niri::niri: locking session\nFeb 25 10:52:21 cachyos-work niri[1402]: 2026-02-25T09:52:21.069601Z DEBUG niri::niri: laptop lid closed\nFeb 25 10:52:21 cachyos-work niri[1402]: 2026-02-25T09:52:21.069678Z DEBUG niri::backend::tty: disconnecting connector: \"eDP-1\"\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.517972Z DEBUG niri::niri: laptop lid opened\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.518017Z DEBUG niri::backend::tty: connecting connector: eDP-1\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.518055Z  WARN niri::backend::tty: configured mode 1920x1200@60 could not be found, falling back to preferred\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.518059Z DEBUG niri::backend::tty: picking mode: Mode { name: \"1920x1200\", clock: 161790, size: (1920, 1200), hsync: (1968, 2000, 2140), vsync: (1203, 1209, 1260), hskew: 0, vscan: 0, vrefres>\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.524417Z  WARN niri::niri: output eDP-1 at x=0 y=0 sized 1920x1200 overlaps an existing output at x=-1920 y=0 sized 3072x1728, falling back to automatic placement\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.524442Z DEBUG niri::niri: putting output eDP-1 at x=1152 y=0\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.525117Z DEBUG niri::backend::tty: device changed: 57857\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.531597Z DEBUG niri::backend::tty: new connector: HDMI-A-1 \"Dell Inc. DELL U2415 08DXD5243HUL\"\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.531642Z  WARN niri::backend::tty: output \"DP-1\": configured mode 3840x2160@60 could not be found, falling back to preferred\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.531649Z DEBUG niri::backend::tty: output \"DP-1\": picking mode: Mode { name: \"2560x1440\", clock: 241500, size: (2560, 1440), hsync: (2608, 2640, 2720), vsync: (1443, 1448, 1481), hskew: 0, vs>\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.532778Z DEBUG niri::backend::tty: connecting connector: HDMI-A-1\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.532879Z  WARN niri::backend::tty: configured mode 1920x1200@60 could not be found, falling back to preferred\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.532887Z DEBUG niri::backend::tty: picking mode: Mode { name: \"1920x1200\", clock: 154000, size: (1920, 1200), hsync: (1968, 2000, 2080), vsync: (1203, 1209, 1235), hskew: 0, vscan: 0, vrefres>\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.535230Z  WARN niri::niri: output eDP-1 at x=0 y=0 sized 1920x1200 overlaps an existing output at x=-1920 y=0 sized 2048x1152, falling back to automatic placement\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.535249Z DEBUG niri::niri: putting output eDP-1 at x=128 y=0\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.535257Z DEBUG niri::niri: putting output HDMI-A-1 at x=2048 y=0\nFeb 25 12:06:47 cachyos-work niri[1402]: 2026-02-25T11:06:47.535540Z DEBUG niri::backend::tty: device changed: 57857\nFeb 25 12:09:10 cachyos-work niri[1402]: 2026-02-25T11:09:10.963323Z  WARN niri::utils::vblank_throttle: output eDP-1 running faster than expected, throttling vblanks: expected refresh 16.666049ms, got vblank after 6.795964ms\nFeb 25 12:09:22 cachyos-work niri[1402]: 2026-02-25T11:09:22.758231Z  INFO niri::niri: unlocking session\nFeb 25 12:17:23 cachyos-work keepassxc[246975]: qt.qpa.wayland: Wayland does not support QWindow::requestActivate()\nFeb 25 12:17:23 cachyos-work keepassxc[246975]: qt.qpa.wayland: Wayland does not support QWindow::requestActivate()\nFeb 25 12:31:49 cachyos-work niri[1402]: 2026-02-25T11:31:49.888087Z  INFO niri::niri: locking session\nFeb 25 12:33:10 cachyos-work niri[1402]: libinput error: client bug: timer button-debounce-debounce-event15: scheduled expiry is in the past (-93ms), your system is too slow\nFeb 25 12:33:25 cachyos-work niri[1402]: 2026-02-25T11:33:25.761156Z  INFO niri::niri: unlocking session\nFeb 25 13:10:35 cachyos-work niri[1402]: 2026-02-25T12:10:35.809039Z  INFO niri::niri: locking session\nFeb 25 13:16:05 cachyos-work niri[1402]: 2026-02-25T12:16:05.910722Z  INFO niri::niri: refusing lock as already locked with an active client\nFeb 25 13:21:19 cachyos-work niri[1402]: 2026-02-25T12:21:19.639079Z DEBUG niri::backend::tty: device changed: 57857\nFeb 25 13:21:19 cachyos-work niri[1402]: 2026-02-25T12:21:19.648223Z DEBUG niri::backend::tty: device changed: 57857\nFeb 25 13:21:31 cachyos-work niri[1402]: 2026-02-25T12:21:31.043376Z  INFO niri::niri: unlocking session\nFeb 25 13:42:39 cachyos-work niri[1402]: 2026-02-25T12:42:39.774825Z  INFO niri::niri: locking session\nFeb 25 13:43:17 cachyos-work niri[1402]: 2026-02-25T12:43:17.738705Z  WARN niri::utils::vblank_throttle: output HDMI-A-1 running faster than expected, throttling vblanks: expected refresh 16.680519ms, got vblank after 7.699267ms\nFeb 25 13:43:54 cachyos-work niri[1402]: 2026-02-25T12:43:54.740450Z  INFO niri::niri: unlocking session\nFeb 25 15:39:37 cachyos-work niri[1402]: 2026-02-25T14:39:37.583316Z DEBUG niri::niri: saving screenshot to \"/home/jschrod/Pictures/Screenshots/Screenshot from 2026-02-25 15-39-37.png\"\nFeb 25 16:06:50 cachyos-work niri[1402]: 2026-02-25T15:06:50.349516Z DEBUG niri::backend::tty: device changed: 57857\nFeb 25 16:06:50 cachyos-work niri[1402]: 2026-02-25T15:06:50.352053Z DEBUG niri::backend::tty: disconnecting connector: \"DP-1\"\nFeb 25 16:06:50 cachyos-work niri[1402]: 2026-02-25T15:06:50.352318Z DEBUG niri::niri: putting output eDP-1 at x=0 y=0\nFeb 25 16:06:50 cachyos-work niri[1402]: 2026-02-25T15:06:50.352390Z DEBUG niri::niri: putting output HDMI-A-1 at x=1920 y=0\nFeb 25 16:06:53 cachyos-work niri[1402]: 2026-02-25T15:06:53.792267Z DEBUG niri::backend::tty: device changed: 57857\nFeb 25 16:06:53 cachyos-work niri[1402]: 2026-02-25T15:06:53.795535Z DEBUG niri::backend::tty: new connector: DP-1 \"Dell Inc. DELL S2722DZ 1B2J3H3\"\nFeb 25 16:06:53 cachyos-work niri[1402]: 2026-02-25T15:06:53.795566Z DEBUG niri::backend::tty: connecting connector: DP-1\nFeb 25 16:06:53 cachyos-work niri[1402]: 2026-02-25T15:06:53.795579Z  WARN niri::backend::tty: configured mode 2560x1440@60 could not be found, falling back to preferred\nFeb 25 16:06:53 cachyos-work niri[1402]: 2026-02-25T15:06:53.795582Z DEBUG niri::backend::tty: picking mode: Mode { name: \"2560x1440\", clock: 241500, size: (2560, 1440), hsync: (2608, 2640, 2720), vsync: (1443, 1448, 1481), hskew: 0, vscan: 0, vrefres>\nlines 533-592/594 100%\n```\n\nYou can see that \n- I closed the lid at 10:48. \n- 12:06 I reopened the lid at work and niri correctly detects the new monitor (attached to HDMI-A-1), and detects that the resolution of my home monitor is not available on DP-1 (the monitor at work uses a different resolution), but does not recognise that it's a different monitor. \n- at 16:06 I unplugged and replugged the USB-C connection to DP-1 and the new monitor gets correctly detected\n\nBelow is the output of `niri msg outputs` before and after I replugged the USB-C connection\n```\n╭─ I     ~ ▓▒░───────────────────────────────────────────────────────────────────────────────░▒▓ ✔  16:04:13 ─╮\n╰─ niri msg outputs                                                                                               ─╯\nOutput \"Dell Inc. DELL S3225QC 3FFF444\" (DP-1)\n  Current mode: 2560x1440 @ 59.951 Hz (preferred)\n  Variable refresh rate: supported, disabled\n  Physical size: 600x340 mm\n  Logical position: -1920, 0\n  Logical size: 2048x1152\n  Scale: 1.25\n  Transform: normal\n  Available modes:\n    2560x1440@59.951 (current, preferred)\n    2560x1440@74.971\n    1920x1080@60.000\n    1920x1080@60.000\n    1920x1080@59.940\n    1920x1080@50.000\n    1600x1200@60.000\n    1400x1050@59.978\n    1600x900@60.000\n    1280x1024@75.025\n    1280x1024@60.020\n    1152x864@75.000\n    1280x720@60.000\n    1280x720@60.000\n    1280x720@59.940\n    1280x720@50.000\n    1024x768@75.029\n    1024x768@60.004\n    800x600@75.000\n    800x600@60.317\n    720x576@50.000\n    720x576@50.000\n    720x480@60.000\n    720x480@60.000\n    720x480@59.940\n    720x480@59.940\n    640x480@75.000\n    640x480@60.000\n    640x480@59.940\n    640x480@59.940\n    720x400@70.082\n\nOutput \"Dell Inc. DELL U2415 08DXD5243HUL\" (HDMI-A-1)\n  Current mode: 1920x1200 @ 59.950 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 520x320 mm\n  Logical position: 2048, 0\n  Logical size: 1200x1920\n  Scale: 1\n  Transform: 90° counter-clockwise\n  Available modes:\n    1920x1200@59.950 (current, preferred)\n    1920x1080@60.000\n    1920x1080@60.000\n    1920x1080@59.940\n    1920x1080@50.000\n    1920x1080@30.000\n    1920x1080@29.970\n    1920x1080@25.000\n    1920x1080@24.000\n    1920x1080@23.976\n    1600x1200@60.000\n    1280x1024@75.025\n    1280x1024@60.020\n    1152x864@75.000\n    1280x720@60.000\n    1280x720@60.000\n    1280x720@59.940\n    1280x720@50.000\n    1024x768@75.029\n    1024x768@60.004\n    800x600@75.000\n    800x600@60.317\n    720x576@50.000\n    720x480@60.000\n    720x480@60.000\n    720x480@59.940\n    720x480@59.940\n    720x480@59.940\n    640x480@75.000\n    640x480@60.000\n    640x480@59.940\n    640x480@59.940\n    720x400@70.082\n\nOutput \"Lenovo Group Limited 0x41C6 Unknown\" (eDP-1)\n  Current mode: 1920x1200 @ 60.002 Hz (preferred)\n  Variable refresh rate: supported, disabled\n  Physical size: 300x190 mm\n  Logical position: 128, 0\n  Logical size: 1920x1200\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1200@60.002 (current, preferred)\n    1920x1080@60.002\n    1600x1200@60.002\n    1680x1050@60.002\n    1280x1024@60.002\n    1440x900@60.002\n    1280x800@60.002\n    1280x720@60.002\n    1024x768@60.002\n    800x600@60.002\n    640x480@60.002\n```\n\n```╭─ I     ~ ▓▒░───────────────────────────────────────────────────────────────────────────────░▒▓ ✔  16:06:31 ─╮\n╰─ niri msg outputs                                                                                               ─╯\nOutput \"Dell Inc. DELL S2722DZ 1B2J3H3\" (DP-1)\n  Current mode: 2560x1440 @ 59.951 Hz (preferred)\n  Variable refresh rate: supported, disabled\n  Physical size: 600x340 mm\n  Logical position: 1920, 0\n  Logical size: 2560x1440\n  Scale: 1\n  Transform: normal\n  Available modes:\n    2560x1440@59.951 (current, preferred)\n    2560x1440@74.971\n    1920x1080@60.000\n    1920x1080@60.000\n    1920x1080@59.940\n    1920x1080@50.000\n    1600x1200@60.000\n    1400x1050@59.978\n    1600x900@60.000\n    1280x1024@75.025\n    1280x1024@60.020\n    1152x864@75.000\n    1280x720@60.000\n    1280x720@60.000\n    1280x720@59.940\n    1280x720@50.000\n    1024x768@75.029\n    1024x768@60.004\n    800x600@75.000\n    800x600@60.317\n    720x576@50.000\n    720x576@50.000\n    720x480@60.000\n    720x480@60.000\n    720x480@59.940\n    720x480@59.940\n    640x480@75.000\n    640x480@60.000\n    640x480@59.940\n    640x480@59.940\n    720x400@70.082\n\nOutput \"Dell Inc. DELL U2415 08DXD5243HUL\" (HDMI-A-1)\n  Current mode: 1920x1200 @ 59.950 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 520x320 mm\n  Logical position: 4480, 0\n  Logical size: 1200x1920\n  Scale: 1\n  Transform: 90° counter-clockwise\n  Available modes:\n    1920x1200@59.950 (current, preferred)\n    1920x1080@60.000\n    1920x1080@60.000\n    1920x1080@59.940\n    1920x1080@50.000\n    1920x1080@30.000\n    1920x1080@29.970\n    1920x1080@25.000\n    1920x1080@24.000\n    1920x1080@23.976\n    1600x1200@60.000\n    1280x1024@75.025\n    1280x1024@60.020\n    1152x864@75.000\n    1280x720@60.000\n    1280x720@60.000\n    1280x720@59.940\n    1280x720@50.000\n    1024x768@75.029\n    1024x768@60.004\n    800x600@75.000\n    800x600@60.317\n    720x576@50.000\n    720x480@60.000\n    720x480@60.000\n    720x480@59.940\n    720x480@59.940\n    720x480@59.940\n    640x480@75.000\n    640x480@60.000\n    640x480@59.940\n    640x480@59.940\n    720x400@70.082\n\nOutput \"Lenovo Group Limited 0x41C6 Unknown\" (eDP-1)\n  Current mode: 1920x1200 @ 60.002 Hz (preferred)\n  Variable refresh rate: supported, disabled\n  Physical size: 300x190 mm\n  Logical position: 0, 0\n  Logical size: 1920x1200\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1200@60.002 (current, preferred)\n    1920x1080@60.002\n    1600x1200@60.002\n    1680x1050@60.002\n    1280x1024@60.002\n    1440x900@60.002\n    1280x800@60.002\n    1280x720@60.002\n    1024x768@60.002\n    800x600@60.002\n    640x480@60.002\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3509/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3501",
      "id": 3985232895,
      "node_id": "I_kwDOKFkxdc7tidP_",
      "number": 3501,
      "title": "[BUG] niri fails to run inside a virtual machine",
      "user": {
        "login": "eaves-dropper",
        "id": 196674206,
        "node_id": "U_kgDOC7kCng",
        "avatar_url": "https://avatars.githubusercontent.com/u/196674206?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/eaves-dropper",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        },
        "1": {
          "id": 10168191960,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJL2A",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:application",
          "name": "not niri:application",
          "color": "bbbbbb",
          "default": false,
          "description": "Issues in applications"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2026-02-24T18:37:13Z",
      "updated_at": "2026-02-25T14:43:39Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I tried running niri inside a virtual machine. It didn't work, I tried many different possibilities. I can't list them all.\n\nVM OS: NixOS unstable\n```nix\n{ config, pkgs, ... }:\n\n{\n  programs.niri.enable = true;\n\n  xdg.portal = {\n    enable = true;\n    wlr.enable = true;\n    extraPortals = [ pkgs.xdg-desktop-portal-gtk ];\n    config.common.default = \"*\";\n  };\n\n  # Add useful packages\n  environment.systemPackages = with pkgs; [\n    niri\n  ];\n}\n```\nthis is the common configuration, that I have used across testing\n\nAfter adding this and rebuilding, (many times with variations)\nI tried running:\n- niri\n- niri-session\n\nFrom terminal and it gave me this error\n\n<img width=\"840\" height=\"54\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/6e255a15-7ac0-4511-a39a-ae8657c8abf9\" />\n\n<img width=\"619\" height=\"57\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/3bae7189-a0a8-41cd-ab03-67d165285a54\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3501/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3488",
      "id": 3972383126,
      "node_id": "I_kwDOKFkxdc7sxcGW",
      "number": 3488,
      "title": "Tilde doesn't work in Include",
      "user": {
        "login": "BennyDeeDev",
        "id": 45900418,
        "node_id": "MDQ6VXNlcjQ1OTAwNDE4",
        "avatar_url": "https://avatars.githubusercontent.com/u/45900418?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BennyDeeDev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191562,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJKSg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:config",
          "name": "area:config",
          "color": "fbca04",
          "default": false,
          "description": "Config parsing, default config, new settings"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2026-02-21T17:16:34Z",
      "updated_at": "2026-03-02T00:44:43Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Paths starting with `~` in `include` directives don't work:\n\n```kdl\ninclude \"~/.config/niri/extra.kdl\"\n```\nYou could use the absolute path as a workaround, but I will include a PR that fixes it.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3488/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3484",
      "id": 3971904712,
      "node_id": "I_kwDOKFkxdc7svnTI",
      "number": 3484,
      "title": "Firefox Crash",
      "user": {
        "login": "AnonAlly",
        "id": 193170968,
        "node_id": "U_kgDOC4OOGA",
        "avatar_url": "https://avatars.githubusercontent.com/u/193170968?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AnonAlly",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191960,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJL2A",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:application",
          "name": "not niri:application",
          "color": "bbbbbb",
          "default": false,
          "description": "Issues in applications"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2026-02-21T11:53:30Z",
      "updated_at": "2026-02-21T21:06:02Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<details><summary>Config</summary>\n\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://yalter.github.io/niri/Configuration:-Introduction\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://yalter.github.io/niri/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            // layout \"us,ru\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n\n            // If this section is empty, niri will fetch xkb settings\n            // from org.freedesktop.locale1. You can control these using\n            // localectl set-x11-keymap.\n        }\n\n        // Enable numlock on startup, omitting this setting disables it.\n        numlock\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    // All commented-out settings here are examples, not defaults.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        // drag false\n        // drag-lock\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // scroll-button-lock\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n/-output \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@120.030\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 2\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=1280 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 16\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        //\n        // The focus ring only draws around the active window, so the only place\n        // where you can see its inactive-color is on other monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#c7ff7f\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#9b0000\"\n\n        // Gradients can use a few different interpolation color spaces.\n        // For example, this is a pastel rainbow gradient via in=\"oklch longer hue\".\n        //\n        // active-gradient from=\"#e5989b\" to=\"#ffb4a2\" angle=45 relative-to=\"workspace-view\" in=\"oklch longer hue\"\n\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        //\n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        //\n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\nspawn-at-startup \"waybar\"\n\n// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:\n// spawn-sh-at-startup \"qs -c ~/source/qs/MyAwesomeShell\"\n\nhotkey-overlay {\n    // Uncomment this line to disable the \"Important Hotkeys\" pop-up at startup.\n    // skip-at-startup\n}\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://yalter.github.io/niri/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+T hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"alacritty\"; }\n    Mod+D hotkey-overlay-title=\"Run an Application: lucien\" { spawn \"lucien\"; }\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\n\n    // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.\n    // For example, this is a standard bind to toggle the screen reader (orca).\n    Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    // Using spawn-sh allows to pass multiple arguments together with the command.\n    // \"-l 1.0\" limits the volume to 100%.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\"; }\n\n    // Example media keys mapping using playerctl.\n    // This will work with any MPRIS-enabled media player.\n    XF86AudioPlay        allow-when-locked=true { spawn-sh \"playerctl play-pause\"; }\n    XF86AudioStop        allow-when-locked=true { spawn-sh \"playerctl stop\"; }\n    XF86AudioPrev        allow-when-locked=true { spawn-sh \"playerctl previous\"; }\n    XF86AudioNext        allow-when-locked=true { spawn-sh \"playerctl next\"; }\n\n    // Example brightness key mappings for brightnessctl.\n    // You can use regular spawn with multiple arguments too (to avoid going through \"sh\"),\n    // but you need to manually put each argument in separate \"\" quotes.\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"+10%\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"10%-\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+O repeat=false { toggle-overview; }\n\n    Mod+Q repeat=false { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    // Cycling through the presets in reverse order is also possible.\n    // Mod+R { switch-preset-column-width-back; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n    Mod+Shift+A { spawn \"/opt/android-studio/bin/studio\"; }\n    Mod+Alt+F { spawn \"/app/lib/firefox/firefox --name org.mozilla.firefox\"; }\n    Mod+Alt+T { spawn \"ptyxis --standalone\"; }\n}\n\nspawn-at-startup \"awww-daemon\"\nspawn-at-startup \"ewwii daemon\"\nspawn-at-startup \"ewwii open example\"\n\n```\n\n</details> \n\nFirefox crash when we spawn context menu with right click for example on `Download ZIP` button on Github.\n\n<img width=\"2879\" height=\"1920\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/e962d0f5-fb45-4040-8000-5fa3fe98c042\" />\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: 25.11\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: AerynOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen AI 7\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3484/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3464",
      "id": 3949306388,
      "node_id": "I_kwDOKFkxdc7rZaIU",
      "number": 3464,
      "title": "Bad work with movable toolbars (specifically in Prism Launcher)",
      "user": {
        "login": "KorolOrol",
        "id": 57080318,
        "node_id": "MDQ6VXNlcjU3MDgwMzE4",
        "avatar_url": "https://avatars.githubusercontent.com/u/57080318?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KorolOrol",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2026-02-16T19:51:46Z",
      "updated_at": "2026-02-17T17:48:39Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nQT applications react poorly to toolbar movements, especially in Prism Launcher. Moving the sidebar to the left is very difficult, and moving the main panel to the top is impossible. I also tried it in kpat, where the panel moves more responsively, but it's not perfect. In KDE Partition Manager, all panels move instantly.\n\nScreencast of my futile attempts to move the toolbars in Prism Launcher:\nhttps://github.com/user-attachments/assets/fa9e8133-1f98-4e11-a105-6809b79a74e3\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n<details><summary>Config</summary>\n\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://yalter.github.io/niri/Configuration:-Introduction\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://yalter.github.io/niri/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            // layout \"us,ru\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n\n            // If this section is empty, niri will fetch xkb settings\n            // from org.freedesktop.locale1. You can control these using\n            // localectl set-x11-keymap.\n\n            layout \"us,ru\"\n            options \"grp:alt_shift_toggle,compose:ralt,ctrl:nocaps\"\n        }\n\n        track-layout \"global\"\n        numlock\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    // All commented-out settings here are examples, not defaults.\n    touchpad {\n        // off\n        tap\n        dwt\n        // drag false\n        // drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        scroll-method \"two-finger\"\n        click-method \"button-areas\"\n        disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\ninclude \"dms/outputs.kdl\"\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n/-output \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"2560x1440@165\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1.5\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=0 y=0\n\n    focus-at-startup\n    hot-corners {\n        top-left\n    }\n}\n\n/-output \"DP-4\" {\n    mode \"1920x1080\"\n    scale 1.125\n    transform \"normal\"\n    position x=1706 y=120\n    hot-corners {\n        off\n    }\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 16\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#cba6f7\"\n\n        // Color of the ring on inactive monitors.\n        //\n        // The focus ring only draws around the active window, so the only place\n        // where you can see its inactive-color is on other monitors.\n        inactive-color \"#6c7086\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#c7ff7f\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#9b0000\"\n\n        // Gradients can use a few different interpolation color spaces.\n        // For example, this is a pastel rainbow gradient via in=\"oklch longer hue\".\n        //\n        // active-gradient from=\"#e5989b\" to=\"#ffb4a2\" angle=45 relative-to=\"workspace-view\" in=\"oklch longer hue\"\n\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        //\n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        //\n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\n// spawn-at-startup \"waybar\"\n\n// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:\n// spawn-sh-at-startup \"qs -c ~/source/qs/MyAwesomeShell\"\n\nhotkey-overlay {\n    // Uncomment this line to disable the \"Important Hotkeys\" pop-up at startup.\n    skip-at-startup\n}\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://yalter.github.io/niri/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Window-Rules\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=\"zen\" title=\"^Картинка в картинке$\"\n    open-floating true\n}\n\nwindow-rule {\n    match app-id=\"zen\"\n    open-maximized true\n}\n\nwindow-rule {\n    match title=\"Endfield\"\n    open-fullscreen true\n}\n\nwindow-rule {\n    match app-id=r\"org.kde.kdeconnect.daemon\" // ID of presentation pointer overlay\n    open-floating true\n    open-fullscreen false\n    default-floating-position x=0 y=0 relative-to=\"top-left\"\n\n    // Adjust these to your monitor's resolution\n    min-width 2560\n    min-height 1440\n\n    // Optionally customize opacity of pointer\n    // opacity 1.0\n\n    tiled-state true\n\n    focus-ring {\n        off\n    }\n    border {\n        off\n    }\n    shadow {\n        off\n    }\n    draw-border-with-background false\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\nwindow-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nprefer-no-csd\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+T hotkey-overlay-title=\"Open a Terminal: kitty\" { spawn \"kitty\"; }\n    Mod+Escape hotkey-overlay-title=\"Open Resources\" { spawn \"resources\"; }\n    Mod+E hotkey-overlay-title=\"Open File Manager: nautilus\" { spawn \"nautilus\"; }\n    Alt+Space hotkey-overlay-title=\"Run an Application: DMS\" { spawn-sh \"dms ipc call spotlight toggle\"; }\n    Mod+L hotkey-overlay-title=\"Lock the Screen: DMS\" { spawn-sh \"dms ipc call lock lock\"; }\n\n    // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.\n    // For example, this is a standard bind to toggle the screen reader (orca).\n    // Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    // Using spawn-sh allows to pass multiple arguments together with the command.\n    // \"-l 1.0\" limits the volume to 100%.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"dms ipc call audio increment 2\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"dms ipc call audio decrement 2\"; }\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"dms ipc call audio mute\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"dms ipc call audio micMute\"; }\n\n    // Example media keys mapping using playerctl.\n    // This will work with any MPRIS-enabled media player.\n    // XF86AudioPlay        allow-when-locked=true { spawn-sh \"playerctl play-pause\"; }\n    // XF86AudioStop        allow-when-locked=true { spawn-sh \"playerctl stop\"; }\n    // XF86AudioPrev        allow-when-locked=true { spawn-sh \"playerctl previous\"; }\n    // XF86AudioNext        allow-when-locked=true { spawn-sh \"playerctl next\"; }\n\n    // Example brightness key mappings for brightnessctl.\n    // You can use regular spawn with multiple arguments too (to avoid going through \"sh\"),\n    // but you need to manually put each argument in separate \"\" quotes.\n    XF86MonBrightnessUp allow-when-locked=true { spawn-sh \"dms ipc call brightness increment 5 \\\"\\\"\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn-sh \"dms ipc call brightness decrement 5 \\\"\\\"\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+Z repeat=false { toggle-overview; }\n\n    Mod+Q repeat=false { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-or-workspace-down; }\n    Mod+Up    { focus-window-or-workspace-up; }\n    Mod+Right { focus-column-right; }\n    // Mod+H     { focus-column-left; }\n    // Mod+J     { focus-window-down; }\n    // Mod+K     { focus-window-up; }\n    // Mod+L     { focus-column-right; }\n\n    Mod+Shift+Left  { move-column-left; }\n    Mod+Shift+Down  { move-window-down-or-to-workspace-down; }\n    Mod+Shift+Up    { move-window-up-or-to-workspace-up; }\n    Mod+Shift+Right { move-column-right; }\n    // Mod+Shift+H     { move-column-left; }\n    // Mod+Shift+J     { move-window-down; }\n    // Mod+Shift+K     { move-window-up; }\n    // Mod+Shift+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Shift+Home { move-column-to-first; }\n    Mod+Shift+End  { move-column-to-last; }\n\n    Mod+Ctrl+Left  { focus-monitor-left; }\n    Mod+Ctrl+Down  { focus-monitor-down; }\n    Mod+Ctrl+Up    { focus-monitor-up; }\n    Mod+Ctrl+Right { focus-monitor-right; }\n    // Mod+Ctrl+H     { focus-monitor-left; }\n    // Mod+Ctrl+J     { focus-monitor-down; }\n    // Mod+Ctrl+K     { focus-monitor-up; }\n    // Mod+Ctrl+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    // Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    // Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    // Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    // Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    // Mod+Page_Down      { focus-workspace-down; }\n    // Mod+Page_Up        { focus-workspace-up; }\n    // Mod+U              { focus-workspace-down; }\n    // Mod+I              { focus-workspace-up; }\n    // Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    // Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    // Mod+Ctrl+U         { move-column-to-workspace-down; }\n    // Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    // Mod+Shift+U         { move-workspace-down; }\n    // Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Shift+1 { move-column-to-workspace 1; }\n    Mod+Shift+2 { move-column-to-workspace 2; }\n    Mod+Shift+3 { move-column-to-workspace 3; }\n    Mod+Shift+4 { move-column-to-workspace 4; }\n    Mod+Shift+5 { move-column-to-workspace 5; }\n    Mod+Shift+6 { move-column-to-workspace 6; }\n    Mod+Shift+7 { move-column-to-workspace 7; }\n    Mod+Shift+8 { move-column-to-workspace 8; }\n    Mod+Shift+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    // Cycling through the presets in reverse order is also possible.\n    // Mod+R { switch-preset-column-width-back; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n    Mod+Ctrl+F { maximize-window-to-edges; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    // Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    // Mod+V       { toggle-window-floating; }\n    // Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n    Mod+Space { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    Mod+V { spawn-sh \"dms ipc call clipboard toggle\"; }\n    Mod+O { spawn-sh \"dms ipc call settings focusOrToggle\"; }\n\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    // Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n\ninclude \"dms/cursor.kdl\"\ninclude \"dms/binds.kdl\"\n\n\n```\n\n</details> \n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (b35bcae)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon 780M Graphics, NVIDIA GeForce RTX 4060 Max-Q / Mobile\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 9 7940HS (16) @ 5.26 GHz\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3464/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3444",
      "id": 3940786807,
      "node_id": "I_kwDOKFkxdc7q46J3",
      "number": 3444,
      "title": "NumLock on startup does not work",
      "user": {
        "login": "caowei734728144",
        "id": 53980366,
        "node_id": "MDQ6VXNlcjUzOTgwMzY2",
        "avatar_url": "https://avatars.githubusercontent.com/u/53980366?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/caowei734728144",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2026-02-14T08:25:24Z",
      "updated_at": "2026-02-15T05:51:33Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nNumLock light turns off after selecting boot option.\nThe NumLock on startup works in Win11 on the same device.\n<!-- Attaching your full niri config can help diagnose the problem. -->\n<details><summary>Config</summary>\n\n```kdl\ninput {\n    keyboard {\n        xkb {\n          ...\n        }\n        numlock\n    }\n\n...\n\n```\n\n</details> \n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (Nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS 26.05 (Yarara)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD 9950X3D\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: RTX 3080ti\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3444/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3426",
      "id": 3922393637,
      "node_id": "I_kwDOKFkxdc7pyvol",
      "number": 3426,
      "title": "noctalia-shell crashes when disconnecting HDMI on ASUS E510 (Intel Celeron N4020)",
      "user": {
        "login": "Angel173hu",
        "id": 106164615,
        "node_id": "U_kgDOBlPxhw",
        "avatar_url": "https://avatars.githubusercontent.com/u/106164615?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Angel173hu",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 15,
      "created_at": "2026-02-10T16:24:51Z",
      "updated_at": "2026-02-28T11:26:25Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When disconnecting an HDMI monitor, Niri logs the following error:\n\nERROR niri::backend::tty: missing surface in vblank callback for crtc crtc::Handle(117)\n\nand the process noctalia-shell immediately crashes.\nThis happens consistently on my ASUS E510 laptop with Intel Celeron N4020, but does not happen on another laptop with the same Niri configuration (noctalia-shell stays alive after HDMI disconnect).\nIt seems to be a bug specific to the combination of Niri + the graphics driver on this hardware.\n\nSteps to reproduce\n\nStart a Niri session with noctalia-shell (spawn-sh-at-startup).\nConnect an HDMI monitor (detected correctly as HDMI-A-1).\nDisconnect the HDMI monitor.\nNiri shows the “missing surface in vblank callback” error and noctalia-shell crashes.\nRelevant logs\n\nDEBUG niri::backend::tty: disconnecting connector: \"HDMI-A-1\"\nfeb 10 09:50:08 enyel-cachyos-x8664 niri[1503]: 2026-02-10T15:50:08.494385Z DEBUG niri::niri: putting output eDP-1 at x=0 y=0\nfeb 10 09:50:08 enyel-cachyos-x8664 niri[1503]: 2026-02-10T15:50:08.565347Z ERROR niri::backend::tty: missing surface in vblank callback for crtc crtc::Handle(117)\n\nSystem Information\n\n• niri version: 25.11 (https://github.com/niri-wm/niri/commit/b35bcae35b3f9665043c335e55ed5828af77db85)\n• quickshell version: 0.2.1 (distributed by Arch Linux)\n• Distro: CachyOS (Arch-based, selected Niri as desktop environment, noctalia came preinstalled)\n• GPU: Intel UHD Graphics (integrated in Celeron N4020)\n• CPU: Intel Celeron N4020 (ASUS E510 laptop)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3426/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3422",
      "id": 3919477608,
      "node_id": "I_kwDOKFkxdc7pnnto",
      "number": 3422,
      "title": "Mouse-only serverside resize",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187133,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI4_Q",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:layout",
          "name": "area:layout",
          "color": "fbca04",
          "default": false,
          "description": "Columns, workspaces, scrolling, fullscreen, resize"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-02-10T05:07:30Z",
      "updated_at": "2026-02-25T07:10:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently you can resize windows through clientside resize handles or serverside with Mod+RMB. But there's no *mouse-only* serverside resize gesture, which makes a prefer-no-csd/tiled-state scenario slightly more annoying than it should be.\n\nOn the surface, the idea is to have small resize areas just outside each window that behave identically to clientside resize areas. However, I'm not sure yet about the specifics of how this should work and what edge cases will come up (both implementation wise and design wise). Guess if I get to this I'll need to dive in and see what happens.\n\nThis feature is also connected with other features like \"resize two columns by their shared edge while preserving their total width\". They are not necessarily dependent on each other, but design wise each should be considered.\n\nIf we ever get proper SSD bars, mouse-only serverside resize would also be very much expected.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3422/reactions",
        "total_count": 13,
        "+1": 8,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 5,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3420",
      "id": 3918688669,
      "node_id": "I_kwDOKFkxdc7pknGd",
      "number": 3420,
      "title": "window-rule default position is ignored when open floating is true",
      "user": {
        "login": "PatrickHechler",
        "id": 65898051,
        "node_id": "MDQ6VXNlcjY1ODk4MDUx",
        "avatar_url": "https://avatars.githubusercontent.com/u/65898051?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/PatrickHechler",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 22,
      "created_at": "2026-02-09T23:43:10Z",
      "updated_at": "2026-02-14T07:44:28Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nwhen the window rule `default-floating-position` is used in combination with `open-floating true`, the window opens correctly in floating mode but in the center of the screen instead of the specified position.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n<details><summary>Config</summary>\n\n```kdl\n\nwindow-rule {\n    match title=\"^vlc$\" app-id=\"^vlc$\"\n    open-floating true\n    default-floating-position x=0 y=0 relative-to=\"bottom\"\n    opacity 0.666\n    focus-ring {\n        off\n    }\n}\n\nwindow-rule {\n    match title=\"^Find/Replace $\" app-id=\"^Eclipse$\"\n    open-floating true\n    default-floating-position x=8 y=0 relative-to=\"right\"\n    default-column-width { fixed 357; }\n    default-window-height { fixed 422; }\n}\n```\n\n</details> \n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (b35bcae)\n* niri version: niri 25.11 (v25.11-109-gab47f5ce)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA GeForce GTX 1060\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 1700\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3420/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3416",
      "id": 3913491439,
      "node_id": "I_kwDOKFkxdc7pQyPv",
      "number": 3416,
      "title": "Left off-screen window visible after scrolling to the right",
      "user": {
        "login": "quantumsnow",
        "id": 205372035,
        "node_id": "U_kgDODD26gw",
        "avatar_url": "https://avatars.githubusercontent.com/u/205372035?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/quantumsnow",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2026-02-08T20:29:08Z",
      "updated_at": "2026-02-10T09:31:30Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen there is a window off-screen to the left, I can see one pixel line of the edge of that window but it should be just outside the screen:\n\n<img width=\"3840\" height=\"2160\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/7065ae61-f84a-47ed-952a-c2cee81e5206\" />\n\nThis only happens when I arrived at this position after scrolling to the right. When I get there scrolling left, the line is not visible:\n\n<img width=\"3840\" height=\"2160\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/05e56a2d-9916-4e55-95b5-4be440596034\" />\n\nHere is a video of the two different scrolling directions:\n\nhttps://github.com/user-attachments/assets/dfee6e31-7a4c-4247-b9da-7b693adb4ffa\n\nFrom the screenshot it appears that the gap to the left is 24 (physical) pixels after scrolling right but 23 after scrolling left. If I understand correctly, it should always be 10*2.25 = 22.5 = 23 after rounding (logical pixel gap times scaling factor).\n\nThis might be related to #640 and #3343 but since the dependence on scrolling direction seems new, I thought I'd report still.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n<details><summary>Config</summary>\n\n```kdl\n// I use the default config but include this file with alterations as well as DMS configs\n\ninput {\n\ttouchpad {\n\t\ttap\n\t\tnatural-scroll\n\t\tdwt\n\t}\n\tkeyboard {\n\t\txkb {\n            options \"compose:ralt\"\n\t\t}\n\t}\n\tmouse {\n\t\tnatural-scroll\n\t}\n}\n\ncursor {\n    xcursor-theme \"Bibata-Modern-Classic\"\n    hide-after-inactive-ms 30000\n}\n\noutput \"eDP-1\" {\n\tscale 2.25\n\tposition x=0 y=0\n}\n\noutput \"PNP(BNQ) BenQ BL2710 N1E06228SL0\" {\n    focus-at-startup\n    position x=1707 y=-300\n}\n\n//Iiyama North America PL2497H\noutput \"DP-1\" {\n    mode \"1920x1080@100\"\n    position x=0 y=-1080\n}\n\nlayout {\n\tgaps 10\n\tshadow { on; }\n\tfocus-ring {\n\t\twidth 0\n\t}\n\t//background-color \"white\"\n}\n\n/-layer-rule {\n\tmatch namespace=\"^quickshell$\"\n\tplace-within-backdrop true\n}\n\n/-layer-rule {\n\tmatch namespace=\"dms:blurwallpaper\"\n\tplace-within-backdrop true\n}\n\nspawn-at-startup \"bash\" \"-c\" \"wl-paste --watch cliphist store &\"\n\nprefer-no-csd\n\nwindow-rule {\n    geometry-corner-radius 20\n}\n\nwindow-rule {\n    match app-id=\"org.gnome.NautilusPreviewer\"\n    open-floating true\n}\n\n/-window-rule {\n    match app-id=\"com.nextcloud.desktopclient.nextcloud\" title=\"Nextcloud\"\n    open-floating true\n}\n\nwindow-rule {\n    match app-id=\"librewolf\"\n    open-maximized true\n}\n\nwindow-rule {\n    match app-id=\"protonvpn-app\"\n    open-floating true\n}\n\nwindow-rule {\n\tmatch app-id=\"org.gnome.Papers\"\n\topen-maximized true\n}\n\nhotkey-overlay {\n    skip-at-startup\n}\n\nbinds {\n    Mod+T hotkey-overlay-title=\"Open a Terminal: Ptyxis\" { spawn \"ptyxis\" \"--new-window\"; }\n    \n    Mod+Shift+Down { focus-workspace-down; }\n    Mod+Shift+Up { focus-workspace-up; }\n    \n    Mod+Ctrl+Shift+Down { move-window-to-workspace-down; }\n    Mod+Ctrl+Shift+Up { move-window-to-workspace-up; }\n    \n    Mod+Alt+Down { move-workspace-down; }\n    Mod+Alt+Up { move-workspace-up; }\n\n    Mod+Shift+Ctrl+Left { move-window-to-monitor-left; }\n    Mod+Shift+Ctrl+Right { move-window-to-monitor-right; }\n    \n    Mod+Alt+Left { move-workspace-to-monitor-left; }\n    Mod+Alt+Right { move-workspace-to-monitor-right; }\n    \n    Mod+Ctrl+B { toggle-window-floating; }\n    Mod+B { switch-focus-between-floating-and-tiling; }\n    \n    Mod+L hotkey-overlay-title=\"Lock Screen\" { \n        spawn \"dms\" \"ipc\" \"call\" \"lock\" \"lock\"; \n    }\n}\n\ngestures {\n    hot-corners {\n        off\n    }\n}\n\nenvironment {\n    //dms\n    XDG_CURRENT_DESKTOP \"niri\"\n    QT_QPA_PLATFORM \"wayland\"\n    ELECTRON_OZONE_PLATFORM_HINT \"auto\"\n    QT_QPA_PLATFORMTHEME \"gtk3\"\n    QT_QPA_PLATFORMTHEME_QT6 \"gtk3\"\n}\n```\n\n</details> \n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Bluefin 43\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel UHD Graphics 620\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel Core i7-8550U\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3416/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3415",
      "id": 3913207088,
      "node_id": "I_kwDOKFkxdc7pPs0w",
      "number": 3415,
      "title": "Feishu (Xwayland Electron) Screensharing requires SHM, but also has a compat issue with gnome portal",
      "user": {
        "login": "fishman",
        "id": 17103,
        "node_id": "MDQ6VXNlcjE3MTAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/17103?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/fishman",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191280,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJMA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:screencasting",
          "name": "area:screencasting",
          "color": "fbca04",
          "default": false,
          "description": "Screen sharing, PipeWire, screencast portal"
        },
        "1": {
          "id": 10168191325,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJXQ",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:pipewire",
          "name": "area:pipewire",
          "color": "fbca04",
          "default": false,
          "description": "Issues with the PipeWire code"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2026-02-08T17:53:04Z",
      "updated_at": "2026-02-16T05:21:07Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I've tried 3 different ways. 1. Sharing without SHM. 2. Sharing with SHM with gnome portal. 3. Sharing with SHM but with hyprland.\n\n1. Pipewire errors when negotiating format\n2. Pipewire error gone, but screen still stuck at sharing without sharing\n3. SHM format negiated and screen is actually sharing\n\n\n1.. When sharing without SHM the following error occurs:\n\n```\npipewire[3589]: pw.context: params Spa:Enum:ParamId:EnumFormat: 0:0 Invalid argument (input format (no more input formats))\npipewire[3589]: pw.context: Object: size 192, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\npipewire[3589]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\npipewire[3589]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\npipewire[3589]: pw.context:     Id 12       (Spa:Enum:VideoFormat:BGRA)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:       Rectangle 1x1\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Fraction 30/1\npipewire[3589]: pw.context:       Fraction 0/1\npipewire[3589]: pw.context:       Fraction 60/1\npipewire[3589]: pw.context: Object: size 192, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\npipewire[3589]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\npipewire[3589]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\npipewire[3589]: pw.context:     Id 11       (Spa:Enum:VideoFormat:RGBA)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:       Rectangle 1x1\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Fraction 30/1\npipewire[3589]: pw.context:       Fraction 0/1\npipewire[3589]: pw.context:       Fraction 60/1\npipewire[3589]: pw.context: Object: size 192, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\npipewire[3589]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\npipewire[3589]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\npipewire[3589]: pw.context:     Id 8        (Spa:Enum:VideoFormat:BGRx)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:       Rectangle 1x1\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Fraction 30/1\npipewire[3589]: pw.context:       Fraction 0/1\npipewire[3589]: pw.context:       Fraction 60/1\npipewire[3589]: pw.context: Object: size 192, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\npipewire[3589]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\npipewire[3589]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\npipewire[3589]: pw.context:     Id 7        (Spa:Enum:VideoFormat:RGBx)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:       Rectangle 1x1\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Fraction 30/1\npipewire[3589]: pw.context:       Fraction 0/1\npipewire[3589]: pw.context:       Fraction 60/1\npipewire[3589]: pw.context: params Spa:Enum:ParamId:EnumFormat: 1:0 Invalid argument (output format (no more input formats))\npipewire[3589]: pw.context: Object: size 288, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\npipewire[3589]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\npipewire[3589]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\npipewire[3589]: pw.context:     Id 8        (Spa:Enum:VideoFormat:BGRx)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:modifier (131074), flags 00000018\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Enum, flags 00000000 88 8\npipewire[3589]: pw.context:       Long 144115188348926724\npipewire[3589]: pw.context:       Long 144115188348926724\npipewire[3589]: pw.context:       Long 144115188348910340\npipewire[3589]: pw.context:       Long 144115188348713732\npipewire[3589]: pw.context:       Long 144115188348492548\npipewire[3589]: pw.context:       Long 144115188348491268\npipewire[3589]: pw.context:       Long 144115188075858436\npipewire[3589]: pw.context:       Long 0\npipewire[3589]: pw.context:       Long 72057594037927935\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\npipewire[3589]: pw.context:     Rectangle 2560x1600\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\npipewire[3589]: pw.context:     Fraction 0/1\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:maxFramerate (131077), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Fraction 60009/1000\npipewire[3589]: pw.context:       Fraction 1/1\npipewire[3589]: pw.context:       Fraction 60009/1000\npipewire[3589]: pw.link: (94.0.0 -> 93.0.0) negotiating -> error (no more input formats) (configure-configure)\npipewire[3589]: pw.context: params Spa:Enum:ParamId:EnumFormat: 0:0 Invalid argument (input format (no more input formats))\npipewire[3589]: pw.context: Object: size 192, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\npipewire[3589]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\npipewire[3589]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\npipewire[3589]: pw.context:     Id 12       (Spa:Enum:VideoFormat:BGRA)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:       Rectangle 1x1\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Fraction 30/1\npipewire[3589]: pw.context:       Fraction 0/1\npipewire[3589]: pw.context:       Fraction 60/1\npipewire[3589]: pw.context: Object: size 192, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\npipewire[3589]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\npipewire[3589]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\npipewire[3589]: pw.context:     Id 11       (Spa:Enum:VideoFormat:RGBA)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:       Rectangle 1x1\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Fraction 30/1\npipewire[3589]: pw.context:       Fraction 0/1\npipewire[3589]: pw.context:       Fraction 60/1\npipewire[3589]: pw.context: Object: size 192, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\npipewire[3589]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\npipewire[3589]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\npipewire[3589]: pw.context:     Id 8        (Spa:Enum:VideoFormat:BGRx)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:       Rectangle 1x1\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Fraction 30/1\npipewire[3589]: pw.context:       Fraction 0/1\npipewire[3589]: pw.context:       Fraction 60/1\npipewire[3589]: pw.context: Object: size 192, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\npipewire[3589]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\npipewire[3589]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\npipewire[3589]: pw.context:     Id 7        (Spa:Enum:VideoFormat:RGBx)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:       Rectangle 1x1\npipewire[3589]: pw.context:       Rectangle 8192x4320\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Fraction 30/1\npipewire[3589]: pw.context:       Fraction 0/1\npipewire[3589]: pw.context:       Fraction 60/1\npipewire[3589]: pw.context: params Spa:Enum:ParamId:EnumFormat: 1:0 Invalid argument (output format (no more input formats))\npipewire[3589]: pw.context: Object: size 288, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\npipewire[3589]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\npipewire[3589]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\npipewire[3589]: pw.context:     Id 8        (Spa:Enum:VideoFormat:BGRx)\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:modifier (131074), flags 00000018\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Enum, flags 00000000 88 8\npipewire[3589]: pw.context:       Long 144115188348926724\npipewire[3589]: pw.context:       Long 144115188348926724\npipewire[3589]: pw.context:       Long 144115188348910340\npipewire[3589]: pw.context:       Long 144115188348713732\npipewire[3589]: pw.context:       Long 144115188348492548\npipewire[3589]: pw.context:       Long 144115188348491268\npipewire[3589]: pw.context:       Long 144115188075858436\npipewire[3589]: pw.context:       Long 0\npipewire[3589]: pw.context:       Long 72057594037927935\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\npipewire[3589]: pw.context:     Rectangle 2560x1600\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\npipewire[3589]: pw.context:     Fraction 0/1\npipewire[3589]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:maxFramerate (131077), flags 00000000\npipewire[3589]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\npipewire[3589]: pw.context:       Fraction 60009/1000\npipewire[3589]: pw.context:       Fraction 1/1\npipewire[3589]: pw.context:       Fraction 60009/1000\npipewire[3589]: pw.link: (231.0.0 -> 69.0.0) negotiating -> error (no more input formats) (configure-configure)\n```\n\n2. gnome portal with SHM, stream stuck at paused\n\n```\nFeb 09 00:09:11  niri[542171]: 2026-02-08T16:09:11.947814Z DEBUG niri::dbus::mutter_screen_cast: record_monitor connector=\"eDP-1\" properties=RecordMonitorProperties { cursor_mode: Some(Metadata), _is_recording: None }\nFeb 09 00:09:11  niri[542171]: 2026-02-08T16:09:11.948606Z DEBUG niri::dbus::mutter_screen_cast: start\nFeb 09 00:09:11  niri[542171]: 2026-02-08T16:09:11.948654Z DEBUG niri::niri: StartCast session_id=1 stream_id=1\nFeb 09 00:09:11  niri[542171]: 2026-02-08T16:09:11.948762Z DEBUG niri::pw_utils: pw stream: state changed: Unconnected -> Connecting stream_id=1\nFeb 09 00:09:11  niri[542171]: 2026-02-08T16:09:11.954341Z DEBUG niri::pw_utils: pw stream: state changed: Connecting -> Paused stream_id=1\nFeb 09 00:09:11  niri[542171]: 2026-02-08T16:09:11.954365Z DEBUG niri::pw_utils: pw stream: sending signal with 72 stream_id=1\nFeb 09 00:09:11  niri[542171]: 2026-02-08T16:09:11.962663Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0x0), modifier: 0, size: spa_rectangle { width: 2560, height: 1600 }, framerate: spa_fraction { num: 0, denom: 1 }, max_framerate: spa_fraction { num: 60009, denom: 1000 }, views: 0, interlace_mode: 0, pixel_aspect_ratio: spa_fraction { num: 0, denom: 0 }, multiview_mode: 0, multiview_flags: 0, chroma_site: 0, color_range: 0, color_matrix: 0, transfer_function: 0, color_primaries: 0 } stream_id=1\nFeb 09 00:09:11  niri[542171]: 2026-02-08T16:09:11.963494Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Streaming stream_id=1\n```\n\n3. hyprland portal sharing shm\n\n```\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] Initializing xdph...\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] XDG_CURRENT_DESKTOP set to niri\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [WARN] Not running on hyprland, some features might be unavailable\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] Gathering exported interfaces\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wl_compositor (ver 6)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wl_subcompositor (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: xdg_wm_base (ver 6)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zxdg_decoration_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: org_kde_kwin_server_decoration_manager (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwlr_layer_shell_v1 (ver 5)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: ext_session_lock_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wl_shm (ver 2)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zxdg_output_manager_v1 (ver 3)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wp_fractional_scale_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_tablet_manager_v2 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_pointer_gestures_v1 (ver 3)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_relative_pointer_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_pointer_constraints_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: ext_idle_notifier_v1 (ver 2)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_idle_inhibit_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wl_data_device_manager (ver 3)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_primary_selection_device_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwlr_data_control_manager_v1 (ver 2)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: ext_data_control_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wp_presentation (ver 2)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wp_security_context_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_text_input_manager_v3 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_input_method_manager_v2 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_keyboard_shortcuts_inhibit_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_virtual_keyboard_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwlr_virtual_pointer_manager_v1 (ver 2)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwlr_foreign_toplevel_manager_v1 (ver 3)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [toplevel] (activate) locks: 1\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: ext_workspace_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwlr_output_manager_v1 (ver 4)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwlr_screencopy_manager_v1 (ver 3)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [pipewire] connected\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy] init successful\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wp_viewporter (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zxdg_exporter_v2 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zxdg_importer_v2 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwlr_gamma_control_manager_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: xdg_activation_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: mutter_x11_interop (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wl_seat (ver 9)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wp_cursor_shape_manager_v1 (ver 2)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: zwp_linux_dmabuf_v1 (ver 5)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wp_drm_lease_device_v1 (ver 1)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG]  | Got interface: wl_output (ver 4)\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [core] dmabufFeedbackMainDevice\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] Found output name eDP-1\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [toplevel] Activated, bound to 1, toplevels: 0\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screenshot] init successful\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [INFO] hyprpicker not found. We suggest to use hyprpicker for color picking to be less meh.\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [toplevel] (activate) locks: 2\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy] New session:\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy]  | /org/freedesktop/portal/desktop/request/1_1062/sc_927429540\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy]  | /org/freedesktop/portal/desktop/session/1_1062/sc_session142654647\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy]  | appid: feishu\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy] SelectSources:\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy]  | /org/freedesktop/portal/desktop/request/1_1062/sc_2076962721\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy]  | /org/freedesktop/portal/desktop/session/1_1062/sc_session142654647\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy]  | appid: feishu\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy] option cursor_mode to 2\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy] unused option multiple\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy] unused option types\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy] restore data invalid / missing, prompting\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [sc] Selection: /screen:eDP-1\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy] SHAREDATA returned selection 0\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy] Start:\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy]  | /org/freedesktop/portal/desktop/request/1_1062/sc_1216838093\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy]  | /org/freedesktop/portal/desktop/session/1_1062/sc_session142654647\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy]  | appid: feishu\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy]  | parent_window:\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [pw] Building modifiers for dma\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [LOG] [screencopy] Sharing initialized\nFeb 09 00:11:47  xdg-desktop-portal-hyprland[547926]: [WARN] [pipewire] Asked for a wl_shm buffer which is legacy.\n\n```\n\n### System Information\n\n* niri version:  niri 25.11 (b35bcae)\n\n* Distro:  CachyOS\n\n* CPU: Ryzen 7590U\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3415/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3410",
      "id": 3909676913,
      "node_id": "I_kwDOKFkxdc7pCO9x",
      "number": 3410,
      "title": "Intermittent monitor activation failure on USB-C dock due to EDID race condition",
      "user": {
        "login": "coleleavitt",
        "id": 75138914,
        "node_id": "MDQ6VXNlcjc1MTM4OTE0",
        "avatar_url": "https://avatars.githubusercontent.com/u/75138914?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/coleleavitt",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-02-07T07:22:30Z",
      "updated_at": "2026-02-09T21:10:29Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Problem\n\nMonitors connected via USB-C dock (Lenovo ThinkPad USB-C Dock Gen 2) intermittently fail to activate on boot or dock reconnection. One or both external monitors stay dark permanently until the dock is re-plugged.\n\n## Root Cause\n\nThe failure is caused by a timing race between the kernel DRM subsystem and EDID firmware negotiation:\n\n1. USB-C dock DP alt-mode + MST link negotiation takes hundreds of milliseconds\n2. Kernel reports connector as `State::Connected` **before** EDID is read → `connector.modes()` returns empty\n3. `pick_mode()` returns `None` → `connector_connected()` skips activation with \"no mode\"\n4. Smithay's `ConnectorScanner` treats `(Connected, Connected)` as a no-op — subsequent scans do not re-emit events for already-connected connectors even when modes become available\n5. The connector is stuck in a permanent dead state\n\nWhether activation succeeds depends entirely on whether EDID is ready before the first scan completes, making the bug **intermittent**.\n\n## Upstream Root Cause\n\nThe underlying issue is in smithay's `ConnectorScanner` (`smithay-drm-extras`), which does not detect mode-list changes on already-connected connectors:\n\n- **Smithay issue**: Smithay/smithay#1922\n- **Smithay PR**: Smithay/smithay#1923\n\n## Workaround (implemented)\n\nPR #3409 adds a bounded rescan timer in `backend/tty.rs`:\n- After `device_changed()` processes connectors, `schedule_rescan_if_needed()` checks for connected-but-unactivated connectors\n- If found, schedules a 2-second delayed rescan (up to 3 retries)\n- This gives the kernel time to complete EDID reads\n\nThis workaround is valuable even after the smithay fix lands, because it handles the case where **no** subsequent udev event fires at all.\n\n## Hardware\n\n- **Laptop**: ThinkPad P16 Gen 3\n- **GPU**: NVIDIA RTX PRO 4000 (nvidia-drm 590.48.01, kernel-open), Intel iGPU (i915)\n- **Dock**: Lenovo ThinkPad USB-C Dock Gen 2\n- **Monitors**: Two LEN S27q-10 (2560x1440@60Hz) — one HDMI, one DP MST\n- **Kernel**: 6.19.0-rc8\n\n## Cross-Compositor Analysis\n\n| Compositor | EDID Race Handling |\n|------------|-------------------|\n| **Mutter** | 3-second debounce timer per connector + mode-change detection → full reload |\n| **wlroots** | No retry — accepts connected+empty-modes, relies on udev events |\n| **KWin** | `isConnected()` requires non-empty modes — connected+no-modes treated as disconnected; no retry |\n| **niri (with PR #3409)** | Bounded rescan timer: 3 retries × 2s delay |\n\n## Related\n\n- #869 — Crash/Freeze when plugging in monitor via USB-C dock\n- #2691 — niri not recognizing all displays\n- #676 — Race with kanshi loses output configuration",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3410/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3403",
      "id": 3906876543,
      "node_id": "I_kwDOKFkxdc7o3jR_",
      "number": 3403,
      "title": "natural-scroll having no effect",
      "user": {
        "login": "Maxi98se",
        "id": 84186509,
        "node_id": "MDQ6VXNlcjg0MTg2NTA5",
        "avatar_url": "https://avatars.githubusercontent.com/u/84186509?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Maxi98se",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2026-02-06T13:51:19Z",
      "updated_at": "2026-02-11T13:55:12Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "the natural-scroll parameter in niri.kld has no effect. the rest of the touchpad parameters work.\n\n<details><summary>Config</summary>\n\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://yalter.github.io/niri/Configuration:-Introduction\n\n\nprefer-no-csd\n\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            // layout \"us,ru\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n\n            // If this section is empty, niri will fetch xkb settings\n            // from org.freedesktop.locale1. You can control these using\n            // localectl set-x11-keymap.\n        }\n\n        // Enable numlock on startup, omitting this setting disables it.\n        // numlock\n        repeat-delay 200\n        repeat-rate 35\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    // All commented-out settings here are examples, not defaults.\n    touchpad {\n        // off\n        tap\n        // dwt\n        dwtp\n        // drag false\n        // drag-lock\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // scroll-button-lock\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\ncursor {\n    xcursor-theme \"Adwaita\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\noutput \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@59.999\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=0 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 8\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        //off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 1.5\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        //active-color \"#7fc8ff\"\n        active-color \"#c4c5c2\"\n\n        // Color of the ring on inactive monitors.\n        //\n        // The focus ring only draws around the active window, so the only place\n        // where you can see its inactive-color is on other monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#c7ff7f\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#9b0000\"\n\n        // Gradients can use a few different interpolation color spaces.\n        // For example, this is a pastel rainbow gradient via in=\"oklch longer hue\".\n        //\n        // active-gradient from=\"#e5989b\" to=\"#ffb4a2\" angle=45 relative-to=\"workspace-view\" in=\"oklch longer hue\"\n\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        //\n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        //\n        draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\n//gui-apps/wlogoutspawn-sh-at-startup \"qs -c ~/.config/quickshell/noctalia-shell\"\n// spawn-sh-at-startup \"swaybg -i ~/Pictures/Wallpaper/LinuxLVDS.jpg\"\nspawn-at-startup \"/usr/libexec/polkit-mate-authentication-agent-1\"\nspawn-sh-at-startup \"wal -R\"\nspawn-at-startup \"xwayland-satellite\"\nspawn-sh-at-startup \"waybar\"\nenvironment {\n    DISPLAY \":0\"\n}\n\n// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:\n// spawn-sh-at-startup \"qs -c ~/source/qs/MyAwesomeShell\"\n\nhotkey-overlay {\n    // Uncomment this line to disable the \"Important Hotkeys\" pop-up at startup.\n    skip-at-startup\n}\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://yalter.github.io/niri/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\nwindow-rule {\n    geometry-corner-radius 8 \n    clip-to-geometry true\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+Return hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"alacritty\"; }\n    Mod+D hotkey-overlay-title=\"Run an Application: wofi\" { spawn-sh \"wofi --show drun -n\"; }\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\n    Mod+Shift+Return hotkey-overlay-title=\"Open a File Manager: Thunar\" { spawn \"thunar\"; }\n\n    // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.\n    // For example, this is a standard bind to toggle the screen reader (orca).\n    Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\n\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"amixer -D pulse sset Master 10%+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"amixer -D pulse sset Master 10%-\"; }\n    //XF86AudioRaiseVolume+Shift allow-when-locked=true { spawn-sh \"amixer -D pulse sset Capture 10%+\"; }\n    //XF86AudioLowerVolume+Shift allow-when-locked=true { spawn-sh \"amixer -D pulse sset Capture 10%-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"amixer -D pulse set Master 1+ toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"amixer -D pulse set Capture 1+ toggle\"; }\n\n    // Example brightness key mappings for brightnessctl.\n    // You can use regular spawn with multiple arguments too (to avoid going through \"sh\"),\n    // but you need to manually put each argument in separate \"\" quotes.\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"+10%\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"10%-\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+O repeat=false { toggle-overview; }\n\n    Mod+Q repeat=false { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    // Cycling through the presets in reverse order is also possible.\n    // Mod+R { switch-preset-column-width-back; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n\n\n</details> \n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (b35bcae)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Gentoo\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3403/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3401",
      "id": 3905703548,
      "node_id": "I_kwDOKFkxdc7ozE58",
      "number": 3401,
      "title": "Unnecessary tile size recalculation on parent window when child dialog opens, causes Chromium child windows to close",
      "user": {
        "login": "feng-yifan",
        "id": 15028843,
        "node_id": "MDQ6VXNlcjE1MDI4ODQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/15028843?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/feng-yifan",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187133,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI4_Q",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:layout",
          "name": "area:layout",
          "color": "fbca04",
          "default": false,
          "description": "Columns, workspaces, scrolling, fullscreen, resize"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2026-02-06T09:07:30Z",
      "updated_at": "2026-02-25T07:35:55Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen a child window/dialog opens in a Chromium-based application (Microsoft Edge), Niri recalculates the parent window's tile size unnecessarily. This causes the parent window geometry to change, which results in the immediate closure of the child window.\n\n### Reproduction Steps\n\n1. Open Microsoft Edge (Chromium-based, running natively on Wayland)\n2. Navigate to any webpage\n3. Press `Ctrl+H` to open History (or open any other internal dialog like Settings)\n4. **Move the mouse cursor onto the History popup window so it gains focus**\n5. Observe: The History popup appears briefly, then immediately closes\n6. Simultaneously, the main Edge window visibly shifts/jitters\n\n### Expected Behavior\n\n- The History popup should remain open and functional\n- The parent window should not change size or position when a child dialog opens\n\n### Actual Behavior\n\n- The History popup opens and immediately closes after focused\n- The parent window visibly shifts left then back (jitter)\n\n### Debug Information\n\nI captured Niri's IPC events during the reproduction. Here are the relevant events:\n\n```json\n// 1. History dialog opens (id: 266)\n{\"WindowOpenedOrChanged\":{\"window\":{\"id\":266,\"title\":\"\",\"app_id\":\"\",\"pid\":7542,\"workspace_id\":5,\"is_focused\":true,...}}}\n\n// 2. Parent window (id: 20, Edge) tile size CHANGES from 1440x2524 to 1432x2516\n{\"WindowLayoutsChanged\":{\"changes\":[[21,{\"pos_in_scrolling_layout\":[3,1],\"tile_size\":[1432.0,2516.0],\"window_size\":[1432,2516],...}]]}}\n\n// 3. Focus moves back to parent window\n{\"WindowFocusChanged\":{\"id\":20}}\n\n// 4. Parent window tile size CHANGES BACK from 1432x2516 to 1440x2524\n{\"WindowLayoutsChanged\":{\"changes\":[[21,{\"pos_in_scrolling_layout\":[2,1],\"tile_size\":[1440.0,2524.0],\"window_size\":[1440,2524],...}]]}}\n\n// 5. History dialog closes\n{\"WindowClosed\":{\"id\":266}}\n```\n\nKey Observations:\n- The parent window's tile width changes from 1440 → 1432 → 1440 (8 pixel difference)\n- The issue only manifests when the parent window has been maximized with maximize-window-to-edges\n\nEnvironment\n\n- OS: Arch Linux (rolling)\n- Niri version: niri 25.11 (b35bcae)\n- Compositor: Wayland\n- Application: Microsoft Edge (Chromium-based, running on Wayland natively)\n- Monitor setup: 3 displays with mixed orientations\n\nOutput configuration (outputs.kdl):\n\n```\noutput \"DP-3\" {\n    mode \"2560x1440@143.998\"\n    scale 1\n    position x=1440 y=350\n}\n\noutput \"HDMI-A-1\" {\n    mode \"2560x1440@59.951\"\n    scale 1\n    transform \"90\"\n    position x=0 y=0\n}\n\noutput \"DP-2\" {\n    mode \"2560x1440@59.951\"\n    scale 1\n    transform \"270\"\n    position x=4000 y=0\n}\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3401/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3384",
      "id": 3891580306,
      "node_id": "I_kwDOKFkxdc7n9M2S",
      "number": 3384,
      "title": "NVIDIA - Black screen / artifacts after waking from suspend",
      "user": {
        "login": "0PandaDEV",
        "id": 70103896,
        "node_id": "MDQ6VXNlcjcwMTAzODk2",
        "avatar_url": "https://avatars.githubusercontent.com/u/70103896?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/0PandaDEV",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187240,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5aA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/nvidia",
          "name": "nvidia",
          "color": "76b900",
          "default": false,
          "description": "NVIDIA issues"
        },
        "1": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 16,
      "created_at": "2026-02-03T14:33:50Z",
      "updated_at": "2026-02-19T23:57:48Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "After suspending and waking the system, displays remain black or show artifacts. SSH access confirms niri is still running but unable to restore display output.\n\nDRM page flip errors on resume:\n```\nFeb 03 15:05:19 PandaDEV niri[2265]: 2026-02-03T14:05:19.410093Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: DRM access error: Page flip commit failed on device `Some(\"/dev/dri/card0\")` (Invalid argument (os error 22))\n```\n\nSuspend/resume cycle completes successfully:\n```\nFeb 03 15:05:18 PandaDEV systemd[1]: Starting System Suspend...\nFeb 03 15:05:18 PandaDEV systemd-sleep[5022]: Performing sleep operation 'suspend'...\nFeb 03 15:05:18 PandaDEV kernel: PM: suspend entry (deep)\nFeb 03 15:05:19 PandaDEV kernel: PM: suspend exit\nFeb 03 15:05:19 PandaDEV systemd[1]: Finished System Suspend.\nFeb 03 15:05:19 PandaDEV niri[2265]: 2026-02-03T14:05:19.330278Z DEBUG niri::backend::tty: resuming session\nFeb 03 15:05:19 PandaDEV niri[2265]: 2026-02-03T14:05:19.370091Z DEBUG niri::backend::tty: device changed: 57856\n```\n\nKernel parameters:\n```\nnvidia_drm.modeset=1 nvidia_drm.fbdev=1\n```\n\nModule options (`/etc/modprobe.d/nvidia-suspend.conf`):\n```\noptions nvidia NVreg_PreserveVideoMemoryAllocations=0\n```\n\nI did not have this problem before on the exact same machine with hyprland. The only workaround is to kill niri and log back in.\n\nThis is only one outcome of the 2 I have observed so far sometimes the wake-up works without any problems, but I get weird, strange artifacts all over my screen:\n\n<img width=\"492\" height=\"254\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/40932024-44e7-4e41-b719-a1b29e9ed5e3\" />\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (b35bcae)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux (6.18.8-lqx1)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: RTX 3060\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel i5-13400F\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3384/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3364",
      "id": 3881153375,
      "node_id": "I_kwDOKFkxdc7nVbNf",
      "number": 3364,
      "title": "Problem with the middle mouse scroll button on apps like Blender and Godot.",
      "user": {
        "login": "Crysthamus",
        "id": 207592486,
        "node_id": "U_kgDODF-cJg",
        "avatar_url": "https://avatars.githubusercontent.com/u/207592486?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Crysthamus",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        },
        "1": {
          "id": 10168187447,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI6Nw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:smithay",
          "name": "not niri:smithay",
          "color": "bbbbbb",
          "default": false,
          "description": "Smithay issues"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2026-02-01T04:28:04Z",
      "updated_at": "2026-02-10T05:57:23Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Pressing the scroll wheel down button and holding it down to orbit (both in blender and godot), causes it to unexpectedly pause at random moments. This issue does not happen on hyprland with the same mouse/CPU/ and power settings.\n\nIts a bit easy to miss, but you can see the mouse teleporting? and the orbit stopping.\nhttps://streamable.com/7jvrpl (Blender) <- Orbit Stops multiple times.\nhttps://streamable.com/63p4ex (Godot) <- \"Orbit\" stops working right before the video ends.\n\nAfter the pause, it starts working again a second later while the mouse wheel button is pressed. \nIdk if this matters or not, but I am on a laptop that has a trackpad, however I am using an external mouse.\n<details><summary>Config</summary>\n\n```kdl\ninclude \"keybinds.kdl\"\ninclude \"processes.kdl\"\n\nprefer-no-csd\n\nlayer-rule {\n\tplace-within-backdrop true\n}\n\ncursor {\n    xcursor-theme \"Bibata-Modern-Classic\"\n    xcursor-size 20\n}\n\nhotkey-overlay {\n    skip-at-startup\n    hide-not-bound\n}\n\nenvironment {\n    GTK_THEME \"AyuArc\"\n    QT_QPA_PLATFORM \"wayland\"\n    SDL_VIDEODRIVER \"wayland\"\n    CLUTTER_BACKEND \"wayland\"\n    ELECTRON_OZONE_PLATFORM_HINT \"auto\"\n    EDITOR \"nvim\"\n}\n\n\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            // layout \"us,ru\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n\n            // If this section is empty, niri will fetch xkb settings\n            // from org.freedesktop.locale1. You can control these using\n            // localectl set-x11-keymap.\n        }\n\n        // Enable numlock on startup, omitting this setting disables it.\n        numlock\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    // All commented-out settings here are examples, not defaults.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        // drag false\n        // drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // scroll-button-lock\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n/-output \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1200@60\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 2\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=1280 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 12\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n    background-color \"transparent\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 2\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#39BAE6\"\n\n        // Color of the ring on inactive monitors.\n        //\n        // The focus ring only draws around the active window, so the only place\n        // where you can see its inactive-color is on other monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#c7ff7f\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#9b0000\"\n\n        // Gradients can use a few different interpolation color spaces.\n        // For example, this is a pastel rainbow gradient via in=\"oklch longer hue\".\n        //\n        // active-gradient from=\"#e5989b\" to=\"#ffb4a2\" angle=45 relative-to=\"workspace-view\" in=\"oklch longer hue\"\n\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        //\n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        //\n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\nspawn-at-startup \"waybar\"\n\n// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:\n// spawn-sh-at-startup \"qs -c ~/source/qs/MyAwesomeShell\"\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/data/screenshots/%Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://yalter.github.io/niri/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n```\n\n</details> \n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (b35bcae)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Archlinux (6.18.7-zen1-1-zen, also happens with the default kernel.)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: iGPU\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:   Intel(R) Core(TM) Ultra 7 255H\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3364/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3343",
      "id": 3872334702,
      "node_id": "I_kwDOKFkxdc7mzyNu",
      "number": 3343,
      "title": "Focus ring clipped at screen edge on scrollable layouts with fractional scaling",
      "user": {
        "login": "1jehuang",
        "id": 94247773,
        "node_id": "U_kgDOBZ4bXQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/94247773?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/1jehuang",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187133,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI4_Q",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:layout",
          "name": "area:layout",
          "color": "fbca04",
          "default": false,
          "description": "Columns, workspaces, scrolling, fullscreen, resize"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2026-01-29T19:54:21Z",
      "updated_at": "2026-02-10T06:03:38Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When using fractional scaling (1.75x in my case), the focus ring gets clipped at the screen edge on scrollable layouts, even when struts are set to match the focus ring width.\n\n## Steps to reproduce\n1. Use a display with fractional scaling (e.g., 1.75x)\n2. Set focus ring width and struts to the same value (e.g., 0.5px or 0.58px)\n3. Open 3 terminal windows at 25% width each\n4. Open a 4th terminal at 50% width (total now exceeds 100%, layout becomes scrollable)\n5. Focus the 50% window so it scrolls to the right edge\n\n## Expected\nFocus ring draws fully on all sides\n\n## Actual\nFocus ring is clipped on the right side\n\n## Workaround\nSetting both focus ring width and struts to 1px (which rounds to 2 physical pixels at 1.75x scale) works correctly.\n\n## Analysis\nIt appears the struts and focus ring are being rounded to physical pixels independently, causing misalignment at fractional scales. Non-scrollable layouts (e.g., 4×25% = exactly 100%) and `maximize-column` work correctly.\n\n## System info\n- niri version: 25.11 (b35bcae)\n- Scale: 1.75\n- Resolution: 2880x1800 (logical: 1645x1028)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3343/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3295",
      "id": 3839977634,
      "node_id": "I_kwDOKFkxdc7k4Wii",
      "number": 3295,
      "title": "Video memory/GTT climbs when screens powered off",
      "user": {
        "login": "exodist",
        "id": 73914,
        "node_id": "MDQ6VXNlcjczOTE0",
        "avatar_url": "https://avatars.githubusercontent.com/u/73914?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/exodist",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10174812927,
          "node_id": "LA_kwDOKFkxdc8AAAACXndS_w",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/kind:leak",
          "name": "kind:leak",
          "color": "d93f0b",
          "default": false,
          "description": "Memory and VRAM leaks"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 15,
      "created_at": "2026-01-21T20:48:36Z",
      "updated_at": "2026-02-28T19:39:21Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Video memory/GTT climb at a rate of up to ~20mb a second when screens are powered off, eventually consuming all system memory (unified memory system, video and system ram are completely shared)\n\nThis happens whenvever I lock my screen, but it also happens when I run `niri msg action power-off-monitors`. I can run amdgpu_top in an ssh from another machine and watch as the memory usage just keeps climbing. First it uses all available vram, then it switches to gtt.\n\nWhen I unlock the system, or move my mouse to turn monitors back on the memory all gets freed.\n\n<details><summary>Config</summary>\n\nconfig.kdl:\n```\ninput {\n    keyboard {\n        numlock\n    }\n\n    touchpad {\n        tap\n        natural-scroll\n        disabled-on-external-mouse\n    }\n\n    trackpoint {\n        off\n    }\n\n    focus-follows-mouse max-scroll-amount=\"30%\"\n}\n\noutput \"Samsung Display Corp. 0x41B3 0x0000FFA1\" {\n    mode \"1920x1200@120.001\"\n    scale 1\n    transform \"normal\"\n    position x=6560 y=0\n    variable-refresh-rate on-demand=true\n\n    hot-corners {\n        off\n    }\n\n    layout {\n        always-center-single-column\n        gaps 16\n        center-focused-column \"never\"\n        preset-column-widths {\n            proportion 1.0\n            proportion 0.5\n        }\n\n        preset-window-heights {\n            proportion 1.0\n            proportion 0.5\n        }\n\n        default-column-width { proportion 1.0; }\n    }\n}\n\noutput \"Dell Inc. DELL U4025QW 72RVC34\" {\n    modeline 1485.0  5120 5284 5372 5500  2160 2168 2178 2250 \"+hsync\" \"+vsync\"\n    mode \"5120x2160@120\"\n    scale 1\n    transform \"normal\"\n    position x=1440 y=0\n    variable-refresh-rate on-demand=true\n\n    focus-at-startup\n\n    hot-corners {\n        off\n    }\n\n    layout {\n        always-center-single-column\n        gaps 16\n        center-focused-column \"never\"\n        preset-column-widths {\n            proportion 0.5\n            proportion 1.0\n        }\n\n        preset-window-heights {\n            proportion 1.0\n            proportion 0.5\n        }\n\n        default-column-width { proportion 0.5; }\n\n        struts {\n            top 256\n            bottom 32\n            left 512\n            right 64\n        }\n    }\n}\n\noutput \"Dell Inc. DELL P2415Q G3D7F0410KHB\" {\n    mode \"2560x1440\"\n    scale 1\n    transform \"270\"\n    position x=0 y=0\n\n    hot-corners {\n        off\n    }\n\n    layout {\n        always-center-single-column\n        gaps 16\n        struts {\n            top 4\n            bottom 4\n            left 4\n            right 4\n        }\n   }\n}\n\nlayout {\n    gaps 16\n\n    center-focused-column \"never\"\n\n    preset-column-widths {\n        proportion 0.33333\n        proportion 0.5\n        proportion 1.0\n    }\n\n    default-column-width { proportion 1.0; }\n\n\n    focus-ring {\n        off\n        width 4\n        active-color \"#7fc8ff\"\n        inactive-color \"#505050\"\n    }\n\n    border {\n        width 4\n        active-gradient   from=\"#408090\" to=\"4080FF\" angle=30\n        inactive-gradient from=\"#101030\" to=\"1010A0\" angle=30\n        urgent-gradient   from=\"#FF5050\" to=\"FFA0A0\" angle=30\n    }\n\n    shadow {\n        softness 30\n        spread 5\n        offset x=0 y=5\n        color \"#0007\"\n    }\n}\n\nspawn-at-startup \"/usr/lib/polkit-kde-authentication-agent-1\"\nspawn-at-startup \"/usr/bin/kdeconnectd\"\nspawn-at-startup \"/home/exodist/bin/exo-dock2\"\n\nhotkey-overlay {\n    skip-at-startup\n}\n\nprefer-no-csd\n\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\nlayer-rule {\n    match namespace=\"waybar\"\n    match at-startup=true\n    opacity 0.99 // this fixes the black fill\n}\n\nwindow-rule {\n    match app-id=\"MissionCenter\"\n    open-floating true\n    open-focused false\n    default-column-width { fixed 1432; }\n    default-window-height { proportion 0.33333; }\n    default-floating-position x=0 y=0 relative-to=\"top-left\"\n    open-on-output \"Dell Inc. DELL P2415Q G3D7F0410KHB\"\n}\n\nwindow-rule {\n    match app-id=\"dmesgterm\"\n    open-floating true\n    open-focused false\n    default-column-width { fixed 1432; }\n    default-window-height { proportion 0.332; }\n    default-floating-position x=0 y=854 relative-to=\"top-left\"\n    open-on-output \"Dell Inc. DELL P2415Q G3D7F0410KHB\"\n}\n\nwindow-rule {\n    match app-id=\"btopterm\"\n    open-floating true\n    open-focused false\n    default-column-width { fixed 1432; }\n    default-window-height { proportion 0.33333; }\n    default-floating-position x=0 y=0 relative-to=\"bottom-left\"\n    open-on-output \"Dell Inc. DELL P2415Q G3D7F0410KHB\"\n}\n\nworkspace \"main\" {\n    open-on-output \"Dell Inc. DELL U4025QW 72RVC34\"\n}\n\nworkspace \"chat\" {\n    open-on-output \"Dell Inc. DELL U4025QW 72RVC34\"\n}\n\nworkspace \"gsg\" {\n    open-on-output \"Dell Inc. DELL U4025QW 72RVC34\"\n}\n\nwindow-rule {\n    match app-id=\"Slack\"\n    match app-id=\"IRCCloud\"\n    match app-id=\"discord\"\n    match app-id=\"signal\"\n    match app-id=\"Element\"\n    open-on-output \"Dell Inc. DELL U4025QW 72RVC34\"\n    open-on-workspace \"chat\"\n    default-column-width { proportion 0.5; }\n}\n\nwindow-rule {\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    match app-id=\"weztermfloat\"\n    match app-id=\"weztermtile\"\n    default-column-width {}\n}\n\nwindow-rule {\n    match app-id=\"weztermfloat\"\n    match app-id=\"kittyfloat\"\n    open-floating true\n}\n\nwindow-rule {\n    match app-id=\"kittytop\"\n    open-floating true\n\n    default-column-width { proportion 1.0; }\n    default-window-height { fixed 256; }\n    default-floating-position x=0 y=0 relative-to=\"top-left\"\n    open-on-output \"Dell Inc. DELL U4025QW 72RVC34\"\n}\n\nwindow-rule {\n    match app-id=\"kittymain\"\n    open-floating false\n    open-on-output \"Dell Inc. DELL U4025QW 72RVC34\"\n}\n\nwindow-rule {\n    match app-id=\"firefox\"\n    open-on-output \"Dell Inc. DELL U4025QW 72RVC34\"\n}\n\nwindow-rule {\n    match app-id=r#\"firefox$\"# title=r#\"YouTube\"#\n    open-floating true\n}\n\nwindow-rule {\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\nwindow-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nbinds {\n    // Removed for brevity\n}\n\noverview {\n    backdrop-color \"#000000\"\n}\n\ninclude \"dms/cursor.kdl\"\n\n```\n\n</details> \n\n### System Information\n\n* niri version: niri 25.11 (v25.11-94-gd7184a04)\n* Distro: Arch Linux x86_64\n* GPU: AMD Radeon 8060S Graphics [Integrated]\n* CPU:AMD RYZEN AI MAX+ PRO 395 (32) @ 5.19 GHz\n\n\n```\nexodist@abydos\n--------------\nOS: Arch Linux x86_64\nHost: HP ZBook Ultra G1a 14 inch Mobile Workstation PC (SBKPFV3)\nKernel: Linux 6.18.6-arch1-1\nUptime: 4 hours, 1 min\nPackages: 1702 (pacman)\nShell: zsh 5.9\nDisplay (SDC41B3): 2880x1800 in 14\", 120 Hz [Built-in]\nDisplay (DELL U4025QW): 5120x2160 in 40\", 120 Hz [External]\nDisplay (DELL P2415Q): 2560x1440 in 24\", 60 Hz [External]\nWM: niri 25.11 (Wayland)\nIcons: Adwaita [GTK3/4]\nCursor: default (24px)\nTerminal: tmux 3.6a\nCPU: AMD RYZEN AI MAX+ PRO 395 (32) @ 5.19 GHz\nGPU: AMD Radeon 8060S Graphics [Integrated]\nMemory: 10.47 GiB / 121.62 GiB (9%)\nSwap: 0 B / 4.00 GiB (0%)\nDisk (/): 23.08 GiB / 925.00 GiB (2%) - btrfs\nDisk (/home): 10.90 GiB / 925.00 GiB (1%) - btrfs\nDisk (/stuff): 804.95 GiB / 1.91 TiB (41%) - btrfs\nLocal IP (enp105s0): 192.168.1.10/24\nBattery (Primary): 99% [AC Connected]\nLocale: en_US.UTF-8\n```\n\n![Image](https://github.com/user-attachments/assets/377ca495-0336-4647-88a2-620cad11fa0e)\n![Image](https://github.com/user-attachments/assets/3ae72fb8-a30d-4e5e-956e-f2694092ba5a)\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3295/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3274",
      "id": 3825726230,
      "node_id": "I_kwDOKFkxdc7kB_MW",
      "number": 3274,
      "title": "Virtual keyboard can get keys stuck",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        },
        "1": {
          "id": 10168187500,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI6bA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/waiting%20for%20upstream",
          "name": "waiting for upstream",
          "color": "5319e7",
          "default": false,
          "description": "Waiting for an upstream project"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-01-17T19:56:56Z",
      "updated_at": "2026-02-10T06:51:08Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Example: run wayvnc, then connect to it, then through VNC press Ctrl+C to terminate the wayvnc command. Then, Ctrl will get stuck, and as far as I can tell, the only way to unstick it is to connect through VNC again.\n\ncc @Bot-wxt1221, probably need to release all virtual keyboard keys when the virtual keyboard Wayland object is destroyed?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3274/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3273",
      "id": 3825620183,
      "node_id": "I_kwDOKFkxdc7kBlTX",
      "number": 3273,
      "title": "Niri 25.11 stuck when resume from off monitors on FreeBSD 15.0",
      "user": {
        "login": "Canvis-Me",
        "id": 55122738,
        "node_id": "MDQ6VXNlcjU1MTIyNzM4",
        "avatar_url": "https://avatars.githubusercontent.com/u/55122738?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Canvis-Me",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        },
        "1": {
          "id": 10168191459,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJ4w",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:session",
          "name": "area:session",
          "color": "fbca04",
          "default": false,
          "description": "Screen locking, idle inhibit, suspend/resume"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2026-01-17T18:25:56Z",
      "updated_at": "2026-02-10T22:33:17Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Niri 25.11 stuck when resume from off monitors on FreeBSD 15.0.\nWith mouse move after `niri msg action power-off-monitors`, the whole\nmonitors show an overview with cursor icon. However, niri cannot respond\nto keyboard and mouse. Have to kill the process from ssh. Don't know how\nto collect niri logs, I'd like to provide it if would help.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n<details><summary>Config</summary>\n\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\nkeyboard {\nxkb {\n// You can set rules, model, layout, variant and options.\n// For more information, see xkeyboard-config(7).\n\n// For example:\nlayout \"us\"\n// options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n}\n}\n\n// Next sections include libinput settings.\n// Omitting settings disables them, or leaves them at their default values.\n/-touchpad {\n// off\ntap\n// dwt\n// dwtp\n// drag-lock\nnatural-scroll\n// accel-speed 0.2\n// accel-profile \"flat\"\n// scroll-method \"two-finger\"\n// disabled-on-external-mouse\n}\n\nmouse {\n// on\n// natural-scroll\n// accel-speed 0.2\n// accel-profile \"flat\"\n// scroll-method \"no-scroll\"\n}\n\ntrackpoint {\n// off\n// natural-scroll\n// accel-speed 0.2\n// accel-profile \"flat\"\n// scroll-method \"on-button-down\"\n// scroll-button 273\n// middle-emulation\n}\n\n// Uncomment this to make the mouse warp to the center of newly focused windows.\n// warp-mouse-to-focus\n\n// Focus windows and outputs automatically when moving the mouse into them.\n// Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n// focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n/-output \"eDP-1\" {\n// Uncomment this line to disable this output.\n// off\n\n// Resolution and, optionally, refresh rate of the output.\n// The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n// If the refresh rate is omitted, niri will pick the highest refresh rate\n// for the resolution.\n// If the mode is omitted altogether or is invalid, niri will pick one automatically.\n// Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\nmode \"1920x1080@120.030\"\n\n// You can use integer or fractional scale, for example use 1.5 for 150% scale.\nscale 2\n\n// Transform allows to rotate the output counter-clockwise, valid values are:\n// normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\ntransform \"normal\"\n\n// Position of the output in the global coordinate space.\n// This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n// The cursor can only move between directly adjacent outputs.\n// Output scale and rotation has to be taken into account for positioning:\n// outputs are sized in logical, or scaled, pixels.\n// For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n// so to put another output directly adjacent to it on the right, set its x to 1920.\n// If the position is unset or results in an overlap, the output is instead placed\n// automatically.\nposition x=1280 y=0\n}\n\noutput \"HDMI-A-1\" {\nmode \"1920x1200\"\nscale 1\ntransform \"normal\"\nposition x=0 y=0\nfocus-at-startup\n}\n\noutput \"DP-3\" {\nmode \"1024x1280\"\nscale 1\ntransform \"90\"\nposition x=1920 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n// Set gaps around windows in logical pixels.\ngaps 8\n\n// When to center a column when changing focus, options are:\n// - \"never\", default behavior, focusing an off-screen column will keep at the left\n//   or right edge of the screen.\n// - \"always\", the focused column will always be centered.\n// - \"on-overflow\", focusing a column will center it if it doesn't fit\n//   together with the previously focused column.\ncenter-focused-column \"never\"\n\n// You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\npreset-column-widths {\n// Proportion sets the width as a fraction of the output width, taking gaps into account.\n// For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n// The default preset widths are 1/3, 1/2 and 2/3 of the output.\nproportion 0.33333\nproportion 0.5\nproportion 0.66667\n\n// Fixed sets the width in logical pixels exactly.\n// fixed 1920\n}\n\n// You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n// preset-window-heights { }\n\n// You can change the default width of the new windows.\ndefault-column-width { proportion 0.5; }\n// If you leave the brackets empty, the windows themselves will decide their initial width.\n// default-column-width {}\n\n// By default focus ring and border are rendered as a solid background rectangle\n// behind windows. That is, they will show up through semitransparent windows.\n// This is because windows using client-side decorations can have an arbitrary shape.\n//\n// If you don't like that, you should uncomment `prefer-no-csd` below.\n// Niri will draw focus ring and border *around* windows that agree to omit their\n// client-side decorations.\n//\n// Alternatively, you can override it with a window rule called\n// `draw-border-with-background`.\n\n// You can change how the focus ring looks.\n/-focus-ring {\n// Uncomment this line to disable the focus ring.\noff\n\n// How many logical pixels the ring extends out from the windows.\nwidth 4\n\n// Colors can be set in a variety of ways:\n// - CSS named colors: \"red\"\n// - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n// - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n// Color of the ring on the active monitor.\nactive-color \"#7fc8ff\"\n\n// Color of the ring on inactive monitors.\ninactive-color \"#505050\"\n\n// You can also use gradients. They take precedence over solid colors.\n// Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n// The angle is the same as in linear-gradient, and is optional,\n// defaulting to 180 (top-to-bottom gradient).\n// You can use any CSS linear-gradient tool on the web to set these up.\n// Changing the color space is also supported, check the wiki for more info.\n//\n// active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\n\n// You can also color the gradient relative to the entire view\n// of the workspace, rather than relative to just the window itself.\n// To do that, set relative-to=\"workspace-view\".\n//\n// inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n}\n\n// You can also add a border. It's similar to the focus ring, but always visible.\n/-border {\n// The settings are the same as for the focus ring.\n// If you enable the border, you probably want to disable the focus ring.\noff\n\nwidth 4\nactive-color \"#ffc87f\"\ninactive-color \"#505050\"\n\n// active-gradient from=\"#ffbb66\" to=\"#ffc880\" angle=45 relative-to=\"workspace-view\"\n// inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n}\n\n// You can enable drop shadows for windows.\n/-shadow {\n// Uncomment the next line to enable shadows.\n// on\n\n// By default, the shadow draws only around its window, and not behind it.\n// Uncomment this setting to make the shadow draw behind its window.\n//\n// Note that niri has no way of knowing about the CSD window corner\n// radius. It has to assume that windows have square corners, leading to\n// shadow artifacts inside the CSD rounded corners. This setting fixes\n// those artifacts.\n//\n// However, instead you may want to set prefer-no-csd and/or\n// geometry-corner-radius. Then, niri will know the corner radius and\n// draw the shadow correctly, without having to draw it behind the\n// window. These will also remove client-side shadows if the window\n// draws any.\n//\n// draw-behind-window true\n\n// You can change how shadows look. The values below are in logical\n// pixels and match the CSS box-shadow properties.\n\n// Softness controls the shadow blur radius.\nsoftness 30\n\n// Spread expands the shadow.\nspread 5\n\n// Offset moves the shadow relative to the window.\noffset x=0 y=5\n\n// You can also change the shadow color and opacity.\ncolor \"#0007\"\n}\n\n// Struts shrink the area occupied by windows, similarly to layer-shell panels.\n// You can think of them as a kind of outer gaps. They are set in logical pixels.\n// Left and right struts will cause the next window to the side to always be visible.\n// Top and bottom struts will simply add outer gaps in addition to the area occupied by\n// layer-shell panels and regular gaps.\nstruts {\n// left 64\n// right 64\n// top 64\n// bottom 64\n}\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// spawn-at-startup \"swayidle\" \"-w\" \"timeout\" \"20\" \"niri msg action power-off-monitors\"\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\nprefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n// Uncomment to turn off all animations.\n// off\n\n// Slow down all animations by this factor. Values below 1 speed them up instead.\n// slowdown 3.0\n}\n\ncursor {\n// xcursor-theme \"Dracula-cursors\"\nxcursor-theme \"Bibata-Modern-Classic\"\nxcursor-size 24\nhide-when-typing\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n// This regular expression is intentionally made as specific as possible,\n// since this is the default config, and we want no false positives.\n// You can get away with just app-id=\"wezterm\" if you want.\nmatch app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\ndefault-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n// This app-id regular expression will work for both:\n// - host Firefox (app-id is \"firefox\")\n// - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\nmatch app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\nopen-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\nwindow-rule {\nmatch app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\nmatch app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\nblock-out-from \"screen-capture\"\n\n// Use this instead if you want them visible on third-party screenshot tools.\n// block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\nwindow-rule {\ngeometry-corner-radius 8\nclip-to-geometry true\n}\n\nbinds {\n// Keys consist of modifiers separated by + signs, followed by an XKB key name\n// in the end. To find an XKB name for a particular key, you may use a program\n// like wev.\n//\n// \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n// when running as a winit window.\n//\n// Most actions that you can bind here can also be invoked programmatically with\n// `niri msg action do-something`.\n\n// Mod-Shift-/, which is usually the same as Mod-?,\n// shows a list of important hotkeys.\nMod+Shift+Slash { show-hotkey-overlay; }\n\n// Suggested binds for running programs: terminal, app launcher, screen locker.\nMod+Shift+Return { spawn \"alacritty\"; }\nMod+P { spawn \"fuzzel\"; }\nSuper+Shift+Ctrl+Alt+L { spawn \"swaylock\"; }\n\n// You can also use a shell. Do this if you need pipes, multiple commands, etc.\n// Note: the entire command goes as a single argument in the end.\n// Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n// Example volume keys mappings for PipeWire & WirePlumber.\n// The allow-when-locked=true property makes them work even when the session is locked.\nXF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\nXF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\nXF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\nXF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n\nMod+Shift+C { close-window; }\n\nMod+Left  { focus-column-left; }\nMod+Down  { focus-window-down; }\nMod+Up    { focus-window-up; }\nMod+Right { focus-column-right; }\nMod+H     { focus-column-left; }\nMod+J     { focus-window-down; }\nMod+K     { focus-window-up; }\nMod+L     { focus-column-right; }\n\nMod+Shift+Left  { move-column-left; }\nMod+Shift+Down  { move-window-down; }\nMod+Shift+Up    { move-window-up; }\nMod+Shift+Right { move-column-right; }\nMod+Shift+H     { move-column-left; }\nMod+Shift+J     { move-window-down; }\nMod+Shift+K     { move-window-up; }\nMod+Shift+L     { move-column-right; }\n\n// Alternative commands that move across workspaces when reaching\n// the first or last window in a column.\n// Mod+J     { focus-window-or-workspace-down; }\n// Mod+K     { focus-window-or-workspace-up; }\n// Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n// Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\nMod+Home { focus-column-first; }\nMod+End  { focus-column-last; }\nMod+Ctrl+Home { move-column-to-first; }\nMod+Ctrl+End  { move-column-to-last; }\n\nMod+Ctrl+Left  { focus-monitor-left; }\nMod+Ctrl+Down  { focus-monitor-down; }\nMod+Ctrl+Up    { focus-monitor-up; }\nMod+Ctrl+Right { focus-monitor-right; }\nMod+Ctrl+H     { focus-monitor-left; }\nMod+Ctrl+J     { focus-monitor-down; }\nMod+Ctrl+K     { focus-monitor-up; }\nMod+Ctrl+L     { focus-monitor-right; }\n\nMod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\nMod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\nMod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\nMod+Shift+Ctrl+Right { move-column-to-monitor-right; }\nMod+Shift+Ctrl+H     { move-column-to-monitor-left; }\nMod+Shift+Ctrl+J     { move-column-to-monitor-down; }\nMod+Shift+Ctrl+K     { move-column-to-monitor-up; }\nMod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n// Alternatively, there are commands to move just a single window:\n// Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n// ...\n\n// And you can also move a whole workspace to another monitor:\n// Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n// ...\n\nMod+Page_Down      { focus-workspace-down; }\nMod+Page_Up        { focus-workspace-up; }\nMod+U              { focus-workspace-down; }\nMod+I              { focus-workspace-up; }\nMod+Ctrl+Page_Down { move-column-to-workspace-down; }\nMod+Ctrl+Page_Up   { move-column-to-workspace-up; }\nMod+Ctrl+U         { move-column-to-workspace-down; }\nMod+Ctrl+I         { move-column-to-workspace-up; }\n\n// Alternatively, there are commands to move just a single window:\n// Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n// ...\n\nMod+Shift+Page_Down { move-workspace-down; }\nMod+Shift+Page_Up   { move-workspace-up; }\nMod+Shift+U         { move-workspace-down; }\nMod+Shift+I         { move-workspace-up; }\n\n// You can bind mouse wheel scroll ticks using the following syntax.\n// These binds will change direction based on the natural-scroll setting.\n//\n// To avoid scrolling through workspaces really fast, you can use\n// the cooldown-ms property. The bind will be rate-limited to this value.\n// You can set a cooldown on any bind, but it's most useful for the wheel.\nMod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\nMod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\nMod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\nMod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\nMod+WheelScrollRight      { focus-column-right; }\nMod+WheelScrollLeft       { focus-column-left; }\nMod+Ctrl+WheelScrollRight { move-column-right; }\nMod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n// Usually scrolling up and down with Shift in applications results in\n// horizontal scrolling; these binds replicate that.\nMod+Shift+WheelScrollDown      { focus-column-right; }\nMod+Shift+WheelScrollUp        { focus-column-left; }\nMod+Ctrl+Shift+WheelScrollDown { move-column-right; }\nMod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n// Similarly, you can bind touchpad scroll \"ticks\".\n// Touchpad scrolling is continuous, so for these binds it is split into\n// discrete intervals.\n// These binds are also affected by touchpad's natural-scroll, so these\n// example binds are \"inverted\", since we have natural-scroll enabled for\n// touchpads by default.\n// Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n// Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n// You can refer to workspaces by index. However, keep in mind that\n// niri is a dynamic workspace system, so these commands are kind of\n// \"best effort\". Trying to refer to a workspace index bigger than\n// the current workspace count will instead refer to the bottommost\n// (empty) workspace.\n//\n// For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n// will all refer to the 3rd workspace.\nMod+1 { focus-workspace 1; }\nMod+2 { focus-workspace 2; }\nMod+3 { focus-workspace 3; }\nMod+4 { focus-workspace 4; }\nMod+5 { focus-workspace 5; }\nMod+6 { focus-workspace 6; }\nMod+7 { focus-workspace 7; }\nMod+8 { focus-workspace 8; }\nMod+9 { focus-workspace 9; }\nMod+Ctrl+1 { move-column-to-workspace 1; }\nMod+Ctrl+2 { move-column-to-workspace 2; }\nMod+Ctrl+3 { move-column-to-workspace 3; }\nMod+Ctrl+4 { move-column-to-workspace 4; }\nMod+Ctrl+5 { move-column-to-workspace 5; }\nMod+Ctrl+6 { move-column-to-workspace 6; }\nMod+Ctrl+7 { move-column-to-workspace 7; }\nMod+Ctrl+8 { move-column-to-workspace 8; }\nMod+Ctrl+9 { move-column-to-workspace 9; }\n\n// Alternatively, there are commands to move just a single window:\n// Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n// Switches focus between the current and the previous workspace.\n// Mod+Tab { focus-workspace-previous; }\n\n// The following binds move the focused window in and out of a column.\n// If the window is alone, they will consume it into the nearby column to the side.\n// If the window is already in a column, they will expel it out.\nMod+BracketLeft  { consume-or-expel-window-left; }\nMod+BracketRight { consume-or-expel-window-right; }\n\n// Consume one window from the right to the bottom of the focused column.\nMod+Comma  { consume-window-into-column; }\n// Expel the bottom window from the focused column to the right.\nMod+Period { expel-window-from-column; }\n\nMod+R { switch-preset-column-width; }\nMod+Shift+R { switch-preset-window-height; }\nMod+Ctrl+R { reset-window-height; }\nMod+F { maximize-column; }\nMod+Shift+F { fullscreen-window; }\n\n// Expand the focused column to space not taken up by other fully visible columns.\n// Makes the column \"fill the rest of the space\".\n// Mod+Ctrl+F { expand-column-to-available-width; }\n\nMod+C { center-column; }\n\n// Finer width adjustments.\n// This command can also:\n// * set width in pixels: \"1000\"\n// * adjust width in pixels: \"-5\" or \"+5\"\n// * set width as a percentage of screen width: \"25%\"\n// * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n// set-column-width \"100\" will make the column occupy 200 physical screen pixels.\nMod+Minus { set-column-width \"-10%\"; }\nMod+Equal { set-column-width \"+10%\"; }\n\n// Finer height adjustments when in column with other windows.\nMod+Shift+Minus { set-window-height \"-10%\"; }\nMod+Shift+Equal { set-window-height \"+10%\"; }\n\n// Move the focused window between the floating and the tiling layout.\nMod+V       { toggle-window-floating; }\nMod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n// Toggle tabbed column display mode.\n// Windows in this column will appear as vertical tabs,\n// rather than stacked on top of each other.\n// Mod+W { toggle-column-tabbed-display; }\n\n// Actions to switch layouts.\n// Note: if you uncomment these, make sure you do NOT have\n// a matching layout switch hotkey configured in xkb options above.\n// Having both at once on the same hotkey will break the switching,\n// since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n// Mod+Space       { switch-layout \"next\"; }\n// Mod+Shift+Space { switch-layout \"prev\"; }\n\nPrint { screenshot; }\nCtrl+Print { screenshot-screen; }\nAlt+Print { screenshot-window; }\n\n// Applications such as remote-desktop clients and software KVM switches may\n// request that niri stops processing the keyboard shortcuts defined here\n// so they may, for example, forward the key presses as-is to a remote machine.\n// It's a good idea to bind an escape hatch to toggle the inhibitor,\n// so a buggy application can't hold your session hostage.\n//\n// The allow-inhibiting=false property can be applied to other binds as well,\n// which ensures niri always processes them, even when an inhibitor is active.\n// Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n// The quit action will show a confirmation dialog to avoid accidental exits.\nMod+Shift+Q { quit; }\nCtrl+Alt+Delete { quit; }\n\n// Powers off the monitors. To turn them back on, do any input like\n// moving the mouse or pressing any other key.\nMod+Shift+P { power-off-monitors; }\n}\n\n```\n\n</details> \n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (unknown commit) built from port x11-wm/niri\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: FreeBSD 15.0-RELEASE-p1\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD RX 7800xt\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 5900x\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3273/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3260",
      "id": 3819297962,
      "node_id": "I_kwDOKFkxdc7jpdyq",
      "number": 3260,
      "title": "Suspend action missing from cli",
      "user": {
        "login": "evysgarden",
        "id": 92547295,
        "node_id": "U_kgDOBYQo3w",
        "avatar_url": "https://avatars.githubusercontent.com/u/92547295?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/evysgarden",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191617,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJKgQ",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:ipc",
          "name": "area:ipc",
          "color": "fbca04",
          "default": false,
          "description": "niri msg, niri IPC, D-Bus, scripting"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2026-01-15T21:44:02Z",
      "updated_at": "2026-02-10T08:02:17Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "not sure if this is intended but I noticed that the suspend action is missing from the cli.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3260/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3258",
      "id": 3816255441,
      "node_id": "I_kwDOKFkxdc7jd2_R",
      "number": 3258,
      "title": "Restarting xdp-gnome can leave lingering PW casts",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191280,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJMA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:screencasting",
          "name": "area:screencasting",
          "color": "fbca04",
          "default": false,
          "description": "Screen sharing, PipeWire, screencast portal"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2026-01-15T06:53:36Z",
      "updated_at": "2026-02-10T07:08:31Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Usually the portal will tell us to stop the screencast session when the stream consumer quits, but if you restart the portal while a stream is ongoing, there's no one to tell us. So we end up with a paused PipeWire node with nobody on the other side.\n\nWe can monitor D-Bus for when the client that started the screencast session (usually the portal) disconnects and stop the screencasts then.\n\nHowever, I think it would be good to keep the screencast going even if the portal is restarted (e.g. if you're streaming portal development). So we need to also monitor PipeWire links and stop the cast when both the D-Bus client is gone, and when our PipeWire node no longer has any connection. Not sure how involved that would be.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3258/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3240",
      "id": 3802557167,
      "node_id": "I_kwDOKFkxdc7ipmrv",
      "number": 3240,
      "title": "transforms not applying on DisplayLink monitors",
      "user": {
        "login": "jusnoord",
        "id": 38820309,
        "node_id": "MDQ6VXNlcjM4ODIwMzA5",
        "avatar_url": "https://avatars.githubusercontent.com/u/38820309?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jusnoord",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-01-12T02:39:06Z",
      "updated_at": "2026-02-11T06:50:01Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I am experiencing issues similar to a comment on #2312 while using a DisplayLink monitor that has a 90 degree translation. I have quoted the comment below, as it perfectly matches the behavior I am experiencing; I don't believe this behavior was addressed in the issue, as I am on niri 25.11 (nixpkgs).  I am not sure how to troubleshoot this whatsoever, so any input would be helpful. \r\n\r\nOriginal Comment:\r\nWhile this branch does allow niri to use my two display link monitors (USB-C dock connected to laptop), there are some problems with the one I use vertically (`transform \"90\"`)\r\n\r\nThe lower part of the screen does not update unless you move the mouse within it. To be specific, its the lower 840 pixels (1920 - 1080) which suggests that something is rendering to 1920x1080 rather than 1080x1920. I have worked around this by adding a bottom struct of 840 pixels on that monitor but I would really quite like to be able to use the bottom half of the screen.\r\n\r\nI also get this when switching to the overview:\r\n<img width=\"263\" height=\"508\" alt=\"image\" src=\"https://github.com/user-attachments/assets/630dd623-516a-4c2c-bcbf-892e598d4b1a\" />\r\nWhich is presumably an artifact of the same issue. Moving the mouse on that screen will cause the screen to update and show the overview correctly (which is why I had to resort to photographing the screen rather than a screenshot).\r\n\r\nI have a second setup which doesn't use displaylink and has a vertical monitor and have no issues there.\r\n\r\n_Originally posted by @Charlie-83 in https://github.com/YaLTeR/niri/issues/2312#issuecomment-3455982127_\r\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3240/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3226",
      "id": 3798429348,
      "node_id": "I_kwDOKFkxdc7iZ26k",
      "number": 3226,
      "title": "Display Output Information Corrupted After TTY Switching and Hot-Plugging",
      "user": {
        "login": "albsch",
        "id": 38429047,
        "node_id": "MDQ6VXNlcjM4NDI5MDQ3",
        "avatar_url": "https://avatars.githubusercontent.com/u/38429047?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/albsch",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2026-01-09T21:43:34Z",
      "updated_at": "2026-02-17T17:14:26Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n\n\nbugreport\n\nI'm using multiple ttys usually and noticed an odd behavior with display disconnection:\n\n1.  Connect external displays\n2.  Log in to `tty1`, start `niri-session`, connect external displays\n3.  Switch to `tty2`\n4.  Disconnect external displays\n5.  Switch back to `tty1`\n6.  Connect external displays again\n\nResult: `niri msg outputs` displays \"Unknown Unknown Unknown\" for a display.\nIf everything still works, repeat steps 2 to 6. \nSometimes, not very often , the display disconnection is handled properly.\n\nAlso, `niri msg outputs` on `tty2` and `tty1` return different configurations (the name is different) for the same physical setup now.\n\n\n<details><summary>Corrupted on tty1</summary>\n\n```\nOutput \"AU Optronics 0x5D2D Unknown\" (eDP-1)\n  Current mode: 1920x1080 @ 60.033 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 290x170 mm\n  Logical position: 3760, 648\n  Logical size: 1920x1080\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1080@60.033 (current, preferred)\n    ...\n\nOutput \"Lenovo Group Limited L24q-10 U5V17A5C\" (DP-7)\n  Current mode: 2560x1440 @ 59.951 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 530x300 mm\n  Logical position: 1200, 300\n  Logical size: 2560x1440\n  Scale: 1\n  Transform: normal\n  Available modes:\n    2560x1440@59.951 (current, preferred)\n    ...\n\nOutput \"Unknown Unknown Unknown\" (DP-4)\n  Current mode: 1920x1200 @ 59.950 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 520x320 mm\n  Logical position: 0, 0\n  Logical size: 1200x1920\n  Scale: 1\n  Transform: 90° counter-clockwise\n  Available modes:\n    1920x1200@59.950 (current, preferred)\n    ...\n\n```\n\n\n</details>\n\n<details><summary>On working tty2</summary>\n\n```\nOutput \"AU Optronics 0x5D2D Unknown\" (eDP-1)\n  Disabled\n  Variable refresh rate: not supported\n  Physical size: 290x170 mm\n  Available modes:\n    1920x1080@60.033 (preferred)\n   ,...\n\nOutput \"HP Inc. HP E243i CNK8401J7Y\" (DP-4)\n  Current mode: 1920x1200 @ 59.950 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 520x320 mm\n  Logical position: 0, 0\n  Logical size: 1200x1920\n  Scale: 1\n  Transform: 90° counter-clockwise\n  Available modes:\n    1920x1200@59.950 (current, preferred)\n    ...\n\nOutput \"Lenovo Group Limited L24q-10 U5V17A5C\" (DP-7)\n  Current mode: 2560x1440 @ 59.951 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 530x300 mm\n  Logical position: 1200, 300\n  Logical size: 2560x1440\n  Scale: 1\n  Transform: normal\n  Available modes:\n    2560x1440@59.951 (current, preferred)\n   ...\n\n```\n\n</details>\n\nFurther, programs like `kanshi` are not able to recognize the proper display configuration anymore.\n\n\n### System Information\n* niri version: `niri 25.11 (v25.11-52-g54c2e2ab)`\n* Distro: Arch Linux 6.18.3-arch1-1\n* CPU & GPU: AMD Ryzen 4700U\n\n\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n<details><summary>Config</summary>\n\n```kdl\nbinds {\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+T hotkey-overlay-title=\"Open a Terminal: kitty\" { spawn \"kitty\"; }\n    Mod+D hotkey-overlay-title=\"Run an Application: wofi\" { spawn \"wofi\"; }\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\n\n    // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.\n    // For example, this is a standard bind to toggle the screen reader (orca).\n    // Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    // Using spawn-sh allows to pass multiple arguments together with the command.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\"; }\n\n    // Example brightness key mappings for brightnessctl.\n    // You can use regular spawn with multiple arguments too (to avoid going through \"sh\"),\n    // but you need to manually put each argument in separate \"\" quotes.\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"+10%\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"10%-\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+O repeat=false { toggle-overview; }\n\n    Mod+Q repeat=false { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    // Mod+J     { focus-window-down; }\n    // Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    // Mod+Ctrl+J     { move-window-down; }\n    // Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    Mod+J     { focus-window-or-workspace-down; }\n    Mod+K     { focus-window-or-workspace-up; }\n    Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    // Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    //Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+Right { move-workspace-to-monitor-right; }\n    //Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+H  { move-workspace-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    // Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+L { move-workspace-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    // Cycling through the presets in reverse order is also possible.\n    // Mod+R { switch-preset-column-width-back; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column \n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n\n```\n\n</details> \n\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3226/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3201",
      "id": 3780217744,
      "node_id": "I_kwDOKFkxdc7hUYuQ",
      "number": 3201,
      "title": "It's kinda easy to break cgroup tracking with spawn-sh",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191459,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJ4w",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:session",
          "name": "area:session",
          "color": "fbca04",
          "default": false,
          "description": "Screen locking, idle inhibit, suspend/resume"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2026-01-05T05:26:37Z",
      "updated_at": "2026-02-16T05:03:14Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In niri we put spawned processes into transient scopes. This is useful so systemd-oomd doesn't kill the compositor when an app runs out of memory, and generally lets the compositor have priority in scheduling over apps. Other compositors like gnome-shell do this too.\n\nA robust way to do it (and this is how `systemd-run --scope` works) is to put yourself into the scope, then exec the target program. But that's a ~7 ms toll on startup time, so in niri we spawn the program right away, and put it into a scope afterwards.\n\nHowever, if the program forks fast enough (before the transient scope is created), that child doesn't go into the scope, and remains in the niri cgroup, along with any of its further children.\n\nNormally this isn't too big a deal because programs that you spawn from niri don't generally fork right away. With `spawn-sh` however this is more or less the main mode of operation: niri spawns sh which itself forks and runs some command.\n\nThankfully, sh seems to avoid a fork when running just one command, i.e. `spawn-sh \"fuzzel\"` works fine with fuzzel ending up in the transient scope. But something like `spawn-sh \"fuzzel && sleep 10\"` will trigger the problem, with fuzzel ending up in the niri cgroup:\n\n![](https://github.com/user-attachments/assets/6650d53b-e385-463f-8892-c21e14660589)\n\n![](https://github.com/user-attachments/assets/553a3748-6447-440e-9b7d-c2d0c95877cd)\n\nI don't know if there's a robust way to fix this without the 7 ms overhead. The number comes from this unscientific benchmark:\n\n```\n$ hyperfine -w 3 --shell=none \"true\" \"systemd-run --user --scope true\"\nBenchmark 1: true\n  Time (mean ± σ):     400.2 µs ±  37.0 µs    [User: 246.9 µs, System: 103.2 µs]\n  Range (min … max):   360.8 µs … 721.8 µs    6211 runs\n\n  Warning: Statistical outliers were detected. Consider re-running this benchmark on a quiet system without any interferences from other programs. It might help to use the '--warmup' or '--prepare' options.\n\nBenchmark 2: systemd-run --user --scope true\n  Time (mean ± σ):       6.7 ms ±   0.2 ms    [User: 1.2 ms, System: 2.2 ms]\n  Range (min … max):     6.0 ms …   7.6 ms    437 runs\n\nSummary\n  true ran\n   16.69 ± 1.65 times faster than systemd-run --user --scope true\n```\n\nMaybe the overhead is actually smaller when you already have a ready D-Bus connection like we have in niri.\n\nAlso if we decide to do this waiting for `StartTransientUnit` before execing, it may require some annoying refactor of command spawning, perhaps moving away from `Command::spawn()` altogether. (Which is also needed to address https://github.com/YaLTeR/niri/issues/229.)\n\nSame issue affecting GNOME Shell: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6565",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3201/reactions",
        "total_count": 4,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 4
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3199",
      "id": 3780037836,
      "node_id": "I_kwDOKFkxdc7hTszM",
      "number": 3199,
      "title": "Getting random crashes",
      "user": {
        "login": "katanya04",
        "id": 79325830,
        "node_id": "MDQ6VXNlcjc5MzI1ODMw",
        "avatar_url": "https://avatars.githubusercontent.com/u/79325830?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/katanya04",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187358,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI53g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/kind:crash",
          "name": "kind:crash",
          "color": "d93f0b",
          "default": false,
          "description": "Crashes and panics"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2026-01-05T03:34:14Z",
      "updated_at": "2026-02-11T13:48:13Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I've been getting random crashes. Sometimes niri dies and the session closes, but I can rejoin. Sometimes the screen freezes and I have to forcefully turn off my computer, and other times the screen turns black and I have to do the same as previously. It's been happening randomly, but perhaps more specifically when I use Visual Studio Code for some time, although I'm not 100% sure if there is a direct relation.\n\n<details><summary>Config</summary>\n\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\n\nspawn-at-startup \"xwayland-satellite\"\nspawn-at-startup \"sunsetr\"\nspawn-at-startup \"~/.dotfiles/waybar/hot_waybar.sh\"\nspawn-at-startup \"swaybg\" \"-i\" \"/home/catania/Images/background.jpg\"\nenvironment {\n    DISPLAY \":0\"\n}\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            layout \"es\"\n            options \"numpad:mac\"\n        }\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        // off\n        tap\n        dwt\n        // dwtp\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n/-output \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@144.001\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 2\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=1280 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 8\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 3\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // active-gradient from=\"#ffbb66\" to=\"#ffc880\" angle=45 relative-to=\"workspace-view\"\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n// spawn-at-startup \"alacritty\" \"-e\" \"fish\"\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\nprefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Images/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\nwindow-rule {\n    geometry-corner-radius 2\n    clip-to-geometry true\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+T { spawn \"alacritty\"; }\n    Mod+D { spawn \"fuzzel\"; }\n    Super+Alt+L { spawn \"swaylock\"; }\n\n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument in the end.\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume  allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\n    XF86AudioLowerVolume  allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\n    XF86AudioMute         allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute      allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n    XF86KbdBrightnessUp   allow-when-locked=true { spawn-sh \"brightnessctl -d '*::kbd_backlight' set 1+\"; }\n    XF86KbdBrightnessDown allow-when-locked=true { spawn-sh \"brightnessctl -d '*::kbd_backlight' set 1-\"; }\n    XF86AudioPlay         allow-when-locked=true { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioPause        allow-when-locked=true { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioNext         allow-when-locked=true { spawn \"playerctl\" \"next\"; }\n    XF86AudioPrev         allow-when-locked=true { spawn \"playerctl\" \"previous\"; }\n    XF86AudioStop         allow-when-locked=true { spawn \"playerctl\" \"stop\"; }\n    XF86MonBrightnessUp   allow-when-locked=true { spawn \"brightnessctl\" \"set\" \"10%+\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"set\" \"10%-\"; }\n\n    Mod+Q { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // Consume one window from the right into the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel one window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    // There are also commands that consume or expel a single window to the side.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n    Mod+C { center-column; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n```\n\n</details> \n\n\nThe VSCode window seems to running on Wayland, xeyes doesn't \"see\" it.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (Nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS 25.11.20251206.d9bc5c7 (Xantusia)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA GeForce GTX 1650 and Radeon Graphics (laptop with dedicated and integrated GPUs)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 4800H with Radeon Graphics\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3199/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3184",
      "id": 3777823413,
      "node_id": "I_kwDOKFkxdc7hLQK1",
      "number": 3184,
      "title": "Interactive move grabs don't immediately start moving windows when switching workspaces",
      "user": {
        "login": "Koranir",
        "id": 101683475,
        "node_id": "U_kgDOBg-REw",
        "avatar_url": "https://avatars.githubusercontent.com/u/101683475?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Koranir",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2026-01-03T07:54:38Z",
      "updated_at": "2026-02-12T06:49:45Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When starting an interactive move grab in tiling mode, there is a threshold that you need to move the cursor by before it actually starts moving the window. This threshold does not count switching between workspaces, as only the absolute position delta of the cursor within an output is considered. This means that once you have switched workspaces, you have to move your cursor a fair distance with no visual feedback at all until the window starts moving.\n\nThe ideal solution here is that the distance from the start workspace to the moved-to workspace is added to the delta used to start the proper window move, instantly putting the move grab into an actual move state.\n\nhttps://github.com/user-attachments/assets/21cb5929-1cd5-43d7-83fb-24f36aeec32f\n\n<details><summary>Config</summary>\n\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            // layout \"us,ru\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n        }\n\n        repeat-delay 200\n        repeat-rate 40\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        accel-speed -0.6\n        accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\noutput \"DP-2\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"5120x1440@120.000\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1.25\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=0 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 0\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.333; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 1\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        // off\n\n        width 1\n        active-color \"#75BBB3\"\n        inactive-color \"#505050\"\n\n        // active-gradient from=\"#ffbb66\" to=\"#ffc880\" angle=45 relative-to=\"workspace-view\"\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n// spawn-at-startup \"alacritty\" \"-e\" \"fish\"\nspawn-at-startup \"xwayland-satellite\" \":3\"\n// spawn-at-startup \"dunst\"\n// spawn-at-startup \"cosmic-bg\"\nspawn-at-startup \"wl-paste\" \"--watch\" \"cliphist\" \"store\"\nspawn-at-startup \"/usr/lib/polkit-kde-authentication-agent-1\"\nspawn-at-startup \"dms\" \"run\"\n\nenvironment {\n    DISPLAY \":3\"\n}\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\nprefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\nwindow-rule {\n    // geometry-corner-radius 8\n    // clip-to-geometry true\n    draw-border-with-background false\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    // Mod+T { spawn \"alacritty\"; }\n    // Mod+D { spawn \"fuzzel\"; }\n    // Super+Alt+L { spawn \"swaylock\"; }\n\n    Mod+E hotkey-overlay-title=\"Application Launcher\" {\n        spawn \"dms\" \"ipc\" \"call\" \"spotlight\" \"toggle\";\n    }\n\n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument in the end.\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume  allow-when-locked=true {\n        spawn \"dms\" \"ipc\" \"call\" \"audio\" \"increment\" \"3\";\n    }\n    Alt+Shift+Page_Up     allow-when-locked=true {\n        spawn \"dms\" \"ipc\" \"call\" \"audio\" \"increment\" \"3\";\n    }\n    XF86AudioLowerVolume  allow-when-locked=true {\n        spawn \"dms\" \"ipc\" \"call\" \"audio\" \"decrement\" \"3\";\n    }\n    Alt+Shift+Page_Down   allow-when-locked=true {\n        spawn \"dms\" \"ipc\" \"call\" \"audio\" \"decrement\" \"3\";\n    }\n    XF86AudioMute         allow-when-locked=true {\n        spawn \"dms\" \"ipc\" \"call\" \"audio\" \"mute\";\n    }\n    XF86AudioMicMute      allow-when-locked=true {\n        spawn \"dms\" \"ipc\" \"call\" \"audio\" \"micmute\";\n    }\n    XF86MonBrightnessUp   allow-when-locked=true {\n        spawn \"dms\" \"ipc\" \"call\" \"brightness\" \"increment\" \"5\";\n    }\n    XF86MonBrightnessDown allow-when-locked=true {\n        spawn \"dms\" \"ipc\" \"call\" \"brightness\" \"decrement\" \"5\";\n    }\n    Super+Shift+L hotkey-overlay-title=\"Lock Screen\" {\n        spawn \"dms\" \"ipc\" \"call\" \"lock\" \"lock\";\n    }\n\n    Mod+Q { spawn \"alacritty\"; }\n    Mod+C { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+f12 { toggle-overview; }\n    // Mod+E { spawn \"rofi\" \"-show\" \"drun\" \"-theme\" \"/home/koranir/src/misc/rofi-themes-collection/themes/squared-everforest.rasi\"; }\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n    Mod+W { center-column; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n```\n\n</details> \n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (b35bcae)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: EndeavourOS x86_64\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA GeForce GTX 1660 SUPER [Discrete]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:12th Gen Intel(R) Core(TM) i7-12700KF (20) @ 5.00 GHz\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3184/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3177",
      "id": 3776298529,
      "node_id": "I_kwDOKFkxdc7hFb4h",
      "number": 3177,
      "title": "xdg-desktop-autostart is run too early",
      "user": {
        "login": "TudbuT",
        "id": 48156391,
        "node_id": "MDQ6VXNlcjQ4MTU2Mzkx",
        "avatar_url": "https://avatars.githubusercontent.com/u/48156391?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/TudbuT",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 36,
      "created_at": "2026-01-02T12:44:35Z",
      "updated_at": "2026-02-14T11:09:18Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nhttps://github.com/YaLTeR/niri/blob/main/resources/niri.service is such that `Wants` specifies the xdg-desktop-autostart - however, it must only be called after niri is already running, which `Wants` does not guarantee (and i think it in fact guarantees the opposite). This leads to several apps trying to autostart, failing because no compositor or xserver is running yet, and crashing.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (Nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: nixos (nixpkgs unstable, https://releases.nixos.org/nixpkgs/nixpkgs-26.05pre916309.b72f284b1be4/nixexprs.tar.xz)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel HD Graphics 520 @ 1.05 GHz [Integrated]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) i7-6500U (4) @ 3.10 GHz\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3177/reactions",
        "total_count": 5,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3116",
      "id": 3761994568,
      "node_id": "I_kwDOKFkxdc7gO3tI",
      "number": 3116,
      "title": "Resize steps accumulate when window hits minimum size, causing delayed resize when reversing direction",
      "user": {
        "login": "qscqsc123",
        "id": 48363036,
        "node_id": "MDQ6VXNlcjQ4MzYzMDM2",
        "avatar_url": "https://avatars.githubusercontent.com/u/48363036?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/qscqsc123",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187133,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI4_Q",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:layout",
          "name": "area:layout",
          "color": "fbca04",
          "default": false,
          "description": "Columns, workspaces, scrolling, fullscreen, resize"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-25T13:18:02Z",
      "updated_at": "2026-02-14T21:08:14Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When resizing a window using keyboard-based discrete resize steps, resize operations continue to be internally accumulated even after the window reaches its minimum size constraint.\n\nAlthough further resize attempts in the shrinking direction have no visible effect (because the window cannot get smaller), the compositor still appears to queue or accumulate those resize steps. When the user then resizes the window in the opposite direction, the first several resize key presses have no visible effect until all previously accumulated steps are canceled out.\n\nThis creates a noticeable “dead zone” where resize keys seem unresponsive when reversing direction after hitting the minimum window size.\nExpected Behavior\n\nOnce the window reaches its minimum size, further resize attempts in that direction should be ignored or discarded.\n\nWhen the resize direction is reversed, the window should immediately start resizing in the new direction.\n\nActual Behavior\n\nResize key presses made after reaching the minimum size appear to be accumulated internally.\n\nWhen reversing resize direction, the window does not resize immediately.\n\nThe number of “unresponsive” resize key presses when enlarging equals the number of extra resize attempts made while the window was already at its minimum size.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3116/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3097",
      "id": 3754964510,
      "node_id": "I_kwDOKFkxdc7f0DYe",
      "number": 3097,
      "title": "Focus stays on floating layer after a floating window is closed",
      "user": {
        "login": "ArijanJ",
        "id": 56356662,
        "node_id": "MDQ6VXNlcjU2MzU2NjYy",
        "avatar_url": "https://avatars.githubusercontent.com/u/56356662?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ArijanJ",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187133,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI4_Q",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:layout",
          "name": "area:layout",
          "color": "fbca04",
          "default": false,
          "description": "Columns, workspaces, scrolling, fullscreen, resize"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-12-22T19:32:27Z",
      "updated_at": "2026-02-19T17:46:13Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen you close a floating window, the focus stays on the floating layer rather than going back to the previous window. \n\nThis is annoying if you have a confirmation/auth/zenity popup, as closing the popup will move your focus to another floating window (e.g., floating picture in picture video) even if that was not your intention.\n\nIt should ideally go back to the last focused window instead, whether it was tiling or floating.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version:  niri 25.11 (b35bcae)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3097/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3095",
      "id": 3754305349,
      "node_id": "I_kwDOKFkxdc7fxidF",
      "number": 3095,
      "title": "Laggy cursor/session with NVIDIA 590.48.01 + dual displays (niri 25.11, kernel 6.18.2)",
      "user": {
        "login": "dewdgi",
        "id": 194709586,
        "node_id": "U_kgDOC5sIUg",
        "avatar_url": "https://avatars.githubusercontent.com/u/194709586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dewdgi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187240,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5aA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/nvidia",
          "name": "nvidia",
          "color": "76b900",
          "default": false,
          "description": "NVIDIA issues"
        },
        "1": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-12-22T15:59:04Z",
      "updated_at": "2026-02-11T13:49:56Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n### Short description\nHardware cursor is laggy (stutters/jitters during movement); niri logs show repeated libinput “event processing lagging” messages and vblank_throttle warnings.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n<details><summary>Config</summary>\n\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://yalter.github.io/niri/Configuration:-Introduction\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://yalter.github.io/niri/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            layout \"us,ru,gr\"\n            options \"grp:alt_shift_toggle\"\n\n            // If this section is empty, niri will fetch xkb settings\n            // from org.freedesktop.locale1. You can control these using\n            // localectl set-x11-keymap.\n        }\n\n        // Enable numlock on startup, omitting this setting disables it.\n        numlock\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    // All commented-out settings here are examples, not defaults.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        // drag false\n        // drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // scroll-button-lock\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    focus-follows-mouse max-scroll-amount=\"30%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\noutput \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@144.003\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=1920 y=0\n    variable-refresh-rate\n}\n\noutput \"DP-1\" {\n    mode \"1920x1080@179.999\"\n    scale 1\n    transform \"normal\"\n    position x=0 y=0\n    variable-refresh-rate\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 16\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        //\n        // The focus ring only draws around the active window, so the only place\n        // where you can see its inactive-color is on other monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#c7ff7f\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        // off\n\n        width 4\n        active-color \"#cba6f7ff\"\n        inactive-color \"#585b70\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#f38ba8\"\n\n        // Gradients can use a few different interpolation color spaces.\n        // For example, this is a pastel rainbow gradient via in=\"oklch longer hue\".\n        //\n        // active-gradient from=\"#e5989b\" to=\"#ffb4a2\" angle=45 relative-to=\"workspace-view\" in=\"oklch longer hue\"\n\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        //\n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        //\n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\nspawn-at-startup \"swaybg\" \"-i\" \"/home/dew/Pictures/Wallpapers/wall1.png\"\n// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:\n// spawn-sh-at-startup \"qs -c ~/source/qs/MyAwesomeShell\"\n\nhotkey-overlay {\n    // Uncomment this line to disable the \"Important Hotkeys\" pop-up at startup.\n    skip-at-startup\n}\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\nprefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\ncursor {\n    xcursor-theme \"Bibata-Modern-Classic\"\n    xcursor-size 24\n}\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://yalter.github.io/niri/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\nwindow-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nwindow-rule {\n  match app-id=\"gamescope\"\n  open-fullscreen true\n}\n\nwindow-rule {\n    match app-id=\"steam\" title=r#\"^notificationtoasts_\\d+_desktop$\"#\n    default-floating-position x=16 y=16 relative-to=\"bottom-right\"\n}\n\nwindow-rule {\n    draw-border-with-background false\n}\n\ngestures {\n  hot-corners {\n    off\n  }\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+T hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"foot\"; }\n    Mod+D hotkey-overlay-title=\"Run an Application: fuzzel\" { spawn \"fuzzel\"; }\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: hyprlock\" { spawn \"hyprlock\"; }\n\n    // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.\n    // For example, this is a standard bind to toggle the screen reader (orca).\n    Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    // Using spawn-sh allows to pass multiple arguments together with the command.\n    // \"-l 1.0\" limits the volume to 100%.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\"; }\n\n    // Example media keys mapping using playerctl.\n    // This will work with any MPRIS-enabled media player.\n    XF86AudioPlay        allow-when-locked=true { spawn-sh \"playerctl play-pause\"; }\n    XF86AudioStop        allow-when-locked=true { spawn-sh \"playerctl stop\"; }\n    XF86AudioPrev        allow-when-locked=true { spawn-sh \"playerctl previous\"; }\n    XF86AudioNext        allow-when-locked=true { spawn-sh \"playerctl next\"; }\n\n    // Example brightness key mappings for brightnessctl.\n    // You can use regular spawn with multiple arguments too (to avoid going through \"sh\"),\n    // but you need to manually put each argument in separate \"\" quotes.\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"+10%\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"10%-\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+O repeat=false { toggle-overview; }\n\n    Mod+Q repeat=false { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    // Cycling through the presets in reverse order is also possible.\n    // Mod+R { switch-preset-column-width-back; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n```\n</details> \n\n<details><summary>Log</summary>\n\n```bash\nDec 22 16:29:27 maibenben systemd[1326]: Starting A scrollable-tiling Wayland compositor...\nDec 22 16:29:27 maibenben niri[1436]: 2025-12-22T14:29:27.765661Z  INFO niri: starting version 25.11 (Nixpkgs)\nDec 22 16:29:27 maibenben niri[1436]: 2025-12-22T14:29:27.790910Z DEBUG niri_config: loaded config from \"/home/dew/.config/niri/config.kdl\"\nDec 22 16:29:27 maibenben niri[1436]: libinput error: event26 - UNIW0001:00 093A:0255 Touchpad: kernel bug: clickpad advertising right button. See https://wayland.freedesktop.org/libinput/doc/1.29.2/clickpad-with-right-button.html for details\nDec 22 16:29:27 maibenben niri[1436]: 2025-12-22T14:29:27.949021Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/renderD128\"\nDec 22 16:29:27 maibenben niri[1436]: 2025-12-22T14:29:27.977765Z DEBUG niri::backend::tty: adding device: 57857 \"/dev/dri/card1\"\nDec 22 16:29:27 maibenben niri[1436]: 2025-12-22T14:29:27.977782Z DEBUG niri::backend::tty: this is the primary node\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.011458Z DEBUG niri::backend::tty: got render node: renderD128\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.011472Z DEBUG niri::backend::tty: initializing the primary renderer\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.079204Z DEBUG niri::backend::tty: device changed: 57857\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.135021Z DEBUG niri::backend::tty: new connector: DP-1 \"Microstep MSI G244F E2 BB4H354805214\"\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.135039Z DEBUG niri::backend::tty: new connector: eDP-1 \"Chimei Innolux Corporation 0x1521 Unknown\"\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.135802Z DEBUG niri::backend::tty: connecting connector: eDP-1\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.135934Z DEBUG niri::backend::tty: picking mode: Mode { name: \"1920x1080\", clock: 342060, size: (1920, 1080), hsync: (1968, 2000, 2080), vsync: (1090, 1095, 1142), hskew: 0, vscan: 0, vrefresh: 144, mode_type: ModeTypeFlags(PREFERRED) }\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.137660Z DEBUG niri::niri: putting output eDP-1 at x=1920 y=0\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.137987Z DEBUG niri::backend::tty: connecting connector: DP-1\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.137994Z DEBUG niri::backend::tty: picking mode: Mode { name: \"1920x1080\", clock: 407590, size: (1920, 1080), hsync: (1968, 2012, 2040), vsync: (1083, 1088, 1110), hskew: 0, vscan: 0, vrefresh: 180, mode_type: ModeTypeFlags(0x0) }\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.140662Z DEBUG niri::niri: putting output DP-1 at x=0 y=0\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.141412Z  INFO niri: listening on Wayland socket: wayland-1\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.141416Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.1436.sock\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.151285Z  INFO niri: listening on X11 socket: :0\nDec 22 16:29:29 maibenben systemd[1326]: Started A scrollable-tiling Wayland compositor.\nDec 22 16:29:29 maibenben niri[1436]: 2025-12-22T14:29:29.879720Z DEBUG niri::utils::xwayland::satellite: connection to X11 abstract socket; spawning xwayland-satellite\nDec 22 16:29:46 maibenben niri[1436]: libinput error: event18 - Beken 2.4G Wireless Device: client bug: event processing lagging behind by 27ms, your system is too slow\nDec 22 16:29:46 maibenben niri[1436]: libinput error: event18 - Beken 2.4G Wireless Device: client bug: event processing lagging behind by 24ms, your system is too slow\nDec 22 16:29:47 maibenben niri[1436]: libinput error: event18 - Beken 2.4G Wireless Device: client bug: event processing lagging behind by 23ms, your system is too slow\nDec 22 16:29:47 maibenben niri[1436]: libinput error: event18 - Beken 2.4G Wireless Device: client bug: event processing lagging behind by 24ms, your system is too slow\nDec 22 16:29:47 maibenben niri[1436]: libinput error: event18 - Beken 2.4G Wireless Device: client bug: event processing lagging behind by 23ms, your system is too slow\nDec 22 16:29:47 maibenben niri[1436]: libinput error: event18 - Beken 2.4G Wireless Device: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nDec 22 16:29:54 maibenben niri[1436]: 2025-12-22T14:29:54.174993Z  WARN niri::utils::vblank_throttle: output DP-1 running faster than expected, throttling vblanks: expected refresh 5.555583ms, got vblank after 2.499ms\nDec 22 16:30:05 maibenben niri[1436]: libinput error: event17 - Razer Razer BlackWidow V3 Tenkeyless: client bug: event processing lagging behind by 23ms, your system is too slow\nDec 22 16:32:50 maibenben niri[1436]: libinput error: event17 - Razer Razer BlackWidow V3 Tenkeyless: client bug: event processing lagging behind by 23ms, your system is too slow\nDec 22 16:35:42 maibenben niri[1436]: libinput error: event17 - Razer Razer BlackWidow V3 Tenkeyless: client bug: event processing lagging behind by 23ms, your system is too slow\nDec 22 16:37:59 maibenben niri[1436]: libinput error: event17 - Razer Razer BlackWidow V3 Tenkeyless: client bug: event processing lagging behind by 27ms, your system is too slow\nDec 22 16:38:00 maibenben niri[1436]: libinput error: event17 - Razer Razer BlackWidow V3 Tenkeyless: client bug: event processing lagging behind by 23ms, your system is too slow\nDec 22 16:38:00 maibenben niri[1436]: libinput error: event17 - Razer Razer BlackWidow V3 Tenkeyless: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\n```\n</details>\n\n<details><summary>nvidia-smi</summary>\n\n```bash\n+-----------------------------------------------------------------------------------------+\n| NVIDIA-SMI 590.48.01              Driver Version: 590.48.01      CUDA Version: 13.1     |\n+-----------------------------------------+------------------------+----------------------+\n| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |\n| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |\n|                                         |                        |               MIG M. |\n|=========================================+========================+======================|\n|   0  NVIDIA GeForce RTX 4050 ...    Off |   00000000:01:00.0  On |                  N/A |\n| N/A   42C    P8              4W /   95W |     391MiB /   6141MiB |      0%      Default |\n|                                         |                        |                  N/A |\n+-----------------------------------------+------------------------+----------------------+\n\n+-----------------------------------------------------------------------------------------+\n| Processes:                                                                              |\n|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |\n|        ID   ID                                                               Usage      |\n|=========================================================================================|\n|    0   N/A  N/A            1436      G   ...gzl33ab8r-niri-25.11/bin/niri        106MiB |\n|    0   N/A  N/A            1625      G   Xwayland                                  2MiB |\n|    0   N/A  N/A            2240      G   ...share/Steam/ubuntu12_32/steam          2MiB |\n|    0   N/A  N/A            2579      G   ./steamwebhelper                         15MiB |\n|    0   N/A  N/A            2608    C+G   ...am/ubuntu12_64/steamwebhelper          5MiB |\n|    0   N/A  N/A            3772      G   ....0.1-1/bin/.librewolf-wrapped        189MiB |\n+-----------------------------------------------------------------------------------------+\n```\n</details>\n\n<details><summary>outputs</summary>\n\n```bash\nOutput \"Chimei Innolux Corporation 0x1521 Unknown\" (eDP-1)\n  Current mode: 1920x1080 @ 144.003 Hz (preferred)\n  Variable refresh rate: supported, enabled\n  Physical size: 340x190 mm\n  Logical position: 1920, 0\n  Logical size: 1920x1080\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1080@144.003 (current, preferred)\n    1920x1080@60.004\n\nOutput \"Microstep MSI G244F E2 BB4H354805214\" (DP-1)\n  Current mode: 1920x1080 @ 179.999 Hz\n  Variable refresh rate: supported, enabled\n  Physical size: 530x290 mm\n  Logical position: 0, 0\n  Logical size: 1920x1080\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1080@60.000 (preferred)\n    1920x1080@179.999 (current)\n    1920x1080@165.001\n    1920x1080@143.976\n    1920x1080@119.930\n    1920x1080@119.879\n    1920x1080@119.982\n    1920x1080@84.884\n    1920x1080@59.939\n    1920x1080@50.000\n    1680x1050@119.986\n    1680x1050@59.954\n    1280x1024@119.958\n    1280x1024@75.025\n    1280x1024@60.020\n    1440x900@119.852\n    1280x720@59.943\n    1280x720@50.000\n    1024x768@75.029\n    1024x768@70.069\n    1024x768@60.004\n    800x600@75.000\n    800x600@72.188\n    800x600@60.317\n    800x600@56.250\n    720x576@50.000\n    720x480@59.940\n    640x480@75.000\n    640x480@72.809\n    640x480@59.940\n    640x480@59.929\n```\n</details>\n\n## What I already tried\n  - Toggled VRR\n  - GBM_BACKEND=nvidia-drm + __GLX_VENDOR_LIBRARY_NAME=nvidia\n  - WLR_NO_HARDWARE_CURSORS=1\n  - Kernel cmdline NVreg_EnableGpuFirmware=0\n  \nhad no effect\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \n  niri 25.11 (Nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: \n  nixos:26.05\n  kernel: 6.18.2\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \n  NVIDIA GeForce RTX 4050 Max-Q / Mobile [Discrete]\n  Laptop is set to dGPU only mode\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\n  12th Gen Intel(R) Core(TM) i5-12450H (12) @ 4.40 GHz",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3095/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3025",
      "id": 3718911622,
      "node_id": "I_kwDOKFkxdc7dqhaG",
      "number": 3025,
      "title": "OpenTabletDriver custom area unusable in Niri",
      "user": {
        "login": "shyperson0",
        "id": 91394210,
        "node_id": "MDQ6VXNlcjkxMzk0MjEw",
        "avatar_url": "https://avatars.githubusercontent.com/u/91394210?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/shyperson0",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-11T11:08:57Z",
      "updated_at": "2026-02-14T21:09:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When using a custom tablet Area and or Rotation within OpenTabletDriver, niri seems to alternate between the actual tablet position and OTD's virtual tablet's, making the device effectively unusable. I would assume this to be related to not being able to configure both tablets separately. \n\n<img width=\"571\" height=\"587\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/a546cf1e-1d04-45ef-8faa-019b37478dd9\" />\n\n### Excerpt from niri config.kdl\n\n```\n\ttablet {\n\t\t// off\n\t\tleft-handed\n\t}\n```\n\n### System Information\n\n* Tablet model: One by Wacom CTL-472\n* niri version: 25.11(b35bcae)\n* Distro: Arch Linux x86_64\n* CPU: Intel i5-3230M\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3025/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3021",
      "id": 3715959721,
      "node_id": "I_kwDOKFkxdc7dfQup",
      "number": 3021,
      "title": "Game window closes but process continues to run when changing resolution settings in game",
      "user": {
        "login": "mikkurogue",
        "id": 5637842,
        "node_id": "MDQ6VXNlcjU2Mzc4NDI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5637842?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mikkurogue",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191960,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJL2A",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:application",
          "name": "not niri:application",
          "color": "bbbbbb",
          "default": false,
          "description": "Issues in applications"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 19,
      "created_at": "2025-12-10T16:35:57Z",
      "updated_at": "2026-02-19T20:06:00Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I play alot of WoW, and I run it through Faugus Launcher. It does the trick usually but sometimes I notice a few problems;\n- Changing anything in terms of resolution or game quality where something like texture resolution would affect output or scaling (anything that causes the window to change some property) the window itself will just disappear, but the process will stay running `niri msg windows` also does not find it, but any sounds etc are still able to be heard.\n- Sometimes the game will \"fail\" to launch (actually just does what is above) when it needs to maximize the window. Only fix I've found is re-installing.\n- Sometimes the UI scaling persists to just be incredibly terrible and text for instance is very low quality while the rest is just fine. At first I thought I just needed to set the environment variable `WINE_FULLSCREEN_INTEGER_SCALING=1` but sometimes it just doesnt work at all.\n\nOf course its running through xwayland as is the case with any Wine/proton game so I doubt its entirely niri's fault.\n\nI dont have this issue with Hyprland (there are however other issues with Hyprland but this somehow isnt one). I think the window is somehow being orphaned but I'm not sure whats going on. Sometimes none of these issues happen at all either, its not consistent.\n\nI'm also unsure if this is then window behaviour or something with wayland satellite, as in hyprland we can just configure xwayland directly and I have never had this specific issue on there.\n\n<details><summary>Config</summary>\n\nThese are the window rules I have for WoW and battlenet/steam\n\n```kdl\ninput {\n    keyboard {\n        xkb {\n            layout \"us,fi\"\n            options \"grp:alt_shift_toggle\"\n        }\n        numlock\n    }\n    touchpad {\n        tap\n       natural-scroll\n    }\n\n    mouse {\n        accel-speed 0.25\n        accel-profile \"flat\"\n    }\n\n    trackpoint {\n   }\n}\n\noutput \"DP-2\" {\n    mode \"2560x1440@155\"\n    scale 1\n    transform \"normal\"\n    position x=0 y=0\n}\n\noutput \"DP-3\" {\n    mode \"1920x1080@144\"\n    scale 1\n}\n\nlayout {\n    gaps 12 \n    background-color \"#14131E\"\n   \n    center-focused-column \"never\"\n\n    preset-column-widths {\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n    }\n\n    default-column-width { proportion 0.5; }\n    focus-ring {\n        width 1 \n        active-color \"#7fc8ff\"\n        inactive-color \"#505050\"\n    }\n\n    border {\n        off\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n        urgent-color \"#9b0000\"\n    }\n\n    shadow {\n       softness 30\n        spread 5\n        offset x=0 y=5\n        color \"#0007\"\n    }\n\n    struts {\n   }\n}\n\nspawn-at-startup \"/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1\"\nspawn-at-startup \"awww-daemon\"\nspawn-at-startup \"awww\" \"img\" \"/home/mikku/Pictures/Wallpapers/arch.png\"\nspawn-at-startup \"waybar\" \"-c\" \"/home/mikku/.config/waybar/config-niri.jsonc\" \"-s\" \"/home/mikku/.config/waybar/css/style-niri.css\"\nspawn-at-startup \"dunst\"\nspawn-at-startup \"swayosd-server\"\nspawn-at-startup \"xembedsniproxy\"\nspawn-at-startup \"systemctl\" \"--user\" \"set-environment\" \"WINE_FULLSCREEN_INTEGER_SCALING=1\"\n// Set XKB layout for XWayland apps\nspawn-at-startup \"setxkbmap\" \"-layout\" \"us,fi\" \"-option\" \"grp:alt_shift_toggle\"\nspawn-at-startup \"discord\"\n// Start Steam silently (minimized to tray)\nspawn-at-startup \"steam\" \"-silent\"\n\nhotkey-overlay {\n    // skip-at-startup\n}\n\nanimations {\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Always spawn Discord on DP-3 monitor\nwindow-rule {\n    match app-id=r#\"discord\"#\n    open-on-output \"DP-3\"\n    open-maximized true\n}\n\n// Allow Steam games to open fullscreen\n// Allow Steam games to open fullscreen (exclude steam_app_0 which is Battle.net)\nwindow-rule {\n    match app-id=r#\"^steam_app_[1-9]\"#\n    open-fullscreen true\n}\n\n// World of Warcraft - fullscreen (through Battle.net/steam_app_0)\nwindow-rule {\n    match title=r#\"World of Warcraft\"#\n    open-maximized true\n}\n\n// Battle.net main window - tiled, not fullscreen\nwindow-rule {\n    match app-id=r#\"^steam_app_0$\"# title=r#\"Battle\\.net\"#\n    open-fullscreen false\n    default-column-width { fixed 1920; }\n}\n\nbinds {\n   Mod+Shift+Slash { show-hotkey-overlay; }\n\n    Mod+T hotkey-overlay-title=\"Open a Terminal: ghostty\" { spawn \"ghostty\"; }\n    Mod+Space hotkey-overlay-title=\"Run an Application Launcher: wofi\" { spawn \"wofi\" \"--show\" \"drun\"; }\n    Mod+F hotkey-overlay-title=\"Open browser: firefox\" { spawn \"firefox\"; }\n    Mod+E hotkey-overlay-title=\"Open file manager: dolphin\" { spawn \"dolphin\"; }\n\n    Ctrl+Alt+W hotkey-overlay-title=\"Toggle Waybar\" { spawn-sh \"pkill waybar || exec waybar -c /home/mikku/.config/waybar/config-niri.jsonc -s /home/mikku/.config/waybar/css/style-niri.css \" ; }\n    Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\n    Mod+S hotkey-overlay-title=\"Take Screenshot\" { spawn-sh \"grim -g \\\"$(slurp -d)\\\" - | wl-copy\"; }\n\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\"; }\n\n    Mod+O repeat=false { toggle-overview; }\n\n    Mod+Q repeat=false { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n      Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n      Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n      Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n   Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    Mod+Comma  { consume-window-into-column; }\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+B { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    Mod+Ctrl+C { center-visible-columns; }\n\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    Mod+W { toggle-column-tabbed-display; }\n\n       Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n    Mod+Shift+P { power-off-monitors; }\n}\n```\n\n</details> \n\n### System Information\n\n* niri version: niri 25.11 (b35bcae)\n\n* Distro: Arch Linux\n\n* GPU: AMD RX7600XT\n\n* CPU: Ryzen 5 5600X\n",
      "closed_by": {
        "login": "mikkurogue",
        "id": 5637842,
        "node_id": "MDQ6VXNlcjU2Mzc4NDI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5637842?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mikkurogue",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3021/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/3013",
      "id": 3712127646,
      "node_id": "I_kwDOKFkxdc7dQpKe",
      "number": 3013,
      "title": "v25.11 fails to run standalone on FreeBSD",
      "user": {
        "login": "jbeich",
        "id": 11153579,
        "node_id": "MDQ6VXNlcjExMTUzNTc5",
        "avatar_url": "https://avatars.githubusercontent.com/u/11153579?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jbeich",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 10,
      "created_at": "2025-12-09T18:23:19Z",
      "updated_at": "2026-02-15T04:47:16Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Regressed by #2627. Affects DRM (niri on VT console) but not Wayland backend (niri on sway).\n\n```c\n$ rm -rf ~/.config/niri\n$ niri\n INFO niri: starting version 25.11 (v25.11-5-g83a733e0)\nDEBUG niri_config: loaded config from \"/home/foo/.config/niri/config.kdl\"\n INFO niri::backend::tty: using as the render node: \"/dev/dri/card0\"\nDEBUG niri::backend::tty: adding device: 156 \"/dev/dri/card0\"\nDEBUG niri::backend::tty: this is the primary node\nDEBUG niri::backend::tty: not a primary node, skipping\n INFO niri: listening on Wayland socket: wayland-2\n INFO niri: IPC listening on: /var/run/user/1234/niri.wayland-2.81008.sock\n WARN niri::utils::xwayland::satellite: error spawning xwayland-satellite at \"xwayland-satellite\", disabling integration: No such file or directory (os error 2)\n WARN niri::utils::spawning: error spawning \"waybar\": Os { code: 2, kind: NotFound, message: \"No such file or directory\" }\n\n# FreeBSD devfs(4) is dynamic, so major/minor numbers are random\n$ ls -lL /dev/dri/\ntotal 0\ncrw-rw----  1 root video  0x9c  6 Nov 20:28 card0\ncrw-rw----  1 root video 0x130  6 Nov 20:28 renderD128\n# from <sys/types.h> aka https://github.com/freebsd/freebsd-src/blob/releng/15.0/sys/sys/types.h\n$ major() { _d=$1; echo $(( (((_d >> 32) & 0xffffff00) | ((_d >> 8) & 0xff)) )); }\n$ minor() { _d=$1; echo $(( (((_d >> 24) & 0xff00) | (_d & 0xffff00ff)) )); }\n$ major 0x9c\n0\n$ minor 0x9c\n156\n$ major 0x130\n1\n$ minor 0x130\n48\n\n# libdrm doesn't use major/minor numbers on FreeBSD\n$ ./test\nprimary = /dev/dri/card0\nrender = /dev/dri/renderD128\n\n$ cat test.c\n#include <fcntl.h>\n#include <stdio.h>\n#include <xf86drm.h>\n\nint main() {\n  int fd = open(\"/dev/dri/card0\", O_RDONLY, NULL);\n  if (fd < 0) return 1;\n\n  printf(\"primary = %s\\n\", drmGetPrimaryDeviceNameFromFd(fd));\n  printf(\"render = %s\\n\", drmGetRenderDeviceNameFromFd(fd));\n  return 0;\n}\n```\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/3013/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2994",
      "id": 3702791964,
      "node_id": "I_kwDOKFkxdc7ctB8c",
      "number": 2994,
      "title": "Xournalpp faster on xwayland than native wayland",
      "user": {
        "login": "Szybet",
        "id": 53944559,
        "node_id": "MDQ6VXNlcjUzOTQ0NTU5",
        "avatar_url": "https://avatars.githubusercontent.com/u/53944559?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Szybet",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-12-07T01:01:28Z",
      "updated_at": "2026-02-13T05:02:39Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I can provide videos of what I mean, but basically the title explains it all. On native wayland, drawing with the stylus is slow and niri shows those errors:\n```\n[  646.492238] niri[2144]: libinput error: client bug: timer tablet-proximity-timer-event4: scheduled expiry is in the past (-21ms), your system is too slow\n[  646.585309] niri[2144]: 2025-12-06T17:27:04.796855Z  WARN niri::utils::vblank_throttle: output DPI-1 running faster than expected, throttling vblanks: expected refresh 11.765292ms, got vblank after 4.875ms\n[  647.054758] niri[2144]: libinput error: client bug: timer tablet-proximity-timer-event4: scheduled expiry is in the past (-27ms), your system is too slow\n[  647.056593] niri[2144]: libinput error: client bug: timer tablet-proximity-timer-event4: scheduled expiry is in the past (-25ms), your system is too slow\n[  647.058109] niri[2144]: libinput error: client bug: timer tablet-proximity-timer-event4: scheduled expiry is in the past (-22ms), your system is too slow\n[  648.578352] systemd[1]: systemd-localed.service: Deactivated successfully.\n[  649.113739] niri[2144]: libinput error: client bug: timer tablet-proximity-timer-event4: scheduled expiry is in the past (-31ms), your system is too slow\n[  649.115592] niri[2144]: libinput error: WARNING: log rate limit exceeded (5 msgs per 3600000ms). Discarding future messages.\n[  654.677279] niri[2144]: libinput error: event4  - w9013 2D1F:0095 Stylus: client bug: event processing lagging behind by 34ms, your system is too slow\n[  655.913528] niri[2144]: libinput error: event4  - w9013 2D1F:0095 Stylus: client bug: event processing lagging behind by 29ms, your system is too slow\n[  656.990695] niri[2144]: libinput error: event4  - w9013 2D1F:0095 Stylus: client bug: event processing lagging behind by 35ms, your system is too slow\n[  668.856098] niri[2144]: libinput error: event4  - w9013 2D1F:0095 Stylus: client bug: event processing lagging behind by 21ms, your system is too slow\n[  670.096579] niri[2144]: libinput error: event4  - w9013 2D1F:0095 Stylus: client bug: event processing lagging behind by 50ms, your system is too slow\n[  670.098507] niri[2144]: libinput error: event4  - w9013 2D1F:0095 Stylus: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\n```\nOn xwayland (via GDK_BACKEND=x11), it's faster and the problem dissappears\n\nIt's niri on commit `311ca6b5da19f5acd7d3e481620de57240ce8f7c`. The problem probably is that the event pipeline is too slow, on xwayland it's a bit faster (CPU usage goes higher in both wayland and xwayland). The stylus is precise, so it reports a lot of events, as the problem doesn't happen when drawing with a finger",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2994/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2989",
      "id": 3701177675,
      "node_id": "I_kwDOKFkxdc7cm31L",
      "number": 2989,
      "title": "4K 165/160/144 Hz on NVIDIA no longer work in niri 25.11 (OLED stays black or falls back to 60 Hz; only 120/60 work)",
      "user": {
        "login": "ang-63",
        "id": 170184246,
        "node_id": "U_kgDOCiTONg",
        "avatar_url": "https://avatars.githubusercontent.com/u/170184246?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ang-63",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 10,
      "created_at": "2025-12-06T06:37:10Z",
      "updated_at": "2026-02-14T21:32:43Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "# 4K 165/160/144 Hz on NVIDIA no longer work in niri 25.11 (OLED stays black or falls back to 60 Hz; only 120/60 work)\n\nTL;DR: After updating to niri 25.11 on NVIDIA, my 4K OLED monitor can no longer run above 120 Hz. Modes 165/160/144 Hz either produce a black screen or silently fall back to 60 Hz. All these modes work fine in GNOME, Hyprland, COSMIC, and older niri builds.\n\n---\n\n## System information\n\n- niri version:  niri 25.11 (b35bcae)\n- Distro: Fedora 43 (Wayland), GNOME 49 installed\n- GPU: NVIDIA GeForce RTX 4070 Ti Super\n- CPU: AMD Ryzen 7 7800X3D\n- NVIDIA kernel module version (modinfo): 580.105.08\n- Kernel:  6.17.9-300.fc43.x86_64\n\n- Monitors:\n  - DP-2: AOC AGON PRO AG326UD (OLED), 3840×2160 @ 165 Hz\n  - DP-3: AOC U28G2G4R4 (LED), 3840×2160 @ 144 Hz\n  - HDMI-A-1: TV (disabled in niri)\n\nThis hardware works at 4K@165 + 4K@144 in:\n- Fedora 43 GNOME\n- Nobara 43 GNOME\n- CachyOS GNOME\n- CachyOS COSMIC\n- CachyOS Hyprland\n- Older niri version from August 2025, on CachyOS Niri\n\nThe issue appears only in the recent niri build from YaLTeR COPR (late November 2025).\n\n---\n\n## Summary of the regression\n\nWhat works:\n- 4K@60 on OLED\n- 4K@120 on OLED (VRR on/off both work)\n- 4K@144 on DP-3\n- All high-refresh modes in other compositors\n\nWhat does not work on OLED (DP-2):\n- 4K@165\n- 4K@160\n- 4K@144\n\nObserved behaviour:\n- OLED stays black with no signal, or\n- niri silently falls back to 60 Hz, or\n- the output is disabled at session start\n\n---\n\n## Available modes (reported by niri)\n\n```\n3840x2160@60.000 (preferred)\n3840x2160@165.000\n3840x2160@160.001\n3840x2160@144.000\n3840x2160@120.005 (current when set)\n...\n```\n\nniri reads all EDID modes correctly.\n\n---\n\n## Runtime behaviour\n\n### 1. Setting 4K@165 at runtime\n```\nniri msg output \"PNP(AOC) AG326UD 10PR4JA000694\" mode 3840x2160@165\n```\n- Command succeeds, no errors\n- Mode stays at 60 Hz\n- No modeset attempt (monitor does not blink)\n\n### 2. Setting 4K@144 or 4K@160\n- Same result: remains at 60 Hz or screen goes black\n\n### 3. Setting 4K@120\n- Works instantly\n- VRR also works normally at 120 Hz\n\n### 4. Restarting niri with >=144 Hz in config\n- OLED disabled or black screen\n\n### 5. Restarting niri with 120/60\n- OLED works normally\n\n---\n\n## Configuration snippet\n\n```\noutput \"HDMI-A-1\" {\n    off\n}\n\noutput \"DP-2\" {\n    mode \"3840x2160@165.000\"\n    scale 1\n    position x=2560 y=0\n    variable-refresh-rate\n    focus-at-startup\n}\n\noutput \"DP-3\" {\n    mode \"3840x2160@144.000\"\n    scale 1\n    position x=6400 y=0\n    variable-refresh-rate\n}\n```\n\nDP-2 only works at 120.005 or 60.000. All >=144 Hz fail regardless of VRR on/off.\n\n---\n\n## Additional observations\n\n1. This setup worked in older niri versions.\n2. It works in GNOME, Hyprland, COSMIC.\n3. niri msg outputs always shows all modes.\n4. niri never performs a modeset to >=144 Hz on DP-2.\n5. DP-3 handles 144 Hz without issues.\n\nThis suggests a regression in niri’s mode-setting logic for high-refresh 4K on NVIDIA.\n\n---\n\n## Logs\n\nI can provide:\n```\njournalctl --user -u niri.service --boot\n```\nafter a failed >=144 Hz start.\n\nEDID dumps or DRM/KMS debug logs can be provided on request.\n\n---\n\n## Possibly related issues\n\n- #2922\n- #2043\n- #2663\n- #2967\n\nThese do not fully match, so I opened a separate issue.\n\n---\n\n## Expected behaviour\n\n- niri should apply EDID-reported modes >=144 Hz on supported hardware\n- If modesetting fails, niri should show a warning instead of falling back to 60 Hz or disabling output\n\nThank you for your work on niri.\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2989/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2968",
      "id": 3693889214,
      "node_id": "I_kwDOKFkxdc7cLEa-",
      "number": 2968,
      "title": "Niri cpu takes up 30% when moving the mouse",
      "user": {
        "login": "Mental-Vortex",
        "id": 206187961,
        "node_id": "U_kgDODEotuQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/206187961?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Mental-Vortex",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 23,
      "created_at": "2025-12-04T10:19:18Z",
      "updated_at": "2026-02-14T21:38:13Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Niri cpu takes up 30-40% when moving the mouse\n\nThis is perf record FlameGraph\n<img width=\"1785\" height=\"1300\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/c90256fd-6279-4aeb-9d25-a39188ac0c7f\" />\n\n* niri version: niri 25.11 (b35bcae)\n* Distro: Arch Linux\n* GPU: Radeon RX 560\n* CPU: AMD FX-8300\n\n![Image](https://github.com/user-attachments/assets/7b9c7122-5428-43ed-aad2-c35891c933e8)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2968/reactions",
        "total_count": 9,
        "+1": 9,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2967",
      "id": 3692631103,
      "node_id": "I_kwDOKFkxdc7cGRQ_",
      "number": 2967,
      "title": "Monitor turns black when using variable refresh rate",
      "user": {
        "login": "AsuraHeap",
        "id": 169622608,
        "node_id": "U_kgDOChw8UA",
        "avatar_url": "https://avatars.githubusercontent.com/u/169622608?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AsuraHeap",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 14,
      "created_at": "2025-12-04T02:52:29Z",
      "updated_at": "2026-02-14T21:39:06Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nAn external monitor stays powered on but turns black when trying to utilize a variable refresh rate. This was not occurring prior to the recent update. This happens both when I open an app set to use vrr with `variable-refresh-rate on-demand=true` in the output config and when I explicitly set the output to use a variable refresh rate.\n<!-- Attaching your full niri config can help diagnose the problem. -->\nHere is the relevent output niri config:\n```\noutput \"DP-2\" {\n        mode \"1920x1080@143.992\"\n        position x=0 y=0\n        focus-at-startup\n        variable-refresh-rate on-demand=true\n}\n```\nAnd the result of `niri msg outputs` when vrr is off:\n```\nOutput \"PanaScope Pixio PX248P 0x00000001\" (DP-2)\n  Current mode: 1920x1080 @ 143.992 Hz\n  Variable refresh rate: supported, disabled\n  Physical size: 530x290 mm\n  Logical position: 0, 0\n  Logical size: 1920x1080\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1080@60.000 (preferred)\n    1920x1080@143.992\n    1920x1080@143.992 (current)\n    1920x1080@119.982\n    1920x1080@60.000\n    etc...\n```\nAnd on:\n```\nOutput \"PanaScope Pixio PX248P 0x00000001\" (DP-2)\n  Current mode: 1920x1080 @ 143.992 Hz\n  Variable refresh rate: supported, enabled\n  Physical size: 530x290 mm\n  Logical position: 0, 0\n  Logical size: 1920x1080\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1080@60.000 (preferred)\n    1920x1080@143.992\n    1920x1080@143.992 (current)\n    1920x1080@119.982\n    1920x1080@60.000\n    etc...\n```\nInterestingly, I was having the issue, restarted my computer and the problem no longer occurred. However, the issue returned later and is consistent. The only event I can think of that may have caused the issue to resurface after the restart is the automatic powering off of my monitors via \n```\nspawn-sh-at-startup \"swayidle -w timeout 600 'swaylock -f -i /path/to/background' timeout 605 'niri msg action power-off-monitors' before-sleep 'swaylock -f -i /path/to/background'\"\n```\nAny ideas would be appreciated, thank you!\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.11 (b35bcae)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: EndeavourOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Iris Xe Graphics\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: 12th Gen Intel Core i7-1255U\n",
      "closed_by": {
        "login": "AsuraHeap",
        "id": 169622608,
        "node_id": "U_kgDOChw8UA",
        "avatar_url": "https://avatars.githubusercontent.com/u/169622608?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AsuraHeap",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2967/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2944",
      "id": 3683452299,
      "node_id": "I_kwDOKFkxdc7bjQWL",
      "number": 2944,
      "title": "Add missing `zwp_linux_dmabuf_v1` protocol on winit backend for hardware accelerated rendering",
      "user": {
        "login": "pjungkamp",
        "id": 56401138,
        "node_id": "MDQ6VXNlcjU2NDAxMTM4",
        "avatar_url": "https://avatars.githubusercontent.com/u/56401138?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/pjungkamp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10211952831,
          "node_id": "LA_kwDOKFkxdc8AAAACYK4Ivw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/backend:winit",
          "name": "backend:winit",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues with the winit (nested window) backend"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-02T00:37:56Z",
      "updated_at": "2026-02-15T04:52:13Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'm currently tinkering with a Niri configuration in a winit window and I've noticed that some GTK4 applications are randomly crashing.\n\nTLDR: GTK4 assumes that `zwp_linux_dmabuf_v1` is available but it's not.\n\nThis led me to discover something else: You can't do hardware accelerated vulkan rendering into a wayland surface at all without `zwp_linux_dmabuf_v1`. Try e.g. `vkcube` with your primary GPU in a Niri winit window.\n\nIt should be possible to add support to the winit backend, e.g. the smithay anvil compositor has it as well: https://github.com/Smithay/smithay/blob/master/anvil/src/winit.rs#L58\n\n### Digging into GTK4\n\nThe crashes in GTK4 only happen when I'm using the vulkan GSK renderer which is triggering this warning when running on Niri/winit.\n\n```\nvkGetPhysicalDeviceSurfaceFormatsKHR(): A surface is no longer available. (VK_ERROR_SURFACE_LOST_KHR) (-1000000000)\n```\n\nWell the warning is printed by the `VK_CHECK` macro in here: https://gitlab.gnome.org/GNOME/gtk/-/blob/main/gdk/gdkvulkancontext.c#L1050-1055\n\nSince this call is not successful, the out parameter `n_formats` is never properly initialized, and this causes `g_newa` (an `alloca` in disguise) to sometimes smash the stack if the garbage value in `n_formats` is too big... Hence the random crashes... Yikes.\n\n### Digging down into the mesa vulkan wsi\n\nI was now wondering why this issue is only happening with Niri's winit backend. Why am I getting `VK_ERROR_SURFACE_LOST`? The error originates here: https://gitlab.freedesktop.org/mesa/mesa/-/blob/93dfe504f29e28dabb7b434369a79364176d16b1/src/vulkan/wsi/wsi_common_wayland.c#L1026-1033\n\nThe problem is that there is neither a shm nor a dmabuf backend available. It seems like `wl_shm` is intentionally ignored if the chosen wsi device is capable of hardware acceleration. Niri's winit backend just doesn't implement `zwp_linux_dmabuf_v1`. Thus the surface is \"lost\"...",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2944/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2922",
      "id": 3676881302,
      "node_id": "I_kwDOKFkxdc7bKMGW",
      "number": 2922,
      "title": "Niri doesn't initialize monitor with preffered refresh rate on first start",
      "user": {
        "login": "yayuuu",
        "id": 24522910,
        "node_id": "MDQ6VXNlcjI0NTIyOTEw",
        "avatar_url": "https://avatars.githubusercontent.com/u/24522910?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/yayuuu",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-11-29T16:01:57Z",
      "updated_at": "2026-02-14T21:44:12Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When starting my PC, going from grub to plymouth to GDM3 with autologin enabled to niri, my main monitor turns off and stays black. Other monitors run on fine.\n\nIt started happening in one of the recent updates.  Before it was initializing fine.\n\nWhen I switch refresh rate from preffered 170Hz to 165Hz, the monitor starts correctly. I can then switch back to 170Hz and it stays on.\n\nWhen I boot the PC and the monitor is turned off (black), switching to a different VT (CTRL+AT+F3) doesn't turn it on, it keeps staying black. Switching to GDM3 (CTRL+ALT+F1) turns it on and I can see the login screen, but then going back to niri turns it off again.\n\nOnly after fixing it by switching refresh rate back and forth, I can switch to a different TTY and then back to niri and it keeps working without any blinking.\n\nThe issue wasn't present with earlier versions of niri 25.08.\n\nAll of my monitors are connected to the same GPU: Sparkle Intel Arc A380.\n```\n04:00.0 VGA compatible controller: Intel Corporation DG2 [Arc A380] (rev 05) (prog-if 00 [VGA controller])\n        Subsystem: Device 172f:4017\n        Flags: bus master, fast devsel, latency 0, IRQ 108, IOMMU group 17\n        Memory at f3000000 (64-bit, non-prefetchable) [size=16M]\n        Memory at fa00000000 (64-bit, prefetchable) [size=8G]\n        Expansion ROM at f4000000 [disabled] [size=2M]\n        Capabilities: <access denied>\n        Kernel driver in use: i915\n        Kernel modules: i915, xe\n```\n\nFull log when niri starts:\n```\nlis 29 16:34:38 yayuuu systemd[2018]: Starting niri.service - A scrollable-tiling Wayland compositor...\nlis 29 16:34:38 yayuuu niri[2175]: 2025-11-29T15:34:38.631551Z  INFO niri: starting version 25.08 (v25.08-188-ge1380aa9)\nlis 29 16:34:38 yayuuu niri[2175]: 2025-11-29T15:34:38.673510Z DEBUG niri_config: loaded config from \"/home/daniel/.config/niri/config.kdl\"\nlis 29 16:34:39 yayuuu niri[2175]: 2025-11-29T15:34:39.483597Z DEBUG niri::backend::tty: attempting to use render node from config: \"/dev/dri/renderD128\"\nlis 29 16:34:39 yayuuu niri[2175]: 2025-11-29T15:34:39.484113Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/renderD128\"\nlis 29 16:34:39 yayuuu niri[2175]: 2025-11-29T15:34:39.597631Z DEBUG niri::backend::tty: adding device: 57857 \"/dev/dri/card1\"\nlis 29 16:34:39 yayuuu niri[2175]: 2025-11-29T15:34:39.597646Z DEBUG niri::backend::tty: this is the primary node\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.030044Z DEBUG niri::backend::tty: this is the primary render node\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.087366Z  WARN niri::backend::tty: error binding wl-display in EGL: EglExtensionNotSupported([\"EGL_WL_bind_wayland_display\"])\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.134765Z DEBUG niri::backend::tty: device changed: 57857\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.203035Z DEBUG niri::backend::tty: new connector: DP-1 \"PNP(AOC) AG344UXM SKXP6JA000191\"\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.203062Z DEBUG niri::backend::tty: new connector: DP-2 \"PNP(JRY) HDMI 1\"\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.203072Z DEBUG niri::backend::tty: new connector: HDMI-A-3 \"PNP(JRY) HDMI 1\"\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.203077Z  WARN niri::backend::tty: new connector HDMI-A-3 duplicates make/model/serial of existing connector DP-2, unnaming\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.203329Z DEBUG niri::backend::tty: connecting connector: DP-1\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.203343Z  WARN niri::backend::tty: configured mode 3440x1440@170 could not be found, falling back to preferred\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.203345Z DEBUG niri::backend::tty: picking mode: Mode { name: \"3440x1440\", clock: 906380, size: (3440, 1440), hsync: (3488, 3552, 3600), vsync: (1443, 1453, 1481), hskew: 0, vscan: 0, vrefresh: 170, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.205923Z DEBUG niri::niri: putting output DP-1 at x=900 y=0\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.206085Z DEBUG niri::backend::tty: connecting connector: DP-2\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.206098Z  WARN niri::backend::tty: configured mode 1440x900@60 could not be found, falling back to preferred\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.206100Z DEBUG niri::backend::tty: picking mode: Mode { name: \"1440x900\", clock: 106500, size: (1440, 900), hsync: (1520, 1672, 1904), vsync: (903, 909, 934), hskew: 0, vscan: 0, vrefresh: 60, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.210846Z DEBUG niri::niri: putting output DP-2 at x=0 y=0\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.210852Z DEBUG niri::backend::tty: connecting connector: HDMI-A-3\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.210864Z  WARN niri::backend::tty: configured mode 1440x900@60 could not be found, falling back to preferred\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.210866Z DEBUG niri::backend::tty: picking mode: Mode { name: \"1440x900\", clock: 106500, size: (1440, 900), hsync: (1520, 1672, 1904), vsync: (903, 909, 934), hskew: 0, vscan: 0, vrefresh: 60, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.212359Z DEBUG niri::niri: putting output HDMI-A-3 at x=4340 y=0\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.212692Z DEBUG niri::backend::tty: adding device: 57856 \"/dev/dri/card0\"\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.212703Z DEBUG niri::backend::tty: node is ignored, skipping\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.213635Z  INFO niri: listening on Wayland socket: wayland-1\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.213638Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.2175.sock\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.224337Z  INFO niri: listening on X11 socket: :0\nlis 29 16:34:40 yayuuu systemd[2018]: Started niri.service - A scrollable-tiling Wayland compositor.\nlis 29 16:34:40 yayuuu dbus-daemon[2079]: [session uid=1000 pid=2079 pidfd=5] Activating via systemd: service name='org.a11y.Bus' unit='at-spi-dbus-bus.service' requested by ':1.25' (uid=1000 pid=2175 comm=\"/usr/bin/niri --session\")\nlis 29 16:34:40 yayuuu niri[2175]: 2025-11-29T15:34:40.274370Z DEBUG niri::utils::xwayland::satellite: connection to X11 abstract socket; spawning xwayland-satellite\nlis 29 16:34:40 yayuuu systemd[2018]: Started app-niri-bash-2271.scope.\nlis 29 16:34:40 yayuuu systemd[2018]: Started app-niri-dms-2274.scope.\nlis 29 16:34:40 yayuuu systemd[2018]: Started app-niri-keyup-2282.scope.\nlis 29 16:34:40 yayuuu systemd[2018]: Started app-niri-xhost-2279.scope.\nlis 29 16:34:43 yayuuu niri[2175]: 2025-11-29T15:34:43.259804Z DEBUG niri_config: loaded config from \"/home/daniel/.config/niri/config.kdl\"\nlis 29 16:34:43 yayuuu niri[2175]: 2025-11-29T15:34:43.770962Z DEBUG niri_config: loaded config from \"/home/daniel/.config/niri/config.kdl\"\nlis 29 16:34:48 yayuuu systemd[2018]: Started app-niri-konsole-3086.scope.\nlis 29 16:35:00 yayuuu obs_replay[3826]: info: Desktop Environment: niri (niri)\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.137105Z DEBUG niri::dbus::mutter_screen_cast: record_monitor connector=\"DP-2\" properties=RecordMonitorProperties { cursor_mode: Some(Metadata), _is_recording: None }\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.137471Z DEBUG niri::dbus::mutter_screen_cast: start\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.137485Z DEBUG niri::niri: StartCast session_id=0 stream_id=0\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.139512Z DEBUG niri::pw_utils: pw stream: state changed: Unconnected -> Connecting stream_id=0\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.139684Z DEBUG niri::dbus::mutter_screen_cast: record_monitor connector=\"DP-1\" properties=RecordMonitorProperties { cursor_mode: Some(Metadata), _is_recording: None }\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.139971Z DEBUG niri::dbus::mutter_screen_cast: start\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.140291Z DEBUG niri::dbus::mutter_screen_cast: record_monitor connector=\"HDMI-A-3\" properties=RecordMonitorProperties { cursor_mode: Some(Metadata), _is_recording: None }\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.140527Z DEBUG niri::dbus::mutter_screen_cast: start\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.140855Z DEBUG niri::niri: StartCast session_id=1 stream_id=1\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.140869Z DEBUG niri::pw_utils: pw stream: state changed: Unconnected -> Connecting stream_id=1\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.140913Z DEBUG niri::niri: StartCast session_id=2 stream_id=2\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.140924Z DEBUG niri::pw_utils: pw stream: state changed: Unconnected -> Connecting stream_id=2\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.163682Z DEBUG niri::pw_utils: pw stream: state changed: Connecting -> Paused stream_id=0\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.163688Z DEBUG niri::pw_utils: pw stream: sending signal with 121 stream_id=0\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.163723Z DEBUG niri::pw_utils: pw stream: state changed: Connecting -> Paused stream_id=1\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.163725Z DEBUG niri::pw_utils: pw stream: sending signal with 123 stream_id=1\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.163743Z DEBUG niri::pw_utils: pw stream: state changed: Connecting -> Paused stream_id=2\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.163745Z DEBUG niri::pw_utils: pw stream: sending signal with 125 stream_id=2\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.178677Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0xc), modifier: 0, size: spa_rectangle { width: 3440, height: 1440 }, framerate: spa_fraction { num: 0, denom: 1 }, max_framerate: spa_fraction { num: 170002, denom: 1000 }, views: 0, interlace_mode: 0, pixel_aspect_ratio: spa_fraction { num: 0, denom: 0 }, multiview_mode: 0, multiview_flags: 0, chroma_site: 0, color_range: 0, color_matrix: 0, transfer_function: 0, color_primaries: 0 } stream_id=1\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.178688Z DEBUG niri::pw_utils: pw stream: fixating the modifier stream_id=1\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.178694Z DEBUG niri::pw_utils: find_preferred_modifier: size=Size<smithay::utils::geometry::Physical> { w: 3440, h: 1440 }, fourcc=XR24, modifiers=[0, 72057594037927937, 72057594037927945, 72057594037927946, 72057594037927948, 72057594037927935]\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.178759Z DEBUG niri::pw_utils: pw stream: allocation successful (modifier=Unrecognized(72057594037927948), plane_count=2), moving to confirmation pending stream_id=1\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.178871Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0x4), modifier: 72057594037927948, size: spa_rectangle { width: 3440, height: 1440 }, framerate: spa_fraction { num: 0, denom: 1 }, max_framerate: spa_fraction { num: 170002, denom: 1000 }, views: 0, interlace_mode: 0, pixel_aspect_ratio: spa_fraction { num: 0, denom: 0 }, multiview_mode: 0, multiview_flags: 0, chroma_site: 0, color_range: 0, color_matrix: 0, transfer_function: 0, color_primaries: 0 } stream_id=1\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.178878Z DEBUG niri::pw_utils: pw stream: moving to ready state stream_id=1\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.199759Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0xc), modifier: 0, size: spa_rectangle { width: 900, height: 1440 }, framerate: spa_fraction { num: 0, denom: 1 }, max_framerate: spa_fraction { num: 59887, denom: 1000 }, views: 0, interlace_mode: 0, pixel_aspect_ratio: spa_fraction { num: 0, denom: 0 }, multiview_mode: 0, multiview_flags: 0, chroma_site: 0, color_range: 0, color_matrix: 0, transfer_function: 0, color_primaries: 0 } stream_id=0\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.199767Z DEBUG niri::pw_utils: pw stream: fixating the modifier stream_id=0\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.199770Z DEBUG niri::pw_utils: find_preferred_modifier: size=Size<smithay::utils::geometry::Physical> { w: 900, h: 1440 }, fourcc=XR24, modifiers=[0, 72057594037927937, 72057594037927945, 72057594037927946, 72057594037927948, 72057594037927935]\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.199814Z DEBUG niri::pw_utils: pw stream: allocation successful (modifier=Unrecognized(72057594037927948), plane_count=2), moving to confirmation pending stream_id=0\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.199839Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0xc), modifier: 0, size: spa_rectangle { width: 900, height: 1440 }, framerate: spa_fraction { num: 0, denom: 1 }, max_framerate: spa_fraction { num: 59887, denom: 1000 }, views: 0, interlace_mode: 0, pixel_aspect_ratio: spa_fraction { num: 0, denom: 0 }, multiview_mode: 0, multiview_flags: 0, chroma_site: 0, color_range: 0, color_matrix: 0, transfer_function: 0, color_primaries: 0 } stream_id=2\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.199842Z DEBUG niri::pw_utils: pw stream: fixating the modifier stream_id=2\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.199844Z DEBUG niri::pw_utils: find_preferred_modifier: size=Size<smithay::utils::geometry::Physical> { w: 900, h: 1440 }, fourcc=XR24, modifiers=[0, 72057594037927937, 72057594037927945, 72057594037927946, 72057594037927948, 72057594037927935]\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.199875Z DEBUG niri::pw_utils: pw stream: allocation successful (modifier=Unrecognized(72057594037927948), plane_count=2), moving to confirmation pending stream_id=2\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.200014Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0x4), modifier: 72057594037927948, size: spa_rectangle { width: 900, height: 1440 }, framerate: spa_fraction { num: 0, denom: 1 }, max_framerate: spa_fraction { num: 59887, denom: 1000 }, views: 0, interlace_mode: 0, pixel_aspect_ratio: spa_fraction { num: 0, denom: 0 }, multiview_mode: 0, multiview_flags: 0, chroma_site: 0, color_range: 0, color_matrix: 0, transfer_function: 0, color_primaries: 0 } stream_id=0\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.200019Z DEBUG niri::pw_utils: pw stream: moving to ready state stream_id=0\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.200032Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0x4), modifier: 72057594037927948, size: spa_rectangle { width: 900, height: 1440 }, framerate: spa_fraction { num: 0, denom: 1 }, max_framerate: spa_fraction { num: 59887, denom: 1000 }, views: 0, interlace_mode: 0, pixel_aspect_ratio: spa_fraction { num: 0, denom: 0 }, multiview_mode: 0, multiview_flags: 0, chroma_site: 0, color_range: 0, color_matrix: 0, transfer_function: 0, color_primaries: 0 } stream_id=2\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.200036Z DEBUG niri::pw_utils: pw stream: moving to ready state stream_id=2\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.200053Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Streaming stream_id=1\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.239948Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Streaming stream_id=0\nlis 29 16:35:01 yayuuu niri[2175]: 2025-11-29T15:35:01.240248Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Streaming stream_id=2\n```\n\nMonitors config:\n```\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n\noutput \"DP-1\" {\n    mode \"3440x1440@170\"\n    position x=900 y=0\n    variable-refresh-rate\n    focus-at-startup\n}\n\noutput \"DP-2\" {\n    mode \"1440x900@60.000\"\n    position x=0 y=0\n    transform \"270\"\n    layout {\n        default-column-width { proportion 1.0; }\n        always-center-single-column\n    }\n}\n\noutput \"HDMI-A-3\" {\n    mode \"1440x900@60.000\"\n    position x=4340 y=0\n    transform \"90\"\n    layout {\n        default-column-width { proportion 1.0; }\n        always-center-single-column\n    }\n}\n```\n\nniri msg outputs (ran it with my main monitor being black):\n```\nOutput \"PNP(AOC) AG344UXM SKXP6JA000191\" (DP-1)\n  Current mode: 3440x1440 @ 170.002 Hz (preferred)\n  Variable refresh rate: supported, enabled\n  Physical size: 800x340 mm\n  Logical position: 900, 0\n  Logical size: 3440x1440\n  Scale: 1\n  Transform: normal\n  Available modes:\n    3440x1440@170.002 (current, preferred)\n    3440x1440@59.973 (preferred)\n    3440x1440@165.001\n    3440x1440@144.001\n    3440x1440@120.000\n    3440x1440@99.982\n    3440x1440@74.983\n    3440x1440@29.985\n    2560x1080@60.000\n    2560x1080@59.940\n    2560x1080@50.000\n    1720x1440@59.936\n    1920x1080@120.000\n    1920x1080@119.880\n    1920x1080@60.000\n    1920x1080@60.000\n    1920x1080@60.000\n    1920x1080@59.940\n    1920x1080@59.940\n    1920x1080@50.000\n    1920x1080@50.000\n    1680x1050@59.954\n    1280x1024@75.025\n    1280x1024@60.020\n    1440x900@59.887\n    1280x720@60.000\n    1280x720@60.000\n    1280x720@59.940\n    1280x720@50.000\n    1024x768@99.991\n    1024x768@75.029\n    1024x768@70.069\n    1024x768@60.004\n    832x624@74.551\n    800x600@99.862\n    800x600@75.000\n    800x600@72.188\n    800x600@60.317\n    800x600@56.250\n    720x576@50.000\n    720x576@50.000\n    720x480@60.000\n    720x480@60.000\n    720x480@59.940\n    720x480@59.940\n    640x480@99.825\n    640x480@75.000\n    640x480@72.809\n    640x480@66.667\n    640x480@60.000\n    640x480@59.940\n    640x480@59.940\n    720x400@70.082\n\nOutput \"PNP(JRY) HDMI 1\" (DP-2)\n  Current mode: 1440x900 @ 59.887 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 400x270 mm\n  Logical position: 0, 0\n  Logical size: 900x1440\n  Scale: 1\n  Transform: 270° counter-clockwise\n  Available modes:\n    1440x900@59.887 (current, preferred)\n    1280x1024@60.020\n    1280x960@60.000\n    1360x768@60.015\n    1280x800@59.910\n    1152x864@59.967\n    1280x720@60.000\n    1280x720@59.940\n    1024x768@75.029\n    1024x768@60.004\n    1440x480@60.000\n    1440x480@60.000\n    1440x480@59.940\n    1440x480@59.940\n    800x600@75.000\n    800x600@60.317\n    720x480@60.000\n    720x480@60.000\n    720x480@59.940\n    720x480@59.940\n    720x480@59.940\n    640x480@72.809\n    640x480@60.000\n    640x480@59.940\n    640x480@59.940\n    720x400@70.082\n\nOutput \"Unknown Unknown Unknown\" (HDMI-A-3)\n  Current mode: 1440x900 @ 59.887 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 400x270 mm\n  Logical position: 4340, 0\n  Logical size: 900x1440\n  Scale: 1\n  Transform: 90° counter-clockwise\n  Available modes:\n    1440x900@59.887 (current, preferred)\n    1280x1024@60.020\n    1280x960@60.000\n    1360x768@60.015\n    1280x800@59.910\n    1152x864@59.967\n    1280x720@60.000\n    1280x720@59.940\n    1024x768@75.029\n    1024x768@60.004\n    1440x480@60.000\n    1440x480@60.000\n    1440x480@59.940\n    1440x480@59.940\n    800x600@75.000\n    800x600@60.317\n    720x480@60.000\n    720x480@60.000\n    720x480@59.940\n    720x480@59.940\n    720x480@59.940\n    640x480@72.809\n    640x480@60.000\n    640x480@59.940\n    640x480@59.940\n    720x400@70.082\n```\n### System Information\n\n* niri version:  niri 25.11 (v25.11)\n* Distro: Debian 13 with Linux 6.17.9-x64v3-xanmod1\n* GPU: Intel Arc A380\n* CPU: AMD Ryzen 7 7800X3D\n\n\n/edit: updated to the latest version and problem persists",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2922/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2896",
      "id": 3664031414,
      "node_id": "I_kwDOKFkxdc7aZK62",
      "number": 2896,
      "title": "Unable to start Niri session, screen keeps alternating between on and off state.",
      "user": {
        "login": "virtuallyunknown",
        "id": 24871108,
        "node_id": "MDQ6VXNlcjI0ODcxMTA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/24871108?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/virtuallyunknown",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187240,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5aA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/nvidia",
          "name": "nvidia",
          "color": "76b900",
          "default": false,
          "description": "NVIDIA issues"
        },
        "1": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-11-25T17:55:16Z",
      "updated_at": "2026-02-14T21:55:36Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nGreetings. I was really hesitant to post this because I don't want to pollute the issue tracker, as issues with similar errors can be found at #2330, #2066 and others. However, from what I read they are somehow related to AMD GPU's, lightdm or cosmic desktop which I don't have installed. I do have an integrated AMD GPU, but it's disabled (Integrated & Hybrid Graphics are turned off from the BIOS).\n\nAnyway, to describe the problem - **it only happened once and I can't reproduce it at the moment**, but basically I boot into Arch and enter my credentials at the GDM login screen. Typically this would start the Niri session, but instead my monitor would output a fully black sreen, then turn off for a second, turn on again and display a black screen again, then this sequence keeps repeating.\n\nAfter about a minute I went into tty3 because I didn't know what was going on and I feared this might damage the hardware. I tried going back to the Niri session a couple of times after that but to no avail. If I am not mistaken, this is where the `DRM access error` occurs.\n\nWorth noting that I've upgraded `niri-git` last night, so the issue may be related to that:\n\n```\n[2025-11-25T01:32:14+0200] [ALPM] upgraded niri-git (25.08.r152.gaecbd67-1 -> 25.08.r194.g45b45ac-1)\n```\n\nAnyway, I've restarted the computer plenty of times in the past 7-8 hours and this haven't happened since, so it might have been a one time thing/non-issue, but I thought the problem is of serious enough nature for me to report it. If you believe this is fixed or non-relevant, please feel free to close this issue. Otherwise I can provide more details and/or logs if needed, and I will report if it happens again. Cheers!\n\n<details>\n\n<summary>Niri Logs: journalctl -b 8e33aa77190943238da9eccde8f56c21 --user-unit=niri</summary>\n\n```sh\nNov 25 17:00:26 arch systemd[3115]: Starting A scrollable-tiling Wayland compositor...\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.419905Z  INFO niri: starting version 25.08 (v25.08-194-g45b45ac2)\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.429113Z DEBUG niri_config: loaded config from \"/home/username/.config/niri/config.kdl\"\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.518181Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/renderD128\"\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.547390Z DEBUG niri::backend::tty: adding device: 57857 \"/dev/dri/card1\"\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.547404Z DEBUG niri::backend::tty: this is the primary node\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.583089Z DEBUG niri::backend::tty: this is the primary render node\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.640197Z DEBUG niri::backend::tty: device changed: 57857\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.680048Z DEBUG niri::backend::tty: new connector: DP-2 \"Samsung Electric Company LF27T450F HK2T701829\"\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.680383Z DEBUG niri::backend::tty: connecting connector: DP-2\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.680489Z DEBUG niri::backend::tty: picking mode: Mode { name: \"1920x1080\", clock: 174500, size: (1920, 1080), hsync: (1968, 2000, 2080), v\nsync: (1083, 1088, 1119), hskew: 0, vscan: 0, vrefresh: 75, mode_type: ModeTypeFlags(0x0) }\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.683126Z DEBUG niri::niri: putting output DP-2 at x=0 y=0\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.683936Z  INFO niri: listening on Wayland socket: wayland-1\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.683941Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.3356.sock\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.694560Z  INFO niri: listening on X11 socket: :0\nNov 25 17:00:26 arch systemd[3115]: Started A scrollable-tiling Wayland compositor.\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.819361Z  WARN niri::utils::vblank_throttle: output DP-2 running faster than expected, throttling vblanks: expected refresh 13.338223ms, g\not vblank after 6.251ms\nNov 25 17:00:26 arch niri[3356]: 2025-11-25T15:00:26.886092Z DEBUG niri::utils::xwayland::satellite: connection to X11 abstract socket; spawning xwayland-satellite\nNov 25 17:01:00 arch niri[3356]: 2025-11-25T15:01:00.712300Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: DRM access error: Page flip comm\nit failed on device `Some(\"/dev/dri/card1\")` (Permission denied (os error 13))\nNov 25 17:01:00 arch niri[3356]: 2025-11-25T15:01:00.785896Z DEBUG niri::backend::tty: device changed: 57857\nNov 25 17:01:00 arch niri[3356]: 2025-11-25T15:01:00.786104Z DEBUG niri::backend::tty: pausing session\nNov 25 17:01:20 arch niri[3356]: 2025-11-25T15:01:20.581730Z DEBUG niri::backend::tty: skipping UdevEvent::Changed as session is inactive\nNov 25 17:03:20 arch niri[3356]: 2025-11-25T15:03:20.835366Z DEBUG niri::backend::tty: skipping UdevEvent::Changed as session is inactive\nNov 25 17:03:20 arch niri[3356]: 2025-11-25T15:03:20.838708Z DEBUG niri::backend::tty: resuming session\nNov 25 17:03:20 arch niri[3356]: 2025-11-25T15:03:20.927694Z DEBUG niri::backend::tty: device changed: 57857\nNov 25 17:03:32 arch niri[3356]: 2025-11-25T15:03:32.131239Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: DRM access error: Page flip comm\nit failed on device `Some(\"/dev/dri/card1\")` (Permission denied (os error 13))\nNov 25 17:03:32 arch niri[3356]: 2025-11-25T15:03:32.180845Z DEBUG niri::backend::tty: device changed: 57857\nNov 25 17:03:32 arch niri[3356]: 2025-11-25T15:03:32.181007Z DEBUG niri::backend::tty: pausing session\nNov 25 17:06:34 arch niri[3356]: 2025-11-25T15:06:34.632089Z DEBUG niri::backend::tty: skipping UdevEvent::Changed as session is inactive\nNov 25 17:06:34 arch niri[3356]: 2025-11-25T15:06:34.641867Z DEBUG niri::backend::tty: skipping UdevEvent::Changed as session is inactive\nNov 25 17:06:37 arch niri[3356]: 2025-11-25T15:06:37.258645Z DEBUG niri::backend::tty: skipping UdevEvent::Changed as session is inactive\nNov 25 17:06:37 arch niri[3356]: 2025-11-25T15:06:37.261297Z DEBUG niri::backend::tty: resuming session\nNov 25 17:06:37 arch niri[3356]: 2025-11-25T15:06:37.338413Z DEBUG niri::backend::tty: device changed: 57857\nNov 25 17:07:05 arch niri[3356]: 2025-11-25T15:07:05.886931Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: DRM access error: Page flip comm\nit failed on device `Some(\"/dev/dri/card1\")` (Permission denied (os error 13))\nNov 25 17:07:06 arch niri[3356]: 2025-11-25T15:07:06.090067Z DEBUG niri::backend::tty: device changed: 57857\nNov 25 17:07:06 arch niri[3356]: 2025-11-25T15:07:06.090142Z DEBUG niri::backend::tty: pausing session\nNov 25 17:08:58 arch niri[3356]: 2025-11-25T15:08:58.605667Z DEBUG niri::backend::tty: skipping UdevEvent::Changed as session is inactive\nNov 25 17:08:59 arch niri[3356]: 2025-11-25T15:08:59.284734Z  INFO niri::utils::signals::platform: quitting due to receiving signal SIGTERM\nNov 25 17:08:59 arch systemd[3115]: Stopping A scrollable-tiling Wayland compositor...\nNov 25 17:08:59 arch niri[3356]: 2025-11-25T15:08:59.285097Z  WARN niri::utils::xwayland::satellite: xwayland-satellite exited with: signal: 15 (SIGTERM)\nNov 25 17:08:59 arch niri[3356]: 2025-11-25T15:08:59.286386Z DEBUG niri::utils::watcher: exiting watcher thread for Regular { user_path: \"/home/username/.config/niri/config.kdl\", system_path: \"\n/etc/niri/config.kdl\" }\nNov 25 17:08:59 arch systemd[3115]: Stopped A scrollable-tiling Wayland compositor.\nNov 25 17:08:59 arch systemd[3115]: niri.service: Consumed 3.307s CPU time, 353.6M memory peak.\n```\n</details>\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n```kdl\n// ~/.config/niri/config.kdl\n\ninclude \"env.kdl\"\ninclude \"spawn.kdl\"\ninclude \"binds.kdl\"\ninclude \"recent.kdl\"\n\ninput {\n    keyboard {\n        xkb {\n        }\n\n        numlock\n        repeat-delay 270 \n        repeat-rate 60\n    }\n}\n\noutput \"DP-2\" {\n    mode \"1920x1080@74.973\"\n    scale 1\n}\n\nlayout {\n    gaps 4\n    center-focused-column \"never\"\n\n    preset-column-widths {\n        proportion 0.5\n        proportion 1.0\n    }\n\n    preset-window-heights {\n        proportion 0.5\n    }\n\n    default-column-width { proportion 0.5; }\n\n    focus-ring {\n        off\n    }\n\n     border {\n        width 4\n        active-color \"#6272A4\"\n        inactive-color \"#282A36\"\n        urgent-color \"#BD93F9\"\n    }\n\n    shadow {\n        off\n    }\n\n    insert-hint {\n        color \"#634ac975\"\n    }\n\n    struts {\n    }\n}\n\nwindow-rule {\n    geometry-corner-radius 8\n    clip-to-geometry true\n    draw-border-with-background true\n}\n\nlayer-rule {\n    match namespace=\"^slapper$\"\n    place-within-backdrop false\n}\n\nlayer-rule {\n    match namespace=\"^wallpaper$\"\n    place-within-backdrop true\n}\n\n\nwindow-rule {\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\noverview {\n    zoom 0.4\n}\n\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// ~/.config/niri/env.kdl\n\nenvironment {\n    // DISPLAY \":0\"\n    ELECTRON_OZONE_PLATFORM_HINT \"auto\"\n    QT_QPA_PLATFORMTHEME \"gtk3\"\n    RUST_LOG \"debug\"\n    RUST_BACKTRACE \"1\"\n}\n\n// ~/.config/niri/spawn.kdl\n\nspawn-at-startup \"firefox\"\n\n// ~/.config/niri/binds.kdl\n\n// skipped for brevity\n\n// ~/.config/niri/recent.kdl\n\nrecent-windows {\n    // off\n    open-delay-ms 0\n\n    highlight {\n        active-color \"#999999ff\"\n        urgent-color \"#ff9999ff\"\n        padding 16\n        corner-radius 4\n    }\n\n    previews {\n        max-height 250\n        max-scale 0.5\n    }\n\n    binds {\n        Alt+Tab         { next-window; }\n        Alt+Shift+Tab   { previous-window; }\n        Alt+grave       { next-window     filter=\"app-id\"; }\n        Alt+Shift+grave { previous-window filter=\"app-id\"; }\n    }\n}\n\n```\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (v25.08-194-g45b45ac2)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: arch 6.17.8-arch1-1\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA Corporation AD107 [GeForce RTX 4060] (rev a1)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 9 7900 12-Core Processor\n\n* Graphics related packages:\n\n```sh\n ❯ sudo pacman -Qs nvidia\nlocal/egl-gbm 1.1.2.1-1\n    The GBM EGL external platform library\nlocal/egl-wayland 4:1.1.20-1\n    EGLStream-based Wayland external platform\nlocal/egl-x11 1.0.3-1\n    NVIDIA XLib and XCB EGL Platform Library\nlocal/gamescope-nvidia 3.16.14.3-1\n    SteamOS session compositing window manager (NVIDIA patch)\nlocal/gamescope-nvidia-debug 3.16.14.3-1\n    Detached debugging symbols for gamescope-nvidia\nlocal/lib32-nvidia-utils 580.105.08-1\n    NVIDIA drivers utilities (32-bit)\nlocal/libvdpau 1.5-3\n    Nvidia VDPAU library\nlocal/linux-firmware-nvidia 20251111-1\n    Firmware files for Linux - Firmware for NVIDIA GPUs and SoCs\nlocal/nvidia-open 580.105.08-5\n    NVIDIA open kernel modules\nlocal/nvidia-utils 580.105.08-4\n    NVIDIA drivers utilities\nlocal/nvtop 3.2.0-1\n    GPUs process monitoring for AMD, Intel and NVIDIA\n\n ❯ sudo pacman -Qs mesa  \nlocal/glu 9.0.3-2\n    Mesa OpenGL utility library\nlocal/lib32-mesa 1:25.2.7-1\n    Open-source OpenGL drivers - 32-bit\nlocal/mesa 1:25.2.7-1\n    Open-source OpenGL drivers\nlocal/mesa-utils 9.0.0-7\n    Essential Mesa utilities\n```\n\n* Niri Outputs:\n\n```\n ❯ niri msg outputs                 \nOutput \"Samsung Electric Company LF27T450F HK2T701829\" (DP-2)\n  Current mode: 1920x1080 @ 74.973 Hz\n  Variable refresh rate: not supported\n  Physical size: 600x340 mm\n  Logical position: 0, 0\n  Logical size: 1920x1080\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1080@60.000 (preferred)\n    1920x1080@74.973 (current)\n    1920x1080@59.939\n    1920x1080@50.000\n    1680x1050@59.954\n    1600x900@60.000\n    1280x1024@75.025\n    1280x1024@60.020\n    1440x900@59.887\n    1280x800@59.810\n    1152x864@75.000\n    1280x720@60.000\n    1280x720@59.943\n    1280x720@50.000\n    1024x768@75.029\n    1024x768@70.069\n    1024x768@60.004\n    800x600@75.000\n    800x600@72.188\n    800x600@60.317\n    800x600@56.250\n    720x576@50.000\n    720x480@59.940\n    640x480@75.000\n    640x480@72.809\n    640x480@59.940\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2896/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2877",
      "id": 3656247649,
      "node_id": "I_kwDOKFkxdc7Z7elh",
      "number": 2877,
      "title": "Drag and drop from unfocused window does not work",
      "user": {
        "login": "DerEchteJoghurt",
        "id": 69429360,
        "node_id": "MDQ6VXNlcjY5NDI5MzYw",
        "avatar_url": "https://avatars.githubusercontent.com/u/69429360?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DerEchteJoghurt",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-11-23T17:14:06Z",
      "updated_at": "2026-02-16T04:36:14Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Not sure if this is more of a bug report or feature request, but dragging something from an unfocused window does not work.\nI'm *not* using `focus-follows-mouse` and sometimes I want to drag something (for example a firefox tab or a file from thunar) from my second monitor to my main monitor. In order to be able to properly drag something from an unfocused window I currently need to click on the window once and then click again to start the drag. Otherwise the drag motion is simply ignored or stops immediately in the case of firefox.\n\n### System Information\n* niri version: niri 25.08 (v25.08-136-gc33a8bed)\n* Distro: Arch Linux\n* GPU: NVIDIA RTX 4070\n* CPU: AMD Ryzen 7 9700X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2877/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2855",
      "id": 3649029277,
      "node_id": "I_kwDOKFkxdc7Zf8Sd",
      "number": 2855,
      "title": "Niri fails to start when logging in",
      "user": {
        "login": "64-bitman",
        "id": 60551350,
        "node_id": "MDQ6VXNlcjYwNTUxMzUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/60551350?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/64-bitman",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 12,
      "created_at": "2025-11-20T20:49:46Z",
      "updated_at": "2026-02-15T20:09:01Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen I log into a Niri session with UWSM, I get a black screen with a blinking cursor. Only when I switch ttys with ctrl-alt-F* and back into the Niri tty does Niri finally load. This started happening roughly 4-5 days ago. Here are the journal logs:\n```\n\nNov 20 15:39:49 archlinux uwsm_niri.desktop[2144]: 2025-11-20T20:39:49.004743Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: D…(os error 22))\nNov 20 15:39:49 archlinux uwsm_niri.desktop[2144]: 2025-11-20T20:39:49.775423Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: D…(os error 22))\nNov 20 15:39:50 archlinux uwsm_niri.desktop[2144]: 2025-11-20T20:39:50.005066Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: D…(os error 22))\nNov 20 15:39:51 archlinux uwsm_niri.desktop[2144]: 2025-11-20T20:39:51.249875Z DEBUG niri::backend::tty: device changed: 57856\nNov 20 15:39:51 archlinux uwsm_niri.desktop[2144]: 2025-11-20T20:39:51.251410Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: D…(os error 13))\nNov 20 15:39:51 archlinux uwsm_niri.desktop[2144]: 2025-11-20T20:39:51.251523Z DEBUG niri::backend::tty: pausing session\nNov 20 15:39:51 archlinux uwsm_niri.desktop[2144]: 2025-11-20T20:39:51.469038Z DEBUG niri::backend::tty: skipping UdevEvent::Changed as session is inactive\nNov 20 15:39:51 archlinux uwsm_niri.desktop[2144]: 2025-11-20T20:39:51.479464Z DEBUG niri::backend::tty: resuming session\n```\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            layout \"us\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n        }\n        repeat-delay 200\n        repeat-rate 30\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        // off\n        tap\n        dwt\n        drag true\n        drag-lock\n        accel-speed 0.0\n        scroll-factor 0.5\n        accel-profile \"flat\"\n        scroll-method \"two-finger\"\n        click-method \"clickfinger\"\n        tap-button-map \"left-right-middle\"\n    }\n\n    mouse {\n        accel-speed 0.0\n        accel-profile \"flat\"\n        scroll-method \"no-scroll\"\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n\n    trackpoint {\n        accel-speed 0.0\n        accel-profile \"flat\"\n    }\n\n    tablet {\n        map-to-output \"eDP-1\"\n    }\n\n    touch {\n        map-to-output \"eDP-1\"\n    }\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\noutput \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1200@60.003\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1.25\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=0 y=0\n\n    variable-refresh-rate\n    focus-at-startup\n}\n\n// window-rule {\n//     clip-to-geometry true\n//     geometry-corner-radius 0\n// }\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    // gaps 16\n    gaps 0\n\n    // struts {\n    //     left 20\n    //     right 20\n    //     top 0\n    //     bottom 0\n    // }\n    always-center-single-column\n\n    default-column-display \"normal\"\n\n    tab-indicator {\n        width 8\n        gap 8\n        length total-proportion=1.0\n        position \"top\"\n        place-within-column\n    }\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n        proportion 0.75\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    background-color \"transparent\"\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    border {\n        width 3\n\n        active-color \"#7fc8ff\"\n\n        inactive-color \"#000000\"\n    }\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 3\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        inactive-color \"hsl(217, 0, 100)\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n}\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\nprefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    slowdown 1.0\n}\ncursor {\n    xcursor-theme \"Adwaita\"\n    xcursor-size 24\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\nwindow-rule {\n    match app-id=\"org.gnome.Nautilus\"\n\n    default-column-width { proportion 0.75; }\n}\n\nwindow-rule {\n    match app-id=\"google-chrome\"\n    match app-id=\"kitty\"\n    match app-id=\"com.obsproject.Studio\"\n    match app-id=\"com.discordapp.Discord\"\n    match app-id=r#\"^libreoffice.*\"#\n    match app-id=r#\"^MATLAB.*\"#\n    match app-id=\"org.gnome.Papers\"\n    match app-id=\"gpartedbin\"\n    match app-id=\"org.gnome.Boxes\"\n    match app-id=\"org.gnome.DiskUtility\"\n    match app-id=\"virt-manager\"\n    match app-id=\"amdgpu_top\"\n    match app-id=\"io.github.celluloid_player.Celluloid\"\n    match app-id=\"com.github.PintaProject.Pinta\"\n    match app-id=\"gimp\"\n    match app-id=\"org.gnome.gitlab.somas.Apostrophe\"\n    match app-id=\"com.github.johnfactotum.Foliate\"\n    match app-id=\"org.gnome.SimpleScan\"\n    match app-id=\"org.inkscape.Inkscape\"\n    match app-id=\"org.pwmt.zathura\"\n    match app-id=\"com.github.xournalpp.xournalpp\"\n    match app-id=\"sqlitebrowser\"\n    match app-id=\"com.github.flxzt.rnote\"\n    match app-id=\"org.gnome.Calendar\"\n\n    open-maximized true\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    match app-id=\"org.keepassxc.KeePassXC\"\n    match app-id=\"KeePassXC\"\n    match app-id=\"org.gnome.Calculator\"\n    open-floating true\n}\n\nwindow-rule {\n    match app-id=\"org.inkscape.Inkscape\"\n\n    open-maximized true\n    open-floating false\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\nwindow-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n    match app-id=\"org.gnome.seahorse.Application\"\n    match app-id=\"org.keepassxc.KeePassXC\"\n    match app-id=\"KeePassXC\"\n    match app-id=\"io.ente.auth\"\n\n    block-out-from \"screencast\"\n}\n\n// Make tiled windows rectangular while using CSD.\nwindow-rule {\n    match is-floating=false\n    tiled-state true\n}\n\nwindow-rule {\n    match is-floating=true\n\n    clip-to-geometry true\n    geometry-corner-radius 6\n}\n\nwindow-rule {\n    match app-id=\"kitty\"\n\n    // clip-to-geometry true\n    // geometry-corner-radius 5\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n// -window-rule {\n//     geometry-corner-radius 12\n//     clip-to-geometry true\n// }\n\nhotkey-overlay {\n    skip-at-startup\n}\n\nwindow-rule {\n    match is-window-cast-target=true\n\n    focus-ring {\n        active-color \"#f38ba8\"\n        inactive-color \"#7d0d2d\"\n    }\n\n    border {\n        inactive-color \"#7d0d2d\"\n    }\n\n    shadow {\n        color \"#7d0d2d70\"\n    }\n\n    tab-indicator {\n        active-color \"#f38ba8\"\n        inactive-color \"#7d0d2d\"\n    }\n}\n\nlayer-rule {\n    match namespace=\"^wallpaper$\"\n    place-within-backdrop true\n}\n\noverview {\n    workspace-shadow {\n        // off\n    }\n\n}\n\nenvironment {\n}\n\nxwayland-satellite {\n    path \"xwayland-satellite\"\n}\n\nswitch-events {\n    lid-close { spawn \"dolock\"; }\n    lid-open { spawn \"niri\" \"msg\" \"action\" \"power-on-monitors\"; }\n    // tablet-mode-on { spawn \"bash\" \"-c\" \"gsettings set org.gnome.desktop.a11y.applications screen-keyboard-enabled true\"; }\n    // tablet-mode-off { spawn \"bash\" \"-c\" \"gsettings set org.gnome.desktop.a11y.applications screen-keyboard-enabled false\"; }\n    // tablet-mode-on { spawn \"rotate-screen\"; }\n    // tablet-mode-off { spawn \"pkill\" \"rotate-screen\"; }\n}\n\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n// spawn-at-startup \"alacritty\" \"-e\" \"fish\"\n\nspawn-sh-at-startup \"exec uwsm app -s b -- swaybg -m fill -i /usr/local/share/wallpapers/Framework.png\"\nspawn-sh-at-startup \"exec uwsm app -s b -- kitten quick-access-terminal -o start_as_hidden=yes\"\n// spawn-at-startup \"sh\" \"-c\" \"exec uwsm app -s b -- clippor --server\"\n// spawn-at-startup \"sh\" \"-c\" \"exec uwsm app -s b -- wl-paste --watch cliphist store\"\n// spawn-at-startup \"sh\" \"-c\" \"exec uwsm app -s b -- wl-paste --type image --watch cliphist store\"\n\nspawn-at-startup \"uwsm\" \"app\" \"start-keepassxc\"\nspawn-at-startup \"uwsm\" \"app\" \"-s\" \"b\" \"rotate-screen\"\nspawn-at-startup \"uwsm\" \"app\" \"-s\" \"b\" \"blueman-applet\"\nspawn-at-startup \"uwsm\" \"app\" \"-s\" \"b\" \"swayidle\"\n// spawn-at-startup \"uwsm\" \"app\" \"-s\" \"b\" \"-S\" \"out\" \"sway-audio-idle-inhibit\"\nspawn-at-startup \"uwsm\" \"app\" \"-s\" \"b\" \"swayosd-server\"\nspawn-at-startup \"uwsm\" \"app\" \"-s\" \"b\" \"charge-daemon\"\n// spawn-at-startup \"uwsm\" \"app\" \"-s\" \"b\" \"touch-gestures\"\n// spawn-at-startup \"uwsm\" \"app\" \"-s\" \"b\" \"rot8\"\n\n// spawn-at-startup \"powerprofilesctl\" \"configure-action\" \"amdgpu_panel_power\" \"--enable\"\n// spawn-at-startup \"powerprofilesctl\" \"configure-action\" \"amdgpu_dpm\" \"--enable\"\nspawn-at-startup \"xhost\" \"+local:\"\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+D repeat=false { spawn \"fuzzel\"; }\n    Super+Alt+L repeat=false { spawn \"dolock\"; }\n\n    Mod+Space repeat=false { spawn \"kitten\" \"quick-access-terminal\"; }\n\n    Mod+b repeat=false { spawn \"toggle-earphones\"; }\n\n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument in the end.\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume    allow-when-locked=true { spawn \"swayosd-client\" \"--output-volume\" \"+5\"; }\n    XF86AudioLowerVolume    allow-when-locked=true { spawn \"swayosd-client\" \"--output-volume\" \"-5\"; }\n\n    XF86AudioMute           allow-when-locked=true { spawn \"swayosd-client\" \"--output-volume\" \"mute-toggle\"; }\n    XF86AudioMicMute        allow-when-locked=true { spawn \"swayosd-client\" \"--input-volume\" \"mute-toggle\"; }\n\n    XF86AudioPlay           allow-when-locked=true { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioNext           allow-when-locked=true { spawn \"playerctl\" \"next\"; }\n    XF86AudioPrev           allow-when-locked=true { spawn \"playerctl\" \"previous\"; }\n\n    XF86MonBrightnessUp     allow-when-locked=true { spawn \"swayosd-client\" \"--brightness\" \"+5\"; }\n    XF86MonBrightnessDown   allow-when-locked=true { spawn \"swayosd-client\" \"--brightness\" \"-5\"; }\n\n    // XF86RFKill\n    XF86Launch1             allow-when-locked=false repeat=false { spawn \"nm-toggle\"; }\n    Ctrl+XF86Launch1        allow-when-locked=false repeat=false { spawn \"sh\" \"-c\" \"rfkill toggle bluetooth && nm-toggle\"; }\n\n    XF86AudioMedia          allow-when-locked=false repeat=false { spawn \"uwsm\" \"app\" \"celluloid\"; }\n\n    Mod+Q repeat=false { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    // Mod+J     { focus-window-down; }\n    // Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    // Mod+Ctrl+J     { move-window-down; }\n    // Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    Mod+J     { focus-window-or-workspace-down; }\n    Mod+K     { focus-window-or-workspace-up; }\n    Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down       { focus-workspace-down; }\n    Mod+Page_Up         { focus-workspace-up; }\n    Mod+U               { focus-workspace-down; }\n    Mod+I               { focus-workspace-up; }\n    Mod+Ctrl+Page_Down  { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up    { move-column-to-workspace-up; }\n    Mod+Ctrl+U          { move-column-to-workspace-down; }\n    Mod+Ctrl+I          { move-column-to-workspace-up; }\n\n    Mod+Ctrl+Shift+F    { toggle-windowed-fullscreen; }\n    Ctrl+Super+P        { toggle-windowed-fullscreen; }\n    Super+P             { fullscreen-window; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+Alt+1 { focus-workspace 1; }\n    Mod+Alt+2 { focus-workspace 2; }\n    Mod+Alt+3 { focus-workspace 3; }\n    Mod+Alt+4 { focus-workspace 4; }\n    Mod+Alt+5 { focus-workspace 5; }\n    Mod+Alt+6 { focus-workspace 6; }\n    Mod+Alt+7 { focus-workspace 7; }\n    Mod+Alt+8 { focus-workspace 8; }\n    Mod+Alt+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+F1 allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Ctrl+Alt+Delete repeat=false { spawn \"uwsm\" \"stop\"; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n```\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (v25.08-165-g6fcdb924)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux x64\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Ultra 5 125U Integrated GPU (Xe drivers)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel Ultra 5 125U\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2855/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2841",
      "id": 3642694191,
      "node_id": "I_kwDOKFkxdc7ZHxov",
      "number": 2841,
      "title": "`scroll-factor` does not apply to trackball devices",
      "user": {
        "login": "ProfLander",
        "id": 1253239,
        "node_id": "MDQ6VXNlcjEyNTMyMzk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1253239?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ProfLander",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-11-19T13:14:17Z",
      "updated_at": "2026-02-16T04:38:38Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The `trackball` section of the input config does not accept `scroll-factor` like the `mouse` section does, thus preventing users of trackball mice from adjusting `on-button-down` scroll sensitivity.\n\nIn my case, I use a Ploopy Adept trackball mouse, and need to apply the following libinput settings for comfortable control:\n```\nsensitivity = -0.75;\naccel_profile = \"flat\";\nscroll_method = \"on_button_down\";\nscroll_button = 277;\nscroll_factor = 0.25\n```\n\nThis works under hyprland, where `scroll_factor` can be applied from the top-level `input` section. But as niri does not offer a global or trackball-local setting, the result is scrolling being ~4x more sensitive than desired.\n\nHopefully this can be worked around at the system level with the appropriate libinput config files, but I'm still investigating that side of things.\n\nRelated: #2393\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri stable v25.08 (commit 01be0e65f4eb91a9cd624ac0b76aaeab765c7294)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS 25.05\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Radeon RX 6900XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Ryzen 9 5950X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2841/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        2844
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2820",
      "id": 3631108269,
      "node_id": "I_kwDOKFkxdc7YblCt",
      "number": 2820,
      "title": "Smoother Alt-Tab previews with mipmaps",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-11-16T20:39:21Z",
      "updated_at": "2026-02-15T09:27:13Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://github.com/YaLTeR/niri/blob/aecbd679e39a321495964995fa1e37d84bd91ddf/src/ui/mru.rs#L371-L374\n\nThe offscreen part is easy (we have a helper ready to go). Haven't looked how hard it would be to generate and use mipmaps in Smithay though.\n\nWill also need profiling to determine the performance impact, since for example GNOME Shell only generates mipmaps after a second of window inactivity, which might have a performance reason behind it.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2820/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2817",
      "id": 3630906540,
      "node_id": "I_kwDOKFkxdc7Yazys",
      "number": 2817,
      "title": "Do not support Shift_R key.",
      "user": {
        "login": "esrid",
        "id": 132313796,
        "node_id": "U_kgDOB-LyxA",
        "avatar_url": "https://avatars.githubusercontent.com/u/132313796?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/esrid",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-11-16T17:50:29Z",
      "updated_at": "2026-02-16T04:43:29Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Do not validate Shift_R keymap when bindings. \n\n`Error:   × error loading config\n  ├─▶ error parsing\n  ╰─▶ error parsing KDL\n\nError:   × invalid keybind\n  ├─▶ invalid keybind\n  ╰─▶ invalid modifier: ShiftR\n     ╭─[config.kdl:381:1]\n 381 │     // shows a list of important hotkeys.\n 382 │     Mod+ShiftR+Slash { show-hotkey-overlay; }\n     ·     ────────┬───────\n     ·             ╰── invalid value\n 383 │\n     ╰────`\n`// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://yalter.github.io/niri/Configuration:-Introduction\nprefer-no-csd\n// Toutes les fenêtres sont semi-transparentes\n// Toggle Waybar avec script\n// Alacritty transparent\nwindow-rule {\n    match app-id=\"Alacritty\"\n    opacity 0.85\n}\n\n// Kitty transparent\nwindow-rule {\n    match app-id=\"kitty\"\n    opacity 0.85\n}\n\n// Waybar transparent (Dynamic Island effet)\nwindow-rule {\n    match app-id=\"waybar\"\n    opacity 0.95\n}\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://yalter.github.io/niri/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n             layout \"fr\"\n\t      file \"~/.config/keymaps/keymap.xkb\" \n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n            // If this section is empty, niri will fetch xkb settings\n            // from org.freedesktop.locale1. You can control these using\n            // localectl set-x11-keymap.\n        }\n\n        // Enable numlock on startup, omitting this setting disables it.\n        numlock\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    // All commented-out settings here are examples, not defaults.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        // drag false\n        // drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // scroll-button-lock\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n/-output \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@120.030\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 2\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=1280 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 16\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        //\n        // The focus ring only draws around the active window, so the only place\n        // where you can see its inactive-color is on other monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#c7ff7f\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#9b0000\"\n\n        // Gradients can use a few different interpolation color spaces.\n        // For example, this is a pastel rainbow gradient via in=\"oklch longer hue\".\n        //\n        // active-gradient from=\"#e5989b\" to=\"#ffb4a2\" angle=45 relative-to=\"workspace-view\" in=\"oklch longer hue\"\n\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        //\n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        //\n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\nspawn-at-startup \"waybar\"\n\n// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:\n// spawn-sh-at-startup \"qs -c ~/source/qs/MyAwesomeShell\"\n\nhotkey-overlay {\n    // Uncomment this line to disable the \"Important Hotkeys\" pop-up at startup.\n    // skip-at-startup\n}\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://yalter.github.io/niri/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://yalter.github.io/niri/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+ShiftR+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+T hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"alacritty\"; }\n    Mod+B hotkey-overlay-title=\"Toggle Waybar\" { \n\t    spawn-sh \"~/.config/waybar/toggle.sh\"; \n\t}\n    Mod+Space hotkey-overlay-title=\"Run an Application: fuzzel\" { spawn \"fuzzel\"; }\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\n\n    // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.\n    // For example, this is a standard bind to toggle the screen reader (orca).\n    Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    // Using spawn-sh allows to pass multiple arguments together with the command.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\"; }\n\n    // Example brightness key mappings for brightnessctl.\n    // You can use regular spawn with multiple arguments too (to avoid going through \"sh\"),\n    // but you need to manually put each argument in separate \"\" quotes.\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"+10%\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"10%-\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+O repeat=false { toggle-overview; }\n\n    Mod+Q repeat=false { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+Comma { consume-or-expel-window-left; }\n    Mod+Semicolon{ consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    //Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n   // Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    // Cycling through the presets in reverse order is also possible.\n    // Mod+R { switch-preset-column-width-back; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}`\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n* niri version: \nniri 25.08 (01be0e6)\n\n* Distro: \nArch Linux \n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \nRADEON VEGA GRAPHIC AMD \n\n* CPU: AMD RYZEN 5\n\n\n<img width=\"888\" height=\"500\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/3b3f13a6-c7af-4bb5-8719-6b786dfb832c\" />\n\n\nhow my keyboard layout look : \n\n<img width=\"380\" height=\"133\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/06324522-ae12-4cf4-8c39-1b03fc5a2ff3\" />\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2817/reactions",
        "total_count": 2,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 1,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2779",
      "id": 3612738019,
      "node_id": "I_kwDOKFkxdc7XVgHj",
      "number": 2779,
      "title": "xkb option not work sometimes",
      "user": {
        "login": "Jax-Tsai-zero",
        "id": 93467279,
        "node_id": "U_kgDOBZIyjw",
        "avatar_url": "https://avatars.githubusercontent.com/u/93467279?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Jax-Tsai-zero",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-11-11T15:15:17Z",
      "updated_at": "2026-02-15T09:35:42Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\nI'm switching to niri from hyprland these days, and trying to migrate what I've configured in hyprland.\nI use input/xkb/options \"caps:escape\" to disable capslock and use it as escape(which works fine in hyprland).\nIn niri, It works fine after I startup, __but a few minites later, the capslock function as escape and capslock simutanously.__.\n\nI don't know what's going on. pls help.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: latest git\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: archlinux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU:\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2779/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2778",
      "id": 3612275626,
      "node_id": "I_kwDOKFkxdc7XTvOq",
      "number": 2778,
      "title": "\"niri msg pick-window\" small issue",
      "user": {
        "login": "megatux",
        "id": 850020,
        "node_id": "MDQ6VXNlcjg1MDAyMA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/850020?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/megatux",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-11T13:14:26Z",
      "updated_at": "2026-02-16T04:44:38Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When using the `niri msg pick-window` I can use super+mouse_scroll_wheel to switch between workspaces but only works on the same monitor I started the command, not on my other monitor (it scrolls workspaces on same monitor). Overview or Super+keys works fine to switch between monitors and workspaces as workaround so not a big deal.\n\n### System Information\n\n* niri version:  niri 25.08 (unknown commit)\n\n* Distro: Opensuse Tumbleweed\n\n* GPU: \n  * Device-1: Intel CoffeeLake-H GT2 [UHD Graphics 630] driver: i915 v: kernel\n  * Device-2: NVIDIA TU117M [GeForce GTX 1650 Mobile / Max-Q] driver: nvidia\n\n* CPU: CPU: quad core Intel Core i5-9300H (-MT MCP-) speed/min/max: 900/800/4100 MHz\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2778/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2762",
      "id": 3597606279,
      "node_id": "I_kwDOKFkxdc7Wbx2H",
      "number": 2762,
      "title": "Rare/intermittent grey horizontal bar graphical glitch",
      "user": {
        "login": "kmandarin-orange",
        "id": 55755379,
        "node_id": "MDQ6VXNlcjU1NzU1Mzc5",
        "avatar_url": "https://avatars.githubusercontent.com/u/55755379?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kmandarin-orange",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        },
        "1": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 10,
      "created_at": "2025-11-06T20:54:29Z",
      "updated_at": "2026-02-26T09:35:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is currently a low-value bug report since I haven't been able to capture any videos of the visual glitch or find any plausibly-related log entries that line up with the times I've seen it yet, but I'll describe it to see if this lines up with others' experience:\n\nOccasionally, seemingly unrelated to the number of connected displays or graphics-intensive work being done (sometimes happens when sitting doing nothing on a web browser and terminal window), a horizontal dark grey bar will appear for about a 1-2 frames before disappearing. Typically it's pretty thin, I'd estimate somewhere between 5px - 40px.\n\nI haven't seen it coincide with visual lag or dropped frames, but around half the time I see it there isn't even any moving content on the screen or any mouse input happening. \n\nThe bar might be the same grey color as the default overview/wallpaper background, but I can't be sure. In any case, I've got desktop and overview backgrounds set via `swww`, so I don't think it's an issue of layers momentarily peeking through. It tends to appear in the lower half of the screen from what I've seen.\n\nNormally I'd write this off as a graphics glitch due to bad drivers, but typically I've had a good time with integrated AMD graphics, so I'm not sure what else to look into. Has anyone else seen similar visual glitches?\n\n<details>\n<summary>Niri config, window rules removed</summary>\n\n```kdl\n\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\n\n\n//  _______         __                __         \n// |       |.--.--.|  |_.-----.--.--.|  |_.-----.\n// |   -   ||  |  ||   _|  _  |  |  ||   _|__ --|\n// |_______||_____||____|   __|_____||____|_____|\n//                      |__|                     \n//\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\noutput \"eDP-1\" {\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    mode \"2256x1504@60.00\"\n    scale 1.25\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=0 y=0\n    focus-at-startup\n}\n\noutput \"Microstep MSI MAG401QR EA5H015302877\" {\n    // Change layout for when using both screens\n    position x=-818 y=-1440\n    scale 1\n}\n\noutput \"Dell Inc. DELL P2721Q 3FDLXC3\" {\n    // Change layout for when using both screens\n    position x=-378 y=-1440\n}\n\noutput \"ASUSTek COMPUTER INC ASUS VP28U 0x00006DCB\" {\n    // Change layout for when using both screens\n    position x=-756 y=-1440\n}\n\noutput \"Samsung Electric Company S24D390 0x30323258\" {\n    // Change layout for when using both screens\n    position x=-116 y=-1080\n}\n\n// switch-events {\n//     lid-close { spawn \"loginctl\" \"lock-session\"; }\n// }\n\n//  _____                            __       __   \n// |     |_.---.-.--.--.-----.--.--.|  |_   _|  |_ \n// |       |  _  |  |  |  _  |  |  ||   _| |_    _|\n// |_______|___._|___  |_____|_____||____|   |__|  \n//               |_____|                           \n//  _______ __          __        \n// |     __|  |_.--.--.|  |.-----.\n// |__     |   _|  |  ||  ||  -__|\n// |_______|____|___  ||__||_____|\n//              |_____|           \n//\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 2\n\n    center-focused-column \"never\"\n    always-center-single-column\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    insert-hint {\n        gradient from=\"#6FBBE7CC\" to=\"#526C7ECC\" angle=135 relative-to=\"workspace-view\"\n    }\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // How many logical pixels the ring extends out from the windows.\n        width 2\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        active-gradient from=\"#6FBBE7EE\" to=\"#526C7EEE\" angle=135\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        inactive-gradient from=\"#50505099\" to=\"#80808099\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    tab-indicator {\n        width 4\n        gap 4\n        gaps-between-tabs 2\n        length total-proportion=0.75\n        corner-radius 4\n        active-color \"#E9C071\"\n        inactive-color \"#505050\"\n        position \"left\"\n        place-within-column\n    }\n\n    shadow {\n        on\n        // draw-behind-window true\n        softness 25\n        spread 5\n        offset x=0 y=8\n        color \"#1C2124\"\n    }\n\n    // empty-workspace-above-first\n}\n\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n    // off\n    slowdown 0.75\n}\n\noverview {\n    zoom 0.33334\n    \n    workspace-shadow {\n        softness 150\n\n        spread 25\n\n        offset x=0 y=10\n\n        color \"#1C2124\"\n    }\n}\n\nhotkey-overlay {\n    skip-at-startup\n}\n\nprefer-no-csd\n\nxwayland-satellite {\n    // off\n}\n\nenvironment {\n    ELECTRON_OZONE_PLATFORM_HINT \"auto\"\n}\n\n//  _______ __               __                   __   \n// |     __|  |_.---.-.----.|  |_.--.--.-----.  _|  |_ \n// |__     |   _|  _  |   _||   _|  |  |  _  | |_    _|\n// |_______|____|___._|__|  |____|_____|   __|   |__|  \n//                                     |__|            \n//  _______                    \n// |   _   |.-----.-----.-----.\n// |       ||  _  |  _  |__ --|\n// |___|___||   __|   __|_____|\n//          |__|  |__|         \n//\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\nspawn-sh-at-startup \"swww-daemon & disown\"\nspawn-sh-at-startup \"swww-daemon -n overview & disown\"\nspawn-at-startup \"/usr/libexec/polkit-mate-authentication-agent-1\"\n\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n\n//  ________ __           __                 \n// |  |  |  |__|.-----.--|  |.-----.--.--.--.\n// |  |  |  |  ||     |  _  ||  _  |  |  |  |\n// |________|__||__|__|_____||_____|________|\n                                          \n//  ______         __              \n// |   __ \\.--.--.|  |.-----.-----.\n// |      <|  |  ||  ||  -__|__ --|\n// |___|__||_____||__||_____|_____|\n//\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n//\n// DESKTOP-WIDE RULES -- rules for tweaking desktop appearance overall\n//\n\n// Round all window corners\nwindow-rule {\n    geometry-corner-radius 16\n    clip-to-geometry true\n}\n\n// Set overview wallpaper\nlayer-rule {\n    match namespace=\"swww-daemonoverview\"\n    place-within-backdrop true\n}\n\nwindow-rule {\n    draw-border-with-background false\n}\n\nwindow-rule {\n    match is-floating=true\n    default-window-height { fixed 600; }\n    default-column-width { fixed 500; }\n}\n\n//  _______                     __         \n// |_     _|.-----.-----.--.--.|  |_.-----.\n//  _|   |_ |     |  _  |  |  ||   _|__ --|\n// |_______||__|__|   __|_____||____|_____|\n//                |__|\n// \n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n            options \"caps:escape,compose:rctrl\"\n        }\n        repeat-delay 500\n        repeat-rate 50\n    }\n\n    disable-power-key-handling\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        natural-scroll\n        accel-speed 0.25\n        accel-profile \"adaptive\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n        scroll-factor 2.5\n    }\n\n    warp-mouse-to-focus mode=\"center-xy\"\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    focus-follows-mouse max-scroll-amount=\"50%\"\n    // workspace-auto-back-and-forth\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+Ctrl+Q hotkey-overlay-title=\"Lock Screen\" { spawn \"hyprlock\"; }\n    Mod+Space hotkey-overlay-title=\"Open App Launcher\" { spawn \"fuzzel\"; }\n    Mod+T hotkey-overlay-title=\"Open Terminal\" { spawn \"kitty\"; }\n    Mod+E hotkey-overlay-title=\"Open File Manager\" { spawn \"nautilus\"; }\n    Ctrl+Shift+Escape hotkey-overlay-title=\"Open Task Manager\" { spawn \"flatpak\" \"run\" \"net.nokyan.Resources\"; }\n    Mod+Ctrl+C hotkey-overlay-title=\"Open Collector\" { spawn \"flatpak\" \"run\" \"it.mijorus.collector\"; }\n    Mod+N { spawn \"swaync-client\" \"-t\" \"-sw\"; }\n    Mod+Shift+N { spawn \"swaync-client\" \"-d\" \"-sw\"; }\n\n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument in the end.\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    // TODO: Add notifications for changing values, use mako?\n    XF86AudioNext { spawn \"playerctl\" \"next\"; }\n    XF86AudioPrev { spawn \"playerctl\" \"previous\"; }\n    XF86AudioPlay { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioStop { spawn \"playerctl\" \"stop\"; }\n    \n    XF86MonBrightnessUp   allow-when-locked=true { spawn-sh \"brightnessctl set +2% --min-value=6954\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn-sh \"brightnessctl set 2%- --min-value=6954\"; }\n    XF86AudioRaiseVolume  allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_SINK@ 0.02+ --limit 1 && paplay /usr/share/sounds/freedesktop/stereo/audio-volume-change.oga\"; }\n    XF86AudioLowerVolume  allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_SINK@ 0.02- --limit 1 && paplay /usr/share/sounds/freedesktop/stereo/audio-volume-change.oga\"; }\n    XF86AudioMute         allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_SINK@ toggle\"; }\n    XF86AudioMicMute      allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_SOURCE@ toggle\"; }\n\n    Mod+Q { close-window; }\n\n    Mod+F      { switch-focus-between-floating-and-tiling; }\n    Mod+Ctrl+F { toggle-window-floating; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Shift+Left  { move-column-left; }\n    Mod+Shift+Down  { move-window-down; }\n    Mod+Shift+Up    { move-window-up; }\n    Mod+Shift+Right { move-column-right; }\n    Mod+Shift+H     { move-column-left; }\n    Mod+Shift+J     { move-window-down; }\n    Mod+Shift+K     { move-window-up; }\n    Mod+Shift+L     { move-column-right; }\n    Mod+Shift+T     { toggle-column-tabbed-display; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Ctrl+Left        { focus-column-first; }\n    Mod+Ctrl+Right       { focus-column-last; }\n    Mod+Ctrl+H           { focus-column-first; }\n    Mod+Ctrl+L           { focus-column-last; }\n    Mod+Ctrl+Home        { move-column-to-first; }\n    Mod+Ctrl+End         { move-column-to-last; }\n    Mod+Shift+Ctrl+H     { move-column-to-first; }\n    Mod+Shift+Ctrl+L     { move-column-to-last; }\n    Mod+Shift+Ctrl+Left  { move-column-to-first; }\n    Mod+Shift+Ctrl+Right { move-column-to-last; }\n\n    Super+Alt+Left  { focus-monitor-left; }\n    Super+Alt+Down  { focus-monitor-down; }\n    Super+Alt+Up    { focus-monitor-up; }\n    Super+Alt+Right { focus-monitor-right; }\n    Super+Alt+H     { focus-monitor-left; }\n    Super+Alt+J     { focus-monitor-down; }\n    Super+Alt+K     { focus-monitor-up; }\n    Super+Alt+L     { focus-monitor-right; }\n\n    Mod+Ctrl+Down        { focus-workspace-down; }\n    Mod+Ctrl+Up          { focus-workspace-up; }\n    Mod+Ctrl+J           { focus-workspace-down; }\n    Mod+Ctrl+K           { focus-workspace-up; }\n    Mod+Shift+Ctrl+Down  { move-column-to-workspace-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-workspace-up; }\n    Mod+Shift+Ctrl+J     { move-column-to-workspace-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-workspace-up; }\n\n    Super+Ctrl+Alt+Down  { move-workspace-down; }\n    Super+Ctrl+Alt+Up    { move-workspace-up; }\n    Super+Ctrl+Alt+J     { move-workspace-down; }\n    Super+Ctrl+Alt+K     { move-workspace-up; }\n    // Super+Ctrl+Alt+1     { move-workspace 1}\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Super+Shift+Alt+Left   { move-column-to-monitor-left; }\n    Super+Shift+Alt+Down   { move-column-to-monitor-down; }\n    Super+Shift+Alt+Up     { move-column-to-monitor-up; }\n    Super+Shift+Alt+Right  { move-column-to-monitor-right; }\n    Super+Shift+Alt+H      { move-column-to-monitor-left; }\n    Super+Shift+Alt+J      { move-column-to-monitor-down; }\n    Super+Shift+Alt+K      { move-column-to-monitor-up; }\n    Super+Shift+Alt+L      { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+0 { focus-workspace 10; }\n    Mod+Shift+1 { move-column-to-workspace 1; }\n    Mod+Shift+2 { move-column-to-workspace 2; }\n    Mod+Shift+3 { move-column-to-workspace 3; }\n    Mod+Shift+4 { move-column-to-workspace 4; }\n    Mod+Shift+5 { move-column-to-workspace 5; }\n    Mod+Shift+6 { move-column-to-workspace 6; }\n    Mod+Shift+7 { move-column-to-workspace 7; }\n    Mod+Shift+8 { move-column-to-workspace 8; }\n    Mod+Shift+9 { move-column-to-workspace 9; }\n    Mod+Shift+0 { move-column-to-workspace 10; }\n    Mod+W { toggle-overview; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    Mod+Tab { focus-workspace-previous; }\n\n    // Consume one window from the right into the focused column.\n    Mod+BracketLeft  { consume-window-into-column; }\n    // Expel one window from the focused column to the right.\n    Mod+BracketRight { expel-window-from-column; }\n\n    // There are also commands that consume or expel a single window to the side.\n    Mod+Comma  { consume-or-expel-window-left; }\n    Mod+Period { consume-or-expel-window-right; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+M { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n    Mod+C { center-column; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-5%\"; }\n    Mod+Equal { set-column-width \"+5%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-5%\"; }\n    Mod+Shift+Equal { set-window-height \"+5%\"; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+Q { quit; } // For those familiar with MacOS \n    Ctrl+Alt+Delete { quit; } // For everyone else\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n```\n\n</details>\n\n### System Information\n\n* niri version: niri 25.08 (af4b5f9)\n* Distro: Fedora Workstation 43 (issue was present on 42 as well)\n* Kernel Version: 6.17.5-300.fc43.x86_64\n* GPU: Integrated Radeon 780M Graphics\n* CPU: AMD Ryzen 7 7840U",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2762/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2759",
      "id": 3595084247,
      "node_id": "I_kwDOKFkxdc7WSKHX",
      "number": 2759,
      "title": "Rendering Glitch in Overview Mode",
      "user": {
        "login": "766F6964",
        "id": 34845270,
        "node_id": "MDQ6VXNlcjM0ODQ1Mjcw",
        "avatar_url": "https://avatars.githubusercontent.com/u/34845270?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/766F6964",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-11-06T10:16:07Z",
      "updated_at": "2026-02-15T20:48:22Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (01be0e6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux (Kernel: 6.17.6-arch1-1)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU:  Radeon 860M Graphics\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen AI 7 350\n\n\nI noticed when going in overview mode and I have librewolf opened (firefox fork) I am seeing rendering glitches - specifically black vertical and horizontal lines (see screenshot - for some reason in the screenshot they show as blue, not sure why).\nThis issue is only visible in the overview mode - when I am focused on the window (aka not in overview mode), there are no lines. Everything is normal.\n\n<img width=\"1440\" height=\"960\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/8486444f-440f-4076-b6fd-64561dddcc68\" />\n\nThis does not happen with other applications.\n\nIt might be worth noting that this issue appears on my Framework 13 Laptop, which has a 2.8K display (2880×1920).\nOn another system using a monitor with a 1440×2560 resolution and the same version of Niri, these lines do not appear.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2759/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2741",
      "id": 3583779822,
      "node_id": "I_kwDOKFkxdc7VnCPu",
      "number": 2741,
      "title": "Rotation not working on the pinenote",
      "user": {
        "login": "Szybet",
        "id": 53944559,
        "node_id": "MDQ6VXNlcjUzOTQ0NTU5",
        "avatar_url": "https://avatars.githubusercontent.com/u/53944559?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Szybet",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187447,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI6Nw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:smithay",
          "name": "not niri:smithay",
          "color": "bbbbbb",
          "default": false,
          "description": "Smithay issues"
        },
        "1": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-11-03T21:14:07Z",
      "updated_at": "2026-02-15T21:01:05Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nNiri runs fine on the pinenote, if not rotated (**Sway, gnome run fine in all rotations**, so I think it's either niri or smithhay fault), any rotation does weird things, for example:\n\n<img width=\"611\" height=\"815\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/66053dc5-64f5-439c-825d-a4e8af69af44\" />\n\n<img width=\"611\" height=\"815\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/5c647d10-3a58-4191-b708-767ac4f034af\" />\n\nThe screenshot was taken using niri directly. It looks like if rotated, it doesn't use the bottom part of the screen, it also does weird things with updates:\n\nhttps://github.com/user-attachments/assets/b6b87848-dfd5-45d5-bd60-91ddec08d94e\n\nIt only updates when clicked elsewhere. This can be replicated in other drawing apps too\n\nAny ideas?... Should I create an issue in smithay too? Niri would be perfect for such a device, as it's pretty android apps switching like, I would love to make it run on it\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\nThe only important part of niri config:\n```\n// Make it boot on pinenote \ndebug { render-drm-device \"/dev/dri/card1\"; }\n\noutput \"DPI-1\" {\n    // No rotation support yet, this breaks things\n    transform \"90\"\n}\n\nspawn-sh-at-startup \"nwg-drawer -r -wm niri msg action spawn --\"\nspawn-sh-at-startup \"eww-wayland open bar\"\n\ninput {\n    // Pinenote touch\n    touch {\n        map-to-output \"DPI-1\"\n    }\n\n    keyboard {\n        xkb {\n            \n        }\n        numlock\n    }\n\n    touchpad {\n        tap\n        natural-scroll\n    }\n\n    mouse {\n \n    }\n\n    trackpoint {\n \n    }\n}\n```\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \nniri 25.08 (c12e0cd6)\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: \nCustom Fedora arm (Custom as in make it work on pinenote but don't break things around)\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \nMALI G52 2EE\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\nRK3566 1.8GHz 64-bit quad-core A55",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2741/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2691",
      "id": 3560074314,
      "node_id": "I_kwDOKFkxdc7UMmxK",
      "number": 2691,
      "title": "niri not recognizing all displays",
      "user": {
        "login": "go3ranh",
        "id": 27911489,
        "node_id": "MDQ6VXNlcjI3OTExNDg5",
        "avatar_url": "https://avatars.githubusercontent.com/u/27911489?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/go3ranh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 18,
      "created_at": "2025-10-28T06:51:46Z",
      "updated_at": "2026-02-15T20:38:52Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nHi, I really like niri so far but when i dock my laptop, only two out of three displays are recognized (plus the internal one which is disabled).\nI tried sway and all displays are working there, niri msg output just has one less.\nIts not even consistent which ones are recognized.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\nI am running basically the example config, I only changed the monitor offsets and some keybinds.\n\nthis is what i get for outputs with niri, I'll log  in to sway and post a comparion\n```\nniri msg outputs\nOutput \"Dell Inc. DELL U2414H 292K478E03ML\" (DP-3)\n  Current mode: 1920x1080 @ 60.000 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 530x300 mm\n  Logical position: 3840, 0\n  Logical size: 1920x1080\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1080@60.000 (current, preferred)\n    1920x1080@59.940\n    1920x1080@50.000\n    1600x1200@60.000\n    1600x900@60.000\n    1280x1024@75.025\n    1280x1024@60.020\n    1152x864@75.000\n    1280x720@60.000\n    1280x720@60.000\n    1280x720@59.940\n    1280x720@50.000\n    1024x768@75.029\n    1024x768@60.004\n    800x600@75.000\n    800x600@60.317\n    720x576@50.000\n    720x480@60.000\n    720x480@60.000\n    720x480@59.940\n    720x480@59.940\n    720x480@59.940\n    640x480@75.000\n    640x480@60.000\n    640x480@59.940\n    640x480@59.940\n    720x400@70.082\n\nOutput \"Lenovo Group Limited 0x40BA Unknown\" (eDP-1)\n  Disabled\n  Variable refresh rate: not supported\n  Physical size: 340x190 mm\n  Available modes:\n    1920x1080@59.977 (preferred)\n    1920x1080@47.982\n\nOutput \"PNP(AOC) 2460G4 GJXH9HA032030\" (DP-1)\n  Current mode: 1920x1080 @ 60.000 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 530x300 mm\n  Logical position: 1920, 0\n  Logical size: 1920x1080\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1080@60.000 (current, preferred)\n    1280x1024@75.025\n    1280x1024@60.020\n    1024x768@120.048\n    1024x768@99.969\n    1024x768@75.029\n    1024x768@70.069\n    1024x768@60.004\n    832x624@74.551\n    800x600@120.087\n    800x600@99.994\n    800x600@75.000\n    800x600@72.188\n    800x600@60.317\n    800x600@56.250\n    640x480@119.995\n    640x480@99.997\n    640x480@75.000\n    640x480@72.809\n    640x480@66.667\n    640x480@59.940\n    720x400@70.082\n\n```\n\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \nCompositor version: 25.08 (Nixpkgs)\nCLI version:        25.08 (Nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel® UHD Graphics 620\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) i7-8650U\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2691/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2686",
      "id": 3557117758,
      "node_id": "I_kwDOKFkxdc7UBU8-",
      "number": 2686,
      "title": "Dual monitor: slower refresh rate display initializes several seconds later on startup",
      "user": {
        "login": "saltnpepper97",
        "id": 114543040,
        "node_id": "U_kgDOBtPJwA",
        "avatar_url": "https://avatars.githubusercontent.com/u/114543040?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/saltnpepper97",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-10-27T14:38:16Z",
      "updated_at": "2026-02-15T20:53:42Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Hello,\n\nWhen starting Niri, my secondary monitor (the one with a lower refresh rate) consistently takes several seconds longer to initialize compared to my primary display. The primary monitor (180 Hz) lights up almost immediately, but the secondary (75 Hz) remains blank briefly before showing the desktop.\n\nThis delay only happens on startup — after that, both displays work fine and stay synchronized.\n\nI’m not using a display manager; Niri is started via a wrapper script that calls niri-session directly under my user systemd session.\n\n### System Info\n\n```\nOS: Arch Linux x86_64  \nKernel: Linux 6.17.5-arch1-1  \nWM: Niri (Wayland) 25.08  \nGPU: AMD Radeon RX 7900 XTX (Mesa 24.x, amdgpu driver)  \nCPU: AMD Ryzen 9 5900X  \nMonitors:  \n  • MSI4CE2 – 2560x1440 @ 180 Hz (DisplayPort)  \n  • PA248QV – 1920x1200 @ 75 Hz (DisplayPort)  \nNo display manager (started from shell script)\n```\n\n### Reproduction Steps\n\n1. Boot system and log in to TTY.\n2. Run `start niri` (wrapper script shown below).\n3. Observe that the 180 Hz monitor initializes first; the 75 Hz monitor lags by ~30 seconds before displaying the compositor. Grey screen on main.\n\n### Additional Details\n\n- Disabling Adaptive Sync and VRR on both monitors (or just the slower one) doesn’t change the behavior.\n- Happens almost every time Niri starts, not just occasionally. \n- No display manager is in use; Niri is launched via:\n\n```\n#!/usr/bin/env bash\nset -euo pipefail\ncase \"$1\" in\n    niri)\n        exec niri-session\n        ;;\n    hyprland)\n        exec hyprland\n        ;;\nesac\n```\n\n### Partial debug snippet\n\n```\nniri[1084]: 2025-10-26T22:42:01.896679Z DEBUG niri::niri: putting output DP-1\nniri[1084]: 2025-10-26T22:42:01.898210Z DEBUG niri::niri: putting output DP-2\n...\n2025-10-26T22:42:01.904588Z INFO niri: listening on Wayland socket\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2686/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2664",
      "id": 3543351148,
      "node_id": "I_kwDOKFkxdc7TMz9s",
      "number": 2664,
      "title": "`screenshot` action via the cli exits before the screenshot is taken",
      "user": {
        "login": "Vortriz",
        "id": 97402159,
        "node_id": "U_kgDOBc49Lw",
        "avatar_url": "https://avatars.githubusercontent.com/u/97402159?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Vortriz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191617,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJKgQ",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:ipc",
          "name": "area:ipc",
          "color": "fbca04",
          "default": false,
          "description": "niri msg, niri IPC, D-Bus, scripting"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-10-23T06:30:13Z",
      "updated_at": "2026-02-27T10:59:08Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "As stated in the title, the `screenshot` action via the cli exits even before the region selection is done.\n\n```\n❯ time niri msg action screenshot --show-pointer false --path /tmp/img.png\n\n________________________________________________________\nExecuted in   47.58 millis    fish           external\n   usr time    8.73 millis  769.00 micros    7.96 millis\n   sys time   10.80 millis  901.00 micros    9.90 millis\n```\n\nThis makes it impossible to use it in screenshot manipulation routines since the exit signal is given before the screenshot file even exists. \n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri unstable 2025-10-19 (commit c8eea8ee9ddf795da8cb356599f17e2dc7cfea20)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS Unstable (25.11)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Iris Xe (iGPU)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel Core i5-12500H \n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2664/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2657",
      "id": 3540761777,
      "node_id": "I_kwDOKFkxdc7TC7yx",
      "number": 2657,
      "title": "Frequent momentary blackscreens when connected to an external display.",
      "user": {
        "login": "keystroke3",
        "id": 37796862,
        "node_id": "MDQ6VXNlcjM3Nzk2ODYy",
        "avatar_url": "https://avatars.githubusercontent.com/u/37796862?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/keystroke3",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187240,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5aA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/nvidia",
          "name": "nvidia",
          "color": "76b900",
          "default": false,
          "description": "NVIDIA issues"
        },
        "1": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-10-22T12:55:59Z",
      "updated_at": "2026-02-15T20:55:03Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I am using a laptop with Niri and sometimes connect it to an external display over HDMI and close the lid. During normal operation in this setup, the external display turns off momentarily for like 1 second and resumes like nothing happened. \nIt used to happen mostly when shifting between desktops and columns, but now it happens even when the system is idling. I have not been able to identify any usage patterns that might reliably reproduce the problem, but it has been getting worse by the day, with up to 10 blinks an hour.\n\nI typically have the same applications running described in the startup section in the configuration, along with Librewolf, Slack and Discord.  I typically have a maximum of 3 desktops and 2 terminal windows with tmux running neovim and some ssh sessions. \n\n<details>\n  <summary>Click to view config file</summary>\n\n```\nenvironment {\n    DISPLAY \":1\"\n    QT_QPA_PLATFORM \"wayland\"\n    ELECTRON_OZONE_PLATFORM_HINT \"wayland\"\n    ELECTRON_ENABLE_WAYLAND \"1\"\n    QT_STYLE_OVERRIDE \"kvantum\"\n    XDG_CURRENT_DESKTOP \"LXQt\"\n    GTK_IM_MODULE \"fcitx\"\n    QT_IM_MODULE \"fcitx\"\n    XMODIFIERS \"@im=fcitx\"\n}\n\noverview{\n    zoom 0.5\n}\n\nhotkey-overlay{\n    skip-at-startup\n}\ngestures {\n    hot-corners {\n        off\n    }\n}\n\ninput {\n    touchpad {\n        tap\n    }\n\n    keyboard {\n        xkb {\n            layout \"us\"\n            options \"compose:ralt\"\n        }\n\n    }\n    focus-follows-mouse max-scroll-amount=\"1%\"\n    disable-power-key-handling\n}\n\n\nwindow-rule {\n    match app-id=r#\"^(mpv|nm-connection-editor|pavucontrol|blueman-manager|com\\.github\\.hluk\\.copyq|org\\.gnome\\.Nautilus|org\\.gnome\\.FileRoller|protonvpn-app)$\"#;\n    open-floating true;\n}\n\nwindow-rule {\n    match title=r\"Library|File Upload\";\n    open-floating true;\n}\n\nwindow-rule {\n    match title=\"Bitwarden\"\n    block-out-from \"screencast\"\n}\n\n\nwindow-rule {\n    match app-id=\"sxiv\";\n    open-floating true;\n    default-column-width { fixed 1200; }\n    default-window-height { fixed 800; }\n}\n\n\noutput \"HDMI-A-1\" {\n    mode \"3840x2160@144\"\n    scale 1.5\n    transform \"normal\"\n    position x=0 y=0\n}\n\n\nlayout {\n    gaps 12\n    preset-column-widths {\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n    }\n\n    tab-indicator {\n        width 8\n        gap 5\n        length total-proportion=0.25\n        position \"left\"\n        active-color \"#E5809E\"\n        inactive-color \"#1E1C31\"\n    }\n\n    default-column-width { proportion 0.5; }\n\n    focus-ring {\n        width 3\n        active-color \"#7fc8ff\"\n        inactive-color \"#888\"\n        active-gradient from=\"#E5C07B\" to=\"#a48abf\" angle=45\n\n    }\n\n    border {\n        off\n\n        width 2\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n        urgent-color \"#9b0000\"\n    }\n\n    shadow {\n\n        softness 30\n\n        spread 5\n\n        offset x=0 y=5\n\n        color \"#0007\"\n    }\n\n    struts {\n        left 8\n        right 8\n    }\n}\n\n\nspawn-at-startup \"waybar\"\nspawn-at-startup \"xwayland-satellite\"\nspawn-at-startup \"nm-applet\" \"--indicator\"\nspawn-at-startup \"blueman-applet\"\nspawn-at-startup \"fcitx5\"\nspawn-at-startup \"easyeffects\" \"--gapplication-service\"\nspawn-at-startup \"dunst\"\nspawn-at-startup \"copyq\"\nspawn-at-startup \"kdeconnectd\"\nspawn-at-startup \"/usr/bin/kdeconnect-indicator\"\nspawn-at-startup \"nm-applet\"\nspawn-at-startup \"~/.bin/startmail\"\nspawn-at-startup \"solaar\" \"-w\" \"hide\"\nspawn-at-startup \"swww-daemon\"\nspawn-at-startup \"xrdb\" \"-load\" \"~/.Xresources\"\nspawn-at-startup \"~/.bin/disable_kbd_on_moonlander\"\n\n\n\nprefer-no-csd\n\nscreenshot-path \"~/Pictures/Screenshots/Screenshot-%Y-%m-%d %H-%M-%S.png\"\n\n\nanimations {\n\n}\n\n\nwindow-rule {\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\nwindow-rule {\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\nwindow-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n}\n\nwindow-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nbinds {\n\n\n    Mod+Return hotkey-overlay-title=\"Open a Terminal\" { spawn \"ghostty\"; }\n    Mod+Space hotkey-overlay-title=\"Run an Application: fuzzel\" { spawn \"fuzzel\"; }\n\n    XF86AudioRaiseVolume { spawn \"pamixer\" \"-i\" \"1\"; }\n    XF86AudioLowerVolume { spawn \"pamixer\" \"-d\" \"1\"; }\n    XF86MonBrightnessDown { spawn \"brightnessctl\" \"s\" \"5%-\"; }\n    XF86MonBrightnessUp { spawn \"brightnessctl\" \"s\" \"+5%\"; }\n    XF86AudioMute { spawn \"~/.bin/volume\" \"mute\"; }\n    XF86AudioPlay { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioNext { spawn \"playerctl\" \"next\"; }\n    XF86AudioPrev { spawn \"playerctl\" \"previous\"; }\n    XF86PowerOff { spawn \"wlogout\"; }\n    Mod+Delete { spawn \"wlogout\"; }\n\n\n\n    Mod+BracketLeft { spawn \"copyq\" \"toggle\"; }\n    Mod+Shift+BracketLeft { spawn \"copyq\" \"show\"; }\n    Mod+g { spawn \"~/.bin/shuffle\"; }\n    Mod+r { spawn \"~/.bin/open_in_mpv\"; }\n    Ctrl+Alt+f { spawn \"librewolf\"; }\n    Alt+Space { spawn \"~/.bin/finder\"; }\n    Mod+Shift+B { spawn \"~/.bin/restart_waybar\"; }\n    Mod+P { spawn \"hyprpicker\" \"-a\"; }\n    Mod+Shift+P { spawn \"hyprpicker\" \"-a\" \"--format=rgb\"; }\n    Mod+backslash { spawn \"~/.bin/audio_output_switch\"; }\n    Mod+e { spawn \"thunar\"; }\n    Mod+t { spawn \"~/.bin/totp\"; }\n    Mod+O repeat=false { toggle-overview; }\n    Mod+Shift+Q repeat=false { close-window; }\n    Mod+H     hotkey-overlay-title=\"focus-column-left\" { focus-column-left; }\n    Mod+J     hotkey-overlay-title=\"focus-window-down\" { focus-window-down; }\n    Mod+K     hotkey-overlay-title=\"focus-window-up\" { focus-window-up; }\n    Mod+L     hotkey-overlay-title=\"focus-column-right\" { focus-column-right; }\n    Mod+Shift+H     hotkey-overlay-title=\"move-column-left\" { move-column-left; }\n    Mod+Shift+J     hotkey-overlay-title=\"move-window-down\" { move-window-down; }\n    Mod+Shift+K     hotkey-overlay-title=\"move-window-up\" { move-window-up; }\n    Mod+Shift+L     hotkey-overlay-title=\"move-column-right\" { move-column-right; }\n\n    Mod+M     { focus-workspace-down; }\n    Mod+U     { focus-workspace-up; }\n    Mod+Shift+1 { move-workspace-to-index 1; }\n    Mod+Shift+2 { move-workspace-to-index 2; }\n    Mod+Shift+3 { move-workspace-to-index 3; }\n    Mod+Shift+4 { move-workspace-to-index 4; }\n    Mod+Shift+5 { move-workspace-to-index 5; }\n    Mod+Shift+6 { move-workspace-to-index 6; }\n    Mod+Shift+7 { move-workspace-to-index 7; }\n    Mod+Shift+8 { move-workspace-to-index 8; }\n    Mod+Shift+9 { move-workspace-to-index 9; }\n    Mod+Shift+0 { move-workspace-to-index 10; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Ctrl+Left  { focus-monitor-left; }\n    Mod+Ctrl+Right { focus-monitor-right; }\n    Mod+Ctrl+H     { focus-monitor-left; }\n    Mod+Ctrl+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    Mod+shift+m { move-column-to-workspace-down; }\n    Mod+shift+u   { move-column-to-workspace-up; }\n\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n\n\n    Mod+Comma  { consume-or-expel-window-left; }\n    Mod+Period { consume-or-expel-window-right; }\n\n    Mod+Shift+Comma  { consume-window-into-column; }\n    Mod+Shift+Period { expel-window-from-column; }\n\n    Mod+V { maximize-column; }\n    Mod+F { fullscreen-window; }\n    Mod+Shift+G { spawn \"~/.config/niri/switch_monitor_scale\"; }\n\n\n    Mod+C { center-column; }\n\n    Mod+Ctrl+C { center-visible-columns; }\n\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    Mod+S       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    Mod+W { toggle-column-tabbed-display; }\n\n\n    Mod+Shift+s { screenshot; }\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n    Mod+Print { spawn \"~/.bin/screensend\"; }\n\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    Mod+Shift+X { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n}\n```\n</details>\n\n\n### System Information\n\n* niri version: niri 25.08 (01be0e6)\n\n* Distro:  Arch Linux  6.17.2-arch1-1\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU:  NVIDIA GeForce RTX 3050 Mobile\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: 11th Gen Intel(R) Core(TM) i5-11300H (8) @ 4.40 GHz\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2657/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2651",
      "id": 3538039840,
      "node_id": "I_kwDOKFkxdc7S4jQg",
      "number": 2651,
      "title": "Rendering artefact when using `niri msg output transform` on integrated screen",
      "user": {
        "login": "Monarn",
        "id": 130708726,
        "node_id": "U_kgDOB8p09g",
        "avatar_url": "https://avatars.githubusercontent.com/u/130708726?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Monarn",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187447,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI6Nw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:smithay",
          "name": "not niri:smithay",
          "color": "bbbbbb",
          "default": false,
          "description": "Smithay issues"
        },
        "1": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-10-21T20:18:55Z",
      "updated_at": "2026-02-15T20:56:54Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nWhen using `niri msg output transform` (all transformations except normal) to rotate my output (only eDP-1, no issue on external), screen damage does not seems to work fine. \nIt is at least some sort of rendering artefact (see the video for an example).\n\nIt was phone recorded, as OBS didn't catch the artefacts. (had to compress very hard, sorry for that)\n\nhttps://github.com/user-attachments/assets/b790a329-819d-4b12-a73b-4588544126b6\n\n\nCannot be replicated with a HP Pavilion x360 2in1 with niri 25.08.1 on Manjaro. (seems very specific to my device\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (01be0e6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: EndeavourOS x86_64\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Graphics @ 1.75 GHz [Integrated]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) Ultra 5 134U (14) @ 4.40 GHz\n\n* Device:  Dell Latitude 7350 Detachable\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2651/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2629",
      "id": 3529179384,
      "node_id": "I_kwDOKFkxdc7SWwD4",
      "number": 2629,
      "title": "Dual monitor setup broken: blank second monitor",
      "user": {
        "login": "pcarrier",
        "id": 8641,
        "node_id": "MDQ6VXNlcjg2NDE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/8641?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/pcarrier",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 25,
      "created_at": "2025-10-18T20:31:51Z",
      "updated_at": "2026-02-15T21:03:20Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nSecond monitor stays blank. Desktop includin mouse cursor refreshes slowly until I disable it.\n\n```\npcarrier@hound ~> niri msg outputs\nOutput \"LG Electronics LG ULTRAGEAR+ 504NTNHBM223\" (DP-2)\n  Current mode: 3840x2160 @ 240.084 Hz\n  Variable refresh rate: supported, enabled\n  Physical size: 700x390 mm\n  Logical position: 0, 0\n  Logical size: 3840x2160\n  Scale: 1\n  Transform: normal\n  Available modes:\n    3840x2160@240.084 (current)\n    3840x2160@144.050\n    3840x2160@95.033\n    3840x2160@59.997\n    2560x1440@143.973\n    1920x1080@143.981\n    1920x1080@119.879\n    1920x1080@60.000\n    1920x1080@59.939\n    1280x1024@75.025\n    1280x720@60.000\n    1280x720@59.943\n    1024x768@60.004\n    800x600@60.317\n    720x480@59.940\n    640x480@59.940\n    640x480@59.929\n\nOutput \"LG Electronics LG ULTRAGEAR+ 504NTUWBM222\" (DP-1)\n  Current mode: 3840x2160 @ 240.084 Hz\n  Variable refresh rate: supported, enabled\n  Physical size: 700x390 mm\n  Logical position: 3840, 0\n  Logical size: 3840x2160\n  Scale: 1\n  Transform: normal\n  Available modes:\n    3840x2160@240.084 (current)\n    3840x2160@144.050\n    3840x2160@95.033\n    3840x2160@59.997\n    2560x1440@143.973\n    1920x1080@143.981\n    1920x1080@119.879\n    1920x1080@60.000\n    1920x1080@59.939\n    1280x1024@75.025\n    1280x720@60.000\n    1280x720@59.943\n    1024x768@60.004\n    800x600@60.317\n    720x480@59.940\n    640x480@59.940\n    640x480@59.929\n```\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n```\ninput {\n    keyboard {\n        xkb {\n            options \"compose:ralt\"\n        }\n    }\n    mouse {\n            accel-profile \"flat\"\n    }\n}\noutput \"DP-1\" {\n    mode \"3840x2160@240.084\"\n    scale 1\n    background-color \"#000000\"\n    variable-refresh-rate\n}\noutput \"DP-2\" {\n    mode \"3840x2160@240.084\"\n    scale 1\n    background-color \"#000000\"\n    variable-refresh-rate\n}\nlayout {\n    gaps 0\n    focus-ring {\n        width 1\n        active-color \"#ff0000\"\n        inactive-color \"#505050\"\n    }\n}\nspawn-at-startup \"waybar\"\nhotkey-overlay {\n    skip-at-startup\n}\nprefer-no-csd\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\nbinds {\n    Mod+Shift+Slash { show-hotkey-overlay; }\n    Mod+T hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"alacritty\"; }\n    Mod+D hotkey-overlay-title=\"Run an Application: fuzzel\" { spawn \"fuzzel\"; }\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\n    Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.01+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.01-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\"; }\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"+10%\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"10%-\"; }\n    XF86AudioPlay allow-when-locked=true { spawn-sh \"playerctl play-pause\"; }\n    Mod+O repeat=false { toggle-overview; }\n    Mod+Q repeat=false { close-window; }\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n    Mod+Comma  { consume-window-into-column; }\n    Mod+Period { expel-window-from-column; }\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n    Mod+Ctrl+F { expand-column-to-available-width; }\n    Mod+C { center-column; }\n    Mod+Ctrl+C { center-visible-columns; }\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n    Mod+W { toggle-column-tabbed-display; }\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n    Mod+Shift+P { power-off-monitors; }\n}\n```\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (Nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS (nixpkgs-unstable)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVidia RTX 4090\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 9 7950X3D\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2629/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2600",
      "id": 3517160164,
      "node_id": "I_kwDOKFkxdc7Ro5rk",
      "number": 2600,
      "title": "Window rules per output OR window matching by output",
      "user": {
        "login": "gvolpe",
        "id": 443978,
        "node_id": "MDQ6VXNlcjQ0Mzk3OA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/443978?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gvolpe",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191562,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJKSg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:config",
          "name": "area:config",
          "color": "fbca04",
          "default": false,
          "description": "Config parsing, default config, new settings"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-10-15T09:24:54Z",
      "updated_at": "2026-02-20T20:49:40Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When using multiple monitors of different resolutions, e.g. a big ultra-wide monitor and a laptop's display, I would like to set the size of my floating (scratchpad) windows when they move between monitors.\n\nThis could be achieved either via window rules per output:\n\n```kdl\noutput \"DP-3\" {\n    window-rule {\n        match app-id=\"spotify\"\n        default-column-width { fixed 1596; }\n        default-window-height { fixed 1240; }\n    }\n}\n```\n\nOr via output matching on window rules:\n\n```kdl\nwindow-rule {\n    match app-id=\"spotify\"\n    match output=\"DP-3\"\n    default-column-width { fixed 1596; }\n    default-window-height { fixed 1240; }\n}\n```\n\nThere may be a few design challenges that this may present that we can discuss here.\n\nA first thing to consider would be how to handle [open-on-output](https://yalter.github.io/niri/Configuration%3A-Window-Rules.html#open-on-output) so we don't end up with an infinite loop. If we go with the first option, then I would think any window rule per output should take precedence over a generic window rule. However, if we go with the second option, output matchers on window rules and open-on-output should be validated accordingly to avoid any conflicts --- and this is over-simplifying things; surely there are more implementations details I'm not aware of. Thoughts? \n\n---\n\nNOTE: _if you're a user interested in this feature, please upvote with a 👍🏽_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2600/reactions",
        "total_count": 15,
        "+1": 15,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        3474
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2599",
      "id": 3516870957,
      "node_id": "I_kwDOKFkxdc7RnzEt",
      "number": 2599,
      "title": "German Neo and KOY keyboard variants not working properly",
      "user": {
        "login": "everscie",
        "id": 185475376,
        "node_id": "U_kgDOCw4hMA",
        "avatar_url": "https://avatars.githubusercontent.com/u/185475376?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/everscie",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        },
        "1": {
          "id": 10168192077,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJMTQ",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri",
          "name": "not niri",
          "color": "BBBBBB",
          "default": false,
          "description": "Other non-niri issues"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-10-15T08:05:40Z",
      "updated_at": "2026-02-21T04:32:11Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Neither the [Neo](https://neo-layout.org/) nor the KOY layout work properly with the following niri settings in the `config.kdl`:\n```\ninput {\n    xkb {\n        layout \"de\"\n        variant \"neo\"\n    }\n}\n```\nor\n```\ninput {\n    xkb {\n        layout \"de\"\n        variant \"koy\"\n    }\n}\n```\nThe problem is the same for both: level 1 and level 4 are confused. That means that when no mod key is pressed then level 4 is active. But when the mod 4 key (Alt Gr) is pressed then level 1 is active.\n\nThis bug makes it almost impossible to write properly in those two layout variants because you always have to keep the mod 4 key pressed.\n\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Void Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU 1: NVIDIA GeForce 940MX [Discrete]\n* GPU 2: Intel HD Graphics 620 @ 1.00 GHz [Integrated]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) i5-7200U (4) @ 3.10 GHz\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2599/reactions",
        "total_count": 5,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2597",
      "id": 3515119088,
      "node_id": "I_kwDOKFkxdc7RhHXw",
      "number": 2597,
      "title": "Nvidia/ Odd flickering in bottom right of screen",
      "user": {
        "login": "argosnothing",
        "id": 225423001,
        "node_id": "U_kgDODW-umQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/225423001?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/argosnothing",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187240,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5aA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/nvidia",
          "name": "nvidia",
          "color": "76b900",
          "default": false,
          "description": "NVIDIA issues"
        },
        "1": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 20,
      "created_at": "2025-10-14T19:03:22Z",
      "updated_at": "2026-02-16T21:15:38Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I also notice this happening in the background of windows when scrolling. ( on DP-1 ). I only started noticing this when I upped my framerate to the highest my monitor advertises. Testing it now with 143 refresh. \n\nhttps://github.com/user-attachments/assets/f30d7309-0c88-45a9-b2e4-c1934b9caefa\n\n<img width=\"843\" height=\"1827\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/c3f97e9e-eacb-42de-b632-7aee7e3c184d\" />\n\n\nniri version: \nniri stable v25.08 (commit 01be0e65f4eb91a9cd624ac0b76aaeab765c7294)\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\nDistro: \nNixOS ( sobiboo flake ) \n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\nGPU: nvidisa gtx 4070\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\nCPU: AMD Ryzen 9 5900X 12-Core Processor. \n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2597/reactions",
        "total_count": 3,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 3
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2544",
      "id": 3491842749,
      "node_id": "I_kwDOKFkxdc7QIUq9",
      "number": 2544,
      "title": "Scroll-method \"on-botton-down\" does not work in overview screen",
      "user": {
        "login": "akhilman",
        "id": 180812,
        "node_id": "MDQ6VXNlcjE4MDgxMg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/180812?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/akhilman",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-10-07T14:54:02Z",
      "updated_at": "2026-02-16T21:25:36Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nScrolling with trackball and `scroll-method \"on-button-down\"` does not work in overview screen, although it works just fine within applications.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n```kdl\n    trackball {\n        natural-scroll\n        accel-speed 0.8\n        scroll-method \"on-button-down\"\n        scroll-button 275\n        left-handed\n    }\n```\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (01be0e6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch \n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Advanced Micro Devices, Inc. [AMD/ATI] Picasso/Raven 2 [Radeon Vega Series / Radeon Vega Mobile Series] (rev d8)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: quad core AMD Ryzen 5 PRO 3400G with Radeon Vega Graphics\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2544/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        3118
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2543",
      "id": 3491842239,
      "node_id": "I_kwDOKFkxdc7QIUi_",
      "number": 2543,
      "title": "Misaligned border rendering",
      "user": {
        "login": "CodedNil",
        "id": 5075747,
        "node_id": "MDQ6VXNlcjUwNzU3NDc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5075747?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/CodedNil",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        },
        "1": {
          "id": 10168192077,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJMTQ",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri",
          "name": "not niri",
          "color": "BBBBBB",
          "default": false,
          "description": "Other non-niri issues"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-10-07T14:53:52Z",
      "updated_at": "2026-02-16T21:27:15Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "With certain apps the appearance of the border render is slightly off which creates a gap.\nI have noticed this in zen browser and zed editor.\n\n<img width=\"170\" height=\"144\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/cc5a0db1-bf69-4587-9726-f724cff2cc94\" />\n\n<img width=\"220\" height=\"204\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/2e6916e2-e225-46c8-aca4-f83df8de1913\" />\n\n<img width=\"136\" height=\"147\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/9422abb9-3e3b-4754-9d21-7b86e945dbde\" />\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri unstable 2025-10-02 (commit ba6e5e082a79901dc89b0d49c5da1b769d652aec)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel i7-1260P\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel i7-1260P\n\n\nThese are my relevant niri config settings:\n```\nfocus-ring = {\n  enable = true;\n  width = 2;\n  active.gradient = {\n    from = \"#aa7a83\";\n    to = \"#7a96aa\";\n    angle = 45;\n    in' = \"oklch longer hue\";\n    relative-to = \"workspace-view\";\n  };\n  inactive.color = \"#505050\";\n};\nborder = {\n  enable = true;\n  width = 2;\n  active.gradient = {\n    from = \"#aa7a83\";\n    to = \"#7a96aa\";\n    angle = 45;\n    in' = \"oklch longer hue\";\n    relative-to = \"workspace-view\";\n  };\n  inactive.color = \"#505050\";\n};\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2543/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2527",
      "id": 3485461361,
      "node_id": "I_kwDOKFkxdc7Pv-tx",
      "number": 2527,
      "title": "Glitched drawing tablet input adds fish hooks to stylus strokes",
      "user": {
        "login": "jaafarrc",
        "id": 168219030,
        "node_id": "U_kgDOCgbRlg",
        "avatar_url": "https://avatars.githubusercontent.com/u/168219030?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jaafarrc",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-10-06T02:15:02Z",
      "updated_at": "2026-02-16T21:30:17Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Drawing tablet stylus input has these weird fish hooks that come out of the strokes that I never actually draw. I can notice this issue both in Wayland native apps (Xournal++, Blender) and in XWayland apps (Krita, WINE apps). I checked in GNOME and KDE's Wayland sessions, and the hook problem wasn't there. Hyprland also exhibits this problem somewhat.\n\n[Niri config, via niri-flake](https://bpa.st/IG4Q)\n\n<img width=\"400\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/520532bf-47e5-4a0c-9d67-5ae0e9db840b\" />\n\n###### Example with Xournal++, running natively on Wayland in Niri. Hooks are most noticable on the top center strokes.\n\n<img width=\"600\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/219547f1-9b1a-4046-a3b4-a19932214cc9\" />\n\n### System Information\n\n* niri version: `niri stable v25.08 (commit 01be0e65f4eb91a9cd624ac0b76aaeab765c7294)`\n* Distro: NixOS unstable (25.11 Xantusia)\n* GPU: NVIDIA GeForce MX130 (via proprietary driver) / Intel UHD Graphics 620\n* CPU: Intel Core i7-8550U\n* Tablet: Wacom Intuos Art",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2527/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2519",
      "id": 3484488830,
      "node_id": "I_kwDOKFkxdc7PsRR-",
      "number": 2519,
      "title": "[Regression] DND from LXQt panel menus broken",
      "user": {
        "login": "stefonarch",
        "id": 10681413,
        "node_id": "MDQ6VXNlcjEwNjgxNDEz",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/stefonarch",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        },
        "1": {
          "id": 10168187500,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI6bA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/waiting%20for%20upstream",
          "name": "waiting for upstream",
          "color": "5319e7",
          "default": false,
          "description": "Waiting for an upstream project"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 10,
      "created_at": "2025-10-05T07:07:58Z",
      "updated_at": "2026-02-20T04:49:48Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Noticed only now: one of the latest commits broke this DND, while the release works fine.\nCan't test my older packages because of libdisplay-info (0.2.0-2 -> 0.3.0-1), this is broken already:\n`niri-git-25.08.r47.ge837e39-1-x86_64.pkg.tar.zst`\n\nIn LXQt single items can be dragged to quicklaunch area or to desktop from both mainmenu and fancymenu widgets. Inside fancymenu items under \"Favorites\" can be dragged to reorder, this is broken too.\nOther DND aren't affected as far I noticed, e.g. inside Quicklaunch area Ctrl+DND to reorder works still.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \nniri 25.08 (v25.08-90-gba6e5e08)                                                                                                  <!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2519/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2477",
      "id": 3465190881,
      "node_id": "I_kwDOKFkxdc7Oip3h",
      "number": 2477,
      "title": "Screen tearing/flickering",
      "user": {
        "login": "germanoeich",
        "id": 17045274,
        "node_id": "MDQ6VXNlcjE3MDQ1Mjc0",
        "avatar_url": "https://avatars.githubusercontent.com/u/17045274?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/germanoeich",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187240,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5aA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/nvidia",
          "name": "nvidia",
          "color": "76b900",
          "default": false,
          "description": "NVIDIA issues"
        },
        "1": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        },
        "2": {
          "id": 10168192027,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJMGw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:hardware",
          "name": "not niri:hardware",
          "color": "bbbbbb",
          "default": false,
          "description": "Driver and hardware bugs"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 22,
      "created_at": "2025-09-29T14:05:15Z",
      "updated_at": "2026-02-16T21:34:56Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Hi! I'm seeing a lot of flickering when plugging in 2 external monitors with niri. Here is my setup:\n\nLaptop screen (eDP-2): 1920x1080@120\nExternal monitor 1 (HDMI-A-1): 2560x1080@60\nExternal monitor 2 (DP-2): 2560x1080@60\n\nWhen I plug in the second external monitor, niri goes crazy with flickering all over the place, here is a video of the issue: \n\nhttps://github.com/user-attachments/assets/903284be-0416-4138-b990-86c58f25def7\n\nMy laptop lid was closed, but opening it doesn't improve the situation. Rebooting did nothing either. I tried switching between my devices using render-drm-device as per https://github.com/YaLTeR/niri/issues/2205, and the artifacts kept happening. Setting `wait-for-frame-completion-before-queueing` does fix the issue, tho.\n\nBefore setting wait for frame completion, I also attempted to comment all my output blocks, and artifacts did not go away.\n\nAs I'm not sure if `wait-for-frame-completion-before-queueing` is a workaround or a long term fix for my specific setup, I decided to open this issue. I'm able to reproduce this easily, so let me know which logs, settings, experiments I can run to help diagnose this.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (01be0e6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: CachyOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU (Integrated): Intel UHD Graphics\n* GPU: NVIDIA GeForce RTX 3060 (Mobile)\n* Nvidia driver: 580.82.09\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel i7-11800H\n\nconfig:\n```kdl\ninput {\n    keyboard {\n        xkb {\n            layout \"us,br\"\n            options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n        }\n\n        numlock\n    }\n    touchpad {\n        tap\n        natural-scroll\n    }\n\n    mouse {\n    }\n\n    trackpoint {\n    }\n    focus-follows-mouse max-scroll-amount=\"0%\"\n}\noutput \"eDP-2\" {\n    mode \"1920x1080@120.002\"\n    scale 1\n    transform \"normal\"\n    position x=0 y=0\n}\n\noutput \"HDMI-A-1\" {\n    scale 1\n    transform \"normal\"\n    position x=0 y=-1080\n}\n\noutput \"DP-2\" {\n    mode \"2560x1080@60\"\n    scale 1\n    transform \"normal\"\n    position x=2560 y=-1080\n}\n\nlayout {\n    gaps 16\n\n    center-focused-column \"never\"\n\n    preset-column-widths {\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n    }\n\n    tab-indicator {\n        width 8\n        gap 8\n        place-within-column\n        active-color \"#ea9ef2ff\"\n    }\n\n    focus-ring {\n        width 4\n        active-color \"#ea9ef2b3\"\n        inactive-color \"#505050\"\n    }\n\n    border {\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        urgent-color \"#9b0000\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        softness 30\n        spread 5\n        offset x=0 y=5\n        color \"#0007\"\n    }\n\n    struts {\n    }\n}\n\n\nhotkey-overlay {\n    skip-at-startup\n}\n\nanimations {\n}\n\nwindow-rule {\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\nwindow-rule {\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\nbinds {\n    // Redacted for brevity\n}\n\n\nwindow-rule {\n    geometry-corner-radius 20\n    clip-to-geometry true\n}\n\nlayer-rule {\n    match namespace=\"^quickshell-overview$\"\n    place-within-backdrop true\n}\n\ndebug {\n    honor-xdg-activation-with-invalid-serial\n    wait-for-frame-completion-before-queueing\n}\n\nspawn-sh-at-startup \"qs -c noctalia-shell\"\n\ncursor {\n    xcursor-theme \"breeze_cursors\"\n}\n\nenvironment {\n    ELECTRON_OZONE_PLATFORM_HINT \"auto\"\n}\n```\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2477/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2471",
      "id": 3462906769,
      "node_id": "I_kwDOKFkxdc7OZ8OR",
      "number": 2471,
      "title": "Qt Qml rendering issue for color transparent, yes it is niri issue works everywhere else.",
      "user": {
        "login": "er-bharat",
        "id": 146621598,
        "node_id": "U_kgDOCL1Eng",
        "avatar_url": "https://avatars.githubusercontent.com/u/146621598?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/er-bharat",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-09-29T01:41:41Z",
      "updated_at": "2026-02-20T04:52:09Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n \nQt Qml cant render transparent color it gets replaced with a darkgrey color on my custom app it works everywhere else gnome kde hyprland labwc etc. surprisingly semi transparent color works fine if only the ones with color: \"transparent\" dont work.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (01be0e6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: arch linux\n* \n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: intel uhd\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:intel i3 10gen\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2471/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2463",
      "id": 3460959062,
      "node_id": "I_kwDOKFkxdc7OSgtW",
      "number": 2463,
      "title": "Steam doesn't start through niri unless i add sleep 1 to the command",
      "user": {
        "login": "Viruzaum",
        "id": 23330390,
        "node_id": "MDQ6VXNlcjIzMzMwMzkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/23330390?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Viruzaum",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168192077,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJMTQ",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri",
          "name": "not niri",
          "color": "BBBBBB",
          "default": false,
          "description": "Other non-niri issues"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 23,
      "created_at": "2025-09-28T02:08:05Z",
      "updated_at": "2026-02-16T21:49:31Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nI can start Steam fine with walker or through the terminal, but when trying to start it with niri via cli or config it doesn't work.\n\n`niri msg action spawn -- steam` does not work\n`niri msg action spawn-sh -- steam` does not work\n`niri msg action spawn-sh -- 'sleep 1 && steam'` does work\nsame behavior with spawn-at-startup\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\nniri config: https://paste.rs/YFBm3.txt\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: unstable 2025-09-17 (commit 4808ba2b2055a09008be17d3e9eeae2d592b7b18)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS 25.11 (Xantusia)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon Graphics [Integrated]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 9800X3D\n",
      "closed_by": {
        "login": "Viruzaum",
        "id": 23330390,
        "node_id": "MDQ6VXNlcjIzMzMwMzkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/23330390?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Viruzaum",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2463/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2455",
      "id": 3459144679,
      "node_id": "I_kwDOKFkxdc7OLlvn",
      "number": 2455,
      "title": "Waterfox Sidebery Hover Drag and Drop",
      "user": {
        "login": "ministryofrain",
        "id": 234688213,
        "node_id": "U_kgDODf0O1Q",
        "avatar_url": "https://avatars.githubusercontent.com/u/234688213?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ministryofrain",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        },
        "1": {
          "id": 10168191960,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJL2A",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:application",
          "name": "not niri:application",
          "color": "bbbbbb",
          "default": false,
          "description": "Issues in applications"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-09-26T21:19:23Z",
      "updated_at": "2026-02-26T16:20:20Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nUsing a Waterfox Add-On called Sidebery for vertical tabs in a browser window as well as a Waterfox custom css file to hide the sidebar that houses Sidebery and show on hover. It is hidden partially in a window and almost completely in fullscreen.\n\nNow, when I hover on the edge of the left side of the screen, the bar will show, and under Win 10 or 11, which I was using just three days ago, it will stay there until I leave the sidebar with my mouse. This is not the case anymore with Niri under CachyOS: the bar will show, but when I click and drag a tab, the sidebar immediately vanishes, forcing me to place the tab as a new window to the left or right, or anywhere, on my monitor. \n\nIn a window, the browser window itself will scoot a little to the left, which allows me to place the tab, but only with a lot of trouble.\n\nHow would I fix something like this? I've tried adding a  \n\n> window-rule {\n>   match title=\"^$\"\n>   open-floating true\n> }\n> \n\ncommand to the niri config.kdl , but it didn't do anything to help the problem?\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: 25.08\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: CachyOS x86_64 (24.12, I believe)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon RX 9060 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel i5-11400F\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2455/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2441",
      "id": 3451148280,
      "node_id": "I_kwDOKFkxdc7NtFf4",
      "number": 2441,
      "title": "shm buffer not released on ready after screencopy",
      "user": {
        "login": "RobinMcCorkell",
        "id": 2016878,
        "node_id": "MDQ6VXNlcjIwMTY4Nzg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2016878?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/RobinMcCorkell",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191396,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJpA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:screencopy",
          "name": "area:screencopy",
          "color": "fbca04",
          "default": false,
          "description": "Issues with wlr/ext-screencopy code"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-09-24T22:09:56Z",
      "updated_at": "2026-02-16T21:51:51Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Attempting to screencopy from Niri with the wlr screencopy protocol and an shm buffer results in the buffer still being marked active on return of the frame `ready` event: https://wayland.app/protocols/wlr-screencopy-unstable-v1#zwlr_screencopy_frame_v1:event:ready\n\nPer the spec, `ready` should be: \"Called as soon as the frame is copied, indicating it is available for reading\"\n\n~To read the buffer on the client requires the server release the buffer, which doesn't seem to happen.~ EDIT: see further discussion in comments\n\nwlroots does this correctly, find `frame_destroy` and `frame_send_ready` here: https://gitlab.freedesktop.org/wlroots/wlroots/-/blob/master/types/wlr_screencopy_v1.c?ref_type=heads\n\nCan be reproduced with my project shaderlock which works correctly on sway: https://github.com/RobinMcCorkell/shaderlock - run with `WAYLAND_DEBUG=1` to see the wayland events passing around.\n\n### System Information\n\n* niri version: niri 25.08\n* Distro: Fedora 42\n* GPU: Intel iGPU\n* CPU: Intel i5-1135G7",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2441/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2435",
      "id": 3447229269,
      "node_id": "I_kwDOKFkxdc7NeItV",
      "number": 2435,
      "title": "Exiting Niri in a systemd service does not wait for `graphical-session.target`, causing some services to immediately fail due to losing the Wayland socket",
      "user": {
        "login": "Frontear",
        "id": 31909298,
        "node_id": "MDQ6VXNlcjMxOTA5Mjk4",
        "avatar_url": "https://avatars.githubusercontent.com/u/31909298?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Frontear",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191459,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJ4w",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:session",
          "name": "area:session",
          "color": "fbca04",
          "default": false,
          "description": "Screen locking, idle inhibit, suspend/resume"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 19,
      "created_at": "2025-09-24T01:38:33Z",
      "updated_at": "2026-02-27T21:07:03Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It seems that `niri.service` exits before `graphical-session.target` is able to terminate, so services which come down alongside it are left in a broken state and usually terminate with error codes. Systemd then marks the system status as \"degraded\" due to the failed services.\n\nThe services which fail to shutdown is inconsistent, as their stop job is subject to race conditions. Ideally `graphical-session.target` is allowed to stop before Niri terminates, so that the wayland socket survives long enough.\n\nRelevant `journalctl` output (last line is when `graphical-session.target` is stopped):\n```\nSep 23 21:30:26 LAPTOP-3DT4F02 niri[117432]: 2025-09-24T01:30:26.607749Z  INFO niri::input: quitting after confirming exit dialog\nSep 23 21:30:26 LAPTOP-3DT4F02 niri[117432]: 2025-09-24T01:30:26.958939Z DEBUG niri::utils::watcher: exiting watcher thread for Regular { user_path: \"/home/frontear/.config/niri/config.kdl\">\nSep 23 21:30:26 LAPTOP-3DT4F02 .xdg-desktop-po[117540]: Lost connection to Wayland compositor.\nSep 23 21:30:26 LAPTOP-3DT4F02 .xdg-desktop-po[117583]: Error reading events from display: Broken pipe\nSep 23 21:30:26 LAPTOP-3DT4F02 .waybar-wrapped[117486]: Error reading events from display: Broken pipe\nSep 23 21:30:26 LAPTOP-3DT4F02 .thunar-wrapped[117483]: Error reading events from display: Broken pipe\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]: wayland: failed to read events from the Wayland socket: Connection reset by peer\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]:  err: wayland.c:1659: failed to read events from the Wayland socket: Connection reset by peer\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]: warn: server.c:74: client FD=8: terminal still alive\nSep 23 21:30:26 LAPTOP-3DT4F02 .swayosd-server[117482]: Lost connection to Wayland compositor.\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]: server: client FD=8: terminal still alive\nSep 23 21:30:26 LAPTOP-3DT4F02 polkit-gnome-au[117477]: Error reading events from display: Broken pipe\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: niri.service: Consumed 34.070s CPU time, 159.5M memory peak.\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]:  err: wayland.c:2302: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]:  err: wayland.c:2302: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]: wayland: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]: wayland: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:26 LAPTOP-3DT4F02 polkitd[1867]: Unregistered Authentication Agent for unix-session:11 (system bus name :1.249, object path /org/gnome/PolicyKit1/AuthenticationAgent, locale en>\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]: wayland: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:27 LAPTOP-3DT4F02 foot[117476]:  err: wayland.c:2302: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:27 LAPTOP-3DT4F02 foot[117476]: warn: server.c:74: client FD=20: terminal still alive\nSep 23 21:30:27 LAPTOP-3DT4F02 foot[117476]:  err: wayland.c:2302: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:27 LAPTOP-3DT4F02 foot[117476]:  err: wayland.c:2302: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:27 LAPTOP-3DT4F02 foot[117476]:  err: wayland.c:2302: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: polkit-gnome.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]: server: client FD=20: terminal still alive\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: polkit-gnome.service: Failed with result 'exit-code'.\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]: wayland: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: Stopped GNOME PolicyKit Agent.\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]: wayland: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: Stopped Idle manager for Wayland.\nSep 23 21:30:26 LAPTOP-3DT4F02 foot[117476]: wayland: failed to roundtrip Wayland display: Connection reset by peer\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: swayidle.service: Consumed 2.062s CPU time, 146.9M memory peak.\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: thunar.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: thunar.service: Failed with result 'exit-code'.\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: Stopped thunar.service.\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: Stopped Dunst notification daemon.\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: xdg-desktop-portal-gnome.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: xdg-desktop-portal-gnome.service: Failed with result 'exit-code'.\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: Stopped Portal service (GNOME implementation).\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: xdg-desktop-portal-gtk.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: xdg-desktop-portal-gtk.service: Failed with result 'exit-code'.\nSep 23 21:30:26 LAPTOP-3DT4F02 systemd[1747]: Stopped Portal service (GTK/GNOME implementation).\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: swayosd.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: swayosd.service: Failed with result 'exit-code'.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopped swayosd.service.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: swayosd.service: Consumed 1.302s CPU time, 28.8M memory peak.\nSep 23 21:30:27 LAPTOP-3DT4F02 foot[117476]:  err: wayland.c:2267: failed to flush wayland socket: Connection reset by peer\nSep 23 21:30:27 LAPTOP-3DT4F02 foot[117476]: wayland: failed to flush wayland socket: Connection reset by peer\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: waybar.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: waybar.service: Failed with result 'exit-code'.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopped Highly customizable Wayland bar for Sway and Wlroots based compositors..\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: waybar.service: Consumed 2.512s CPU time, 25.1M memory peak.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: foot.service: Main process exited, code=exited, status=230/PERSONALITY\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopping microsoft-edge...\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopped target Startup of XDG autostart applications.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopping Portal service...\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopping flatpak document portal service...\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopping sandboxed app permission store...\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1]: run-user-1000-doc.mount: Deactivated successfully.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopped sandboxed app permission store.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopped Portal service.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopped flatpak document portal service.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopped microsoft-edge.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: app-niri-microsoft\\x2dedge-763a6496.scope: Consumed 1min 51.233s CPU time, 1.2G memory peak.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: app-org.chromium.Chromium-118028.scope: Consumed 55.911s CPU time, 1.2G memory peak.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: foot.service: Failed with result 'exit-code'.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopped Fast, lightweight and minimalistic Wayland terminal emulator..\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: foot.service: Consumed 55.052s CPU time, 2.1G memory peak.\nSep 23 21:30:27 LAPTOP-3DT4F02 systemd[1747]: Stopped target Current graphical user session.\n```\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (Nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Iris Xe Graphics\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: 11th Gen Intel(R) Core(TM) i7-1195G7\n",
      "closed_by": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2435/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2393",
      "id": 3419118001,
      "node_id": "I_kwDOKFkxdc7Ly5mx",
      "number": 2393,
      "title": "scroll-factor does not affect on-button-down scrolling",
      "user": {
        "login": "ArijanJ",
        "id": 56356662,
        "node_id": "MDQ6VXNlcjU2MzU2NjYy",
        "avatar_url": "https://avatars.githubusercontent.com/u/56356662?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ArijanJ",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-09-15T18:52:17Z",
      "updated_at": "2025-09-24T05:21:01Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nHi, I have a keyboard with a built-in trackball that I use to move the mouse and scroll. The scrolling is done `on-button-down`, but niri does not seem to care about the `scroll-factor` value when doing this.\n\nThis is what I currently have versus the sway equivalent:\n```kdl\nmouse {\n    scroll-method \"on-button-down\"\n    scroll-button 279\n    natural-scroll\n    scroll-factor 0.01\n}\n```\n```kdl\ninput \"43256:6196:Bastard_Keyboards_Charybdis_Mini_(3x6)_Splinky_Mouse\" {\n    scroll_factor 0.25\n    natural_scroll on\n    scroll_method on_button_down\n    scroll_button BTN_TASK\n    rotation_angle 0\n}\n```\nIn niri as opposed to sway, the scrolling is very fast no matter what I change the value to. I can't put `scroll-factor` in a 'trackball' block, niri does not allow it (but this specific device does not get picked up as a trackball either way). I also can't select the device by name, but that already has an open issue and probably doesn't matter here.\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (01be0e6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: N/A\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: N/A\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2393/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2390",
      "id": 3417815062,
      "node_id": "I_kwDOKFkxdc7Lt7gW",
      "number": 2390,
      "title": "Fedora Package: Default MOD+SHIFT+/ command apparantly unusable on LATAM keyboard",
      "user": {
        "login": "ghost",
        "id": 10137,
        "node_id": "MDQ6VXNlcjEwMTM3",
        "avatar_url": "https://avatars.githubusercontent.com/u/10137?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ghost",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 16,
      "created_at": "2025-09-15T12:44:42Z",
      "updated_at": "2025-11-30T11:23:53Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The desktop started up with a very much appreciated and very helpful overlay showing the default keybindings, but on my LATAM keyboard it is impossible to use the command which returns it to the screen.\n\nThis may be because the `/` symbol appears above the `7` key on my keyboard and requires shift to press, hiding the modifier from the application? It is possible I am misunderstanding something or making a mistake that I am not aware of yet.\n\nI understand the solution is to change the keybind in the config, but when starting niri for the first time, it is possible to:\n\n1. accidentally close the help window\n2. not know how to launch any applications\n3. config becomes practically unchangeable\n\nFurthermore I don't seem to have a config file in the `.config/niri/` directory, which implies to me that I am using a default config embedded in the application. This means I would need to know to download and modify the default config without being able to access the help overlay in the meantime.\n\n### System Information\n\n* niri version: 25.08\n* Distro: Fedora Sway Spin 42\n\n### Keyboard Layout\n\n![LATAM (spanish latin america) keyboard layout showing the / above the 7](https://upload.wikimedia.org/wikipedia/commons/8/8e/KB_Latin_American.svg)\n\nThank you very much for your consideration!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2390/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2381",
      "id": 3414175812,
      "node_id": "I_kwDOKFkxdc7LgDBE",
      "number": 2381,
      "title": "Empty `tile_pos_in_workspace_view` for tiled windows",
      "user": {
        "login": "realSaltyFish",
        "id": 64259296,
        "node_id": "MDQ6VXNlcjY0MjU5Mjk2",
        "avatar_url": "https://avatars.githubusercontent.com/u/64259296?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/realSaltyFish",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-09-13T21:38:28Z",
      "updated_at": "2026-02-13T01:21:35Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen retrieving window layout info via niri-ipc, the `tile_pos_in_workspace_view` field is `null` for tiled windows, and only populated for floating windows. Since the field is described as \"tile position within the current view of the workspace\", I believe it should also be populated for tiled windows.\n\nThis information is useful because it enables precisely selecting a window with `slurp` for screenshot with 3rd party tools. (Would be very nice if niri natively supports this.)\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (01be0e6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel HD Graphics 630\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel Core i7-7700\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2381/reactions",
        "total_count": 9,
        "+1": 9,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2377",
      "id": 3411346404,
      "node_id": "I_kwDOKFkxdc7LVQPk",
      "number": 2377,
      "title": "too many open files when running tests",
      "user": {
        "login": "sodiboo",
        "id": 37938646,
        "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
        "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sodiboo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-09-12T17:27:32Z",
      "updated_at": "2025-09-15T04:45:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The main niri binary increases its file descriptor soft limit to the hard limit upon startup:\n\nhttps://github.com/YaLTeR/niri/blob/b7909dbf61c7c1511b9a51ef46e1d503d5ba3d05/src/main.rs#L160\n\nBut it does no such thing for tests, as far as i can tell.\n\nSome users of my packages have reported that their builds are failing because the tests exhaust the file descriptor limit.\n\n- https://github.com/sodiboo/niri-flake/issues/1294\n- https://github.com/sodiboo/niri-flake/issues/1300\n- https://github.com/sodiboo/niri-flake/issues/1263#issuecomment-3264107285\n\nAs suggested in https://github.com/sodiboo/niri-flake/issues/1300, i could probably increase this limit in my package during the check phase? But this doesn't seem to be a NixOS-specific issue. The resource limit should probably be increased in the tests in niri itself. right?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2377/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2339",
      "id": 3387524304,
      "node_id": "I_kwDOKFkxdc7J6YTQ",
      "number": 2339,
      "title": "Cursor theme not picked up correctly",
      "user": {
        "login": "elmuz",
        "id": 9587977,
        "node_id": "MDQ6VXNlcjk1ODc5Nzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/9587977?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/elmuz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 18,
      "created_at": "2025-09-05T13:14:22Z",
      "updated_at": "2026-01-20T00:00:11Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "After the Niri release 25.08 I am experiencing that cursor is not displayed correctly. It used to work fine.\nMy cursor theme is located ~/.local/share/icons/<cursor-theme>. In particular,\n- The theme I am using is [Nordic](https://github.com/EliverLara/Nordic/tree/master/kde/cursors/Nordic-cursors)\n- Few apps display the cursor correctly (e.g. waybar, firefox, qalculate-gtk)\n- PyCharm (xwayland-satellite) doesn't pick it, but size is correct\n- Desktop, Alacritty do not pick the theme nor the size (very small cursor)\n\nNiri config:\n```\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n\t    variant \"altgr-intl\"\n            layout \"us\"\n            options \"shift:both_capslock,caps:super\"\n        }\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        // drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-3mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n\n// Ufficio\noutput \"DP-5\" {\n    mode \"1920x1080@60.000\"\n    position x=0 y=0\n}\noutput \"DP-7\" {\n    mode \"1920x1080@60.000\"\n    position x=1920 y=0\n}\n\noutput \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    // mode \"1920x1080@120.030\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    // scale 2\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    // transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=2887 y=1083\n    backdrop-color \"#2e3440\"\n}\n\noutput \"PNP(YEY) YMG-4K32-01 demoset-1\" {\n    mode \"3840x2160@59.982\"\n    scale 1.33\n    position x=0 y=0\n}\n\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 16\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 3\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#4c566a\"\n\n        // Color of the ring on inactive monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#81a1c1\"\n        inactive-color \"#505050\"\n\n        // active-gradient from=\"#ffbb66\" to=\"#ffc880\" angle=45 relative-to=\"workspace-view\"\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        //\n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        //\n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n\n    // Set transparent workspace background color.\n    background-color \"transparent\"\n}\n\n// Layers rules\n// Make the wallpaper stationary, rather than moving with workspaces.\nlayer-rule {\n    // This is for swaybg; change for other wallpaper tools.\n    // Find the right namespace by running niri msg layers.\n    match namespace=\"^swww\"\n    place-within-backdrop true\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n// spawn-at-startup \"alacritty\" \"-e\" \"fish\"\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/%Y%m%d-%H%M%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n\n// Optionally, disable the workspace shadows in the overview.\noverview {\n    workspace-shadow {\n        off\n    }\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n// Set open-maximized to true for all windows.\nwindow-rule {\n    open-maximized true\n    geometry-corner-radius 4\n    clip-to-geometry true\n    shadow {\n        on\n        spread 5\n\tsoftness 20\n        offset x=0 y=5\n    }\n}\n\n// Then, for Alacritty, set open-maximized back to false.\nwindow-rule {\n    match app-id=\"Alacritty\"\n    open-maximized false\n}\n\nwindow-rule {\n    match app-id=\"firefox\"\n    open-on-workspace \"one\"\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firef    geometry-corner-radius 12ox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\nwindow-rule {\n    match app-id=\"qalculate-gtk\"\n    open-floating true\n    default-column-width { fixed 800; }\n    default-window-height { fixed 570; }\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\n// Workspaces\nworkspace \"one\" {\n    open-on-output \"PNP(YEY) YMG-4K32-01 demoset-1\"\n}\nworkspace \"two\" {\n    open-on-output \"PNP(YEY) YMG-4K32-01 demoset-1\"\n}\nworkspace \"three\" {\n    open-on-output \"PNP(YEY) YMG-4K32-01 demoset-1\"\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+return { spawn \"alacritty\"; }\n    Mod+space { spawn \"fuzzel\"; }\n    Mod+L { spawn \"swaylock\"; }\n    Mod+C { spawn \"qalculate-gtk\"; }\n\n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument in the end.\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"--limit\" \"1.0\" \"@DEFAULT_AUDIO_SINK@\" \"0.03+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"--limit\" \"1.0\" \"@DEFAULT_AUDIO_SINK@\" \"0.03-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n    XF86MonBrightnessUp  { spawn \"brightnessctl\" \"set\" \"+5%\"; }\n    XF86MonBrightnessDown  { spawn \"brightnessctl\" \"set\" \"5%-\"; }\n\n    Mod+Shift+Q { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    // Mod+Down  { focus-window-down; }\n    // Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    // Mod+H     { focus-column-left; }\n    // Mod+J     { focus-window-down; }\n    // Mod+K     { focus-window-up; }\n    // Mod+L     { focus-column-right; }\n\n    // Mod+Ctrl+Left  { move-column-left; }\n    // Mod+Ctrl+Down  { move-window-down; }\n    // Mod+Ctrl+Up    { move-window-up; }\n    // Mod+Ctrl+Right { move-column-right; }\n    // Mod+Ctrl+H     { move-column-left; }\n    // Mod+Ctrl+J     { move-window-down; }\n    // Mod+Ctrl+K     { move-window-up; }\n    // Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Ctrl+Left  { focus-monitor-left; }\n    // Mod+Shift+Down  { focus-monitor-down; }\n    // Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Ctrl+Right { focus-monitor-right; }\n    // Mod+Shift+H     { focus-monitor-left; }\n    // Mod+Shift+J     { focus-monitor-down; }\n    // Mod+Shift+K     { focus-monitor-up; }\n    // Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Left  { move-column-to-monitor-left; }\n    // Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    // Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Right { move-column-to-monitor-right; }\n    // Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    // Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    // Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    // Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    // Mod+Page_Down      { focus-workspace-down; }\n    // Mod+Page_Up        { focus-workspace-up; }\n    Mod+Down            { focus-workspace-down; }\n    Mod+Up              { focus-workspace-up; }\n    // Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    // Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Shift+Down      { move-column-to-workspace-down; }\n    Mod+Shift+Up        { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace \"one\"; }\n    Mod+2 { focus-workspace \"two\"; }\n    Mod+3 { focus-workspace \"three\"; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace \"one\"; }\n    Mod+Ctrl+2 { move-column-to-workspace \"two\"; }\n    Mod+Ctrl+3 { move-column-to-workspace \"three\"; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+Shift+C { center-column; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    // Window switcher\n    Mod+Tab { spawn \"/home/alessio/.config/fuzzel/app_switch.py\"; }\n    // Overview\n    Mod+H { toggle-overview; }\n\n    // Screenshot\n    Print { screenshot; }\n    Mod+Shift+P { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n    Mod+P { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Shift+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+K { quit; }\n    Ctrl+Alt+Delete { quit; }\n    Mod+Escape { spawn \"/home/alessio/.config/fuzzel/powermenu.sh\"; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    // Mod+Shift+P { power-off-monitors; }\n}\n\ngestures {\n    hot-corners {\n        off\n    }\n}\n\ncursor {\n    xcursor-theme \"Nordic-cursors\"\n}\n\nhotkey-overlay {\n    skip-at-startup\n}\n\nenvironment {\n    GTK_THEME \"Nordic-bluish-accent\"\n    QT_QPA_PLATFORM \"wayland\"\n    SDL_VIDEODRIVER \"wayland\"\n    CLUTTER_BACKEND \"wayland\"\n    RADV_PERFTEST \"video_decode\"\n    DISPLAY \":0\"\n}\n\nprefer-no-csd\n\nspawn-at-startup \"waybar\"\nspawn-at-startup \"swww-daemon\"\nspawn-at-startup \"import-gsettings.sh\"\n```\n\nOther info:\n```shell\n➜  ~ env | grep CUR\nXCURSOR_SIZE=24\nXCURSOR_THEME=Nordic-cursors\nXDG_CURRENT_DESKTOP=niri\n```\n```shell\n➜  ~ gsettings get org.gnome.desktop.interface cursor-theme\n'Nordic-cursors'\n```\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: `niri 25.08 (v25.08)`\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Ubuntu 24.04\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: integrated\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) Ultra 7 155H\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2339/reactions",
        "total_count": 11,
        "+1": 11,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2335",
      "id": 3386022337,
      "node_id": "I_kwDOKFkxdc7J0pnB",
      "number": 2335,
      "title": "Zed Editor is broken in Niri",
      "user": {
        "login": "cetra3",
        "id": 6415435,
        "node_id": "MDQ6VXNlcjY0MTU0MzU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6415435?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cetra3",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 51,
      "created_at": "2025-09-05T01:57:10Z",
      "updated_at": "2026-02-27T21:28:01Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This may not be a niri bug specifically, but the [zed editor](https://zed.dev/) is broken in niri.  The reason is that when the application starts up, something invalidates the vulkan surface, and you have to resize the window to get it to work again.\n\nI've [raised a PR in blade](https://github.com/kvark/blade/pull/266) to be a bit more overt with this, but maybe there is something with the way that niri starts up windows that it's skipping a resize check or something.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (01be0e6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Nvidia 3090\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 9 3900XT \n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2335/reactions",
        "total_count": 24,
        "+1": 24,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2330",
      "id": 3376727376,
      "node_id": "I_kwDOKFkxdc7JRMVQ",
      "number": 2330,
      "title": "Black screen when starting Niri in Asahi NixOS",
      "user": {
        "login": "sezaru",
        "id": 279828,
        "node_id": "MDQ6VXNlcjI3OTgyOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/279828?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sezaru",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 16,
      "created_at": "2025-09-02T16:23:25Z",
      "updated_at": "2025-10-16T15:57:23Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Yesterday I removed my Asahi Fedora installation from my M2 Macbook Pro and installed NixOS instead.\n\nUnfortunately, niri is failing to start with this new setup. (obs. Niri worked great in the Fedora Asahi distro in the same hardware).\n\nLooking at `/dev/dri` I see 4 devices `card1`, `card2`, `card3` and `renderD128`.\n\nBy default, niri will just start in a black screen.\n\nI tried setting `debug { render-drm-device \"/dev/dri/card1\"; }` for each of the 4 devices, here are the logs from them:\n\n`/dev/dri/card1`:\nIt will be stuck in a black screen.\n\n```\n2025-09-02T16:01:40.915194Z  INFO niri: starting version stable v25.05.1 (commit 8ba57fcf25d2fc9565131684a839d58703f1dae7)\n2025-09-02T16:01:40.919935Z DEBUG niri_config: loaded config from \"/home/sezdocs/.config/niri/config.kdl\"\n2025-09-02T16:01:40.923530Z DEBUG niri::backend::tty: attempting to use render node from config: \"/dev/dri/card1\"\n2025-09-02T16:01:40.923543Z  WARN niri::backend::tty: DRM node \"/dev/dri/card1\" is not a render node\n2025-09-02T16:01:40.923559Z  WARN niri::backend::tty: could not get render node for DRM node \"/dev/dri/card1\"; proceeding anyway\n2025-09-02T16:01:40.923573Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/card1\"\n2025-09-02T16:01:40.936142Z DEBUG niri::backend::tty: device added: 57858 \"/dev/dri/card2\"\n2025-09-02T16:01:40.936190Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:01:40.936200Z DEBUG niri::backend::tty: device added: 57859 \"/dev/dri/card3\"\n2025-09-02T16:01:40.936227Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:01:40.936233Z DEBUG niri::backend::tty: device added: 57857 \"/dev/dri/card1\"\n2025-09-02T16:01:40.936257Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:01:40.936281Z  INFO niri: listening on Wayland socket: wayland-3\n2025-09-02T16:01:40.936287Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-3.147530.sock\n2025-09-02T16:01:41.625393Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:01:41.625419Z  WARN niri::handlers::layer_shell: no output for new layer surface, closing\n2025-09-02T16:01:41.625437Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:01:41.625460Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:01:41.625464Z  WARN niri::handlers::layer_shell: no output for new layer surface, closing\n2025-09-02T16:01:41.625471Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:01:41.628800Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:01:41.628859Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n```\n\n`/dev/dir/card2`:\nIt will just flash the screen and go back to the tty.\n```\n2025-09-02T16:03:31.884164Z  INFO niri: starting version stable v25.05.1 (commit 8ba57fcf25d2fc9565131684a839d58703f1dae7)\n2025-09-02T16:03:31.889610Z DEBUG niri_config: loaded config from \"/home/sezdocs/.config/niri/config.kdl\"\n2025-09-02T16:03:31.893257Z DEBUG niri::backend::tty: attempting to use render node from config: \"/dev/dri/card2\"\n2025-09-02T16:03:31.893272Z  WARN niri::backend::tty: DRM node \"/dev/dri/card2\" is not a render node\n2025-09-02T16:03:31.893303Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/renderD128\"\n2025-09-02T16:03:31.907180Z DEBUG niri::backend::tty: device added: 57859 \"/dev/dri/card3\"\n2025-09-02T16:03:31.907227Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:03:31.907237Z DEBUG niri::backend::tty: device added: 57857 \"/dev/dri/card1\"\n2025-09-02T16:03:31.907271Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:03:31.907276Z DEBUG niri::backend::tty: device added: 57858 \"/dev/dri/card2\"\n2025-09-02T16:03:31.907309Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:03:31.907333Z  INFO niri: listening on Wayland socket: wayland-1\n2025-09-02T16:03:31.907340Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.152182.sock\n2025-09-02T16:03:32.551283Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:03:32.551333Z  WARN niri::handlers::layer_shell: no output for new layer surface, closing\n2025-09-02T16:03:32.551368Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:03:32.551414Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:03:32.551426Z  WARN niri::handlers::layer_shell: no output for new layer surface, closing\n2025-09-02T16:03:32.551442Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:03:32.555071Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:03:32.555117Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n```\n\n`/dev/dri/card3`:\nIt will be stuck in a black screen.\n```\n2025-09-02T16:05:25.079292Z  INFO niri: starting version stable v25.05.1 (commit 8ba57fcf25d2fc9565131684a839d58703f1dae7)\n2025-09-02T16:05:25.084688Z DEBUG niri_config: loaded config from \"/home/sezdocs/.config/niri/config.kdl\"\n2025-09-02T16:05:25.088317Z DEBUG niri::backend::tty: attempting to use render node from config: \"/dev/dri/card3\"\n2025-09-02T16:05:25.088332Z  WARN niri::backend::tty: DRM node \"/dev/dri/card3\" is not a render node\n2025-09-02T16:05:25.088349Z  WARN niri::backend::tty: could not get render node for DRM node \"/dev/dri/card3\"; proceeding anyway\n2025-09-02T16:05:25.088363Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/card3\"\n2025-09-02T16:05:25.101117Z DEBUG niri::backend::tty: device added: 57859 \"/dev/dri/card3\"\n2025-09-02T16:05:25.101174Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:05:25.101184Z DEBUG niri::backend::tty: device added: 57857 \"/dev/dri/card1\"\n2025-09-02T16:05:25.101257Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:05:25.101262Z DEBUG niri::backend::tty: device added: 57858 \"/dev/dri/card2\"\n2025-09-02T16:05:25.101300Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:05:25.101325Z  INFO niri: listening on Wayland socket: wayland-2\n2025-09-02T16:05:25.101331Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-2.156283.sock\n2025-09-02T16:05:25.728002Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:05:25.728043Z  WARN niri::handlers::layer_shell: no output for new layer surface, closing\n2025-09-02T16:05:25.728080Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:05:25.728125Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:05:25.728135Z  WARN niri::handlers::layer_shell: no output for new layer surface, closing\n2025-09-02T16:05:25.728149Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:05:25.733034Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:05:25.733086Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n```\n\n`/dev/dri/renderD128`:\nit will just flash the screen and go back to the tty.\n```\n2025-09-02T16:06:23.634895Z  INFO niri: starting version stable v25.05.1 (commit 8ba57fcf25d2fc9565131684a839d58703f1dae7)\n2025-09-02T16:06:23.639662Z DEBUG niri_config: loaded config from \"/home/sezdocs/.config/niri/config.kdl\"\n2025-09-02T16:06:23.642918Z DEBUG niri::backend::tty: attempting to use render node from config: \"/dev/dri/renderD128\"\n2025-09-02T16:06:23.642960Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/renderD128\"\n2025-09-02T16:06:23.657830Z DEBUG niri::backend::tty: device added: 57858 \"/dev/dri/card2\"\n2025-09-02T16:06:23.657908Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:06:23.657918Z DEBUG niri::backend::tty: device added: 57857 \"/dev/dri/card1\"\n2025-09-02T16:06:23.657960Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:06:23.657970Z DEBUG niri::backend::tty: device added: 57859 \"/dev/dri/card3\"\n2025-09-02T16:06:23.658019Z  WARN niri::backend::tty: error adding device: Failed to open device: Resource temporarily unavailable (os error 11)\n2025-09-02T16:06:23.658043Z  INFO niri: listening on Wayland socket: wayland-1\n2025-09-02T16:06:23.658049Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.159199.sock\n2025-09-02T16:06:24.298658Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:06:24.298832Z  WARN niri::handlers::layer_shell: no output for new layer surface, closing\n2025-09-02T16:06:24.298901Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:06:24.299096Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:06:24.299146Z  WARN niri::handlers::layer_shell: no output for new layer surface, closing\n2025-09-02T16:06:24.299177Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:06:24.305612Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n2025-09-02T16:06:24.305678Z  WARN niri::backend::tty: error doing early import: Error::DeviceMissing\n```\n\nI tried this both with version `25.05.1` and `unstable 2025-08-22 (commit 2865ec3e47fa0b170f82f4beeefa56a5ea49d133)`.\n\nHere is my full config.kdl in case it helps:\n\n``` \n input {\n    keyboard {\n        xkb {\n            layout \"us\"\n            model \"\"\n            rules \"\"\n            variant \"\"\n            options \"compose:ralt,ctrl:nocaps\"\n        }\n        repeat-delay 200\n        repeat-rate 25\n        track-layout \"global\"\n    }\n    touchpad {\n        tap\n        dwt\n    }\n    focus-follows-mouse max-scroll-amount=\"90%\"\n}\noutput \"eDP-1\" {\n    scale 1.000000\n    transform \"normal\"\n    position x=0 y=0\n}\nscreenshot-path \"~/Pictures/Screenshots/Screenshot-from-%Y-%m-%d-%H-%M-%S.png\"\nprefer-no-csd\nlayout {\n    gaps 8\n    struts {\n        left 0\n        right 0\n        top 0\n        bottom 0\n    }\n    focus-ring {\n        width 2\n        active-color \"#7FC8FF\"\n        inactive-color \"#505050\"\n    }\n    border { off; }\n    shadow {\n        on\n        offset x=0 y=5\n        softness 10\n        spread 5\n        draw-behind-window false\n        color \"#000F\"\n    }\n    default-column-width { proportion 0.500000; }\n    preset-column-widths {\n        proportion 0.333330\n        proportion 0.500000\n        proportion 0.666670\n    }\n    center-focused-column \"never\"\n}\ncursor {\n    xcursor-theme \"Bibata-Original-Ice\"\n    xcursor-size 24\n    hide-after-inactive-ms 3000\n}\nhotkey-overlay { skip-at-startup; }\nenvironment {\n    DISPLAY \":0\"\n    \"QT_QPA_PLATFORMTHEME\" \"gtk3\"\n    \"QT_QPA_PLATFORMTHEME_QT6\" \"gtk3\"\n}\nbinds {\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+B { spawn \"zen\"; }\n    Mod+C { center-visible-columns; }\n    Mod+Comma { consume-window-into-column; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n    Mod+Ctrl+Return hotkey-overlay-title=\"Application Launcher\" { spawn \"/nix/store/6bbd712v3g21bxz56cqm9n5rz0vxcdg1-quickshell-wrapped-0.2.0/bin/qs\" \"ipc\" \"call\" \"spotlight\" \"toggle\"; }\n    Mod+Down { focus-workspace-down; }\n    Mod+E { spawn \"/nix/store/qy2ggzj2gp490q0l0829zjasi0amfb99-nautilus-48.3/bin/nautilus\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n    Mod+F { maximize-column; }\n    Mod+H { focus-column-left; }\n    Mod+J { focus-window-or-workspace-down; }\n    Mod+K { focus-window-or-workspace-up; }\n    Mod+L { focus-column-right; }\n    Mod+Left { focus-column-left; }\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+O repeat=false { toggle-overview; }\n    Mod+P { screenshot show-pointer=false; }\n    Mod+Period { expel-window-from-column; }\n    Mod+Q { close-window; }\n    Mod+Return hotkey-overlay-title=\"Open a terminal: ghostty\" { spawn \"/nix/store/pivavdxir44hs5n37qjx19gasvskcs4m-ghostty-1.1.3/bin/ghostty\"; }\n    Mod+Right { focus-column-right; }\n    Mod+S { switch-preset-column-width; }\n    Mod+Shift+Ctrl+J { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K { move-column-to-monitor-up; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n    Mod+Shift+F { expand-column-to-available-width; }\n    Mod+Shift+H { move-column-left; }\n    Mod+Shift+J { move-column-to-workspace-down; }\n    Mod+Shift+K { move-column-to-workspace-up; }\n    Mod+Shift+L { move-column-right; }\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Slash { show-hotkey-overlay; }\n    Mod+Space { toggle-window-floating; }\n    Mod+Tab { switch-focus-between-floating-and-tiling; }\n    Mod+Up { focus-workspace-up; }\n    Mod+W { toggle-column-tabbed-display; }\n    XF86AudioLowerVolume { spawn \"/nix/store/6bbd712v3g21bxz56cqm9n5rz0vxcdg1-quickshell-wrapped-0.2.0/bin/qs\" \"ipc\" \"call\" \"audio\" \"decrement\" \"3\"; }\n    XF86AudioMicMute { spawn \"/nix/store/6bbd712v3g21bxz56cqm9n5rz0vxcdg1-quickshell-wrapped-0.2.0/bin/qs\" \"ipc\" \"call\" \"audio\" \"micmute\"; }\n    XF86AudioMute { spawn \"/nix/store/6bbd712v3g21bxz56cqm9n5rz0vxcdg1-quickshell-wrapped-0.2.0/bin/qs\" \"ipc\" \"call\" \"audio\" \"mute\"; }\n    XF86AudioNext { spawn \"/nix/store/ccviqni26qk3bm179iqiaxz5gvp0dgi9-playerctl-2.4.1/bin/playerctl\" \"next\"; }\n    XF86AudioPlay { spawn \"/nix/store/ccviqni26qk3bm179iqiaxz5gvp0dgi9-playerctl-2.4.1/bin/playerctl\" \"play-pause\"; }\n    XF86AudioPrev { spawn \"/nix/store/ccviqni26qk3bm179iqiaxz5gvp0dgi9-playerctl-2.4.1/bin/playerctl\" \"previous\"; }\n    XF86AudioRaiseVolume { spawn \"/nix/store/6bbd712v3g21bxz56cqm9n5rz0vxcdg1-quickshell-wrapped-0.2.0/bin/qs\" \"ipc\" \"call\" \"audio\" \"increment\" \"3\"; }\n    XF86AudioStop { spawn \"/nix/store/ccviqni26qk3bm179iqiaxz5gvp0dgi9-playerctl-2.4.1/bin/playerctl\" \"pause\"; }\n    XF86KbdBrightnessDown { spawn \"/nix/store/6bbd712v3g21bxz56cqm9n5rz0vxcdg1-quickshell-wrapped-0.2.0/bin/qs\" \"ipc\" \"call\" \"brightness\" \"decrement\" \"5\" \"kbd_backlight\"; }\n    XF86KbdBrightnessUp { spawn \"/nix/store/6bbd712v3g21bxz56cqm9n5rz0vxcdg1-quickshell-wrapped-0.2.0/bin/qs\" \"ipc\" \"call\" \"brightness\" \"increment\" \"5\" \"kbd_backlight\"; }\n    XF86MonBrightnessDown { spawn \"/nix/store/6bbd712v3g21bxz56cqm9n5rz0vxcdg1-quickshell-wrapped-0.2.0/bin/qs\" \"ipc\" \"call\" \"brightness\" \"decrement\" \"5\" \"\"; }\n    XF86MonBrightnessUp { spawn \"/nix/store/6bbd712v3g21bxz56cqm9n5rz0vxcdg1-quickshell-wrapped-0.2.0/bin/qs\" \"ipc\" \"call\" \"brightness\" \"increment\" \"5\" \"\"; }\n    XF86Search { spawn \"/nix/store/6bbd712v3g21bxz56cqm9n5rz0vxcdg1-quickshell-wrapped-0.2.0/bin/qs\" \"ipc\" \"call\" \"spotlight\" \"toggle\"; }\n}\nwindow-rule {\n    draw-border-with-background false\n    geometry-corner-radius 10.000000 10.000000 10.000000 10.000000\n    clip-to-geometry true\n}\nwindow-rule {\n    match is-floating=true\n    shadow { on; }\n}\nwindow-rule {\n    match is-window-cast-target=true\n    border { inactive-color \"#7d0d2d\"; }\n    focus-ring {\n        active-color \"#f38ba8\"\n        inactive-color \"#7d0d2d\"\n    }\n    shadow { color \"#7d0d2d70\"; }\n    tab-indicator {\n        active-color \"#f38ba8\"\n        inactive-color \"#7d0d2d\"\n    }\n}\nwindow-rule {\n    match app-id=\"org.telegram.desktop\"\n    block-out-from \"screencast\"\n}\nwindow-rule {\n    match app-id=\"app.drey.PaperPlane\"\n    block-out-from \"screencast\"\n}\nwindow-rule {\n    match app-id=\"zen\"\n    match app-id=\"firefox\"\n    match app-id=\"chromium-browser\"\n    match app-id=\"xdg-desktop-portal-gtk\"\n    scroll-factor 0.500000\n}\nwindow-rule {\n    match app-id=\"zen\"\n    match app-id=\"firefox\"\n    match app-id=\"chromium-browser\"\n    open-maximized true\n}\nwindow-rule {\n    match app-id=\"firefox\" title=\"Picture-in-Picture\"\n    match app-id=\"zen\" title=\"Picture-in-Picture\"\n    default-column-width { fixed 480; }\n    default-window-height { fixed 270; }\n    open-floating true\n    default-floating-position relative-to=\"bottom-right\" x=32 y=32\n}\nwindow-rule {\n    match title=\"Picture in picture\"\n    open-floating true\n    default-floating-position relative-to=\"bottom-right\" x=32 y=32\n}\nwindow-rule {\n    match title=\"Discord Popout\"\n    open-floating true\n    default-floating-position relative-to=\"bottom-right\" x=32 y=32\n}\nwindow-rule {\n    match app-id=\"dialog\"\n    open-floating true\n}\nwindow-rule {\n    match app-id=\"popup\"\n    open-floating true\n}\nwindow-rule {\n    match app-id=\"task_dialog\"\n    open-floating true\n}\nwindow-rule {\n    match app-id=\"gcr-prompter\"\n    open-floating true\n}\nwindow-rule {\n    match app-id=\"file-roller\"\n    open-floating true\n}\nwindow-rule {\n    match app-id=\"org.gnome.FileRoller\"\n    open-floating true\n}\nwindow-rule {\n    match app-id=\"nm-connection-editor\"\n    open-floating true\n}\nwindow-rule {\n    match app-id=\"blueman-manager\"\n    open-floating true\n}\nwindow-rule {\n    match app-id=\"xdg-desktop-portal-gtk\"\n    open-floating true\n}\nwindow-rule {\n    match app-id=\"org.kde.polkit-kde-authentication-agent-1\"\n    open-floating true\n}\nwindow-rule {\n    match app-id=\"pinentry\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"Progress\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"File Operations\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"Copying\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"Moving\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"Properties\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"Downloads\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"file progress\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"Confirm\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"Authentication Required\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"Notice\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"Warning\"\n    open-floating true\n}\nwindow-rule {\n    match title=\"Error\"\n    open-floating true\n}\ndebug { render-drm-device \"/dev/dri/renderD128\"; }\n  ```\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version:  `25.05.1` and `unstable 2025-08-22 (commit 2865ec3e47fa0b170f82f4beeefa56a5ea49d133)`.\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS Asahi 25.05\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: The Macbook M2 GPU, not sure what is it name\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: M2\n\n* Kernel: 6.14.8-asahi aarch64\n\n*PS*: I also read in the documentation that using a mesa version that is not \"in sync\" with the niri version can result in a black screen in NixOS, but I'm not sure how exactly I should check if that is the issue and fix it.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2330/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2316",
      "id": 3368428509,
      "node_id": "I_kwDOKFkxdc7IxiPd",
      "number": 2316,
      "title": "Opening Element from its tray icon causes a visual & sizing bug",
      "user": {
        "login": "Winterhuman",
        "id": 86165318,
        "node_id": "MDQ6VXNlcjg2MTY1MzE4",
        "avatar_url": "https://avatars.githubusercontent.com/u/86165318?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Winterhuman",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-08-29T23:01:39Z",
      "updated_at": "2025-12-12T07:53:47Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nIf Element (Flathub flatpak version 1.11.110. Old Element versions are affected. Different packaging formats not tested) is opened from its tray icon (with the tray provided by either `waybar`'s \"tray\" module, or `xfce4-panel`'s \"Status Tray Plugin\" item), when no existing window is present, the window that is opened behaves very strangely. Main characteristics:\n\n- The entire window tries to extend below the workspace view, including the border, but the top of the border stays where it should be.\n- The app itself is offset inwards visually, creating a gap between it and the border, and is also truncated by the workspace view.\n    - You can still `Mod`-drag it around if you click from in this gap.\n- Even if the window is given a `preset-column-width` of `0.5`, the window will appear (going by where the borders appear horizontally) & act as if it's slightly larger and prevent other `0.5` width columns from sharing its view (when using `center-focused-column \"on-overflow\"`).\n- Going into the overview reveals a flicking line below or at where the window abruptly ends. The offset of the line from the bottom of the window is different each time the overview is opened, and looks to be where part of the bottom of the window stays in place relative to the whole screen; it looks like that part of the screen isn't clearing properly)\n- Resizing the window, or turning it into a tabbed column with another window (the value of `default-column-display` doesn't affect this), fixes the issue from that point onward, until the window is closed and re-opened from the tray.\n\nHere's an example image to demonstrate:\n\n![Image](https://github.com/user-attachments/assets/9222868a-de9d-452a-af88-b1dba781d517)\n\n> [!NOTE]\n> The bottom of the image *is* the bottom of the workspace view, going into the overview reveals nothing else other than the previously mentioned flickering line. I would show a screenshot of the line, but, entering Niri's built-in screenshot tool causes the line to disappear until the overview is toggled again)\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\nConfig: Any with `prefer-no-csd` set\n\n### System Information\n\nniri version: niri 25.05.1 (8ba57fc)\nDistro: Arch Linux\nGPU: AMD RX 580\nCPU: AMD Ryzen 5 3600X",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2316/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2314",
      "id": 3367237668,
      "node_id": "I_kwDOKFkxdc7Is_gk",
      "number": 2314,
      "title": "wtype makes input unusable",
      "user": {
        "login": "zoriya",
        "id": 32224410,
        "node_id": "MDQ6VXNlcjMyMjI0NDEw",
        "avatar_url": "https://avatars.githubusercontent.com/u/32224410?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zoriya",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-08-29T15:17:21Z",
      "updated_at": "2026-01-18T00:18:00Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`wtype` (a binary that inputs keys through the virtual-keyboard protocol) works as it should but once it exits (and closes the virtual keyboard), the selected app stops receiving input events from your keyboard.\n\n### Reproduction\n\n- run ` wtype -k p` in a shell\n- observe that `p` got written (as it should)\n- observe that your keyboard does not input anymore until you unfocus the app (niri keybinds still work)\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (Nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: nixos\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: /\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: /\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2314/reactions",
        "total_count": 10,
        "+1": 10,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2309",
      "id": 3364444501,
      "node_id": "I_kwDOKFkxdc7IiVlV",
      "number": 2309,
      "title": "Span window across all monitors",
      "user": {
        "login": "JaCoB1123",
        "id": 642504,
        "node_id": "MDQ6VXNlcjY0MjUwNA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/642504?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/JaCoB1123",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187133,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI4_Q",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:layout",
          "name": "area:layout",
          "color": "fbca04",
          "default": false,
          "description": "Columns, workspaces, scrolling, fullscreen, resize"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 11,
      "created_at": "2025-08-28T19:31:32Z",
      "updated_at": "2026-02-26T17:20:45Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The issue with flameshot on multi screens seems to be that it opens a window that is your virtual screen size, but niri shows only the left most part of it on the main monitor. Unfortunately there seems no way to have a window span multiple screens - not even when the window is floating. Is there maybe some possibility to get this to work? It would need to set a window to  span all available monitors.\r\n\r\n_Originally posted by @JaCoB1123 in https://github.com/YaLTeR/niri/discussions/1737#discussioncomment-13656904_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2309/reactions",
        "total_count": 8,
        "+1": 8,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2303",
      "id": 3357340383,
      "node_id": "I_kwDOKFkxdc7IHPLf",
      "number": 2303,
      "title": "Winit touch issues",
      "user": {
        "login": "Quackdoc",
        "id": 74831516,
        "node_id": "MDQ6VXNlcjc0ODMxNTE2",
        "avatar_url": "https://avatars.githubusercontent.com/u/74831516?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Quackdoc",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10211952831,
          "node_id": "LA_kwDOKFkxdc8AAAACYK4Ivw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/backend:winit",
          "name": "backend:winit",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues with the winit (nested window) backend"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-08-26T22:42:15Z",
      "updated_at": "2026-02-15T20:01:24Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (v25.05.1-165-g7cbb6288-modified)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel A380\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:Ryzen 2600\n\n\nWhen running nested, I run into a few issues with touch, the first one being https://github.com/Smithay/smithay/issues/1806 \n\nI modified niri to throw `handle.frame(self);` at the end of the touch events and that does indeed make touch register. However the vertical axis of touch seems to be miscalibrated. It seems to be inverted, the \"center\" point of touch is well below the actual center of the window, I am roughly pressing the center point of the window in the first picture, and the very bottom-center of the window in the second one\n\n<img width=\"1280\" height=\"960\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/4cc66b8a-7e1c-4c4c-82db-a2ffd868504e\" />\n\n<img width=\"1280\" height=\"960\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/23888a03-e162-4b81-8477-92cd2fdaecf7\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2303/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2302",
      "id": 3357298696,
      "node_id": "I_kwDOKFkxdc7IHFAI",
      "number": 2302,
      "title": "Multiple ScreenCasts broken",
      "user": {
        "login": "Gamer92000",
        "id": 42619277,
        "node_id": "MDQ6VXNlcjQyNjE5Mjc3",
        "avatar_url": "https://avatars.githubusercontent.com/u/42619277?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gamer92000",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-08-26T22:24:21Z",
      "updated_at": "2025-08-27T09:46:11Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nWhen a single application (or rather, process) requests two screencasts through the desktop portal and stops one, the other one breaks. Specifically, the non-stopped screencast remains present but receives no further data.\n\nLet me prefix the rest by saying that I am not fully sure where the exact cause lies, but all my tests lead me to niri itself.\n\nI built a minimal example to reproduce the problem in any browser (I tested Chromium and Firefox), you can find it [here](https://gist.github.com/Gamer92000/a61a3a8207dfb6c58fbe931389b5124e). Simply start both streams, stop one and notice how the other one stops moving.\n\nI am using the Gnome desktop portal for screencast - as per the wiki. This does not happen in a full Gnome environment, leading me to exclude the portal as a potential cause. When looking at some verbose pipewire logs I noticed that some reconfiguration happened between the Input and Output node for the screencast session that should persist. However, this eventually failed and left the Input Node with an empty Format array.\n\nI was unable to reproduce this issue in OBS, though.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Alder Lake-P iGPU (i5-1240P)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: i5-1240P\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2302/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2282",
      "id": 3348179827,
      "node_id": "I_kwDOKFkxdc7HkStz",
      "number": 2282,
      "title": "Workspace shadow doesn't show in overview animation when the workspace itself isn't rendered",
      "user": {
        "login": "miku4k",
        "id": 89653242,
        "node_id": "MDQ6VXNlcjg5NjUzMjQy",
        "avatar_url": "https://avatars.githubusercontent.com/u/89653242?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/miku4k",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-08-23T12:37:56Z",
      "updated_at": "2025-08-23T16:23:38Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nThe workspace shadow isn't rendered if the workspace isn't rendered. This is noticeable when slowly opening the overview, eg using the touchpad gesture. If you look at the edge of your screen, you can see it popping in once at least a pixel of the workspace itself is visible.\n\n<details><summary>Screenshots</summary>\n<p>\n\n<img width=\"1920\" height=\"1080\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/15b43162-abb7-467e-a529-cdab3090df0e\" />\n\n<img width=\"1920\" height=\"1080\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/6fe9576d-87d5-4e66-8d85-575155b89a9a\" />\n\n</p>\n</details> \n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<details><summary>Config</summary>\n<p>\n\nGenerated from nix\n\n```kdl\ninput {\n    keyboard {\n        xkb {\n            layout \"de,de,de,us\"\n            model \"\"\n            rules \"\"\n            variant \"dvorak,nodeadkeys,bone,\"\n            options \"compose:rwin\"\n        }\n        repeat-delay 600\n        repeat-rate 25\n        track-layout \"global\"\n        numlock\n    }\n    touchpad {\n        tap\n        drag true\n        drag-lock\n        scroll-method \"two-finger\"\n        tap-button-map \"left-right-middle\"\n    }\n    warp-mouse-to-focus mode=\"center-xy\"\n    focus-follows-mouse max-scroll-amount=\"50%\"\n    disable-power-key-handling\n}\noutput \"eDP-1\" {\n    scale 1\n    focus-at-startup\n    transform \"normal\"\n    position x=0 y=0\n}\nscreenshot-path \"/home/lily/media/pics/Screenshots/Screenshot_%Y-%m-%d_%H:%M:%S.png\"\nprefer-no-csd\n// i think this is the only relevant part\noverview { backdrop-color \"#dce0e8\"; }\nlayout {\n    gaps 5\n    struts {\n        left 0\n        right 35\n        top 0\n        bottom 0\n    }\n    focus-ring {\n        width 5\n        active-color \"#8839ef\"\n    }\n    border { off; }\n    insert-hint { color \"#8839ef80\"; }\n    default-column-width\n    preset-column-widths {\n        proportion 0.200000\n        proportion 0.250000\n        proportion 0.333333\n        proportion 0.400000\n        proportion 0.500000\n        proportion 0.600000\n        proportion 0.666667\n        proportion 0.750000\n        proportion 0.800000\n        proportion 1.000000\n    }\n    preset-window-heights {\n        proportion 0.250000\n        proportion 0.333333\n        proportion 0.500000\n        proportion 0.666667\n        proportion 0.750000\n        proportion 1.000000\n    }\n    center-focused-column \"never\"\n    always-center-single-column\n    empty-workspace-above-first\n}\ncursor {\n    xcursor-theme \"default\"\n    xcursor-size 24\n}\nhotkey-overlay { skip-at-startup; }\nenvironment {\n    DISPLAY \":3\"\n    \"QT_QPA_PLATFORM\" \"wayland;xcb\"\n    \"QT_WAYLAND_DISABLE_WINDOWDECORATION\" \"1\"\n}\nbinds {\n    Alt+Print { screenshot-window; }\n    Alt+Tab { spawn \"rofi\" \"-i\" \"-show-icons\" \"-show\" \"window\"; }\n    Ctrl+Alt+Delete { spawn \"wlogout\" \"-p\" \"layer-shell\" \"-b\" \"4\"; }\n    Ctrl+Print { screenshot-screen; }\n    Ctrl+XF86AudioLowerVolume allow-when-locked=true { spawn \"brightnessctl\" \"set\" \"5%-\"; }\n    Ctrl+XF86AudioPlay { spawn \"playerctl\" \"stop\"; }\n    Ctrl+XF86AudioRaiseVolume allow-when-locked=true { spawn \"brightnessctl\" \"set\" \"5%+\"; }\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Alt+L { spawn \"swaylock\"; }\n    Mod+Alt+Space { spawn \"/nix/store/mymfaxnsfkx0k0bln6fj3mng5bc8bm1q-chkb/bin/chkb\"; }\n    Mod+C { center-column; }\n    Mod+Comma { consume-window-into-column; }\n    Mod+Ctrl+C { center-visible-columns; }\n    Mod+Ctrl+Down { move-window-down; }\n    Mod+Ctrl+F { switch-focus-between-floating-and-tiling; }\n    Mod+Ctrl+H { move-column-left-or-to-monitor-left; }\n    Mod+Ctrl+I { move-window-to-workspace-down; }\n    Mod+Ctrl+J { move-window-down; }\n    Mod+Ctrl+K { move-window-up; }\n    Mod+Ctrl+L { move-column-right-or-to-monitor-right; }\n    Mod+Ctrl+Left { move-column-left-or-to-monitor-left; }\n    \"Mod+Ctrl+Page_Down\" { move-window-to-workspace-down; }\n    \"Mod+Ctrl+Page_Up\" { move-window-to-workspace-up; }\n    Mod+Ctrl+Right { move-column-right-or-to-monitor-right; }\n    Mod+Ctrl+U { move-window-to-workspace-up; }\n    Mod+Ctrl+Up { move-window-up; }\n    Mod+Down { focus-window-down-or-top; }\n    Mod+E { spawn \"kitty\" \"-e\" \"nvim\"; }\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n    Mod+F { toggle-window-floating; }\n    Mod+F1 { show-hotkey-overlay; }\n    Mod+H { focus-column-or-monitor-left; }\n    Mod+I { focus-workspace-down; }\n    Mod+J { focus-window-down-or-top; }\n    Mod+K { focus-window-up-or-bottom; }\n    Mod+L { focus-column-or-monitor-right; }\n    Mod+Left { focus-column-or-monitor-left; }\n    Mod+M { maximize-column; }\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+O { toggle-overview; }\n    \"Mod+Page_Down\" { focus-workspace-down; }\n    \"Mod+Page_Up\" { focus-workspace-up; }\n    Mod+Period { expel-window-from-column; }\n    Mod+Plus { set-column-width \"+10%\"; }\n    Mod+Q { close-window; }\n    Mod+R { switch-preset-column-width; }\n    Mod+Return { spawn \"kitty\"; }\n    Mod+Right { focus-column-or-monitor-right; }\n    Mod+Shift+C { center-window; }\n    Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+H { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }\n    Mod+Shift+Down { focus-monitor-down; }\n    Mod+Shift+F { fullscreen-window; }\n    Mod+Shift+H { focus-monitor-left; }\n    Mod+Shift+J { focus-monitor-down; }\n    Mod+Shift+K { focus-monitor-up; }\n    Mod+Shift+L { focus-monitor-right; }\n    Mod+Shift+Left { focus-monitor-left; }\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Plus { set-window-height \"+10%\"; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+Up { focus-monitor-up; }\n    Mod+Shift+WheelScrollDown { focus-column-right; }\n    Mod+Shift+WheelScrollUp { focus-column-left; }\n    Mod+Space { spawn \"rofi\" \"-i\" \"-show-icons\" \"-show\" \"drun\"; }\n    Mod+U { focus-workspace-up; }\n    Mod+Up { focus-window-up-or-bottom; }\n    Mod+V { spawn \"bash\" \"-c\" \"exec -- cliphist list | rofi -i -dmenu -p Clipboard | cliphist decode | wl-copy\"; }\n    Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }\n    Print { screenshot; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"5%-\"; }\n    XF86AudioMute allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioNext { spawn \"playerctl\" \"next\"; }\n    XF86AudioPlay { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioPrev { spawn \"playerctl\" \"previous\"; }\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"5%+\"; }\n    XF86AudioStop { spawn \"playerctl\" \"stop\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"set\" \"5%-\"; }\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"set\" \"5%+\"; }\n    XF86PowerOff { spawn \"wlogout\" \"-p\" \"layer-shell\" \"-b\" \"4\"; }\n}\nswitch-events {\n    lid-close { spawn \"niri\" \"msg\" \"action\" \"power-off-monitors\"; }\n    lid-open { spawn \"niri\" \"msg\" \"action\" \"power-on-monitors\"; }\n}\nspawn-at-startup \"wl-paste\" \"--watch\" \"cliphist\" \"store\"\nspawn-at-startup \"wlclock\" \"--layer\" \"bottom\" \"--border-size\" \"0\" \"--size\" \"300\" \"--background-colour\" \"#eff1f5\" \"--clock-colour\" \"#8839ef\" \"--position\" \"top-right\" \"--marking-width\" \"5\" \"--margin\" \"100\"\nwindow-rule {\n    geometry-corner-radius 10.000000 10.000000 10.000000 10.000000\n    clip-to-geometry true\n}\nwindow-rule {\n    match is-window-cast-target=true\n    border {\n        active-color \"#d20f39\"\n        inactive-color \"#d20f39\"\n    }\n    focus-ring { off; }\n}\nwindow-rule {\n    match app-id=\"swayimg\"\n    draw-border-with-background false\n}\nwindow-rule {\n    match title=\"clock-popup\"\n    default-column-width { proportion 0.500000; }\n    default-window-height { proportion 0.500000; }\n    open-floating true\n}\ngestures {\n    dnd-edge-view-scroll { trigger-width 100; }\n    dnd-edge-workspace-switch { trigger-height 100; }\n}\nanimations {\n    slowdown 0.250000\n    window-close { off; }\n    window-open { off; }\n    workspace-switch { off; }\n}\n```\n\n</p>\n</details>\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Lucienne [Integrated]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 5 5500U\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2282/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2280",
      "id": 3347832559,
      "node_id": "I_kwDOKFkxdc7Hi97v",
      "number": 2280,
      "title": "wtype produces gibberish, when other window is selected",
      "user": {
        "login": "abcdw",
        "id": 1218615,
        "node_id": "MDQ6VXNlcjEyMTg2MTU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1218615?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/abcdw",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-08-23T09:00:45Z",
      "updated_at": "2025-09-05T17:33:50Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I have two foot terminal windows. When I run wtype in the first one and keep focus in the first one, it types everything correctly. When I run wtype and change focus to the other window it types gibberish.\n\nI also tested the same by running wtype from emacs' vterm and typing into other applications foot/librewolf/chromium.  It behaves the same way.\n\n<img width=\"2880\" height=\"1800\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/3a4e8e14-307a-43f0-8892-3149bf89ed4a\" />\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Guix System\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: igpu\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: 12th Gen Intel(R) Core(TM) i7-1260P\n\nCan be related to #1546\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2280/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2278",
      "id": 3347461505,
      "node_id": "I_kwDOKFkxdc7HhjWB",
      "number": 2278,
      "title": "Flickering when using two extern monitors with a laptop",
      "user": {
        "login": "ZreXoc",
        "id": 61901461,
        "node_id": "MDQ6VXNlcjYxOTAxNDYx",
        "avatar_url": "https://avatars.githubusercontent.com/u/61901461?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ZreXoc",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-08-23T05:19:17Z",
      "updated_at": "2025-09-08T05:32:30Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nI got a laptop and I connected two monitors to it. However, content on the external monitor partially appears on another monitor, causing overlap and flickering. Rendering issues do not occur on the laptop's own screen, nor is content rendered to other screens.\n\n[Video](https://github.com/user-attachments/assets/69fda91e-77b7-4ac2-b4b7-1d86a53fd79f) (From left to right, they are HDMI-A-1, DP-1 and eDP-2 respectively.)\n\nI have no issues on Hyprland.\n\nI found a similar issue https://github.com/YaLTeR/niri/issues/842, but it doesn't look quite the same.\n\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n```\noutput \"eDP-2\" {\n    mode \"2560x1440@60\"\n    scale 1.5\n    transform \"270\"\n\n    //position x=5120 y=0\n}\n\noutput \"HDMI-A-1\" {\n    mode \"2560x1440@60\"\n    scale 1\n    transform \"normal\"\n}\n\noutput \"DP-1\" {\n    mode \"2560x1440@60\"\n    transform \"normal\"\n}\n\n```\n\n```\nOutput \"BOE 0x0B7D Unknown\" (eDP-2)\n  Current mode: 2560x1440 @ 240.000 Hz (preferred)\n  Variable refresh rate: supported, disabled\n  Physical size: 360x200 mm\n  Logical position: 0, 0\n  Logical size: 960x1706\n  Scale: 1.5\n  Transform: 270° counter-clockwise\n  Available modes:\n    2560x1440@240.000 (current, preferred)\n    2560x1440@60.001 (preferred)\n\nOutput \"Shenzhen KTC Technology Group H27T13 Unknown\" (DP-1)\n  Current mode: 2560x1440 @ 60.000 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 600x330 mm\n  Logical position: 960, 0\n  Logical size: 2560x1440\n  Scale: 1\n  Transform: normal\n  Available modes:\n    2560x1440@60.000 (current, preferred)\n    2560x1440@100.000\n    2560x1440@74.998\n    1920x1080@60.000\n    1920x1080@59.939\n    1920x1080@50.000\n    1400x1050@59.978\n    1280x1024@75.025\n    1280x1024@60.020\n    1440x900@59.887\n    1280x960@60.000\n    1280x720@60.000\n    1280x720@59.943\n    1280x720@50.000\n    1024x768@75.029\n    1024x768@70.069\n    1024x768@60.004\n    800x600@75.000\n    800x600@72.188\n    800x600@60.317\n    800x600@56.250\n    720x576@50.000\n    720x480@59.940\n    640x480@75.000\n    640x480@72.809\n    640x480@59.940\n    640x480@59.929\n\nOutput \"Shenzhen KTC Technology Group Q24T09 0x00000001\" (HDMI-A-1)\n  Current mode: 2560x1440 @ 59.968 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 530x300 mm\n  Logical position: 3520, 0\n  Logical size: 2560x1440\n  Scale: 1\n  Transform: normal\n  Available modes:\n    2560x1440@59.968 (current, preferred)\n    3840x2160@59.940\n    3840x2160@50.000\n    3840x2160@29.970\n    3840x2160@23.976\n    2560x1440@144.002\n    2560x1440@119.998\n    2560x1440@75.000\n    1920x1080@60.000\n    1920x1080@59.939\n    1920x1080@50.000\n    1680x1050@59.954\n    1600x900@60.000\n    1280x1024@75.025\n    1280x1024@60.020\n    1440x900@59.887\n    1280x720@60.000\n    1280x720@59.943\n    1280x720@50.000\n    1024x768@75.029\n    1024x768@70.069\n    1024x768@60.004\n    800x600@75.000\n    800x600@72.188\n    800x600@60.317\n    800x600@56.250\n    720x576@50.000\n    720x480@59.940\n    640x480@75.000\n    640x480@59.940\n    640x480@59.929\n```\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA GeForce RTX 4060 Max-Q / Mobile\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:13th Gen Intel(R) Core(TM) i9-13900HX (32)\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2278/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2269",
      "id": 3336526356,
      "node_id": "I_kwDOKFkxdc7G31oU",
      "number": 2269,
      "title": "Issue when using overview",
      "user": {
        "login": "Sizu08",
        "id": 25228464,
        "node_id": "MDQ6VXNlcjI1MjI4NDY0",
        "avatar_url": "https://avatars.githubusercontent.com/u/25228464?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Sizu08",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-08-20T04:31:44Z",
      "updated_at": "2025-09-18T07:31:45Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'm not sure how to accurately describe this issue, but here it goes. I think it occurs when these three things occur at the same time.\n\n1. When I play a fullscreen game through wine using native wayland and not x11, although I'm not sure if this is relevant\n\n2. I receive a notification, I am currently using mako for the daemon.\n\n3. I activate niri overview.\n\nWhat then occurs is my fullscreen game freezes, although I can tell it is still running since the audio is playing. Nothing on the monitor that my game is on can be used in any way. I tried terminating wine and logging out. The monitor continues to show the game at the point that the error occurred.\n\nI don't think anything in the niri config is relevant to this issue, but I can upload it if necessary.\n\nAttached is the relevant journalctl output showing an amd_gpu flip_done timed out error. The issue begins at Aug 19 20:50:18 in the logs.\n\n### System Information\n\nniri version: niri 25.05.1 (8ba57fc)\n\nDistro: CachyOS\n\nGPU: AMD RX 9070xt\n\nCPU: AMD 7800x3d\n\n[log.txt](https://github.com/user-attachments/files/21881080/log.txt)\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2269/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2255",
      "id": 3328465711,
      "node_id": "I_kwDOKFkxdc7GZFsv",
      "number": 2255,
      "title": "weird flashing",
      "user": {
        "login": "BluewyDiamond",
        "id": 115411576,
        "node_id": "U_kgDOBuEKeA",
        "avatar_url": "https://avatars.githubusercontent.com/u/115411576?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BluewyDiamond",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191960,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJL2A",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:application",
          "name": "not niri:application",
          "color": "bbbbbb",
          "default": false,
          "description": "Issues in applications"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-08-17T16:20:48Z",
      "updated_at": "2026-02-26T17:00:20Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nRunning Peak through wayland and changing fullscreen mode (in game) causes dangerous flashing. It stops after a while though.\n\nhttps://github.com/user-attachments/assets/9b89f227-d2c5-4464-b4ff-ca426fbff997\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \nniri 25.05.1 (v25.05.1-111-g6d0505e6)\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: \nCachyOS\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \nAMD RX 5700XT\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 7800x3d\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2255/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2254",
      "id": 3328296400,
      "node_id": "I_kwDOKFkxdc7GYcXQ",
      "number": 2254,
      "title": "Cannot use screen sharing in feishu",
      "user": {
        "login": "xcpky",
        "id": 52552971,
        "node_id": "MDQ6VXNlcjUyNTUyOTcx",
        "avatar_url": "https://avatars.githubusercontent.com/u/52552971?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/xcpky",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191280,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJMA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:screencasting",
          "name": "area:screencasting",
          "color": "fbca04",
          "default": false,
          "description": "Screen sharing, PipeWire, screencast portal"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-08-17T12:37:40Z",
      "updated_at": "2026-02-26T17:12:43Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "[feishu](https://www.feishu.cn) runs in xwayland-satellite. In a feishu meeting, I can select the windows or displays to share, but other people cannot see the screen. \n\nI have already checked https://github.com/YaLTeR/niri/wiki/Screencasting and installed everything needed. \n\n<img width=\"1916\" height=\"737\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/6c95bf3a-ce73-41e5-a915-472b2536e069\" />\n\nMy os is fedora 42 with Niri installed by the official copr(niri-git).\n\nI noticed some interesting logs in xdg-desktop-pipewire-gnome and pipewire through journalctl:\n```\nxdg-desktop-por[132099]: Failed to associate portal window with parent window\n```\n\nthe following pastebin contains error logs from pipe wire\nhttps://paste.debian.net/1392027/\n\nlogs from niri that might help:\n```\nAug 17 12:27:33 Zhaobin niri[81286]: 2025-08-17T04:27:33.305021Z DEBUG niri::utils::xwayland::satellite: connection to X11 abstract socket; spawning xwayland-satellite\nAug 17 12:37:52 Zhaobin niri[81286]: 2025-08-17T04:37:52.178022Z DEBUG niri::dbus::mutter_screen_cast: record_monitor connector=\"DP-3\" properties=RecordMonitorProperties { cursor_mode: Some(Metadata), _is_recording: None }\nAug 17 12:37:52 Zhaobin niri[81286]: 2025-08-17T04:37:52.178468Z DEBUG niri::dbus::mutter_screen_cast: start\nAug 17 12:37:52 Zhaobin niri[81286]: 2025-08-17T04:37:52.178540Z DEBUG niri::niri: StartCast session_id=0 stream_id=0\nAug 17 12:37:52 Zhaobin niri[81286]: 2025-08-17T04:37:52.180023Z DEBUG niri::pw_utils: pw stream: state changed: Unconnected -> Connecting\nAug 17 12:37:52 Zhaobin niri[81286]: 2025-08-17T04:37:52.180931Z DEBUG niri::pw_utils: pw stream: state changed: Connecting -> Paused\nAug 17 12:37:52 Zhaobin niri[81286]: 2025-08-17T04:37:52.180943Z DEBUG niri::pw_utils: pw stream: sending signal with 98\nAug 17 12:37:52 Zhaobin niri[81286]: 2025-08-17T04:37:52.202075Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Error(\"no more input formats\")\nAug 17 12:37:52 Zhaobin niri[81286]: 2025-08-17T04:37:52.202095Z  WARN niri::pw_utils: pw error id=2 seq=10 res=-32 no more input formats\nAug 17 12:40:43 Zhaobin niri[81286]: 2025-08-17T04:40:43.899092Z DEBUG niri::dbus::mutter_screen_cast: stop\nAug 17 12:40:43 Zhaobin niri[81286]: 2025-08-17T04:40:43.908705Z DEBUG niri::niri: StopCast session_id=0\nAug 17 12:40:43 Zhaobin niri[81286]: 2025-08-17T04:40:43.908754Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Unconnected\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2254/reactions",
        "total_count": 7,
        "+1": 7,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2251",
      "id": 3328104222,
      "node_id": "I_kwDOKFkxdc7GXtce",
      "number": 2251,
      "title": "FreeBSD CI doesn't cache dependency builds",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662319,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYrw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/help%20wanted",
          "name": "help wanted",
          "color": "008672",
          "default": true,
          "description": "Looking for contributors to help with this!"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-08-17T08:15:12Z",
      "updated_at": "2026-02-26T17:45:06Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For some reason it only caches the crate downloads, but they are still fully rebuilt: https://github.com/matejc/niri/actions/runs/17018576618/job/48244398407#step:6:37830\n\n@matejc had tried to fix it for a while in #2072 but couldn't figure it out. Help would be very much appreciated in figuring this out.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2251/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2248",
      "id": 3327066433,
      "node_id": "I_kwDOKFkxdc7GTwFB",
      "number": 2248,
      "title": "Add window stacking order to IPC",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        },
        "1": {
          "id": 6994395392,
          "node_id": "LA_kwDOKFkxdc8AAAABoOYBAA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/needs%20design",
          "name": "needs design",
          "color": "0F94BE",
          "default": false,
          "description": "Need to figure out how exactly to implement this"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-08-16T09:07:20Z",
      "updated_at": "2025-11-30T11:55:26Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "#1265 added window positions and sizes, but notably absent is window stacking order, important for floating windows.\n\nThe main problem is it's not entirely clear what's the best way to expose it that is both easy to work with and not too spammy.\n\n> One idea I had is to have the stacking order on a workspace as a `Vec<WindowId>`, then have some kind of `WorkspaceWindowsRestacked { ws_id: WorkspaceId, new_order: Vec<WindowId> }`. Any windows missing from that should be considered below, or something.\n\nAlso, however we expose it should be forward-compatible. For example, when we add always-on-top windows, they will likely be on top of all other floating windows, yet they will have a stacking order among themselves. This can add new IPC but should not require breaking changes to any existing IPC.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2248/reactions",
        "total_count": 5,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2239",
      "id": 3324307750,
      "node_id": "I_kwDOKFkxdc7GJOkm",
      "number": 2239,
      "title": "Drag and drop in Visual Studio Code shifts the focus.",
      "user": {
        "login": "itjustcrashed",
        "id": 151413500,
        "node_id": "U_kgDOCQZi_A",
        "avatar_url": "https://avatars.githubusercontent.com/u/151413500?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/itjustcrashed",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-08-15T04:35:53Z",
      "updated_at": "2025-08-21T17:17:19Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen you drag and drop files in Visual Studio Code, the entire focus shifts left.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Asahi Arch Linux ARM\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Apple M2 T8112\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Apple M2 T8112\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2239/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2233",
      "id": 3320542739,
      "node_id": "I_kwDOKFkxdc7F63YT",
      "number": 2233,
      "title": "Waking laptop with power button immediately puts it in suspend again",
      "user": {
        "login": "chaseblock",
        "id": 6424521,
        "node_id": "MDQ6VXNlcjY0MjQ1MjE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6424521?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/chaseblock",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-08-14T02:51:11Z",
      "updated_at": "2026-02-05T10:06:08Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Howdy,\n\nWhen running niri, after suspending my laptop (due to idle or explicitly calling `systemctl suspend`), if I press the power button, it will briefly wake up (for < 1 second) before going back into suspend. It seems that niri must be registering the power button event (that woke the laptop up) and immediately putting the laptop back to sleep again.\n\nA viable workaround is setting `disable-power-key-handling` in the niri config file. This prevents this bug, but it also means that the power button no longer works for putting the laptop to sleep.\n\nThis occurs with the default config.\n\n### System Information\n\nFramework Laptop\n\n* niri version: niri 25.05.1 (8ba57fc)\n\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: (Integrated graphics) Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] \n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz\n\n\nWhenever you get around to it, please let me know if there's any additional information that could help.\n\nThanks!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2233/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2223",
      "id": 3316639308,
      "node_id": "I_kwDOKFkxdc7Fr-ZM",
      "number": 2223,
      "title": "ScreenCast shows window selection but only black screen (OBS mainly)",
      "user": {
        "login": "blueOkiris",
        "id": 4405453,
        "node_id": "MDQ6VXNlcjQ0MDU0NTM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4405453?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/blueOkiris",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 12,
      "created_at": "2025-08-13T01:47:44Z",
      "updated_at": "2026-02-17T22:25:09Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nWhen I try to screen record with OBS, the gnome portal selection pops up, sees all my windows and reports back a size to OBS, but only a black screen is actually shown once selected.\n\nI've tried some different things like environment variables, different portals (kde, cosmic, and hyprland). I've seen some similar things on previous issues, but none of the configs match mine and none of the solutions work.\n\n<details>\n    <summary> Current /etc/environment </summary>\n\n```\nEDITOR=nvim\nVISUAL=nvim\nLC_COLLATE=en_US.UTF-8\nXCURSOR_SIZE=16\nGTK_CURSOR_THEME=Breeze_Default\nGTK_ICON_THEME=Papirus-Dark\nGTK_THEME=Arc-Dark\nELECTRON_TRASH=trash-cli\nELECTRON_OZONE_PLATFORM_HINT=wayland\nQT_QPA_PLATFORM=wayland\nQT_QPA_PLATFORMTHEME=qt6ct\nLIBVA_DRIVER_NAME=nvidia\n__GL_GSYNC_ALLOWED=1\n__NV_PRIME_RENDER_OFFLOAD=1\n__GLX_VENDOR_LIBRARY_NAME=nvidia\n__VK_LAYER_NV_optimus=NVIDIA_only\nXDG_SESSION_TYPE=wayland\nGBM_BACKEND=nvidia\nWLR_NO_HARDWARE_CURSORS=1\nNVD_BACKEND=direct\nQML_DISABLE_DISK_CACHE=1\n```\n\n</details>\n\nI'd also like to note that this affects Sunshine (a game streaming app) and WebRTC stuff in the browser.\n\nHowever, it doesn't affect screen shots and it doesn't affect the alternative OBS capture option \"Wayland output (scpy)\" based on wlr-screencopy.\n\nI think it's not communicating with OBS about formats correctly. Here's the OBS output when I select a screen:\n\n<details>\n    <summary> OBS Log </summary>\n\n```\ninfo: PipeWire initialized\ninfo: User added source 'Screen Capture (PipeWire)' (pipewire-screen-capture-source) to scene 'Screen Recording'\ninfo: [pipewire] Screencast session created\ninfo: [pipewire] Asking for monitor and window\ninfo: [pipewire] source selected, setting up screencast\ninfo: [pipewire] Server version: 1.4.7\ninfo: [pipewire] Library version: 1.4.7\ninfo: [pipewire] Header version: 1.4.7\ninfo: [pipewire] Created stream 0x55f08b3e3c40\ninfo: [pipewire] Stream 0x55f08b3e3c40 state: \"connecting\" (error: none)\ninfo: [pipewire] Playing stream 0x55f08b3e3c40\ninfo: [pipewire] Stream 0x55f08b3e3c40 state: \"paused\" (error: none)\ninfo: [pipewire] Negotiated format:\ninfo: [pipewire]     Format: 8 (Spa:Enum:VideoFormat:BGRx)\ninfo: [pipewire]     Modifier: 0x0\ninfo: [pipewire]     Size: 1920x1080\ninfo: [pipewire]     Framerate: 0/1\ninfo: [pipewire] Negotiated format:\ninfo: [pipewire]     Format: 8 (Spa:Enum:VideoFormat:BGRx)\ninfo: [pipewire]     Modifier: 0x0\ninfo: [pipewire]     Size: 1920x1080\ninfo: [pipewire]     Framerate: 0/1\ninfo: [pipewire] Stream 0x55f08b3e3c40 state: \"streaming\" (error: none)\nerror: glEGLImageTargetTexture2DOES failed, glGetError returned GL_INVALID_OPERATION(0x502)\ninfo: [pipewire] Renegotiating stream\ninfo: [pipewire] Stream 0x55f08b3e3c40 state: \"paused\" (error: none)\ninfo: [pipewire] Negotiated format:\ninfo: [pipewire]     Format: 8 (Spa:Enum:VideoFormat:BGRx)\ninfo: [pipewire]     Modifier: 0x0\ninfo: [pipewire]     Size: 1920x1080\ninfo: [pipewire]     Framerate: 0/1\ninfo: [pipewire] Negotiated format:\ninfo: [pipewire]     Format: 8 (Spa:Enum:VideoFormat:BGRx)\ninfo: [pipewire]     Modifier: 0xffffffffffffff\ninfo: [pipewire]     Size: 1920x1080\ninfo: [pipewire]     Framerate: 0/1\ninfo: [pipewire] Stream 0x55f08b3e3c40 state: \"streaming\" (error: none)\nerror: glEGLImageTargetTexture2DOES failed, glGetError returned GL_INVALID_OPERATION(0x502)\ninfo: [pipewire] Renegotiating stream\ninfo: [pipewire] Stream 0x55f08b3e3c40 state: \"paused\" (error: none)\ninfo: [pipewire] Stream 0x55f08b3e3c40 state: \"error\" (error: no more input formats)\nerror: [pipewire] Error id:2 seq:42 res:-32 (Broken pipe): no more input formats\ninfo: adding 85 milliseconds of audio buffering, total audio buffering is now 106 milliseconds (source: Mic/Aux)\n```\n\n</details>\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\nHere's my niri config:\n\n\n<details>\n    <summary> Niri Config </summary>\n\n```\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction\n\nenvironment {\n    DISPLAY \":0\"\n}\n\nspawn-at-startup \"wl-clipboard\"\nspawn-at-startup \"dunst\" \"-conf\" \"~/.config/dunst/dunstsrc\"\nspawn-at-startup \"/home/dylan/.config/niri/startup.sh\"\n\n// Input device configuration.\ninput {\n    keyboard {\n        xkb {\n            options \"compose:ralt\"\n        }\n        numlock\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        tap\n        natural-scroll\n        accel-speed 0.2\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    focus-follows-mouse\n    workspace-auto-back-and-forth\n}\n\noutput \"eDP-2\" {\n    mode \"1920x1080@360\"\n    scale 1\n    transform \"normal\"\n    position x=1723 y=1440\n}\n\noutput \"DP-1\" {\n    mode \"3440x1400@60\"\n    scale 1\n    transform \"normal\"\n    position x=0 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 16\n\n    // When to center a column when changing focus\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n    }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Color of the ring on the active monitor.\n        active-color \"#03BB85\"\n\n        // Color of the ring on inactive monitors.\n        inactive-color \"#505050\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        off\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        on\n\n        // Softness controls the shadow blur radius.\n        softness 5\n\n        // Spread expands the shadow.\n        spread 3\n\n        // Offset moves the shadow relative to the window.\n        offset x=-2 y=2\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        left 16\n        right 16\n        // top 64\n        // bottom 64\n    }\n}\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\nwindow-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nbinds {\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+Return hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"alacritty\"; }\n    Mod+S hotkey-overlay-title=\"Run an Application: wofi\" { spawn \"wofi\" \"--location\" \"0\" \"--show=drun,run\" \"--allow-images\" \"--insensitive\"; }\n    Mod+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\" \"-F\" \"-i\" \"~/Pictures/Wallpapers/linux-supremecy-3.png\" \"-k\" \"--ring-color\" \"03bb85ff\" \"--inside-color\" \"00000000\" \"--line-color=03bb85\" \"--line-color=03bb85\" \"--separator-color=00000000\" \"--ring-ver-color=0385bb\" \"--inside-ver-color=00000000\" \"--inside-wrong-color=00000000\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.05+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.05-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    Mod+O repeat=false { toggle-overview; }\n\n    Mod+X { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n\n    Mod+Shift+Left  { move-column-left; }\n    Mod+Shift+Down  { move-window-down; }\n    Mod+Shift+Up    { move-window-up; }\n    Mod+Shift+Right { move-column-right; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Ctrl+Down       { focus-workspace-down; }\n    Mod+Ctrl+Up         { focus-workspace-up; }\n    Mod+Ctrl+Shift+Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Shift+Up   { move-column-to-workspace-up; }\n\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n    Mod+Comma  { consume-window-into-column; }\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n    Mod+Ctrl+C { center-visible-columns; }\n\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+Shift+Space { toggle-window-floating; }\n    Mod+Ctrl+Space  { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Screenshot\n    Print           { screenshot; }\n    Win+Shift+S     { screenshot; }\n    Ctrl+Print      { screenshot-screen; }\n    Alt+Print       { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n```\n\n</details>\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\nAnd here's my niri log from when starting streaming:\n\n<details>\n    <summary> journalctl --user -xeu niri  </summary>\n\n```\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.146090Z DEBUG niri::dbus::mutter_screen_cast: record_monitor connector=\"eDP-2\" properties=RecordMonitorProperties { cursor_mode: Some(Metadata), _is_recording: None }\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.146352Z DEBUG niri::dbus::mutter_screen_cast: start\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.146364Z DEBUG niri::niri: StartCast session_id=6 stream_id=6\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.146413Z DEBUG niri::pw_utils: pw stream: state changed: Unconnected -> Connecting\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.148162Z DEBUG niri::pw_utils: pw stream: state changed: Connecting -> Paused\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.148169Z DEBUG niri::pw_utils: pw stream: sending signal with 164\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.167960Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0xc), modifier: 0, size: spa_rectangle { width: 1920, height: 1080 }, framerate: spa_fract>\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.167976Z DEBUG niri::pw_utils: pw stream: fixating the modifier\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.167979Z DEBUG niri::pw_utils: find_preferred_modifier: size=Size<smithay::utils::geometry::Physical> { w: 1920, h: 1080 }, fourcc=XR24, modifiers=[0, 72057594037927935]\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.169147Z DEBUG niri::pw_utils: pw stream: allocation successful (modifier=Linear, plane_count=1), moving to confirmation pending\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.169260Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0x4), modifier: 0, size: spa_rectangle { width: 1920, height: 1080 }, framerate: spa_fract>\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.169266Z DEBUG niri::pw_utils: pw stream: moving to ready state\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.237612Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Streaming\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.249593Z DEBUG niri::pw_utils: pw stream: state changed: Streaming -> Paused\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.249704Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0xc), modifier: 0, size: spa_rectangle { width: 1920, height: 1080 }, framerate: spa_fract>\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.249712Z DEBUG niri::pw_utils: pw stream: fixating the modifier\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.249715Z DEBUG niri::pw_utils: find_preferred_modifier: size=Size<smithay::utils::geometry::Physical> { w: 1920, h: 1080 }, fourcc=XR24, modifiers=[72057594037927935]\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.253423Z DEBUG niri::pw_utils: pw stream: allocation successful (modifier=Invalid, plane_count=1), moving to confirmation pending\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.253629Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRx, flags: VideoFlags(0x4), modifier: 72057594037927935, size: spa_rectangle { width: 1920, height: 1080 }, fram>\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.253638Z DEBUG niri::pw_utils: pw stream: moving to ready state\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.272278Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Streaming\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.278460Z DEBUG niri::pw_utils: pw stream: state changed: Streaming -> Paused\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.279138Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Error(\"no more input formats\")\nAug 12 20:45:07 msi-raider niri[44560]: 2025-08-13T01:45:07.279146Z  WARN niri::pw_utils: pw error id=2 seq=286 res=-32 no more input formats\nAug 12 20:45:12 msi-raider niri[44560]: 2025-08-13T01:45:12.214036Z DEBUG niri::dbus::mutter_screen_cast: stop\nAug 12 20:45:12 msi-raider niri[44560]: 2025-08-13T01:45:12.214097Z DEBUG niri::niri: StopCast session_id=6\nAug 12 20:45:12 msi-raider niri[44560]: 2025-08-13T01:45:12.214145Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Unconnected\n```\n\n</details>\n\nSomething about Niri/Wayland + Nvidia + Pipewire + gnome portal is just not clicking.\n\nIt might just be my config, but at this point I feel like I've tried everything I know that could be causing an issue. Like, you'll notice I'm on the latest commit. I was previously on the released version, but saw a commit that might help nvidia, so I'm on the latest now, but still it didn't help.\n\nAny help would be appreciated!\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (v25.05.1-95-g00445786)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Nvidia RTX 3080 Mobile\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel i711800H (16)\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2223/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2201",
      "id": 3301182049,
      "node_id": "I_kwDOKFkxdc7ExAph",
      "number": 2201,
      "title": "Layer rule to place on lock screen",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-08-07T16:37:30Z",
      "updated_at": "2025-08-07T16:37:30Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For things like on-screen keyboards or volume change displays, etc.\n\n### Discussed in https://github.com/YaLTeR/niri/discussions/2160\n\n<div type='discussions-op-text'>\n\n<sup>Originally posted by **KyleKrein** August  1, 2025</sup>\nIt would be very useful, if it would be possible, to tell a layer, that it can be shown (and interacted with) above locking app. It could be used for virtual keyboards for touchscreens or situations, when for ex. the bluetooth keyboard doesn't work. For now I have no way to unlock my framework12 in tablet mode</div>",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2201/reactions",
        "total_count": 13,
        "+1": 11,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 2
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2199",
      "id": 3299000979,
      "node_id": "I_kwDOKFkxdc7EosKT",
      "number": 2199,
      "title": "If a client hangs, moving the mouse over them can quickly cause the client to crash",
      "user": {
        "login": "Kirottu",
        "id": 56396750,
        "node_id": "MDQ6VXNlcjU2Mzk2NzUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/56396750?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Kirottu",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-08-07T05:10:24Z",
      "updated_at": "2025-08-07T05:10:24Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is a known [Wayland issue](https://gitlab.freedesktop.org/wayland/wayland/-/issues/159), that I have just recently ran into with modded Minecraft, where long hangs are very common when starting the game or entering a world.\n\nA solution seen in the aforementioned issue is of pinging the client for responsiveness, and if unresponsiveness is detected stopping sending input events. This seems to be the approach GNOME has taken according to the issue.\n\nIs this something that should be implemented in Niri or should I make an issue on the Smithay side instead?\n\n<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: v25.05.1\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS unstable\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: RX 6700 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Ryzen 7 5700X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2199/reactions",
        "total_count": 2,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2190",
      "id": 3292758490,
      "node_id": "I_kwDOKFkxdc7EQ4Ha",
      "number": 2190,
      "title": "Random stuttering",
      "user": {
        "login": "axelkar",
        "id": 120189068,
        "node_id": "U_kgDOBynwjA",
        "avatar_url": "https://avatars.githubusercontent.com/u/120189068?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/axelkar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 11,
      "created_at": "2025-08-05T11:37:20Z",
      "updated_at": "2025-09-11T17:59:56Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nI get random stutters with Niri, but only on my laptop. I have 50 tabs open in Firefox, most of which are unloaded.\n\nHere are some rough estimates:\n- 0.5s to 1s stutters tend to come when I switch workspaces, open the overview or scroll up and down in the overview.\n- Sometimes the stutters are unbearable. E.g. 10s freeze when scrolling windows, when just Kitty, Wezterm and Firefox were open. In Waybar, memory usage was not at 90% or something crazy like that.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\nHtop info:\n```\n    PID USER       PRI  NI  VIRT   RES   SHR S CPU%▽MEM%   TIME+  Command\n   1781 axel        20   0 14.2G  789M  275M S  20.0 10.3  3h49:39 .firefox-wrapped --name firefox\n   1165 axel        20   0 2277M  118M  103M R   9.1  1.5  2h27:11 niri --session\n```\n\nHow do I use Tracy? Can I use it with [niri-flake's settings](https://github.com/sodiboo/niri-flake/blob/ab19f1d6bf4b38558c84df4990ec0618ec526eb5/flake.nix#L131) without recompiling Niri? What about `perf`?\n\nOh and I _think_ the audio was also frozen during one of these hiccups. So not Niri?\n\nSearch terms: Stutter hiccup freeze frozen choppy\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri stable v25.05.1 (commit 8ba57fcf25d2fc9565131684a839d58703f1dae7)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS unstable\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: (Mesa 25.1.7, driver i915) Intel HD Graphics 620\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: 2-core 4-thread Intel Core i5-7300U",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2190/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2184",
      "id": 3289267552,
      "node_id": "I_kwDOKFkxdc7EDj1g",
      "number": 2184,
      "title": "Top and overlay layer laggy on external monitor when using software scaling",
      "user": {
        "login": "maxbol",
        "id": 1177725,
        "node_id": "MDQ6VXNlcjExNzc3MjU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1177725?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/maxbol",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-08-04T12:35:13Z",
      "updated_at": "2025-08-04T12:35:13Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When opening the following applications on my secondary monitor I am experiencing significant lag:\n\n- wlogout\n- swaync-client -t (control center)\n\nThe only thing these apps have in common that I can think of is that they both render a non-main layer.\n\nThe output in question:\n\n```\nOutput \"ASUSTek COMPUTER INC ASUS PA279CV R5LMTF116390\" (DP-1)\n  Current mode: 3840x2160 @ 59.997 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 600x340 mm\n  Logical position: 2560, 0\n  Logical size: 3072x1728\n  Scale: 1.25\n  Transform: normal\n  Available modes:\n    3840x2160@59.997 (current, preferred)\n    ...\n```\n\nWhen turning off scaling, these apps perform better, although if I'm not mistaken there is still a bit of a stutter on the external monitor.\n\nOn hyprland these apps work fine, no stuttering.\n\nWhen running the apps on the built-in monitor they are buttery smooth, even when the external monitor is connected.\n\nAll other apps work flawlessly and the overall experience of the desktop is very positive.\n\nIt does not matter whether I run the apps with my own config or in a non-configured \"default\" state.\n\nNiri config: https://github.com/maxbol/config/blob/next%40upgrade-25.05%40niri/modules/home-manager/linux-desktop/wm/niri.nix\n\n\n### System Information\n\n* niri version: \nniri unstable 2025-07-31 (commit 91b6a111cf228fadaabba706d8f4d155efc63b3a)\n\n* Distro: \nNixOS 25.05 Stable\n\n* GPU: \nintegrated (AMD Radeon 780M) + discrete (AMD Radeon RX 7700S) GPU\n\n* CPU:\nAMD Ryzen™ 7040HS ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2184/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2170",
      "id": 3286351794,
      "node_id": "I_kwDOKFkxdc7D4b-y",
      "number": 2170,
      "title": "Niri crash, no current serial, commit on mapped surface without a configured serial",
      "user": {
        "login": "ghost",
        "id": 10137,
        "node_id": "MDQ6VXNlcjEwMTM3",
        "avatar_url": "https://avatars.githubusercontent.com/u/10137?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ghost",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-08-02T21:57:13Z",
      "updated_at": "2025-08-03T17:14:29Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Niri crashes when I click on (Save/Save as) in the Preset Menu in [MiniMeters](https://directmusic.itch.io/minimeters). Both using the paid version and the demo. I get fully thrown out my session. When I login again, waybar does not launch and I have to logout and login again to fix all the weirdness.\nMiniMeters is wayland native. The broken session after I login does not show anything weird in the logs, even if waybar does not start\n\nHere are the errors from the journal:\n```\n2025-08-02T21:28:30.102111Z  WARN niri::window::mapped: no current serial; did the surface not ack the initial configure?\n2025-08-02T21:28:30.114694Z ERROR niri::handlers::xdg_shell: commit on a mapped surface without a configured serial\n2025-08-02T21:28:30.114737Z ERROR niri::handlers::compositor: commit on a mapped surface without a configured serial\n```\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (Nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS Unstable\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA GeForce GTX 1650 SUPER\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) i5-9400F (6) @ 4.10 GHz\n\n[Complete log](https://github.com/user-attachments/files/21562057/log.txt)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2170/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2167",
      "id": 3285310236,
      "node_id": "I_kwDOKFkxdc7D0dsc",
      "number": 2167,
      "title": "niri crashes when a client exits during shrink.",
      "user": {
        "login": "PatrickHechler",
        "id": 65898051,
        "node_id": "MDQ6VXNlcjY1ODk4MDUx",
        "avatar_url": "https://avatars.githubusercontent.com/u/65898051?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/PatrickHechler",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-08-01T23:00:38Z",
      "updated_at": "2025-08-03T11:38:36Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "if the client uses shared memory and exits while it gets resized to a smaller window size niri crashes\n\n1.  start the client and wait until niri resizes it the the full window height (minus bounds)\n    + if niri shrinks the client here no crash happens\n2. resize the window to a lower size (Mod + Mouse, for some reason I can't use Mod+R to resize (probably because I have a very minimal client))\n3. the client waits until the configure event is triggered\n4. the client shrinks the filesize of the shared memory file\n5. the client destroys the shm_pool\n6. the client exits instead of creating a new shm_pool\n\non my second mashine niri does not always crash:\n+ niri only crashes when the client is started from an other niri (niri on tty3 start client for niri on tty4 by setting WAYLAND_DISPLAY)\n+ niri does not crash when the window is first resized to a larger size\n+ I have not tested if niri crashes om my first mashine when the initial window height is above the monitor height\n\n[my niri config](http://patrick.hechler.de/Downloads/conf/niri@Kuat.kdl) (second mashine, the config of my first mashine is a little different)\n\nthe full source can be found at https://git.rwth-aachen.de/patrick_laszlo.hechler/tecav ([niri-bug.c](https://git.rwth-aachen.de/patrick_laszlo.hechler/tecav/-/blob/super/src/niri-bug.c?ref_type=heads) contains all required code to do the crash (xdg-shell.{c,h} also needs to be generated))\n\n### System Information\n\n* testet with niri version: \n    + niri 25.05.1 (8ba57fc)\n    + niri 25.05.1 (v25.05.1-78-g91b6a111)\n\n* Distro: Arch\n\n* GPU: nvidia GeForce RTX 2070 (second mashine)\n* GPU: nvidia GeForce RTX 1060 (first mashine, I think)\n\n* CPU: AMD Ryzen 5 3600 (second mashine)\n* CPU: AMD Ryzen (first mashine, I think)\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2167/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2165",
      "id": 3285226228,
      "node_id": "I_kwDOKFkxdc7D0JL0",
      "number": 2165,
      "title": "Niri will not launch from GDM or Greetd correctly",
      "user": {
        "login": "Apollo-sudo767",
        "id": 179651890,
        "node_id": "U_kgDOCrVFMg",
        "avatar_url": "https://avatars.githubusercontent.com/u/179651890?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Apollo-sudo767",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 19,
      "created_at": "2025-08-01T21:55:58Z",
      "updated_at": "2025-09-01T18:36:31Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nWhen launching Niri from gdm or greetd, it launches without monitors. Niri works perfectly from a tty.\n<!-- Attaching your full niri config can help diagnose the problem. -->\n[config.kdl](https://github.com/Apollo-sudo767/phanes/blob/main/home/dotfiles/niri/config.kdl)\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \n25.05.1 (Nixpkgs)\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: \nNixos\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \nNvidia RTX 4070 ti\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\nAMD Ryzen 7 7800x3d",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2165/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2161",
      "id": 3284056844,
      "node_id": "I_kwDOKFkxdc7DvrsM",
      "number": 2161,
      "title": "[BUG] Black screen on NVIDIA RTX 3070",
      "user": {
        "login": "imxyy1soope1",
        "id": 103114856,
        "node_id": "U_kgDOBiVoaA",
        "avatar_url": "https://avatars.githubusercontent.com/u/103114856?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/imxyy1soope1",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187240,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5aA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/nvidia",
          "name": "nvidia",
          "color": "76b900",
          "default": false,
          "description": "NVIDIA issues"
        },
        "1": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 10,
      "created_at": "2025-08-01T14:02:59Z",
      "updated_at": "2026-02-25T21:09:51Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nUsing proprietary driver and opensource kernel module, SDDM can be normally displayed but goes black with \"no signal\" when logged in, but Sunshine can stream Niri desktop. \nNouveau works fine.\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\nNVIDIA settings:\n```nix\nhardware.nvidia = {\n  package = config.boot.kernelPackages.nvidiaPackages.latest; # beta and stable doesn't work as well\n  modesetting.enable = true;\n  nvidiaSettings = true;\n  open = true;\n};\nservices.xserver.videoDrivers = [ \"nvidia\" ];\n```\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri unstable 2025-07-18 (commit fefc0bc0a71556eb75352e2b611e50eb5d3bf9c2)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS 25.11.20250730.d02f407\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA RTX 3070\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 5 5600\n\n* dmesg: https://0x0.st/87bU.txt\n* Niri journal: https://0x0.st/87qC.txt\n* NixOS config repo: https://git.imxyy.top/allencai/ccl-nixos-dotfiles",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2161/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2157",
      "id": 3281641364,
      "node_id": "I_kwDOKFkxdc7Dmd-U",
      "number": 2157,
      "title": "Spawn children in separate process group(s)",
      "user": {
        "login": "axelkar",
        "id": 120189068,
        "node_id": "U_kgDOBynwjA",
        "avatar_url": "https://avatars.githubusercontent.com/u/120189068?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/axelkar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191459,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJ4w",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:session",
          "name": "area:session",
          "color": "fbca04",
          "default": false,
          "description": "Screen locking, idle inhibit, suspend/resume"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-07-31T20:19:34Z",
      "updated_at": "2026-02-26T17:19:01Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'd like to start with an appreciation of  spawning children in systemd scopes. Thank you! I love that feature!\n\nI'm currently using `earlyoom` with the `-g` flag, and all processes spawned by Niri (including Firefox) and Niri itself are in the same process group. This just led to everything being killed when Firefox was the target.\n\nNote: GNOME hasn't fixed this: https://github.com/rfjakob/earlyoom/blob/master/MANPAGE.md#-g\n\nOr should I just switch to systemd-oomd? Does it support user scopes?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2157/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2153",
      "id": 3280435780,
      "node_id": "I_kwDOKFkxdc7Dh3pE",
      "number": 2153,
      "title": "Drag issue",
      "user": {
        "login": "minhincs",
        "id": 205402779,
        "node_id": "U_kgDODD4ymw",
        "avatar_url": "https://avatars.githubusercontent.com/u/205402779?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/minhincs",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-07-31T13:13:34Z",
      "updated_at": "2025-08-08T16:51:17Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When I want to drag-n-drop something it automatically slide my focus to the left. I guess that Niri recognize the \"item\" I am trying to drag and drop is a new window as Niri behave like one.\n\nApp that have this bug: Discord ( I use Vesktop actually ), Obsidian _ Both installed via Flatpak\nApp that do not have this bug: Zen browser (Flatpak), Nautilus\n\n### System Information\n* niri version: 25.05.1\n* Distro: Fedora WS 42\n* GPU: Intel Iris Xe Graphics\n* CPU: i5-1145G7\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2153/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2149",
      "id": 3277877630,
      "node_id": "I_kwDOKFkxdc7DYHF-",
      "number": 2149,
      "title": "Sometimes $NIRI_SOCKET is not set",
      "user": {
        "login": "tomasciccola",
        "id": 117094913,
        "node_id": "U_kgDOBvq6AQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/117094913?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tomasciccola",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-07-30T17:18:13Z",
      "updated_at": "2025-08-08T14:08:11Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Sometimes when I log in to my user and niri (with `niri --session` and just running plain niri), $NIRI_SOCKET is not set on the compositor. I say sometimes and eyeballing it I would say its 50% with the variable set and 50% without. \n\n\n\n```kdl\n// AUTO SPAWN\nspawn-at-startup \"dinit\" \"--user\" \"-q\"\nspawn-at-startup \"dinitctl\" \"setenv\" \"WAYLAND_DISPLAY\" \"XDG_CURRENT_DESKTOP\" \"DISPLAY\" \"NIRI_SOCKET\"\n\nhotkey-overlay {\n  skip-at-startup\n}\n\nenvironment {\n  DISPLAY \":0\"\n}\n\n// Input\ninput {\n  keyboard {\n    xkb {\n      layout \"us\"\n      variant \"altgr-intl\"\n    }\n    repeat-rate 50\n    repeat-delay 300\n  }\n\n  touchpad {\n    tap\n    accel-profile \"adaptive\"\n  }\n\n  mouse {\n    accel-profile \"adaptive\"\n  }\n\n  warp-mouse-to-focus\n  focus-follows-mouse\n}\n\ncursor {\n  hide-when-typing\n  hide-after-inactive-ms 2000\n}\n\noutput \"eDP-1\" {\n  mode \"1920x1200\"\n  position x=0 y=1080\n  scale 1.0\n  background-color \"#222222\"\n}\n\noutput \"HDMI-A-1\" {\n  mode \"1920x1080\"\n  position x=0 y=0\n  scale 1.0\n  background-color \"#222222\"\n}\n\nlayout {\n  gaps 0\n  center-focused-column \"on-overflow\"\n\n  default-column-width { proportion 1.0; }\n  preset-column-widths {\n    proportion 0.5\n    proportion 1.0\n  }\n\n  focus-ring {\n    off\n  }\n\n  border {\n    width 3\n    active-color \"#fa277c\"\n    inactive-color \"#303030\"\n  }\n\n}\n\nprefer-no-csd\n\nscreenshot-path \"screen_%Y-%m-%d_%H-%M-%S.png\"\n\nwindow-rule {\n  geometry-corner-radius 6\n  clip-to-geometry true\n}\n\nwindow-rule {\n  match app-id=\"imv\"\n  match app-id=\"blueberry\"\n  open-floating true\n}\n\nlayer-rule {\n  match namespace=\"launcher\"\n  shadow {\n    on\n    softness 40\n    spread 5\n    offset x=0 y=5\n    draw-behind-window true\n    color \"#00000064\"\n  }\n}\n\nbinds {\n\n  // LAUNCH/SELECT\n  Mod+Return { spawn \"~/bin/wm/selectOrLaunch\"; }\n  Mod+Ctrl+Return { spawn \"fuzzel\"; }\n  Mod+Shift+Return repeat=false { spawn \"foot\"; }\n  Mod+Space {  spawn \"~/bin/wm/bar\"; }\n  Mod+Escape { spawn \"~/bin/wm/exitm\"; }\n  Mod+C { spawn \"~/bin/wm/wifi\"; }\n  Mod+P { spawn \"~/bin/wm/passm\"; }\n\n  Mod+Tab { focus-window-previous; }\n  Mod+F { fullscreen-window; }\n  Mod+W { switch-preset-column-width; }\n  Mod+Shift+P { power-off-monitors; }\n\n  // WINDOW\n  Mod+Q { close-window; }\n\n  Mod+H     { focus-column-left-or-last; }\n  Mod+J     { focus-window-or-workspace-down; }\n  Mod+K     { focus-window-or-workspace-up; }\n  Mod+L     { focus-column-right-or-first; }\n\n  Mod+Shift+H     { move-column-left; }\n  Mod+Shift+J     { move-column-to-workspace-down; }\n  Mod+Shift+K     { move-column-to-workspace-up; }\n  Mod+Shift+L     { move-column-right; }\n\n  Mod+Ctrl+H     { focus-monitor-left; }\n  Mod+Ctrl+J     { focus-monitor-down; }\n  Mod+Ctrl+K     { focus-monitor-up; }\n  Mod+Ctrl+L     { focus-monitor-right; }\n\n  Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n  Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n  Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n  Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n  Mod+WheelScrollDown      { focus-column-right; }\n  Mod+WheelScrollUp        { focus-column-left; }\n\n  Mod+S { toggle-window-floating; }\n\n  // MULTIMEDIA\n  Mod+equal { spawn \"~/bin/wm/volume\" \"up\";}\n  Mod+minus { spawn \"~/bin/wm/volume\" \"down\";}\n  Mod+0 { spawn \"~/bin/wm/volume\" \"mute\";}\n  Print { screenshot-screen; }\n  Shift+Print { screenshot-window; }\n  Ctrl+Print { screenshot; }\n\n}\n\n```\n\n### System Information\n\n\n* niri version: niri 25.05.1 (8ba57fc)\n\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Artix Linux\n\n\n* GPU: AMD Radeon\n\n\n* CPU: AMD Rizen 7\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2149/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2141",
      "id": 3269878328,
      "node_id": "I_kwDOKFkxdc7C5mI4",
      "number": 2141,
      "title": "When using flatpaks sometimes the mouse input stops working",
      "user": {
        "login": "asosnovsky",
        "id": 7451445,
        "node_id": "MDQ6VXNlcjc0NTE0NDU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7451445?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/asosnovsky",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-07-28T13:16:50Z",
      "updated_at": "2025-07-30T13:20:05Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "\nThis is a strange bug that seems to happen inconsistently, would appreciate any help on how to at least debug this. FYI I have gnome as a backup, where this issue never seem to happen, so I suspect it's something that I messed up with my wayland portals.\n\nBasically, I have some apps installed as flatpaks, specifically dbeaver and chrome, which seem to lose on mouse input. The keyboard input still functions fine, but the mouse input just stops reacting. At first I thought it was a sleep/hibernate thing, but that seems to not be the case. It's just seems like the flatpaks stop responding to mouse inputs after prolong sessions while using niri specifically.\n\n\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n* niri version:  niri 25.05.1 (unknown commit) \nSince using nixos, and niri is the one from nixpkgs, this is the flake.lock:\n\n```nix\n  \"nixpkgs\": {\n         \"locked\": {\n           \"lastModified\": 1751211869,\n           \"narHash\": \"sha256-1Cu92i1KSPbhPCKxoiVG5qnoRiKTgR5CcGSRyLpOd7Y=\",\n           \"owner\": \"NixOS\",\n           \"repo\": \"nixpkgs\",\n           \"rev\": \"b43c397f6c213918d6cfe6e3550abfe79b5d1c51\",\n           \"type\": \"github\"\n         },\n```\n\n* Distro: NixOS 25.05\n\n```\n❯ uname -a\nLinux fwbook 6.15.2-zen1 #1-NixOS ZEN SMP PREEMPT_DYNAMIC Tue Jan  1 00:00:00 UTC 1980 x86_64 GNU/Linux\n```\n\n\n* CPU: AMD Ryzen 5 7640U w/ Radeon 760M Graphics\n\n* Hardware:\n```\nArchitecture:                            x86_64\nCPU op-mode(s):                          32-bit, 64-bit\nAddress sizes:                           48 bits physical, 48 bits virtual\nByte Order:                              Little Endian\nCPU(s):                                  12\nOn-line CPU(s) list:                     0-11\nVendor ID:                               AuthenticAMD\n**Model name:                              AMD Ryzen 5 7640U w/ Radeon 760M Graphics**\nCPU family:                              25\nModel:                                   116\nThread(s) per core:                      2\nCore(s) per socket:                      6\nSocket(s):                               1\nStepping:                                1\nFrequency boost:                         disabled\nCPU(s) scaling MHz:                      58%\nCPU max MHz:                             3501.0000\nCPU min MHz:                             405.9140\nBogoMIPS:                                6986.27\nFlags:                                   fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good amd_lbr_v2 nopl xtopology nonstop_tsc cpuid extd_apicid aperfmperf rapl pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate ssbd mba perfmon_v2 ibrs ibpb stibp ibrs_enhanced vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local user_shstk avx512_bf16 clzero irperf xsaveerptr rdpru wbnoinvd cppc arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold vgif x2avic v_spec_ctrl vnmi avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid overflow_recov succor smca fsrm flush_l1d amd_lbr_pmc_freeze\nVirtualization:                          AMD-V\nL1d cache:                               192 KiB (6 instances)\nL1i cache:                               192 KiB (6 instances)\nL2 cache:                                6 MiB (6 instances)\nL3 cache:                                16 MiB (1 instance)\nNUMA node(s):                            1\nNUMA node0 CPU(s):                       0-11\nVulnerability Gather data sampling:      Not affected\nVulnerability Ghostwrite:                Not affected\nVulnerability Indirect target selection: Not affected\nVulnerability Itlb multihit:             Not affected\nVulnerability L1tf:                      Not affected\nVulnerability Mds:                       Not affected\nVulnerability Meltdown:                  Not affected\nVulnerability Mmio stale data:           Not affected\nVulnerability Old microcode:             Not affected\nVulnerability Reg file data sampling:    Not affected\nVulnerability Retbleed:                  Not affected\nVulnerability Spec rstack overflow:      Mitigation; Safe RET\nVulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl\nVulnerability Spectre v1:                Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2:                Mitigation; Enhanced / Automatic IBRS; IBPB conditional; STIBP always-on; PBRSB-eIBRS Not affected; BHI Not affected\nVulnerability Srbds:                     Not affected\nVulnerability Tsx async abort:           Not affected\n```\n\n\n* config.kdl\n\n```kdl\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\n    touchpad {\n        tap\n        natural-scroll\n    }\n}\nspawn-at-startup \"hypridle\"\nspawn-at-startup \"xwayland-satellite\"\nspawn-at-startup \"ghostty\"\nspawn-at-startup \"mako\"\nspawn-at-startup \"nm-applet --indicator\"\nspawn-at-startup \"waybar\"\nspawn-at-startup \"waybar -c /home/ari/.config/waybar/bottom-config.jsonc\"\n\nenvironment {\n  QT_QPA_PLATFORM \"wayland\"\n  QT_WAYLAND_DISABLE_WINDOWDECORATION \"1\"\n  NIXOS_OZONE_WL \"1\"\n  DISPLAY \":0\"\n  ELECTRON_OZONE_PLATFORM_HINT \"auto\"\n}\n\n\n// =========================\n// Outputs\n// =========================\noutput \"BOE 0x0BCA Unknown\" {\n    mode \"2256x1504@60\"\n    scale 1\n    transform \"normal\"\n    position x=0 y=0\n}\n// Portable Azopa\noutput \"PNP(GWD) ARZOPA \\\\x15\\\\xd9F\\\\x1675US0000\" {\n  mode \"1920x1080@60\"\n  scale 1 \n  transform \"normal\"\n  position x=-1920 y=0\n}\n// Two Screens in Office\noutput \"Samsung Electric Company S22R35x H4TR604392\" {\n  mode \"1920x1080@74.973\"\n  scale 1 \n  transform \"normal\"\n  position x=-960 y=-1080\n}\n\noutput \"Samsung Electric Company S22R35x H4TR503886\" {\n  mode \"1920x1080@74.973\"\n  scale 1 \n  transform \"normal\"\n  position x=980 y=-1080\n}\n\n// Office \noutput \"Dell Inc. DELL SE3223Q 1WDWKK3\" {\n  scale 2\n  position x=0 y=-1080\n}\n\n// =========================\n// General layout\n// =========================\nlayout {\n    gaps 8\n    center-focused-column \"never\"\n    tab-indicator\n    preset-column-widths {\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n    }\n    default-column-width { proportion 0.5; }\n    focus-ring {\n        width 4\n        active-color \"#7fc8ff\"\n        inactive-color \"#505050\"\n    }\n}\n\n// =========================\n// Screen Shots\n// =========================\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// =========================\n// Window Rules\n// =========================\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    match app-id=\"org.pulseaudio.pavucontrol\"\n    match app-id=\"Rofi\"\n    match app-id=\"nm-connection-editor\"\n    match app-id=\".blueman-manager-wrapped\"\n    match app-id=r#\"^org.gnome.Calendar$\"#\n    match app-id=r#\"^gcr-prompter$\"#\n    match app-id=r#\"^xdg-desktop-portal-gnome$\"#\n    match app-id=r#\"^nm-applet$\"#\n    match app-id=r#\"^chrome-.*\"#\n    match title=\"$Huddle:.*\" app-id=\"Slack\"\n    match title=\"Visual Studio Code\" app-id=\"code\"\n\n    open-focused true\n    open-floating true\n    default-floating-position x=0 y=25 relative-to=\"top\"\n    default-window-height { proportion 0.5; }\n    default-column-width { proportion 0.25; }\n}\nwindow-rule {\n    match is-active=false\n    opacity 0.85\n}\nwindow-rule {\n    match app-id=r#\"^Slack$\"#\n    match app-id=\"code\" \n    exclude app-id=r#\"^code$\"# title=r#\"^Visual Studio Code$\"#\n    open-fullscreen false\n    open-floating false\n    open-maximized true\n    open-focused true\n}\n// =========================\n// General Stuff \n// =========================\nswitch-events { \n  lid-close { spawn \"notify-send\" \"The laptop lid is closed!\"; }\n  lid-open { spawn \"notify-send\" \"The laptop lid is open!\"; }\n}\nhotkey-overlay {\n    skip-at-startup\n}\n\n// =========================\n//  General binds\n//  =========================\nbinds {\n    Mod+Shift+H { show-hotkey-overlay; }\n    Mod+T { spawn \"ghostty\"; }\n    Mod+Space { spawn \"fuzzel\"; }\n    Mod+B { spawn \"chromium\" \"--profile-directory=ProfilePersonal\"; }\n    Mod+Alt+B { spawn \"chromium\" \"--profile-directory=ProfileWork\"; }\n    Mod+E { spawn \"wofi-emoji\"; }\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n    XF86MonBrightnessUp { spawn \"brightnessctl\" \"set\" \"10%+\"; }\n    XF86MonBrightnessDown { spawn \"brightnessctl\" \"set\" \"10%-\"; }\n    Mod+Alt+L { spawn \"/run/current-system/sw/bin/makoctl\" \"dismiss\" \"-a\"; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-workspace-down; }\n    Mod+Up    { focus-workspace-up; }\n    Mod+Right { focus-column-right; }\n\n    Mod+Shift+Tab { focus-monitor-next; }\n\n    Mod+Ctrl+Right { swap-window-right; }\n    Mod+Ctrl+Left { swap-window-left; }\n    Mod+Ctrl+Up { move-window-to-workspace-up; }\n    Mod+Ctrl+Down { move-window-to-workspace-down; }\n\n    Mod+W { toggle-column-tabbed-display; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n    Mod+Ctrl+F { reset-window-height; }\n    Mod+V       { toggle-window-floating; }\n    \n    Mod+C { center-column; }\n\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n    \n    Print { screenshot; }\n    Mod+P { screenshot; }\n    \n    Ctrl+Alt+Delete { quit; }\n    Mod+Q { close-window; }\n\n    Mod+Ctrl+W { spawn \"waybar\"; }\n    Mod+Ctrl+B { spawn \"waybar\" \"-c\" \"/home/ari/.config/waybar/bottom-config.jsonc\"; }\n}\n\n\n/// Com Apps\nworkspace \"chat\" {\n    open-on-output \"eDP-1\"\n}\nspawn-at-startup \"slack\"\nwindow-rule {\n    match app-id=r#\"^Slack$\"#\n    match app-id=r#\"^signal$\"#\n    open-on-workspace \"chat\"\n    open-focused true\n}\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2141/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2138",
      "id": 3267259875,
      "node_id": "I_kwDOKFkxdc7Cvm3j",
      "number": 2138,
      "title": "dunst notification freezes if multiple long  notification is recieved together",
      "user": {
        "login": "dijith-481",
        "id": 173086288,
        "node_id": "U_kgDOClEWUA",
        "avatar_url": "https://avatars.githubusercontent.com/u/173086288?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dijith-481",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-07-27T16:56:53Z",
      "updated_at": "2026-01-16T10:02:36Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nwhen multiple notifications are  received together the notification can't be  dismissed it just freezes over the screen\n- wrote a simple script to test it \n- the issue is seen when the total length of  visible notification becomes longer than the screen height \n-  killing dunst and reloading removes the freezed notification\n```bash\n pkill dunst && niri msg action spawn -- dunst\n```\n- sometimes killing waybar removes the freezed notification  ( i guess  change in the layout forces entire thing screen to be redrawn)\n```bash\nfor i in $(seq 1 $1); do\n  echo \"Sending notification $i\"\n  notifications=\"\"\n  for _ in $(seq 1 $2); do\n    notifications+=\"Notification $i\"$'\\n'\n  done\n  notify-send \"$notifications\"\ndone\n\n\n```\n\n- when the total height is less than screen height it correctly works and can be dismissed(passed 3 notification)\n <img width=\"948\" height=\"1153\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/602ff9fb-2a02-42ee-a310-44cc08b454c5\" />\n- when passing 4 or higher to the script it freezes and given it freezes (sometimes it only shows first notification)\n<img width=\"957\" height=\"787\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/7a5a68ad-30f3-456f-9f45-45ddd6c238f9\" />\n- the next image is identical to first one but here the notifications cant be dismissed\n\n<img width=\"956\" height=\"1158\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/daf69df1-d6d4-418f-a374-f2da0f08319a\" />\n- content below it renders correctly \n\n<img width=\"914\" height=\"1160\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/13690620-35fb-4b49-ab46-59c540a0b86f\" />\n\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n- tried with  default niri config issue is reproduced\n- tried with other wm (hyprland) cannot reproduce it there\n- tried with default dunst config  issue is reproduced\n```\nworkspace \"mainWorkspace\"\nworkspace \"browser\"\nworkspace \"ytmusic\"\n\nenvironment {\n    DISPLAY \":0\"\n    ELECTRON_OZONE_PLATFORM_HINT \"wayland\"\n    QT_QPA_PLATFORM \"wayland;xcb\"\n    QT_QPA_PLATFORMTHEME \"qt6ct\"\n    GTK_THEME \"Nordic-v40\" \n  GDK_BACKEND \"wayland\"\n    // GTK_USE_PORTAL \"1\"\n    // GDK_DEBUG \"portals\"\n    QT_WAYLAND_DISABLE_WINDOWDECORATION \"1\"\n    QT_STYLE_OVERRIDE \"kvantum\"\n    QT_AUTO_SCREEN_SCALE_FACTOR \"1\"\n    QT_ENABLE_HIGHDPI_SCALING \"1.2\"\n    QT_QUICK_CONTROLS_STYLE \"org.kde.desktop\"\n    XDG_CURRENT_DESKTOP \"niri\"\n    XDG_SESSION_TYPE \"wayland\"\n    // XDG_SESSION_DESKTOP \"niri\"\n    SSH_AUTH_SOCK \"/run/user/1000/gcr/ssh\"\n    GDK_DPI_SCALE \"1.2\"\n    GDK_SCALE \"1.2\"\n}\n\n\ninput {\n    disable-power-key-handling\n    keyboard {\n        repeat-delay 240\n        repeat-rate 50\n        xkb {\n            layout \"us\"\n        }\n    }\n\n    touchpad {\n        tap\n        dwt\n        drag-lock\n        accel-speed 0.2\n        scroll-method \"two-finger\"\n        tap-button-map \"left-right-middle\"\n        scroll-factor 1\n    }\n\n    mouse {\n        // natural-scroll\n        accel-speed 0.2\n    }\n\n    trackpoint {}\n\n    warp-mouse-to-focus mode=\"center-xy\"\n    focus-follows-mouse max-scroll-amount=\"10%\"\n    // workspace-auto-back-and-forth\n}\n\nlayer-rule {\n    match namespace=\"swww-daemon\"\n    // place-within-backdrop true\n}\n\noutput \"eDP-1\" {\n    // off\n    mode \"1920x1200\"\n    scale 1.2\n    transform \"normal\"\n background-color \"#191d24\"\n    // position x=0 y=0\n}\n\nlayout {\n    gaps 4\n\n    center-focused-column \"never\"\n    always-center-single-column\n    default-column-display \"tabbed\"\n    // empty-workspace-above-first\n    // background-color \"#191d24\"\nbackground-color \"transparent\"\n\n    preset-column-widths {\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n        proportion 0.90\n    }\n\n    preset-window-heights {\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n        proportion 1.00\n    }\n\n    default-column-width { proportion 0.5; }\n    // default-column-width {}\n\n    focus-ring {\n        // off\n        width 2\n        active-color \"#81a1c1\"\n        inactive-color \"#3b4252\"\n        active-gradient from=\"#3b4252ff\" to=\"#81a1c1\" angle=20 in=\"srgb\" relative-to=\"workspace-view\"\n    }\n\n\n    border {\n        off\n        // width 1\n        // active-color \"#81a1c1\"\n        // inactive-color \"#3b4252\"\n    }\n\n    tab-indicator {\n        hide-when-single-tab\n        width 4\n        gap 8\n        length total-proportion=0.25\n        corner-radius 5\n        position \"left\"\n        gaps-between-tabs 4\n        active-color \"#a3be8c\"\n        inactive-color \"#a3be8c40\"\n    }\n\n    shadow {\n        // on\n        softness 10\n        spread 0\n        offset x=0 y=0\n        color \"#81a1c2\"\n    }\n\n    insert-hint {\n        // off\n        color \"#8fbcbb\"\n        gradient from=\"#5e81acc0\" to=\"#81a1c1d0\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    struts {\n        left 6\n        right 6\n        // top 32\n        // bottom 64\n    }\n}\n\noverview {\n    zoom 0.3\n    backdrop-color \"#2e3440\"\n    workspace-shadow {\n          off\n    }\n\n}\n\nspawn-at-startup  \"clipse\" \"-listen\"  \nspawn-at-startup  \"foot\" \"server\"\nspawn-at-startup  \"systemctl\" \"--user\" \"start\" \"hyprpolkitagent\"\nspawn-at-startup  \"kdeconnectd\"\nspawn-at-startup   \"kdeconnect-indicator\"\nspawn-at-startup  \"waybar\" \nspawn-at-startup \"dunst\" \nspawn-at-startup  \"syncthing\" \"serve\" \nspawn-at-startup  \"swww-daemon\" \nspawn-at-startup \"sleep\" \"1\"  \"&&\" \"exec\" \"swww\" \"restore\" \nspawn-at-startup \"~/.config/hypr/scripts/initwallpaper.sh\"\nspawn-at-startup  \"gnome-keyring-daemon\" \"--start\" \"--components=secrets\"\nspawn-at-startup \"dbus-update-activation-environment\" \"--systemd\" \"WAYLAND_DISPLAY\" \"XDG_CURRENT_DESKTOP\" \"XDG_SESSION_TYPE\" \"NIRI_SOCKET\"\nspawn-at-startup   \"zen-browser\" \nspawn-at-startup   \"hypr\" \nspawn-at-startup   \"brave\" \"--app=https://music.youtube.com\"\nspawn-at-startup   \"wlsunset\" \"-l\" \"10.77\" \"-L\" \"76.22\"\nspawn-at-startup \"xwayland-satellite\"\n\nprefer-no-csd\n\nscreenshot-path \"~/Downloads/screenshots/ from %Y-%m-%d %H-%M-%S.png\"\n\n\ncursor {\n    xcursor-theme \"oreo_nord_cursors\"\n    xcursor-size 10\n    hide-when-typing\n    // hide-after-inactive-ms 3000\n}\n\nhotkey-overlay {\n    skip-at-startup\n}\n\nlayer-rule {\n    match namespace=\"^swww-daemon$\"\n    // place-within-backdrop true\n}\n\n\nlayer-rule {\n    match namespace=\"waybar\"\n    match at-startup=true\n    opacity 0.8\n\n    shadow {\n        on\n        // off\n        softness 40\n        spread 5\n        offset x=0 y=5\n        draw-behind-window true\n        color \"#00000064\"\n        // inactive-color \"#00000064\"\n    }\n\n    // place-within-backdrop true\n    // baba-is-float true\n}\n\ngestures {\n    hot-corners {\n        off\n    }\n}\n\nanimations {\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n     slowdown 0.5\n}\n\nwindow-rule {\n    match app-id=r#\"^floatingfoot$\"#\n    open-floating true\n    default-column-width { fixed 784; }\n    default-window-height { fixed 464; }\n}\nwindow-rule {\n    match at-startup=true  app-id=r#\"^.*music.youtube.*$\"#\n    open-maximized true\n    open-on-workspace \"ytmusic\"\n}\n\nwindow-rule{\n  match app-id=r#\"^org\\.kde\\.kdeconnect\\.daemon$\"#\n  open-floating true\n  default-floating-position x=600 y=0 relative-to=\"top-left\"\n}\nwindow-rule {\n    // match app-id=r#\"^yazi$\"#\n    match  title=r#\".*md$\"#\n    // open-floating true\n    // default-column-width { fixed 1016; }\n    // default-window-height { fixed 659; }\n}\n\nwindow-rule {\n    match title=r#\"^.*(qView).*$\"#\n    open-floating true\n    default-column-width { fixed 700; }\n    default-window-height { fixed 438; }\n}\n\nwindow-rule {\n    match at-startup=true app-id=r#\"zen$\"# \n    open-on-workspace \"browser\"\n    open-maximized true\n    draw-border-with-background false\n}\nwindow-rule {\n    match app-id=r#\"^clipse$\"#\n    match app-id=r#\"^selectwebsite$\"#\n    open-floating true\n    default-column-width { fixed 622; }\n    default-window-height { fixed 652; }\n}\nwindow-rule {\n    match app-id=r#\"^fum$\"#\n\n    default-floating-position x=600 y=0 relative-to=\"top-left\"\n    open-floating true\n    border {\n      off\n    }\nbaba-is-float true\n    focus-ring {\n      off\n    }\n    shadow {\n      off\n    }\n    open-focused false\n    default-column-width { fixed 420; }\n    default-window-height { fixed 260; }\n}\n\n\nwindow-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n}\n\nwindow-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n}\n\nwindow-rule {\n  match app-id=r#\"^org\\.gnome\\.Nautilus$\"# title=r#\"^.*(wants to open).*$\"#\n  default-column-width { proportion 0.33333;}\n  default-window-height { proportion 0.66667; }\ndefault-floating-position x=0 y=0 relative-to=\"top-right\"\n}\nwindow-rule {\n  match  is-floating=true\n    shadow{\n        on\n    }\n  }\n\nwindow-rule {\n    geometry-corner-radius 8\n    clip-to-geometry true\n}\n\nswitch-events {\n  lid-close { spawn \"hyprlock\"; }\n}\n\nbinds {\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // touchpadscroll\n    Mod+Alt+TouchpadScrollUp { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.01+\"; }\n    Mod+Alt+TouchpadScrollDown  { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.01-\"; }\n    Mod+TouchpadScrollLeft  { focus-column-left; }\n    Mod+TouchpadScrollRight  { focus-column-right; }\n    Mod+TouchpadScrollUp cooldown-ms=200 { focus-workspace-up; }\n    Mod+TouchpadScrollDown cooldown-ms=200 { focus-workspace-down; }\n\n    // volume and brightness\n    XF86AudioPlay allow-when-locked=true { spawn \"playerctl\" \"play-pause\"  ; }\n    XF86AudioPause allow-when-locked=true { spawn \"playerctl\" \"play-pause\"  ; }\n    XF86AudioPrev allow-when-locked=true { spawn \"playerctl\" \"next\"  ; }\n    XF86AudioNext allow-when-locked=true { spawn \"playerctl\" \"previous\"  ; }\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.05+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.05-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"~/.config/hypr/scripts/brightness.sh\" \"up\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"~/.config/hypr/scripts/brightness.sh\" \"down\"; }\n\n\n    // playerctl\n    Mod+Alt+space repeat=false { spawn  \"~/.config/hypr/scripts/playerctl-play-pause.sh\"; }\n    Mod+Alt+slash repeat=false { spawn \"playerctld\" \"shift\"; }\n    Mod+Alt+period repeat=false { spawn \"playerctl\" \"next\"; }\n    Mod+Alt+comma repeat=false { spawn \"playerctl\" \"previous\"; }\n\n    // wallpaper\n    Mod+U repeat=false { spawn  \"~/.config/hypr/scripts/wallpaper.sh\"; }\n    Mod+Control+U repeat=false { spawn  \"~/.config/hypr/scripts/live-wallpaper.sh\"; }\n\n    // close active\n    Mod+Ctrl+W repeat=false {   spawn \"sh\" \"-c\" \"niri msg action close-window && ~/.config/hypr/scripts/wallpaper.sh\"; }\n    Mod+W repeat=false {   close-window ;}\n\n    // terminal\n    Mod+Q  { spawn \"foot\"; }\n    Mod+Return repeat=false { spawn \"foot\" \"-a\" \"floatingfoot\"; }\n    Mod+Alt+Return repeat=false { spawn \"kitty\"; }\n\n    // notification\n    Mod+C repeat=false { spawn \"dunstctl\" \"close\"; }\n    Mod+Shift+C repeat=false { spawn \"dunstctl\" \"set-paused\" \"toggle\"; }\n\n    // bluetooth connection \n    Mod+Alt+b repeat=false { spawn \"bluetoothctl\" \"connect\" \"68:4A:E9:01:FC:C4\"; }\n\n    // night light\n    Mod+Alt+E repeat=false { spawn \"sh\" \"-c\" \"pkill wlsunset || wlsunset -l 10.77 -L 76.22\"; }\n\n    // apps\n    Mod+space repeat=false { spawn \"fuzzel\"; }\n    Mod+F2 { spawn \"hyprlock\"; }\n    Mod+E repeat=false { spawn \"kitty\" \"--class\" \"yazi\" \"-e\" \"yazi\"; }\n    Mod+Control+E repeat=false { spawn \"foot\" \"-a\" \"floatingfoot\" \"-e\" \"yazi\"; }\n    Mod+V repeat=false { spawn \"kitty\" \"--class\" \"clipse\" \"-e\" \"clipse\"; }\n    Mod+Control+space repeat=false { spawn \"sh\" \"-c\" \"pkill fum || kitty --class fum -e 'fum'\"; }\n\n    // screenshot\n    Mod+XF86Favorites { screenshot-screen ; }\n    Mod+Control+XF86Favorites { screenshot; }\n    Mod+Shift+XF86Favorites { screenshot-window; }\n    Mod+Alt+XF86Favorites { spawn \"sh\" \"-c\" \"pkill wf-recorder || wf-recorder \\\\\n        --geometry \\\"$(slurp)\\\" \\\\\n        -f ~/Downloads/screenshots/record_$(date +%Y%m%d_%H%M%S)_wf.mkv\";\n    }\n    XF86Favorites repeat=false { spawn \"~/.config/hypr/scripts/screenshot.sh\" \"region\" \"--clipboard-only\"; }\n    // Mod+Shift+p repeat=false { spawn \"~/.config/hypr/scripts/screenshot.sh\" \"window\"; }\n    // Mod+Control+p repeat=false { spawn \"~/.config/hypr/scripts/screenshot.sh\" \"region\"; }\n\n    Mod+B repeat=false { spawn \"zen-browser\"; }\n    // Mod+Alt+b repeat=false { focus-workspace \"browser\"; }\n    Mod+Control+B repeat=false { spawn  \"./Dev/history-website-appmode/target/release/history-website-appmode\"; }\n    Mod+Control+Shift+B repeat=false { spawn  \"./Dev/history-website-appmode/target/release/history-website-appmode\" \"-i\"; }\n    Mod+Alt+Y repeat=false { spawn \"brave\" \"--app=https://music.youtube.com\" ; }\n    Mod+g repeat=false { spawn \"brave\" \"--app=https://aistudio.google.com\"; }\n    Mod+Control+f repeat=false { spawn  \"~/.config/hypr/scripts/kde-fileshare.sh\"; }\n    Mod+z repeat=false { \"spawn\" \"foot\"  \"nvim\"; }\n    Mod+x repeat=false { spawn \"sh\" \"-c\" \"foot -T md ~/.config/hypr/scripts/mdToday.sh\"; }\n    Mod+Control+X repeat=false { spawn \"sh\" \"-c\" \"foot -T md  ~/.config/hypr/scripts/todolist.sh\"; }\n    Mod+Alt+c repeat=false { spawn \"hyprpicker\" \"-a\"; }\n    Mod+Y repeat=false {  focus-workspace \"ytmusic\"; }\n\n    Mod+grave repeat=false { toggle-overview; }\n    Alt+Space repeat=false { toggle-overview; }\n    \n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up;}\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    // Mod+Shift+Left  { focus-monitor-left; }\n    // Mod+Shift+Down  { focus-monitor-down; }\n    // Mod+Shift+Up    { focus-monitor-up; }\n    // Mod+Shift+Right { focus-monitor-right; }\n    // Mod+Shift+H     { focus-monitor-left; }\n    // Mod+Shift+J     { focus-monitor-down; }\n    // Mod+Shift+K     { focus-monitor-up; }\n    // Mod+Shift+L     { focus-monitor-right; }\n\n    // Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    // Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    // Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    // Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    // Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    // Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    // Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    // Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // Mod+Page_Down      { focus-workspace-down; }\n    // Mod+Page_Up        { focus-workspace-up; }\n    Mod+N              { focus-workspace-down; }\n    Mod+P              { focus-workspace-up; }\n\n    Mod+Control+N         { move-workspace-down; }\n    Mod+Control+P         { move-workspace-up; }\n    Mod+Shift+N         { move-column-to-workspace-down; }\n    Mod+Shift+P         { move-column-to-workspace-up; }\n\n    // Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    // Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    // Mod+Ctrl+U         { move-column-to-workspace-down; }\n    // Mod+Shift+Page_Down { move-workspace-down; }\n    // Mod+Shift+Page_Up   { move-workspace-up; }\n\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    Mod+Shift+1 { move-column-to-index 1; }\n    Mod+Shift+2 { move-column-to-index 2; }\n    Mod+Shift+3 { move-column-to-index 3; }\n    Mod+Shift+4 { move-column-to-index 4; }\n    Mod+Shift+5 { move-column-to-index 5; }\n    Mod+Shift+6 { move-column-to-index 6; }\n    Mod+Shift+7 { move-column-to-index 7; }\n    Mod+Shift+8 { move-column-to-index 8; }\n    Mod+Shift+9 { move-column-to-index 9; }\n\n    Mod+Alt+1 { focus-column 1; }\n    Mod+Alt+2 { focus-column 2; }\n    Mod+Alt+3 { focus-column 3; }\n    Mod+Alt+4 { focus-column 4; }\n    Mod+Alt+5 { focus-column 5; }\n    Mod+Alt+6 { focus-column 6; }\n    Mod+Alt+7 { focus-column 7; }\n    Mod+Alt+8 { focus-column 8; }\n    Mod+Alt+9 { focus-column 9; }\n\n    Mod+Shift+I { focus-column-first; }\n    Mod+Shift+A { focus-column-last; }\n    Mod+Control+Shift+I { move-column-to-first; }\n    Mod+Control+Shift+A { move-column-to-last; }\n\n    Mod+Tab { focus-window-previous; }\n    Mod+Shift+Tab { focus-workspace-previous; }\n\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n    Mod+Comma  { consume-window-into-column; }\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Shift+Q { set-column-width \"33%\"; }\n    Mod+Shift+W { set-column-width \"50%\"; }\n    Mod+Control+R { reset-window-height; }\n\n    Mod+Shift+E { set-column-width \"66%\"; }\n    Mod+D { maximize-column; }\n    Mod+F { fullscreen-window; }\n    Mod+Shift+F { toggle-windowed-fullscreen; }\n\n    Mod+Control+D { expand-column-to-available-width; }\n\n    Mod+Minus { set-column-width \"-4%\"; }\n    Mod+Equal { set-column-width \"+4%\"; }\n    Mod+Shift+Minus { set-window-height \"-4%\"; }\n    Mod+Shift+Equal { set-window-height \"+4%\"; }\n    Mod+A       { toggle-window-floating; }\n    Mod+Control+Tab { switch-focus-between-floating-and-tiling; }\n    Mod+T { toggle-column-tabbed-display; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot show-pointer=false; }\n    Ctrl+Print { screenshot-screen show-pointer=false; }\n    Alt+Print { screenshot-window ; }\n\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n    // Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    Mod+F3 { power-off-monitors; }\n\n}\n```\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \n❯ niri -V\nniri 25.05.1 (8ba57fc)\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro:\n Arch Linux x86_64\nLinux 6.15.6-arch1-1\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \nintegrated \n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\nintel core ultra 7 155h\n\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2138/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2112",
      "id": 3256686683,
      "node_id": "I_kwDOKFkxdc7CHRhb",
      "number": 2112,
      "title": "Trying to safely kill processes doesn't work if spawed with Niri",
      "user": {
        "login": "scientiac",
        "id": 58177655,
        "node_id": "MDQ6VXNlcjU4MTc3NjU1",
        "avatar_url": "https://avatars.githubusercontent.com/u/58177655?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/scientiac",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-07-23T14:47:55Z",
      "updated_at": "2025-07-23T15:57:02Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nIf I launch a program, e.g. Firefox from the terminal and use `pkill firefox` from the terminal, it kills the process.  \nBut, If I launch the program `firefox` from `wofi` or `rofi` or `fuzzel` or `niri msg action spawn -- firefox` or using a keybind, `pkill` cannot kill the program.\n\n`pkill` or `kill <pid>` both doesn't work except for `kill -9` which I am currently using in my config.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n[config](https://github.com/user-attachments/files/21389997/config.txt)\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (v25.05.1-66-g7b065f86)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon 780M Graphics [Integrated]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 8840HS (16) @ 3.30 GHz\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2112/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2102",
      "id": 3248859366,
      "node_id": "I_kwDOKFkxdc7Bpajm",
      "number": 2102,
      "title": "Tray Based Flatpak Apps Do Not Autostart",
      "user": {
        "login": "etrigan63",
        "id": 7347264,
        "node_id": "MDQ6VXNlcjczNDcyNjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7347264?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/etrigan63",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-07-21T14:18:04Z",
      "updated_at": "2025-07-24T02:35:58Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "System Tray based Flatpak apps install and run normally from the launcher (`pikabar-launcher` in my case, but it is the same with `fuzzel`). However, if I select the app's \"Launch at startup\" setting which creates a GNOME-style `.desktop` file in `$HOME/.config/autostart`, the app does not launch at startup. PikaOS is Debian based so if I install a `.deb` version of the app, autostart works as expected. I have checked the `.desktop` files and the EXEC path is correct for the Flatpak versions. \n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\nApps are running in Wayland. The apps I am having issues with (so far):\n`syncthing-gtk`\n`syncthingy`\n`trayscale`\n\nThere are no .deb version of the first two so I installed `syncthingtray`which does have a .deb version. My workaround for `trayscale` is a little more convoluted. I installed `distrobox`, spun up an Arch container, installed an AUR helper, installed `trayscale` from the AUR, copied the binary from the container to the host and it works normally. This makes updating the app a manual process for me until this flatpak thing gets resolved.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (21fe2a51-modified)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: PikaOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Radeon  780M Graphics\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 7840U\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2102/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2094",
      "id": 3246826122,
      "node_id": "I_kwDOKFkxdc7BhqKK",
      "number": 2094,
      "title": "Deficient floating window selection",
      "user": {
        "login": "jrvieira",
        "id": 16804617,
        "node_id": "MDQ6VXNlcjE2ODA0NjE3",
        "avatar_url": "https://avatars.githubusercontent.com/u/16804617?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jrvieira",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-07-21T00:19:06Z",
      "updated_at": "2025-09-14T20:33:07Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When changing focus between floating windows using the keyboard, windows with the same coordinate as the focused one become impossible to focus. For example, it's only possible to select one window with focus-column-right/left of multiple windows sharing the x coordinate and with focus-window-up/down sharing the y coordinate. \n\nThis makes it so that all except one window sharing both coordinates aswell as windows that share coordinates with the maximum or minimum values of both coordinates become impossible to select.\n\n```\n+-----+  +-----+\n|  1  |  |  3  |   <- Can't focus window 3\n+-----+  +-----+\n\n         +-----+\n         |  2  |   Focus moves only between windows 1 and 2\n         +-----+\n```\n\n\n### System Information\n\n* niri version: niri 25.05.1 (unknown commit)\n\n* Distro: Void Linux (rolling)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2094/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2081",
      "id": 3245284918,
      "node_id": "I_kwDOKFkxdc7Bbx42",
      "number": 2081,
      "title": "Cursor not warped to window on touchpad view swipe",
      "user": {
        "login": "winkelnp",
        "id": 68015877,
        "node_id": "MDQ6VXNlcjY4MDE1ODc3",
        "avatar_url": "https://avatars.githubusercontent.com/u/68015877?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/winkelnp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-07-19T12:49:13Z",
      "updated_at": "2025-08-18T04:39:13Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen the horizontal three-finger swipe is used to move the horizontal view, the cursor is often left behind on an unfocused window, even with `warp-mouse-to-focus` and `focus-follows-mouse` enabled. Is this meant to be like that or should `warp-mouse-to-focus` change that?\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon 740M Graphics [Integrated]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 5 8540U\n\n<details> <summary> My full niri config </summary>\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            layout \"de\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n            options \"kpdl:dot,\"\n        }\n\n        // Enable numlock on startup, omitting this setting disables it.\n        numlock\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        // off\n        tap\n        dwt\n        // dwtp\n        drag true\n        drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    focus-follows-mouse max-scroll-amount=\"95%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\noutput \"eDP-1\" {\n    // off\n    mode \"1920x1200@60.00\"\n    scale 1.2\n    transform \"normal\"\n    position x=1920 y=300\n}\noutput \"HDMI-A-1\" {\n    // off\n    // mode \"1920x1080@60.000\"\n    scale 1\n    transform \"normal\"\n    position x=0 y=0\n    focus-at-startup\n    variable-refresh-rate //on-demand=true\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 12\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        left 30\n        right 30\n        // top -20\n        // bottom -20\n    }\n\n    background-color \"transparent\"\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        // off\n\n        width 3\n        active-color \"#7fc8ff\"\n        inactive-color \"#505050\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#9b0000\"\n\n        // active-gradient from=\"#ffbb66\" to=\"#ffc880\" angle=45 relative-to=\"workspace-view\"\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        // \n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        // \n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    tab-indicator{\n        // place-within-column\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\nspawn-at-startup \"~/.config/niri/scripts/waybar.sh\"\nspawn-at-startup \"hyprpaper\"\nspawn-at-startup \"hypridle\"\nspawn-at-startup \"wlsunset\" \"-t 3200\" \"-l 49\" \"-L 8\"\nspawn-at-startup \"dunst\"\nspawn-at-startup \"kdeconnect-indicator\"\nspawn-at-startup \"/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1\"\nspawn-at-startup \"org.signal.Signal\" \"--start-in-tray\"\nspawn-at-startup \"nextcloud\" \"--background\"\n\nspawn-at-startup \"xwayland-satellite\"\nenvironment {\n    DISPLAY \":1\"\n}\n/-xwayland-satellite {\n    path \"xwayland-satellite\"\n}\n\nspawn-at-startup \"wl-paste\" \"--watch cliphist store\"\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\nprefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\ncursor {\n    hide-when-typing\n}\n\noverview {\n    zoom 0.5\n    workspace-shadow {\n        // off\n        softness 20\n        spread 20\n        offset x=0 y=10\n        color \"#00000050\"\n    }\n}\ngestures {\n    hot-corners {\n        off\n    }\n}\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n// Startup apps\nspawn-at-startup \"kitty\" \"-e\" \"btop\"\nwindow-rule {\n    match app-id=\"kitty\" at-startup=true\n    open-on-output \"eDP-1\"\n    open-maximized true\n    open-focused false\n}\nspawn-at-startup \"dolphin\"\nwindow-rule {\n    match app-id=\"org.kde.dolphin\" at-startup=true\n    open-on-output \"HDMI-A-1\"\n    open-maximized false\n    open-focused true\n}\nspawn-at-startup \"firefox\"\nwindow-rule {\n    match app-id=\"firefox\" at-startup=true\n    open-on-output \"HDMI-A-1\"\n    open-maximized true\n    open-focused true\n}\nspawn-at-startup \"sh\" \"-c\" \"sleep 2; org.mozilla.Thunderbird\"\nwindow-rule {\n    match app-id=r#\"(org\\.mozilla\\.Thunderbird)|thunderbird\\-esr\"# at-startup=true\n    open-on-output \"HDMI-A-1\"\n    open-maximized true\n    open-focused false\n    open-floating false\n}\nspawn-at-startup \"sh\" \"-c\" \"sleep 1; bitwarden-desktop\"\nwindow-rule {\n    match title=\"Bitwarden\" at-startup=true\n    open-on-output \"HDMI-A-1\"\n    open-maximized false\n    open-focused true\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    // match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    match title=\"^Picture-in-Picture$\"\n    open-floating true\n    default-floating-position x=40 y=40 relative-to=\"bottom-right\"\n    open-focused false\n}\n\nwindow-rule {\n    match app-id=\"firefox\" title=\"Enter name of file to save to…\"\n    min-width 735\n    max-width 735\n    min-height 374\n    max-height 374\n}\n\nwindow-rule {\n    match app-id=\"Calculator\"\n    match app-id=\"blueman-manager\"\n    match app-id=\"nextcloud\" title=\"Nextcloud\"\n    match app-id=\"hyprland-share-picker\"\n    match app-id=\"nm-connection-editor\" title=r#\"Editing .*\"#\n    match app-id=\"org.kde.krename\" title=r#\"Progress|(Find and Replace)\"#\n    match app-id=\"zenity\" title=\"Progress\"\n    match app-id=\"steam\" title=\"Steam setup\"\n    match app-id=r#\"(org\\.mozilla\\.Thunderbird)|thunderbird\\-esr\"# title=\"|((Create New)|Edit Calendar)\" at-startup=false\n    match app-id=r#\"(org\\.mozilla\\.Thunderbird)|thunderbird\\-esr\"# title=\"An error has ocurred\"\n    match app-id=r#\"(org\\.mozilla\\.Thunderbird)|thunderbird\\-esr\"# title=\"Instant messaging status\"\n    match title=r#\"About Mozilla (Firefox|Thunderbird)\"#\n    open-floating true\n}\n\nwindow-rule {\n    match app-id=\"Brave-browser\" title=\"Xbox Cloud Gaming\"\n    match app-id=\"steam_app\"\n    match app-id=\"supertuxkart\"\n    open-floating false\n    open-maximized true\n}\n\n//  block out from screen capture.\nwindow-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.(World\\.Secrets|seahorse\\.Application)$\"#\n    match app-id=r#\"^.*(b|B)itwarden.*$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\nwindow-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nlayer-rule {\n    match namespace=\"hyprpaper\"\n    place-within-backdrop true\n}\n\nlayer-rule {\n    match namespace=\"notifications\"\n    block-out-from \"screen-capture\"\n}\n\nlayer-rule {\n    match namespace=\"wofi\"\n    geometry-corner-radius 12\n    opacity 0.999 // remove black background\n    shadow {\n        on\n    }\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+ssharp { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+q        hotkey-overlay-title=\"Open a Terminal: kitty\"    { spawn \"kitty\"; }\n    Mod+r        hotkey-overlay-title=\"Run an Application: wofi\"  { spawn \"wofi\"; }\n    Super+escape hotkey-overlay-title=\"Lock the Screen: hyprlock\" { spawn \"hyprlock\"; }\n\n    Mod+b                { spawn \"firefox\"; }\n    Mod+adiaeresis       { spawn \"emacsclient\" \"-nc\" \"-a\" \"''\"; }\n    Mod+Shift+adiaeresis { spawn \"emacs\"; }\n    Mod+e                { spawn \"dolphin\"; }\n\n    Mod+Shift+v hotkey-overlay-title=\"Spawn Clipboard\" { spawn \"~/.config/niri/scripts/clipboard.sh\"; }\n    Mod+c       hotkey-overlay-title=\"Spawn NetworkManager-Dmenu\" { spawn \"networkmanager_dmenu\"; }\n\n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument in the end.\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n\n    Shift+XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SOURCE@\" \"0.01+\"; }\n    Shift+XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SOURCE@\" \"0.01-\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n    Shift+XF86AudioMute  allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n\n    XF86AudioPlay        allow-when-locked=true { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioPause       allow-when-locked=true { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioStop        allow-when-locked=true { spawn \"playerctl\" \"stop\"; }\n    XF86AudioNext        allow-when-locked=true { spawn \"playerctl\" \"next\"; }\n    XF86AudioPrev        allow-when-locked=true { spawn \"playerctl\" \"previous\"; }\n\n    Shift+XF86AudioPlay  allow-when-locked=true { spawn \"playerctl\" \"next\"; }\n    Shift+XF86AudioPause allow-when-locked=true { spawn \"playerctl\" \"next\"; }\n    Ctrl+XF86AudioPlay   allow-when-locked=true { spawn \"playerctl\" \"previous\"; }\n    Ctrl+XF86AudioPause  allow-when-locked=true { spawn \"playerctl\" \"previous\"; }\n\n    XF86Calculator       { spawn \"gnome-calculator\"; }\n    XF86Mail             { spawn \"org.mozilla.Thunderbird\"; }\n\n    XF86MonBrightnessDown       allow-when-locked=true { spawn \"~/.config/hypr/scripts/backlight\" \"dec\"; }\n    XF86MonBrightnessUp         allow-when-locked=true { spawn \"~/.config/hypr/scripts/backlight\" \"inc\"; }\n    Shift+XF86MonBrightnessDown allow-when-locked=true { spawn \"~/.config/hypr/scripts/backlight-external\" \"dec\"; }\n    Shift+XF86MonBrightnessUp   allow-when-locked=true { spawn \"~/.config/hypr/scripts/backlight-external\" \"inc\"; }\n    Mod+F11                     allow-when-locked=true { spawn \"~/.config/hypr/scripts/backlight-external\" \"specify\" \"80\"; }\n\n    // Mod+Shift+Return { spawn \"~/.config/niri/scripts/touchpad.sh\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+s repeat=false { toggle-overview; }\n\n    Mod+w { close-window; }\n\n    Mod+H     { focus-column-left; }\n    // Mod+J     { focus-window-down; }\n    // Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+H     { move-column-left; }\n    // Mod+Ctrl+J     { move-window-down; }\n    // Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    Mod+J     { focus-window-or-workspace-down; }\n    Mod+K     { focus-window-or-workspace-up; }\n    Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    // Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    // Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    // Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    // Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n    Mod+Shift+Ctrl+H     { move-workspace-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-workspace-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-workspace-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-workspace-to-monitor-right; }\n\n    // Mod+Page_Down      { focus-workspace-down; }\n    // Mod+Page_Up        { focus-workspace-up; }\n    // Mod+U              { focus-workspace-down; }\n    // Mod+I              { focus-workspace-up; }\n    // Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    // Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    // Mod+Ctrl+U         { move-column-to-workspace-down; }\n    // Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    // Mod+Shift+Page_Down { move-workspace-down; }\n    // Mod+Shift+Page_Up   { move-workspace-up; }\n    // Mod+Shift+U         { move-workspace-down; }\n    // Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+Comma        { consume-or-expel-window-left; }\n    Mod+Period       { consume-or-expel-window-right; }\n\n    Mod+d            { swap-window-left; }\n    Mod+Shift+d      { swap-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    // Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    // Mod+Period { expel-window-from-column; }\n\n    Mod+y { switch-preset-column-width; }\n    Mod+Shift+y { switch-preset-window-height; }\n    Mod+Ctrl+y { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+Shift+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Plus  { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Plus  { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Ctrl+V  { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+g { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    Mod+Space       { switch-layout \"next\"; }\n    Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    Mod+Shift+F9 hotkey-overlay-title=\"Respawn waybar\" { spawn \"~/.config/niri/scripts/waybar.sh\"; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    // Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+escape hotkey-overlay-title=\"Exit niri\" { quit skip-confirmation=true; }\n    Ctrl+Alt+Delete hotkey-overlay-title=null { quit; }\n\n    Mod+Delete { spawn \"nwg-bar\"; }\n    Mod+Shift+Delete hotkey-overlay-title=\"Suspend System\" { spawn \"systemctl\" \"suspend\"; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n\n}\n```\n</details>\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2081/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2078",
      "id": 3244811508,
      "node_id": "I_kwDOKFkxdc7BZ-T0",
      "number": 2078,
      "title": "Focus follows cursor doesn't work if fullscreen program becomes unfullscreened.",
      "user": {
        "login": "shayanz23",
        "id": 35084589,
        "node_id": "MDQ6VXNlcjM1MDg0NTg5",
        "avatar_url": "https://avatars.githubusercontent.com/u/35084589?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/shayanz23",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-07-19T03:05:32Z",
      "updated_at": "2025-10-26T22:51:29Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nI have an issue where if I full screen an app and unfullscreen it, the focus stays on the last app that was fullscreen instead of the app cursor on top of.\n\nHere's a video demo of firefox being closed by keybind when my cursor is on top of kitty:\n\nhttps://github.com/user-attachments/assets/838c5b08-5030-497a-8d62-ae6d255598fc\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\n\noutput \"DP-1\" {\n    // off\n    mode \"3840x2160@164.992\"\n    scale 1.5\n    position x=0 y=0\n    variable-refresh-rate on-demand=true\n    focus-at-startup\n}\n\noutput \"DP-2\" {\n    // off\n    mode \"2560x1440@164.835\"\n    scale 1\n    transform \"90\"\n    position x=-1440 y=-100\n}\n\nenvironment {\n    QT_QPA_PLATFORM \"wayland\"\n    ELECTRON_OZONE_PLATFORM_HINT \"auto\"\n    XDG_MENU_PREFIX \"arch-\"\n    DISPLAY \":0\"\n}\n\ninput {\n    focus-follows-mouse\n    warp-mouse-to-focus\n\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            // layout \"us,ru\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n        }\n\n        // Enable numlock on startup, omitting this setting disables it.\n        numlock\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        // drag false\n        // drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n        \n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n/-output \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@120.030\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 2\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=1280 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 7\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 2\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 2\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#9b0000\"\n\n        // active-gradient from=\"#ffbb66\" to=\"#ffc880\" angle=45 relative-to=\"workspace-view\"\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        // \n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        // \n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\nspawn-at-startup \"xwayland-satellite\"\n// spawn-at-startup \"steam -silent\"\nspawn-at-startup \"flatpak run org.telegram.desktop -startintray\"\n// spawn-at-startup \"flatpak run com.discordapp.Discord --start-minimized\"\n// spawn-at-startup \"flatpak run org.signal.Signal\"\nspawn-at-startup \"/home/human/niriconfig/waybar/startwaybar.sh\"\nspawn-at-startup \"/home/human/.bash_profile\"\nspawn-at-startup \"kdeconnect-indicator\"\nspawn-at-startup \"wl-paste\" \"--type\" \"text\" \"--watch\" \"cliphist\" \"store\" \"#\" \"Stores\" \"only\" \"text\" \"data\"\nspawn-at-startup \"wl-paste\" \"--type\" \"image\" \"--watch\" \"cliphist\" \"store\" \"#\" \"Stores\" \"only\" \"image\" \"data\"\n// spawn-at-startup \"XDG_MENU_PREFIX=arch- kbuildsycoca6\"\nspawn-at-startup \"heroic\"\nspawn-at-startup \"/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1\"\n\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot-from-%Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\n\n// Open the Firefox picture-in-picture player as floating by default.\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+T hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"kitty\"; }\n    Mod+L hotkey-overlay-title=\"Lock the Screen: hyprlock\" { spawn \"hyprlock\"; }\n    Mod+A hotkey-overlay-title=\"Open file manager\" { spawn \"thunar\"; }\n    Mod+X hotkey-overlay-title=\"Run code\" { spawn \"code\"; }\n    Mod+B hotkey-overlay-title=\"Run browser\" { spawn \"firefox\"; }\n\n    Mod+space hotkey-overlay-title=\"Find an Application using rofi drun\" { spawn \"/home/human/niriconfig/rofi/start-drun.sh\"; }\n    Mod+Shift+W hotkey-overlay-title=\"waybar restart\" {spawn \"/home/human/niriconfig/waybar/startwaybar.sh\"; }\n    Mod+M hotkey-overlay-title=\"Run power menu\" { spawn \"/home/human/niriconfig/rofi/powermenu/run-power-menu.sh\"; }\n    Mod+C hotkey-overlay-title=\"Run clipboard menu\" { spawn \"/home/human/niriconfig/rofi/clipmenu/start-clipmenu.sh\"; }\n    Mod+Shift+X hotkey-overlay-title=\"Run calc menu\" { spawn \"/home/human/niriconfig/rofi/calculator/start-calcmenu.sh\"; }\n    \n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument in the end.\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n    XF86AudioNext allow-when-locked=true { spawn \"playerctl\" \"next\"; }\n    XF86AudioPause allow-when-locked=true { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioPlay allow-when-locked=true { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioPrev allow-when-locked=true { spawn \"playerctl\" \"previous\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+W repeat=false { toggle-overview; }\n\n    Mod+Q { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n//    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+Shift+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    // Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: CachyOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD RX 9070XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Ryzen 7 9800X3D\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2078/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2076",
      "id": 3243310013,
      "node_id": "I_kwDOKFkxdc7BUPu9",
      "number": 2076,
      "title": "window rule not applied on libreoffice-writer",
      "user": {
        "login": "GRFTSOL",
        "id": 108245502,
        "node_id": "U_kgDOBnOx_g",
        "avatar_url": "https://avatars.githubusercontent.com/u/108245502?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/GRFTSOL",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-07-18T13:54:21Z",
      "updated_at": "2025-07-20T01:56:44Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nAs the title, using window rule below: \n```\nwindow-rule {\n    match app-id=r#\"libreoffice-(calc|draw|impress|math|writer)\"#\n    open-maximized true\n}\n```\ncalc/draw/impress/math are affected by the window rule, but not affect `libreoffice-writer`, using `default-column-width { proportion 1.0; }` not affect either, manually toggle width and maximize is working\n- checked with `readlink /proc/$(niri msg --json pick-window | jq .pid)/exe`, belongs to `usr/lib/libreoffice/program/soffice.bin` which other libreoffice application also belongs to.\n\n- also confirmed running on Wayland with `xeyes`\n<!-- Attaching your full niri config can help diagnose the problem. -->\nNiri config:\n[config.txt](https://github.com/user-attachments/files/21317447/config.txt)\n```\nniri validate\n2025-07-18T13:53:09.881925Z DEBUG niri_config: loaded config from \"/home/chasel/.config/niri/config.kdl\"\n2025-07-18T13:53:09.882033Z  INFO niri: config is valid\n```\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \n25.05.1\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: \narchlinux\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \nAMD Radeon Vega 8 Graphics [Integrated]\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\nAMD Ryzen 5 3550H (8) @ 2.10 GHz\n\nVideo: \n\nhttps://github.com/user-attachments/assets/9d33b4b7-2b16-422a-af89-1f1afd95fedd",
      "closed_by": {
        "login": "GRFTSOL",
        "id": 108245502,
        "node_id": "U_kgDOBnOx_g",
        "avatar_url": "https://avatars.githubusercontent.com/u/108245502?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/GRFTSOL",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2076/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2073",
      "id": 3240556140,
      "node_id": "I_kwDOKFkxdc7BJvZs",
      "number": 2073,
      "title": "niri msg - waybar bug",
      "user": {
        "login": "Ezrajf",
        "id": 220225654,
        "node_id": "U_kgDODSBgdg",
        "avatar_url": "https://avatars.githubusercontent.com/u/220225654?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Ezrajf",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-07-17T18:47:46Z",
      "updated_at": "2025-07-17T20:27:19Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Using niri msg action screenshot within the waybar config.jsonc as a \"on-click-right\": \"niri msg action screenshot\" will work, and allow you to screenshot but once you esc from the ui waybar will be locked until you then left click on it (anywhere) to use the \"on-click\" function of the same module. \nRunning the niri msg through a script also has the same issue. \n\nDid not know to report here or waybar so did both. \n\n### System Information\n\n\n* niri version: niri 25.05.1 (8ba57fc)\n  6.15.6-arch1-1\n\n\n* GPU: amd 9070xt\n\n\n* CPU: 9950x3d\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2073/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2058",
      "id": 3234607682,
      "node_id": "I_kwDOKFkxdc7AzDJC",
      "number": 2058,
      "title": "`window-movement` animations sometimes stop randomly and the scrolling view gets stuck halfway through.",
      "user": {
        "login": "voidstar-null",
        "id": 97352165,
        "node_id": "U_kgDOBc155Q",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/voidstar-null",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-07-16T06:07:59Z",
      "updated_at": "2025-07-16T11:45:27Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nJust encountered this recently, as can be seen in the screenshot below, the `window-movement` animation stops randomly when it causes the view to scrolt and it freezes the view in between until I mannually switch to a window.\n<img width=\"1920\" height=\"1080\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/cac4843f-40e6-46b5-8c65-e42511ccd3d3\" />\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n<details>\n<summary> niri config </summary>\n<pre>\nprefer-no-csd\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\nspawn-at-startup \"~/.local/share/scripts/autostart.sh\"\nspawn-at-startup \"/usr/lib/mate-polkit/polkit-mate-authentication-agent-1\"\n// spawn-at-startup \"dunst\"\n// spawn-at-startup \"activate-linux\"\n\n\nenvironment {\n\tEDITOR \"nvim\"\n\tQT_QPA_PLATFORM \"wayland\"\n\tGTK_THEME \"Graphite-Dark-kanagawa\"\n\tQT_QPA_PLATFORMTHEME \"qt6ct\"\n\tELECTRON_OZONE_PLATFORM_HINT \"auto\"\n}\n\ncursor {\n\txcursor-theme \"volantes_light_cursors\"\n\txcursor-size 24\n\thide-when-typing\n\thide-after-inactive-ms 10000\n}\n\nhotkey-overlay {\n\tskip-at-startup\n}\n\ninput {\n\tkeyboard {\n\t\ttrack-layout \"global\"\n\t\trepeat-delay 500\n\t\trepeat-rate 40\n\t\txkb {\n\t\t\toptions \"caps:escape_shifted_capslock\"\n\t\t}\n\t}\n\ttouchpad {\n\t\ttap\n\t\t// dwt\n\t\tnatural-scroll\n\t\taccel-speed 1.0\n\t\taccel-profile \"adaptive\"\n\t\tscroll-factor 1.2\n\t\tscroll-method \"two-finger\"\n\t\ttap-button-map \"left-right-middle\"\n\t\tclick-method \"clickfinger\"\n\t\t// disabled-on-external-mouse\n\t\t// middle-emulation\n\t}\n\tmouse {\n\t\tnatural-scroll\n\t\taccel-speed 0.5\n\t\taccel-profile \"adaptive\"\n\t\tscroll-factor 1.0\n\t\tscroll-method \"no-scroll\"\n\t}\n\twarp-mouse-to-focus mode=\"center-xy-always\"\n\tfocus-follows-mouse max-scroll-amount=\"50%\"\n\t// workspace-auto-back-and-forth\n}\n//\noutput \"eDP-1\" {\n\tmode \"1920x1080@144.023\"\n\tscale 1.0\n\ttransform \"normal\"\n\tposition x=0 y=0\n\tvariable-refresh-rate on-demand=true\n\tbackground-color \"#00000000\"\n}\n\nbinds {\n\tMod+l repeat=false { focus-column-right; }\n\tMod+h repeat=false { focus-column-left; }\n\tMod+j repeat=false { focus-workspace-down; }\n\tMod+k repeat=false { focus-workspace-up; }\n\tMod+bracketright repeat=false { focus-column-last; }\n\tMod+bracketleft repeat=false { focus-column-first; }\n\tMod+Shift+l repeat=false { move-column-right; }\n\tMod+Shift+h repeat=false { move-column-left; }\n\tMod+Shift+k repeat=false { move-window-to-workspace-up; }\n\tMod+Shift+j repeat=false { move-window-to-workspace-down; }\n\tMod+Shift+bracketleft repeat=false { move-column-to-first; }\n\tMod+Shift+bracketright repeat=false { move-column-to-last; }\n\tMod+Shift+P repeat=false { consume-or-expel-window-left; }\n\tMod+Shift+N repeat=false { consume-or-expel-window-right; }\n\tMod+Tab repeat=false { focus-window-down-or-top; }\n\tMod+Shift+Tab repeat=false { focus-window-up-or-bottom; }\n\tMod+f repeat=false { fullscreen-window; }\n\tMod+Shift+f repeat=false { maximize-column; }\n\tMod+Alt+f repeat=false { toggle-windowed-fullscreen; }\n\tMod+c repeat=false { center-visible-columns; }\n\tMod+period { set-column-width \"+1%\"; }\n\tMod+comma { set-column-width \"-1%\"; }\n\tMod+Shift+period { set-window-height \"+1%\"; }\n\tMod+Shift+comma { set-window-height \"-1%\"; }\n\tMod+q repeat=false { close-window; }\n\tMod+Shift+slash repeat=false { spawn \"sh\" \"-c\" \"niri msg -j focused-window | jq > /tmp/winprop.json && foot --app-id winprop nvim /tmp/winprop.json\"; }\n\tMod+Shift+E { quit; }\n\tMod+End allow-when-locked=true { spawn \"sh\" \"-c\" \"niri msg action quit --skip-confirmation\"; }\n\tMod+semicolon { switch-preset-column-width; }\n\tMod+Shift+semicolon { switch-preset-window-height; }\n\tMod+Shift+space { toggle-window-floating; }\n\tMod+space { switch-focus-between-floating-and-tiling; }\n\tMod+Print { screenshot; }\n\tPrint { screenshot-screen write-to-disk=true; }\n\tMod+Shift+Print { screenshot-window; }\n\tMod+o repeat=false { toggle-overview; }\n\tMod+Return repeat=false { spawn \"alacritty\"; }\n\tMod+Shift+Return repeat=false { spawn \"alacritty\" \"--class\" \"term-float\"; }\n\t// Mod+Shift+W repeat=false { spawn \"sh\" \"-c\" \"niri msg action focus-workspace \\\"web\\\" && niri msg action spawn -- zen-browser\"; }\n\tMod+Shift+W repeat=false { spawn \"web-browser\"; }\n\tMod+Shift+Y repeat=false { spawn \"foot\" \"--app-id=yazi\" \"yazi\"; }\n\tMod+z repeat=false { spawn \"gtklock\" \"-c\" \"~/.config/gtklock/config.ini\"; }\n\tMod+p repeat=false { spawn \"~/.local/share/scripts/color-picker.sh\"; }\n\tMod+backslash { set-window-width \"50%\"; }\n\tMod+equal { expand-column-to-available-width; }\n\tXF86Favorites repeat=false { spawn \"ytm\"; }\n\tXF86AudioRaiseVolume { spawn \"sh\" \"-c\" \"~/.local/share/scripts/utils volume --inc 5\"; }\n\tXF86AudioLowerVolume { spawn \"sh\" \"-c\" \"~/.local/share/scripts/utils volume --dec 5\"; }\n\tXF86AudioMute { spawn \"sh\" \"-c\" \"~/.local/share/scripts/utils volume --mute\"; }\n\tXF86AudioPlay { spawn \"playerctl\" \"play-pause\"; }\n\tXF86AudioStop { spawn \"playerctl\" \"stop\"; }\n\tXF86AudioPrev { spawn \"playerctl\" \"previous\"; }\n\tXF86AudioNext { spawn \"playerctl\" \"next\"; }\n\tXF86MonBrightnessUp { spawn \"sh\" \"-c\" \"~/.local/share/scripts/utils brightness --inc 1\"; }\n\tXF86MonBrightnessDown { spawn \"sh\" \"-c\" \"~/.local/share/scripts/utils brightness --dec 1\"; }\n\t// Mod+Shift+Return { }\n\n\tMod+1 { focus-workspace 1; }\n\tMod+2 { focus-workspace 2; }\n\tMod+3 { focus-workspace 3; }\n\tMod+4 { focus-workspace 4; }\n\tMod+5 { focus-workspace 5; }\n\tMod+6 { focus-workspace 6; }\n\tMod+7 { focus-workspace 7; }\n\tMod+minus { spawn \"sh\" \"-c\" \"~/.config/niri/scripts/toggle-scratchpad.sh\"; }\n\tMod+Shift+1 { move-window-to-workspace 1 focus=false; }\n\tMod+Shift+2 { move-window-to-workspace 2; }\n\tMod+Shift+3 { move-window-to-workspace 3; }\n\tMod+Shift+4 { move-window-to-workspace 4; }\n\tMod+Shift+5 { move-window-to-workspace 5; }\n\tMod+Shift+6 { move-window-to-workspace 6; }\n\tMod+Shift+7 { move-window-to-workspace 7; }\n\tMod+Shift+minus { spawn \"sh\" \"-c\" \"~/.config/niri/scripts/move-to-scratchpad.sh\"; }\n\n\tMod+Shift+R { spawn \"~/.local/share/scripts/autostart.sh\"; }\n\n\tMod+W { toggle-column-tabbed-display; }\n\n\tMod+d { spawn \"~/.local/share/scripts/application-launcher.sh\"; }\n}\n\nswitch-events {\n\t// lid-close { spawn \"hyprlock\"; }\n}\n\nlayer-rule {\n\tmatch namespace=\"^selection$\"\n}\n\nlayer-rule {\n\tmatch namespace=\"^wallpaper$\"\n\tplace-within-backdrop true\n}\n\nlayer-rule {\n\tmatch namespace=\"^Panel$\"\n\tplace-within-backdrop true\n}\n\nlayout {\n\tgaps 15\n\tcenter-focused-column \"on-overflow\"\n\talways-center-single-column\n\tdefault-column-display \"tabbed\"\n\t// empty-workspace-above-first\n\tpreset-column-widths {\n\t\tproportion 0.50\n\t\tproportion 0.55\n\t\tproportion 0.60\n\t\tproportion 0.65\n\t\tproportion 0.70\n\t\tproportion 0.75\n\t\tproportion 0.80\n\t\tproportion 0.90\n\t\tproportion 0.95\n\t\tproportion 1.0\n\t}\n\tdefault-column-width {}\n\tpreset-window-heights {\n\t\tproportion 0.50\n\t\tproportion 0.55\n\t\tproportion 0.60\n\t\tproportion 0.65\n\t\tproportion 0.70\n\t\tproportion 0.75\n\t\tproportion 0.80\n\t\tproportion 0.90\n\t\tproportion 0.95\n\t\tproportion 1.0\n\t}\n\n\tfocus-ring {\n\t\twidth 1\n\t\t// active-gradient from=\"#82aaff\" to=\"#fb93e5\" angle=45 relative-to=\"workspace-view\"\n\t\tactive-gradient from=\"#d27e99\" to=\"#7e9cd8\" angle=45 relative-to=\"workspace-view\"\n\t\tinactive-gradient from=\"#82aaff\" to=\"#fb93e5\" angle=45 relative-to=\"workspace-view\"\n\t}\n\n\tborder {\n\t\twidth 1\n\t\t// active-gradient from=\"#82aaff\" to=\"#fca7ea\" angle=45 relative-to=\"workspace-view\"\n\t\tactive-gradient from=\"#d27e99\" to=\"#7e9cd8\" angle=45 relative-to=\"workspace-view\"\n\t\tinactive-gradient from=\"#82aaff75\" to=\"#fca7ea75\" angle=45 relative-to=\"workspace-view\" in=\"oklab\"\n\n\t}\n\n\tstruts {\n\t\tleft 0\n\t\tright 0\n\t\ttop 0\n\t\tbottom 0\n\t}\n\n\tinsert-hint {\n\t\toff\n\t\tgradient from=\"#82aaff\" to=\"#fca7ea\" angle=45 relative-to=\"workspace-view\"\n\t}\n\n\ttab-indicator {\n\t\thide-when-single-tab\n\t\t// place-within-column\n\t\tcorner-radius 3\n\t\tgap 5\n\t\twidth 5\n\t\tlength total-proportion=0.8\n\t\tposition \"left\"\n\t\tgaps-between-tabs 0\n\t\t// active-color \"#65bcff\"\n\t\t// inactive-color \"gray\"\n\t\tactive-gradient from=\"#82aaff\" to=\"#fca7ea\" angle=45 relative-to=\"workspace-view\"\n\t\tinactive-gradient from=\"#394b70\" to=\"#737aa2\" angle=45 relative-to=\"workspace-view\"\n\t}\n\n\tbackground-color \"transparent\"\n}\n\nwindow-rule {\n\tclip-to-geometry true\n\tgeometry-corner-radius 0\n\tdraw-border-with-background true\n\tshadow {\n        on\n        softness 5\n        spread 5\n        offset x=0 y=0\n        draw-behind-window true\n        color \"#00000065\"\n        // inactive-color \"#00000064\"\n    }\n}\n\nwindow-rule  {\n\tmatch is-focused=true\n\tshadow {\n        on\n        softness 10\n        spread 5\n        offset x=0 y=0\n        draw-behind-window true\n        color \"#000000ff\"\n        // inactive-color \"#00000064\"\n    }\n}\n\nwindow-rule {\n\tmatch is-floating=true\n\t// baba-is-float true\n\tgeometry-corner-radius 5\n\t// focus-ring {\n\t// \twidth 1\n\t// }\n}\n\nwindow-rule {\n\tmatch app-id=\"^foot$|^Alacritty$\"\n\tdefault-column-width { proportion 0.50; }\n}\n\nwindow-rule {\n\tmatch app-id=\"^term-float$\"\n\tdefault-column-width { proportion 0.5; }\n\tdefault-window-height { proportion 0.75; }\n\topen-floating true\n}\n\nwindow-rule {\n\tmatch app-id=\"^(zen)$|^zen-twilight$\"\n\tdefault-column-width { proportion 0.95; }\n\topen-focused true\n\t// block-out-from \"screencast\"\n}\n\nwindow-rule {\n\tmatch app-id=\"^firefox-aurora$|^(firefox-developer-edition)$\"\n\tdefault-column-width { proportion 1.0; }\n\t// open-on-workspace \"web\"\n\topen-focused true\n}\n\nwindow-rule {\n\tmatch app-id=\"winprop\"\n\topen-floating true\n}\n\nwindow-rule {\n\t// match app-id=\"^zen-beta$\"\n\tmatch title=\"^Library$\"\n\topen-floating true\n\tdefault-column-width { proportion 0.5; }\n\tdefault-window-height { proportion 0.5; }\n}\n\nwindow-rule {\n\tmatch app-id=\"^org.pwmt.zathura$\"\n\tdefault-column-width { proportion 1.0;}\n}\n\nwindow-rule {\n\tmatch app-id=\"^font-manager$\"\n\tdefault-column-width { proportion 0.95; }\n}\n\nwindow-rule {\n\tmatch app-id=\"^com.github.th_ch.youtube_music$\"\n\tdefault-column-width { proportion 0.8; }\n\topen-on-workspace \"media\"\n\topen-focused true\n}\n\nwindow-rule {\n\tmatch app-id=\"^python3$\"\n\tmatch title=\"(.*) - OpenShot Video Editor\"\n\topen-maximized true\n}\n\nwindow-rule {\n\tmatch app-id=\"^mpv$\"\n\topen-maximized true\n\topen-focused true\n\topen-on-workspace \"media\"\n}\n\nwindow-rule {\n\tmatch app-id=\"^org.qbittorrent.qBittorrent$\"\n\topen-on-workspace \"scratchpad\"\n\topen-focused true\n}\n\nwindow-rule {\n    match title=\"^Picture-in-Picture$\"\n\n    open-floating true\n    default-column-width { proportion 0.35; }\n    default-window-height { proportion 0.35; }\n}\n\n\nwindow-rule {\n    match title=\".*Properties$\"\n\n    open-floating true\n}\n\nwindow-rule {\n\tmatch app-id=\"^float-term$|^term-float$\"\n    open-floating true\n    default-column-width { proportion 0.5; }\n    default-window-height { proportion 0.5; }\n}\n\nwindow-rule {\n\tmatch is-floating=true\n\t// match app-id=\"ca.desrt.dconf-editor\"\n\t// match title=\"^$\"\n\tdefault-floating-position x=0 y=100 relative-to=\"top\"\n}\n\nworkspace \"init\" {}\nworkspace \"scratchpad\" {\n}\n\n\nanimations {\n\twindow-open {\n\t\tduration-ms 200\n\t\tcurve \"ease-out-expo\"\n\t}\n\n\twindow-close {\n\t\tduration-ms 200\n\t\tcurve \"ease-out-expo\"\n\t}\n\n\tworkspace-switch {\n\t\tspring damping-ratio=1.0 stiffness=300 epsilon=0.00001\n\t}\n\n\thorizontal-view-movement {\n\t\tspring damping-ratio=1.0 stiffness=100 epsilon=0.00001\n\t}\n\n\twindow-movement {\n\t\tspring damping-ratio=1.0 stiffness=250 epsilon=0.0001\n\t}\n\n\twindow-resize {\n\t    spring damping-ratio=1.0 stiffness=250 epsilon=0.0001\n\t}\n\n\t// window-resize {\n\t// \tcustom-shader r\"\n\t// \tvec4 resize_color(vec3 coords_curr_geo, vec3 size_curr_geo) {\n\t// \t\tvec3 coords_tex_next = niri_geo_to_tex_next * coords_curr_geo;\n\t// \t\tvec4 color = texture2D(niri_tex_next, coords_tex_next.st);\n\t// \t\treturn color;\n\t// \t}\n\t// \t\"\n\t// }\n\n\tconfig-notification-open-close {\n\t\tspring damping-ratio=0.6 stiffness=250 epsilon=0.001\n\t}\n\n\toverview-open-close {\n\t\tspring damping-ratio=1.0 stiffness=250 epsilon=0.0001\n\t}\n}\n\noverview {\n\tzoom 0.5\n\t// backdrop-color \"#151623\"\n\tworkspace-shadow {\n\t\t// off\n\t}\n}\n\ngestures {\n\thot-corners {\n\t\toff\n\t}\n}\n\n\n// swapn-at-startup \"~/.config/autostart/autostart.sh\"\n\n</pre>\n</details>\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (v25.05.1-64-g5ac440a7)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Corporation Alder Lake-P GT1 [UHD Graphics]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel core i5 12450H\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2058/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2043",
      "id": 3229216037,
      "node_id": "I_kwDOKFkxdc7Aee0l",
      "number": 2043,
      "title": "DP-MST with high refresh monitors on laptop causes some to fail to display",
      "user": {
        "login": "dyfrgi",
        "id": 1012426,
        "node_id": "MDQ6VXNlcjEwMTI0MjY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1012426?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dyfrgi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-07-14T15:48:39Z",
      "updated_at": "2025-07-17T14:23:50Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When connecting my external monitors to my ThinkPad P14s via Lenovo ThunderBolt 4 dock (over USB, not ThunderBolt), it uses DP-MST. This works fine in X11 (and on my Framework 16 with ~the same Niri config), but on this system it fails to display on one random external monitor. When this happens, I get this message repeated in logs:\n```\nJul 14 11:06:19 mleuchtenburg niri[4515]: 2025-07-14T15:06:19.918245Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an >\nJul 14 11:06:20 mleuchtenburg niri[4515]: 2025-07-14T15:06:20.074409Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an >\nJul 14 11:06:20 mleuchtenburg niri[4515]: 2025-07-14T15:06:20.308072Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an >\nJul 14 11:06:20 mleuchtenburg niri[4515]: 2025-07-14T15:06:20.414966Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an >\n```\n\nIt doesn't always repeat at this rate - sometimes the messages are as much as 10 seconds apart. Never more than 10 seconds. While this is happening, mouse movements are choppy and I also get libinput errors about my system being too slow:\n```\nJul 14 11:06:07 mleuchtenburg niri[4515]: libinput error: event7  - ELAN0678:00 04F3:3195 Touchpad: client bug: event processing lagging behind by 141ms, your s>\nJul 14 11:06:07 mleuchtenburg niri[4515]: libinput error: event7  - ELAN0678:00 04F3:3195 Touchpad: WARNING: log rate limit exceeded (5 msgs per 60min). Discard>\n```\n\nWhen I set the monitors to a slower refresh rate (lower bandwidth) using `wlr-randr`, then they work. Niri tries to pick the fastest refresh for the configured (or highest) display size, which results in the modes 3440x1440@144.001007, 2560x1440@75.001999, and 1920x1200@60.026001. Lowering the faster ones to around 60Hz fixes the issue.\n\nThe workaround for me is to configure them with the right mode in config.kdl or to set the modes with wlr-randr on startup.\n\nI think that fixing these issues is the purpose of `DrmOutputManager` in smithay, added in https://github.com/Smithay/smithay/pull/1576.\n\n<details>\n<summary>wlr-randr output</summary>\n\n```text\nDP-8 \"ASUSTek COMPUTER INC - PA278CV - DP-8\"\n  Make: ASUSTek COMPUTER INC\n  Model: PA278CV\n  Serial: MBLMQS020628\n  Physical size: 600x340 mm\n  Enabled: yes\n  Modes:\n    2560x1440 px, 59.951000 Hz (preferred, current)\n    2560x1440 px, 75.001999 Hz\n    2560x1080 px, 59.978001 Hz\n    2048x1152 px, 60.000000 Hz\n    1920x1200 px, 59.950001 Hz\n    1920x1080 px, 60.000000 Hz\n    1920x1080 px, 59.939999 Hz\n    1920x1080 px, 50.000000 Hz\n    1920x1080 px, 25.000000 Hz\n    1920x1080 px, 24.000000 Hz\n    1920x1080 px, 23.976000 Hz\n    1600x1200 px, 60.000000 Hz\n    1680x1050 px, 59.882999 Hz\n    1280x1024 px, 75.025002 Hz\n    1280x1024 px, 60.020000 Hz\n    1440x900 px, 59.901001 Hz\n    1280x960 px, 60.000000 Hz\n    1280x800 px, 59.810001 Hz\n    1152x864 px, 75.000000 Hz\n    1280x768 px, 59.869999 Hz\n    1280x720 px, 60.000000 Hz\n    1280x720 px, 59.939999 Hz\n    1280x720 px, 50.000000 Hz\n    1024x768 px, 75.028999 Hz\n    1024x768 px, 70.069000 Hz\n    1024x768 px, 60.004002 Hz\n    800x600 px, 75.000000 Hz\n    800x600 px, 60.317001 Hz\n    800x600 px, 56.250000 Hz\n    720x576 px, 50.000000 Hz\n    720x576 px, 50.000000 Hz\n    720x480 px, 60.000000 Hz\n    720x480 px, 60.000000 Hz\n    720x480 px, 59.939999 Hz\n    720x480 px, 59.939999 Hz\n    640x480 px, 75.000000 Hz\n    640x480 px, 72.808998 Hz\n    640x480 px, 66.667000 Hz\n    640x480 px, 60.000000 Hz\n    640x480 px, 59.939999 Hz\n    720x400 px, 70.082001 Hz\n  Position: 3440,0\n  Transform: 270\n  Scale: 1.000000\n  Adaptive Sync: disabled\neDP-1 \"AU Optronics - 0xFA9B - eDP-1\"\n  Make: AU Optronics\n  Model: 0xFA9B\n  Physical size: 300x190 mm\n  Enabled: yes\n  Modes:\n    1920x1200 px, 60.026001 Hz (preferred, current)\n    1920x1080 px, 60.026001 Hz\n    1600x1200 px, 60.026001 Hz\n    1680x1050 px, 60.026001 Hz\n    1280x1024 px, 60.026001 Hz\n    1440x900 px, 60.026001 Hz\n    1280x800 px, 60.026001 Hz\n    1280x720 px, 60.026001 Hz\n    1024x768 px, 60.026001 Hz\n    800x600 px, 60.026001 Hz\n    640x480 px, 60.026001 Hz\n  Position: 4880,0\n  Transform: normal\n  Scale: 1.250000\n  Adaptive Sync: disabled\nDP-10 \"PNP(AOC) - U34G2G4R3 - DP-10\"\n  Make: PNP(AOC)\n  Model: U34G2G4R3\n  Serial: 0x0000010B\n  Physical size: 800x330 mm\n  Enabled: yes\n  Modes:\n    3440x1440 px, 59.973000 Hz (preferred, current)\n    3440x1440 px, 144.001007 Hz\n    3440x1440 px, 120.000000 Hz\n    3440x1440 px, 99.982002 Hz\n    2560x1080 px, 143.945007 Hz\n    2560x1080 px, 120.000000 Hz\n    2560x1080 px, 119.879997 Hz\n    2560x1080 px, 59.976002 Hz\n    2560x1080 px, 60.000000 Hz\n    2560x1080 px, 59.939999 Hz\n    2560x1080 px, 50.000000 Hz\n    1720x1440 px, 59.936001 Hz\n    1920x1080 px, 60.000000 Hz\n    1920x1080 px, 60.000000 Hz\n    1920x1080 px, 59.939999 Hz\n    1920x1080 px, 50.000000 Hz\n    1680x1050 px, 59.953999 Hz\n    1280x1024 px, 75.025002 Hz\n    1280x1024 px, 60.020000 Hz\n    1440x900 px, 59.887001 Hz\n    1280x720 px, 60.000000 Hz\n    1280x720 px, 60.000000 Hz\n    1280x720 px, 59.939999 Hz\n    1280x720 px, 50.000000 Hz\n    1024x768 px, 99.990997 Hz\n    1024x768 px, 75.028999 Hz\n    1024x768 px, 70.069000 Hz\n    1024x768 px, 60.004002 Hz\n    832x624 px, 74.551003 Hz\n    800x600 px, 99.862000 Hz\n    800x600 px, 75.000000 Hz\n    800x600 px, 72.188004 Hz\n    800x600 px, 60.317001 Hz\n    800x600 px, 56.250000 Hz\n    720x576 px, 50.000000 Hz\n    720x576 px, 50.000000 Hz\n    720x480 px, 60.000000 Hz\n    720x480 px, 60.000000 Hz\n    720x480 px, 59.939999 Hz\n    720x480 px, 59.939999 Hz\n    640x480 px, 99.824997 Hz\n    640x480 px, 75.000000 Hz\n    640x480 px, 72.808998 Hz\n    640x480 px, 66.667000 Hz\n    640x480 px, 60.000000 Hz\n    640x480 px, 59.939999 Hz\n    640x480 px, 59.939999 Hz\n    720x400 px, 70.082001 Hz\n  Position: 0,500\n  Transform: normal\n  Scale: 1.000000\n  Adaptive Sync: disabled\n```\n</details>\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: 25.05.01 (I believe this is from main; it's the one from nixpkgs)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Debian 12 with niri from Nix\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Radeon 680M (integrated)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 PRO 6850U",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2043/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2041",
      "id": 3228718594,
      "node_id": "I_kwDOKFkxdc7AclYC",
      "number": 2041,
      "title": "Support for translating strings",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-07-14T13:06:39Z",
      "updated_at": "2025-10-03T12:41:21Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Discussed in https://github.com/YaLTeR/niri/discussions/2040\n\n<div type='discussions-op-text'>\n\n<sup>Originally posted by **therealmate** July 14, 2025</sup>\nIt would be a great addition for Niri to support localizing strings. (bindings menu, screenshot UI, etc) I know there aren't many right now, but it would be nice for non-English users to have a fully translated interface.\nMaybe something like the Fluent system (https://projectfluent.org/) could be used with Weblate (https://weblate.org) integration.</div>\n\n-----\n\nI haven't used Fluent before so idk if it works well for a Linux system component such as a compositor. Need to try and see how it looks. If there are problems, could always fall back to the tried and true gettext, as used in gtk-rs apps for instance (though it isn't without problems).\n\nRelated: https://github.com/YaLTeR/niri/issues/861",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2041/reactions",
        "total_count": 7,
        "+1": 7,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2030",
      "id": 3226713563,
      "node_id": "I_kwDOKFkxdc7AU73b",
      "number": 2030,
      "title": "Occasional single-frame flickers of arbitrary windows",
      "user": {
        "login": "PandorasFox",
        "id": 3235827,
        "node_id": "MDQ6VXNlcjMyMzU4Mjc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3235827?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/PandorasFox",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 13,
      "created_at": "2025-07-13T18:19:17Z",
      "updated_at": "2026-02-14T11:10:20Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "My application windows will occasionally 'flicker' and I'll see about one frame of my Background layer (sww-daemon, though that shouldn't matter). \n\nI do have the following relevant [config](https://github.com/PandorasFox/dots/blob/dev/eggs/niri/config.kdl) bits:\n\n```\noutput \"LG Electronics LG ULTRAGEAR+ 412NTWG8M665\" {\n\t\tposition x=0 y=2160\n\t\tvariable-refresh-rate on-demand=true\n}\n\nlayer-rule {\n\tmatch namespace=\"^swww-daemon$\"\n\tplace-within-backdrop true\n}\n```\n\nI have only noticed this behavior since I acquired a 240Hz primary monitor - as far as I can tell, this does not happen on my 120Hz monitor or on this new monitor when it's at a lower refresh rate, so this appears to maybe be a frametime issue somehow.\n\n\nSome additional details:\n- I have noticed this with both Firefox and Ghostty (both wayland-native; no xwayland involved)\n- no loglines in dmesg/journalctl/etc whenever this occurs\n- usually happens while the window is focused (e.g. has happened in firefox when browsing)\n- most reliably (but still infrequently) happens when switching focus to a window when mousing over it\n  -  e.g. mousing over firefox from an adjacent window to copy some text, will occasionally make firefox flicker & paint one frame of wallpaper as it gains focus (or at least something approximating this behavior I'm describing, idk about how frame perfect this is)\n  - wiggling my cursor back and forth between two windows has not managed to trigger this; it usually happens after a window hasn't been focused for.... about a minute or two at minimum, I guess?\n-  Ghostty has occasionally done this while typing in it\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version:  niri 25.05.1 (v25.05.1-37-g37458d94)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro:  arch\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Nvidia 3090\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7950X3D\n\nThe only relevant log lines I have for this display are:\n\n```\nDEBUG niri::backend::tty: new connector: DP-5 \"LG Electronics LG ULTRAGEAR+ 412NTWG8M665\"\nDEBUG niri::backend::tty: picking mode: Mode { name: \"3440x1440\", clock: 1399310, size: (3440, 1440), hsync: (3448, 3480, 3600), vsync: (1522, 1530, 1619), hskew: 0, vscan: 0, vrefresh: 240, mode_type: ModeTypeFlags(0x0) }\nDEBUG niri::backend::tty: error setting max bpc: couldn't find max bpc property\n```\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2030/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2008",
      "id": 3223343531,
      "node_id": "I_kwDOKFkxdc7AIFGr",
      "number": 2008,
      "title": "Winit backend doesn't refresh modifiers",
      "user": {
        "login": "axelkar",
        "id": 120189068,
        "node_id": "U_kgDOBynwjA",
        "avatar_url": "https://avatars.githubusercontent.com/u/120189068?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/axelkar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-07-11T15:35:34Z",
      "updated_at": "2025-07-13T12:27:41Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n1. Run Niri on a TTY (from now on referred to as root level Niri)\n2. Run Niri with the Winit backend (from now on referred to as embedded Niri) next to another window\n3. Inside the embedded Niri, start `wev -f wl_pointer` with its output going to a terminal\n4. Put the wev window so that it's never switched away from focus inside the embedded Niri (e.g. in a column with the terminal that runs wev)\n6. Focus the embedded Niri\n7. <kbd>Mod4</kbd>+<kbd>H</kbd> (focus left with <kbd>Mod4</kbd> being part of the keybind)\n8. Focus back to the embedded Niri without using <kbd>Mod4</kbd> (e.g. with pointer)\n9. Toggle <kbd>Mod1</kbd> and <kbd>Control</kbd> to see the modifiers wev is seeing as active\n10. Observe that <kbd>Mod4</kbd> is shown as depressed in wev\n11. Observe that <kbd>Mod4</kbd> doesn't go away even when you toggle it (Only Super_L is shown as being toggled, no modifier changes)\n12. <kbd>Mod4</kbd> is only depressed when focusing out of the embedded Niri without <kbd>Mod4</kbd>, and back to the embedded Niri with <kbd>Mod4</kbd> being part of the keybind\n\nIs this a fundamental issue of winit or Wayland?\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri stable v25.05.1 (commit 8ba57fcf25d2fc9565131684a839d58703f1dae7)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS unstable",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2008/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/2006",
      "id": 3223009732,
      "node_id": "I_kwDOKFkxdc7AGznE",
      "number": 2006,
      "title": "Idle inhibitor not working when locked",
      "user": {
        "login": "gdamms",
        "id": 79591579,
        "node_id": "MDQ6VXNlcjc5NTkxNTc5",
        "avatar_url": "https://avatars.githubusercontent.com/u/79591579?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gdamms",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-07-11T13:50:45Z",
      "updated_at": "2025-10-17T17:36:36Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Hello !\n\nI am using waybar, swayidle and swaylock. When I use the integrated idle inhibitor of waybar, it works great and swayidle no longer autolock my session and no longer suspends it. But, when I lock the session my self, the inhibitor is no longer workin and swayidle ends by suspending my session. It seems like swayidle cannot see the inhibitor when in lock state.\nBtw, it does works as intended with sway or hypr so I belive it comes from niri.\n\nDoes anyone faced the same issue? Any workaround to suggest? or could this be fixed?\n\nHave a good day :)\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/2006/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1992",
      "id": 3216900908,
      "node_id": "I_kwDOKFkxdc6_vgMs",
      "number": 1992,
      "title": "Screen locking fails if session is not active",
      "user": {
        "login": "mahkoh",
        "id": 1882250,
        "node_id": "MDQ6VXNlcjE4ODIyNTA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1882250?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mahkoh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-07-09T19:17:50Z",
      "updated_at": "2025-09-03T14:43:10Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In 25.05.1 (8ba57fc), executing swaylock, while the VT that is running niri is not the active session, causes the lock operation to fail and the screen to remain unlocked.\n\nIn a terminal run `sleep 2; swaylock` and switch to a different VT within two seconds.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1992/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1989",
      "id": 3216121551,
      "node_id": "I_kwDOKFkxdc6_sh7P",
      "number": 1989,
      "title": "Apps crashing with `Data too big for buffer (4088 + 20 > 4096)`",
      "user": {
        "login": "Viruzaum",
        "id": 23330390,
        "node_id": "MDQ6VXNlcjIzMzMwMzkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/23330390?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Viruzaum",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 25,
      "created_at": "2025-07-09T14:18:30Z",
      "updated_at": "2026-02-28T08:59:57Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nvesktop crashes randomly all the time with `Fatal Wayland communication error: Broken pipe.`\nI also had one instance where both zen and kitty crashed, not sure if related.\n\nniri logs show:\n```\nData too big for buffer (4088 + 20 > 4096).\nerror in client communication (pid 2919302)\n```\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri stable v25.05.1 (commit 8ba57fcf25d2fc9565131684a839d58703f1dae7)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS 25.11 (Xantusia)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel 3rd Gen Core processor Graphics Controller\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1989/reactions",
        "total_count": 9,
        "+1": 9,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1983",
      "id": 3213848063,
      "node_id": "I_kwDOKFkxdc6_j23_",
      "number": 1983,
      "title": "Support for Interactive Screenshot with xdg-desktop-portal-gnome",
      "user": {
        "login": "user9169747",
        "id": 201052305,
        "node_id": "U_kgDOC_vQkQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/201052305?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/user9169747",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-07-08T21:45:50Z",
      "updated_at": "2026-02-20T22:40:21Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "First I want to thank you for developing one of the greatest window manager/wayland compositor I have even used.\n\nI wanted to use [Gradia](https://flathub.org/apps/be.alexandervanhee.gradia) to take screenshot and edit it. Niri does support Screenshot portal API but Gradia is using the is a xdg-desktop-portal for getting [interactive screenshot](https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.Screenshot.html#org-freedesktop-portal-screenshot-screenshot) which Niri doesn't support. Presently xdg-desktop-portal-gnome invokes InteractiveScreenshot dbus method to get the interactive screeenshot which, in GNOME is provided by gnome-shell, but Niri currently doesn't provide support for it.\n**trigger:** I requested an interactive screenshot in [ASHPD Demo](https://flathub.org/apps/com.belmoussaoui.ashpd.demo).\n<img width=\"870\" height=\"1045\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/ddd765a8-ca7e-49c4-903a-088fc728f242\" />\n\n**error:** `xdg-desktop-portal-gnome[1908]: InteractiveScreenshot failed: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: Unknown method 'InteractiveScreenshot'`\nCan you please add support for the interactive screenshot from xdg-desktop-portal, which will make screenshot apps which use desktop portals functional in Niri.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Fedora rawhide f43\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel UHD Graphics 730\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel i3-12100\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1983/reactions",
        "total_count": 9,
        "+1": 9,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1980",
      "id": 3212012014,
      "node_id": "I_kwDOKFkxdc6_c2nu",
      "number": 1980,
      "title": "Scroll lag in Eclipse",
      "user": {
        "login": "VaclavC",
        "id": 10547969,
        "node_id": "MDQ6VXNlcjEwNTQ3OTY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547969?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/VaclavC",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 12,
      "created_at": "2025-07-08T10:44:33Z",
      "updated_at": "2025-07-17T20:31:33Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If I run eclipse under Niri, I have a substantial scroll lag. It somewhat improves if I turn Niri animations off, but that I really don't want to do. If I run Eclipse with GDK_BACKEND=x11, the lag is gone, but fractional scaling looks terrible.\n\nNot sure if I should report it here or if it is more Eclipse problem?\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1980/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1959",
      "id": 3203811566,
      "node_id": "I_kwDOKFkxdc6-9kju",
      "number": 1959,
      "title": "Unfocusing window causes certain games to need to desync and need to entirely redraw or freeze",
      "user": {
        "login": "Seralyne",
        "id": 16268338,
        "node_id": "MDQ6VXNlcjE2MjY4MzM4",
        "avatar_url": "https://avatars.githubusercontent.com/u/16268338?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Seralyne",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 13,
      "created_at": "2025-07-04T22:45:26Z",
      "updated_at": "2025-12-29T19:24:04Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nMirrored from https://github.com/Supreeeme/xwayland-satellite/issues/201:\n\nI've been testing out in Niri. Upon the launch of World of Warcraft: Mists of Pandaria Classic's prepatch, it seems to desync when not focused. If I leave it like that for a few seconds, it'll need to redraw the frame entirely.\n\nIf left there for more than 10-15 seconds, it will entirely freeze, and be unable to recover. It is worth noting this behaviour does NOT happen on World of Warcraft Classic Anniversary under the same circumstances. It also does not happen when force-unsetting DISPLAY to run using the native Wayland Wine Driver, though Battle.net itself becomes nearly unusable when used like that, so running on xwayland is still ideal. It also does NOT happen under other compositors - even when running under xwayland-satellite. \n\nSteps to Reproduce:\n\nRedrawing Behaviour:\n\n    1. Boot up World of Warcraft: Mists of Pandaria Classic\n    2. At any point, unfocus the game (easier to see in-game though)\n    3. Wait a few seconds\n    4. Refocus the game\n\nFreezing Behavior\n\n    1. Boot up World of Warcraft: Mists of Pandaria Classic\n    2. At any point, unfocus the game (easier to see in-game though)\n    3. Wait 10-15+ seconds\n    4. Refocus the game\n\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\nNiri Config attached in a gist: https://gist.github.com/Seralyne/faa07febc5eb2fa661d4bcaf372e196e\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\nWhile this *is* an issue with a X11 app, it is something I can only reproduce in Niri - even running under xwayland-satellite on other compositors. It does *not* happen when running Wine under Wayland on Niri, although it does make Battle.net nigh-unusable, and I can't reliably open games when running under those conditions.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Nvidia RTX 3070 Ti\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 5 3600X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1959/reactions",
        "total_count": 11,
        "+1": 9,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 2
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1939",
      "id": 3189521083,
      "node_id": "I_kwDOKFkxdc6-HDq7",
      "number": 1939,
      "title": "Three windows moving left through group will center when removed from group.",
      "user": {
        "login": "morenathan",
        "id": 98691858,
        "node_id": "U_kgDOBeHrEg",
        "avatar_url": "https://avatars.githubusercontent.com/u/98691858?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/morenathan",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-06-30T18:49:48Z",
      "updated_at": "2025-07-01T18:41:46Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Hello,\n\nThis is a very specific bug. If there are three windows opened, and they are all 0.5 width, when moving them from right-to-left and you move all the way to the first position it will end up centered.\n\nWhere it becomes *very* specific is that you must be using consume and expel as your primary method of movement. You'll see in my configuration posting below all my keyboard movements are window-based, not column-based.\n\nWith this configuration you're always consuming or expelling windows. If moving from right-to-left you're constantly doing one or another of those actions. When you land at the first position the window will center and push the rest of them off the screen to the right.\n\n<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nVersion: niri 25.05.1 (v25.05.1-37-g37458d94)\nLinux: ArchLinux (up-to-date)\nRunning in a systemd session.\nGPU: iGPU AMD Radeon 780M\nCPU: AMD Ryzen 7 8700G\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n```\nhotkey-overlay { skip-at-startup; }\nscreenshot-path \"~/Pictures/screenshots/%Y-%m-%dT%H-%M-%S_niri.png\"\n\nspawn-at-startup \"/home/nathan/.config/niri/niri-config.bash\"\n\nenvironment {\n\tELECTRON_OZONE_PLATFORM_HINT \"auto\"\n\t// QT_WAYLAND_DECORATION \"adwaita\"\n\tQT_QPA_PLATFORMTHEME \"gtk3\"\n\t// GTK_USE_PORTAL \"1\"\n\t// FDK_DEBUG \"portals\"\n\n\tGIMP3_DIRECTORY \"/home/nathan/.config/gimp3\"\n\tGIMP3_CACHEDIR \"/home/nathan/.cache/gimp3\"\n\tGIMP3_TEMPDIR \"/home/nathan/.local/state/gimp3\"\n}\n\ncursor {\n\txcursor-theme \"Adwaita\"\n\txcursor-size 48\n\thide-when-typing\n}\n\ngestures { hot-corners { off; }; }\ninput {\n\tkeyboard {\n\t\txkb {\n\t\t\tlayout \"us\"\n\t\t\tmodel \"pc105\"\n\t\t\toptions \"ctrl:hyper_capscontrol,shift:both_capslock_cancel\"\n\t\t}\n\t\tnumlock\n \t}\n\ttouchpad { off; }\n\ttrackpoint { off; }\n\twarp-mouse-to-focus\n}\n\noutput \"Unknown Unknown CNK7441DWM\" { position x=0 y=0; }\noutput \"Unknown Unknown CNK7441F2S\" { position x=2560 y=0; }\n\nprefer-no-csd\nanimations { off; }\nlayout {\n\talways-center-single-column\n\tdefault-column-display \"tabbed\"\n\tdefault-column-width { proportion 0.5; }\n\tpreset-column-widths {\n\t\tproportion 0.67\n\t\tproportion 1.00\n\t\tproportion 0.33\n\t\tproportion 0.50\n\t}\n\tfocus-ring { off; }\n\tborder {\n\t\twidth 5\n\t\tactive-gradient from=\"#ff6c60\" to=\"#ffb6b0\" angle=30\n\t\tinactive-gradient from=\"#4e4e4e\" to=\"#7c7c7c\" angle=30\n\t}\n\tgaps 10\t\n\tstruts {\n\t\tright 35\n\t\tleft 35\n\t}\n\ttab-indicator {\n\t\tposition \"top\"\n\t\twidth 10\n\t\tgaps-between-tabs 10\n\t\tgap 10\n\t\thide-when-single-tab\n\t\tplace-within-column\n\t\tactive-gradient from=\"#ff6c60\" to=\"#ffb6b0\" angle=30\n\t\tinactive-gradient from=\"#4e4e4e\" to=\"#7c7c7c\" angle=30\n\t}\n}\n\nworkspace \"email\" { \n\topen-on-output \"DP-7\"\n}\nwindow-rule {\n\tmatch app-id=\"thunderbird\"\n\topen-on-workspace \"email\"\n\tdefault-column-width { proportion 1.00; }\n}\n\nworkspace \"messaging\" { \n\topen-on-output \"DP-7\"\n}\nwindow-rule {\n\t// Element (for Matrix) WebApp\n\tmatch app-id=\"chrome-ejhkdoiecgkmdpomoahkdihbcldkgjci-Default\"\n\t// Google Messages WebApp\n\tmatch app-id=\"chrome-hpfldicfbfomlpcikngkocigghgafkph-Default\"\n\t// LocalSend\n\tmatch title=\"LocalSend\" app-id=\"org.localsend.localsend_app\"\n\topen-on-workspace \"messaging\"\n\tdefault-column-width { proportion 0.50; }\n}\n\n// all windows\nwindow-rule {\n\tclip-to-geometry true\n\tgeometry-corner-radius 0\n}\n\n// general floating rule\nwindow-rule {\n\tmatch title=\"Network Connections\" \t\t\tapp-id=\"nm-connection-editor\"\n\tmatch title=\"Pipewire Volume Control\"\t\tapp-id=\"com.saivert.pwvucontrol\"\n\tmatch title=\"Smile\"\t\t\t\t\t\t\t\tapp-id=\"it.mijorus.smile\"\n\tmatch title=\"Volume Control\"\t\t\t\t\tapp-id=\"org.pulseaudio.pavucontrol\"\n\tmatch title=\"bluetoothctl\"\t\t\t\t\t\tapp-id=\"Alacritty\"\n\tmatch title=\"CopyQ\"\t\t\t\t\t\t\t\tapp-id=\"com.github.hluk.copyq\"\n\tmatch title=\"Calculator\"\t\t\t\t\t\tapp-id=\"org.gnome.Calculator\"   \n\tmatch \t\t\t\t\t\t\t\t\t\t\t\tapp-id=\"nm-connection-editor\"\n\n\tmatch app-id=\"vlc\"\n\texclude title=\"VLC media player\"\n\n\topen-floating true\n\tshadow { on; }\n}\n\nwindow-rule {\n\tmatch title=\"Bluetooth Devices\" app-id=\"blueman-manager\"\n\tdefault-floating-position x=5 y=5 relative-to=\"top-right\" \n\tdefault-window-height { fixed 600; }\n\topen-floating true\n\tshadow { on; }\n}\n\nwindow-rule {\n\tmatch title=\"CopyQ\"\t\t\t\t\t\t\t\tapp-id=\"com.github.hluk.copyq\"\n\tdefault-floating-position x=5 y=5 relative-to=\"top-right\" \n\tdefault-column-width { fixed 550; }\n\tdefault-window-height { fixed 800; }\n}\n\nwindow-rule {\n\tmatch title=\"Pipewire Volume Control\"\t\tapp-id=\"com.saivert.pwvucontrol\"\n\tmatch title=\"Volume Control\"\t\t\t\t\tapp-id=\"org.pulseaudio.pavucontrol\"\n\tdefault-column-width { fixed 800; }\n\tdefault-window-height { fixed 600; }\n}\n\nwindow-rule {\n\tmatch title=\"GNU Image Manipulation Program\" app-id=\"gimp\"\n\tdefault-column-width { proportion 0.75; }\n}\n\nbinds {\n\t// default applications\n\tMod3+B \t\t{ spawn \"firefox\"; }\n\tMod3+E \t\t{ spawn \"nautilus\"; }\n\tMod3+M \t\t{ spawn \"thunderbird\"; }\n\tMod3+Return\t{ spawn \"alacritty\"; }\n\tMod3+Z \t\t{ spawn \"zim\"; }\n\tXF86Search \t{ spawn \"fuzzel\"; }\n\t\n\t// niri\n\tMod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\tCtrl+Alt+Delete { quit; }\n\tPrint { screenshot; }\n\t\n\t// regular applications\n\tMod3+period { spawn \"smile\"; }\n\t\n\t// audio controls\n\tXF86AudioMute { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n\tAlt+XF86AudioMute { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n\tXF86AudioLowerVolume { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"5%-\"; }\n\tXF86AudioRaiseVolume { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"5%+\"; }\n\tMod3+XF86AudioMute { spawn \"pwvucontrol\"; }\n\t\n\t// window misc\n\tAlt+F1 { show-hotkey-overlay; }\n\tCtrl+Q { close-window; }\n\tAlt+Tab { toggle-overview; }\n\tSuper+C { center-column; }\n\n\t// window size\n\tSuper+F { maximize-column; }\n\tSuper+Alt+F { expand-column-to-available-width; }\n\tSuper+R { switch-preset-column-width; }\n\tMod+Ctrl+R { reset-window-height; }\n\tMod+F11 { fullscreen-window; }\n\n\t// window focus\n\tSuper+H { focus-column-or-monitor-left; }\n\tSuper+Left { focus-column-or-monitor-left; }\n\tSuper+L { focus-column-or-monitor-right; }\n\tSuper+Right { focus-column-or-monitor-right; }\n\n\tSuper+K { focus-window-down; }\n\tSuper+Down { focus-window-down; }\n\tSuper+J { focus-window-up; }\n\tSuper+Up { focus-window-up; }\n\n\tSuper+space { switch-focus-between-floating-and-tiling; }\n\n\tSuper+N { focus-workspace-down; }\n\tSuper+P { focus-workspace-up; }\n\n\tSuper+Alt+Left { focus-monitor-left; }\n\tSuper+Alt+H { focus-monitor-left; }\n\tSuper+Alt+Right { focus-monitor-right; }\n\tSuper+Alt+L { focus-monitor-right; }\n\n\t// window movement\n\tSuper+Shift+H { consume-or-expel-window-left; }\n\tSuper+Shift+Left { consume-or-expel-window-left; }\n\tSuper+Shift+L { consume-or-expel-window-right; }\n\tSuper+Shift+Right { consume-or-expel-window-right; }\n\n\tSuper+Shift+J { move-window-up; }\n\tSuper+Shift+Up { move-window-up; }\n\tSuper+Shift+K { move-window-down; }\n\tSuper+Shift+Down { move-window-down; }\n\n\tSuper+Shift+N { move-window-to-workspace-down; }\n\tSuper+Shift+P { move-window-to-workspace-up; }\n\tSuper+Shift+space { toggle-window-floating; }\n\n\tSuper+Shift+Alt+H { move-window-to-monitor-left; }\n\tSuper+Shift+Alt+Left { move-window-to-monitor-left; }\n\tSuper+Shift+Alt+L { move-window-to-monitor-right; }\n\tSuper+Shift+Alt+Right { move-window-to-monitor-right; }\n}\n\n```\n\nThis happens with all application types.\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1939/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1937",
      "id": 3188525679,
      "node_id": "I_kwDOKFkxdc6-DQpv",
      "number": 1937,
      "title": "Vsync cauing performance issues and input lag for xwayland applicaitons.",
      "user": {
        "login": "rpop0",
        "id": 38384209,
        "node_id": "MDQ6VXNlcjM4Mzg0MjA5",
        "avatar_url": "https://avatars.githubusercontent.com/u/38384209?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rpop0",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-06-30T13:37:46Z",
      "updated_at": "2025-07-23T22:28:51Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Exact details of the problem can be found in the issue I opened for on xwayland-satellite https://github.com/Supreeeme/xwayland-satellite/issues/192. I decided to open this issue here because upon more testing, it seems like my performance issues are only happening in Niri and not Hyprland.\n\nEssentially what my performance issues boil down to is vsync. With vsync enabled, I have huge input lag and frames are locked at 61 (Instead of at my refresh rate 165), both of which don't happen with hyprland+xwayland-satellite, where there is no input lag with vsync on. More about it can be seen in the issue.\n\n### System Information\n\n* niri version: niri 25.05.1 (v25.05.1-37-g37458d94)\n\n* Distro: EndeavourOS\n\n* GPU: Nvidia RTX 4070\n\n* CPU: AMD Ryzen 5 5600x\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1937/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1932",
      "id": 3186553515,
      "node_id": "I_kwDOKFkxdc697vKr",
      "number": 1932,
      "title": "Screencasting not working",
      "user": {
        "login": "kurkii",
        "id": 95172106,
        "node_id": "U_kgDOBaw2Cg",
        "avatar_url": "https://avatars.githubusercontent.com/u/95172106?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kurkii",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        },
        "1": {
          "id": 10168191325,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJXQ",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:pipewire",
          "name": "area:pipewire",
          "color": "fbca04",
          "default": false,
          "description": "Issues with the PipeWire code"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-06-29T20:46:35Z",
      "updated_at": "2026-02-26T17:11:17Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nTrying to screencast on niri doesn't work. OBS doesn't show an option for it, with it showing\n\n`debug: Found portal inhibitor`\n`info: [pipewire] No capture sources available`\n\nWhile Discord just has a black screen.\n\nI believe I've narrowed this down to `xdg-desktop-portal-gnome`, which when run manually:\n`$ /usr/libexec/xdg-desktop-portal-gnome -vr`\nshows:\n`Non-compatible display server, exposing settings only.`\n\nI'm unsure exactly why it doesn't like niri. I tested if it was related to` XDG_CURRENT_DESKTOP` by setting it to `gnome` but it didn't fix it. I'm launching pipewire in `.xprofile`, as apparently launching it directly in niri could cause this issue, but I'm still getting it. I am running niri with this command:\n\n`dbus-run-session niri --session`\n\nas shown in the [Gentoo wiki](https://wiki.gentoo.org/wiki/Niri#Invocation)\n\nHeres my config: https://paste.rs/xFLs2.xml\n\n\nSystem Information,\n<!-- Paste the output of niri -V, e.g. niri 25.02 (b94a5db) -->\nniri version: 25.05.1\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\nDistro: Gentoo Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\nGPU: AMD RX 6750XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\nCPU: AMD Ryzen 5 7600X",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1932/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1921",
      "id": 3183623907,
      "node_id": "I_kwDOKFkxdc69wj7j",
      "number": 1921,
      "title": "Tiled Display Support (LG Ultrafine 5K)",
      "user": {
        "login": "nuudlman",
        "id": 62861466,
        "node_id": "MDQ6VXNlcjYyODYxNDY2",
        "avatar_url": "https://avatars.githubusercontent.com/u/62861466?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/nuudlman",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-06-27T17:42:17Z",
      "updated_at": "2025-11-11T15:09:26Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nI have a first gen LG Ultrafine 5K, which uses two DP 1.2 streams internally to achieve 5K (2560x2880).\n\nIn X11, these are combined into a single 5K display, but Niri doesn't seem to be able to combine them.\n\nThis isn't supported by sway (https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/1580), but seems to be supported by Gnome and KDE.\n\nIs this supported by niri? If so, what should I do to get 5K.\n<!-- Attaching your full niri config can help diagnose the problem. -->\nDisplay config\n```\noutput \"eDP-1\" {\n   position x=0 y=2160\n   scale 1\n}\noutput \"LG Electronics LG UltraFine 805NTRL4M326\" {\n    position x=0 y=0\n    scale 1\n}\n```\nniri msg outputs\n```\nOutput \"AU Optronics 0xA49A Unknown\" (eDP-1)\n  Current mode: 1920x1200 @ 60.026 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 300x190 mm\n  Logical position: 0, 2160\n  Logical size: 1920x1200\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1200@60.026 (current, preferred)\n    1920x1200@40.019\n\nOutput \"LG Electronics LG UltraFine 805NTRL4M326\" (DP-3)\n  Current mode: 3840x2160 @ 59.999 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 600x340 mm\n  Logical position: 0, 0\n  Logical size: 3840x2160\n  Scale: 1\n  Transform: normal\n  Available modes:\n    3840x2160@59.999 (current, preferred)\n    4096x2304@59.999\n    2560x2880@60.000\n    3200x1800@59.999\n    2560x1440@60.000\n    640x480@59.940\n\nOutput \"Unknown Unknown Unknown\" (DP-4)\n  Current mode: 2560x2880 @ 60.000 Hz\n  Variable refresh rate: not supported\n  Physical size: 600x340 mm\n  Logical position: 3840, 0\n  Logical size: 2048x2304\n  Scale: 1.25\n  Transform: normal\n  Available modes:\n    2560x2880@60.000 (current)\n```\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (v25.05.1)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Ubuntu 24.04\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Iris Xe iGPU\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel Core i5-1245U\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1921/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1918",
      "id": 3182961405,
      "node_id": "I_kwDOKFkxdc69uCL9",
      "number": 1918,
      "title": "No error reporting for an invalid keyboard layout configuration",
      "user": {
        "login": "sbroglie",
        "id": 218117192,
        "node_id": "U_kgDODQA0SA",
        "avatar_url": "https://avatars.githubusercontent.com/u/218117192?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sbroglie",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-06-27T14:05:09Z",
      "updated_at": "2025-07-18T13:07:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider the following two Niri configs:\n\n```\ninput {\n    keyboard {\n        xkb {\n            layout \"fr\"\n            foo\n        }\n    }\n}\n```\n\nand\n\n```\ninput {\n    keyboard {\n        xkb {\n            layout \"en\"\n        }\n    }\n}\n```\n\nBoth are invalid but only the former produces a visible error to the user.  (The second is invalid because the layout `en` does not exists, it should be either `us`, `gb` or similar). This behaviour is shown in both cases: when starting a new niri session and if the config is changed during a running session (live reloading of the config).\n\nThere is already some reporting in the system log but its not displayed to the user. (I only stumbled on this by accident while looking through the logs for a different reason.)\n\n```\nDEBUG niri_config: loaded config from \"~/.config/niri/config.kdl\"\nxkbcommon: ERROR: [XKB-338] Couldn't find file \"symbols/en\" in include paths\nxkbcommon: ERROR: [XKB-338] 1 include paths searched:\nxkbcommon: ERROR: [XKB-338]         /etc/X11/xkb\nxkbcommon: ERROR: [XKB-338] 3 include paths could not be added:\nxkbcommon: ERROR: [XKB-338]         ~/.config/xkb\nxkbcommon: ERROR: [XKB-338]         ~/.xkb\nxkbcommon: ERROR: [XKB-338]         /etc/xkb\nxkbcommon: ERROR: [XKB-769] Abandoning symbols file \"(unnamed)\"\nxkbcommon: ERROR: Failed to compile xkb_symbols\nxkbcommon: ERROR: [XKB-822] Failed to compile keymap\nWARN niri::niri: error updating xkb config: BadKeymap\n```\n\n### Expected Behaviour\n\n * Niri should show an error message similar to the first case, and ideally pointing out that the keyboard layout does not exists.\n * `niri validate` should detect this error, too.\n\n### System Information\n\n * niri version: niri 25.05.1 (unknown commit)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1918/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1914",
      "id": 3179712635,
      "node_id": "I_kwDOKFkxdc69hpB7",
      "number": 1914,
      "title": "niri-session cannot be called from login shell init file",
      "user": {
        "login": "sbroglie",
        "id": 218117192,
        "node_id": "U_kgDODQA0SA",
        "avatar_url": "https://avatars.githubusercontent.com/u/218117192?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sbroglie",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 13,
      "created_at": "2025-06-26T16:48:58Z",
      "updated_at": "2025-11-09T15:47:49Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I start the Window system after login in on TTY1 from the shells init file  (bash_profile, zprofile, ...). Calling `niri-session` from the init file results in an hanging system.\n\nMy preliminary investigation so far:\n\nAt the start of `niri/resources/niri-session`, the following code\n```\nif [ -n \"$SHELL\" ] &&\n   grep -q \"$SHELL\" /etc/shells &&\n   ! (echo \"$SHELL\" | grep -q \"false\") &&\n   ! (echo \"$SHELL\" | grep -q \"nologin\"); then\n  if [ \"$1\" != '-l' ]; then\n    exec bash -c \"exec -l '$SHELL' -c '$0 -l $*'\"\n  else\n    shift\n  fi\nfi\n```\nstarts a new login shell, which in turn executes its init configuration file, starting niri-session, which starts again a new login-shell, ...\n\n### Expected Behaviour\n\nIf already running in a login shell, niri should not spawn a new one.\nNote that this might be hard to detected.\n\nAlternatively, document the `-l` parameter and its consequences properly.\n\n### Workaround\n\nCall `niri-session` with the undocumented  `-l` parameter to skip the spawning of a new login shell, i.e. replace the call of `niri-session` in your `/etc/profile` (or similar for other shells) with\n\n```\nniri-session -l\n```\n\n### System Information\n\n * niri version: niri 25.05.1 (unknown commit)\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1914/reactions",
        "total_count": 14,
        "+1": 13,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1913",
      "id": 3179678081,
      "node_id": "I_kwDOKFkxdc69hgmB",
      "number": 1913,
      "title": "Bind with current keyboard layout ignored on multi layout configurations",
      "user": {
        "login": "sbroglie",
        "id": 218117192,
        "node_id": "U_kgDODQA0SA",
        "avatar_url": "https://avatars.githubusercontent.com/u/218117192?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sbroglie",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-06-26T16:33:16Z",
      "updated_at": "2025-07-19T08:01:57Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If multiple keyboard layouts are configured, bindings for non-ASCII characters are ignored and fall back to their corresponding ASCII key.\n\n### Multiple keyboard layouts\n\nConsider the following configuration with two layouts `us` and `de(neo)`.\n```\ninput {\n    keyboard {\n        xkb {\n            layout \"us,de\"\n            variant \",neo\"\n            options \"grp:ctrl_select\"\n        }\n    }\n}\n\nbinds {\n    Mod+J { show-hotkey-overlay; }\n    Mod+odiaeresis { toggle-column-tabbed-display; } // neo-odiaeresis = us-x\n    Mod+X  { switch-preset-column-width; }\n}\n\nspawn-at-startup \"alacritty\" // optional to see effects\n```\n\nNotes on keys:\nThe following symbols sit on the same physical key:\n* `odiaeresis` of `de(neo)` and `x` on `us`\n* `x` of `de(neo)` and `q` on `us`\n\nPressing the physical `x` key in `wev`with `de(neo)` layout active  results in\n```\n[14:     wl_keyboard] key: serial: 300226; time: 42119521; key: 53; state: 1 (pressed)\n                      sym: odiaeresis   (246), utf8: 'ö'\n```\n\nStarting niri with the above  configuration, switching to the second layout (`de(neo)`) with `right-control` and pressing `Mod+odiaeresis` results in the `Mod+X` action `switch-preset-column-width` to be executed, `toggle-column-tabbled-display` is ignored.\nPressing  the physical `q` key corresponding to `x` on  `de(neo)` triggers `switch-preset-column-width` as expected.\n\n### Single keyboard layout\n\nIf we change the layout configuration to a single layout:\n```\ninput {\n    keyboard {\n        xkb {\n            layout \"de\"\n            variant \"neo\"\n        }\n    }\n}\n\nbinds {\n    Mod+J { show-hotkey-overlay; }\n    Mod+odiaeresis { toggle-column-tabbed-display; } // neo-ö = us-x\n    Mod+X  { switch-preset-column-width; }\n}\n\nspawn-at-startup \"foot\" // optional to see effects\n```\nand press `Mod+odiaeresis` (i.e. the physical `x` key), then `toggle-column-tabbed-display` is executed as expected.\n\n### Expected Behaviour\n\nOn multi layout configuration, if there is an explicit binding for a key, then that binding should be executed.\n\n### System Information\n\n* niri version: niri 25.05.1 (unknown commit)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1913/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1910",
      "id": 3178236744,
      "node_id": "I_kwDOKFkxdc69cAtI",
      "number": 1910,
      "title": "Iced wgpu backend fails with Vulkan on niri + NVIDIA, but works with GL",
      "user": {
        "login": "Blindinlights",
        "id": 80579201,
        "node_id": "MDQ6VXNlcjgwNTc5MjAx",
        "avatar_url": "https://avatars.githubusercontent.com/u/80579201?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Blindinlights",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 17,
      "created_at": "2025-06-26T08:09:40Z",
      "updated_at": "2025-11-30T05:59:51Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Hello, I've found a specific rendering issue with iced on a niri Wayland compositor with NVIDIA proprietary drivers.\n\nMany applications built with iced (including the official examples and Pop!_OS's COSMIC applications) fails to render its UI when using the default Vulkan backend. The window appears, but the content does not update. The log shows an \"Error Outdated when presenting surface\".\nThis problem only occurs with applications built with iced on niri; it works fine on kwin and cosmic-comp.\n\nThe issue is completely resolved by forcing the wgpu OpenGL backend via the `WGPU_BACKEND=gl` environment variable.\n\n\n\nLogs from [`cosmic-term`](https://github.com/pop-os/cosmic-term):\n<details>\n<summary>log</summary>\n\n```log\n[2025-06-26T07:52:36Z WARN  wgpu_hal::gles::egl] No config found!\n[2025-06-26T07:52:36Z WARN  wgpu_hal::gles::egl] EGL says it can present to the window but not natively\n[2025-06-26T07:52:36Z WARN  wgpu_hal::gles::adapter] Max vertex attribute stride unknown. Assuming it is 2048\n[2025-06-26T07:52:36Z WARN  wgpu_hal::gles::egl] Re-initializing Gles context due to Wayland window\n[2025-06-26T07:52:36Z WARN  wgpu_hal::gles::egl] No config found!\n[2025-06-26T07:52:36Z WARN  wgpu_hal::gles::egl] EGL says it can present to the window but not natively\n[2025-06-26T07:52:36Z WARN  wgpu_hal::vulkan::conv] Unrecognized present mode 1000361000\n[2025-06-26T07:52:36Z WARN  wgpu_hal::vulkan::conv] Unrecognized present mode 1000361000\n[2025-06-26T07:52:36Z WARN  sctk_adwaita::buttons] Ignoring unknown button type: icon\n[2025-06-26T07:52:36Z WARN  wgpu_hal::vulkan::conv] Unrecognized present mode 1000361000\n[2025-06-26T07:52:36Z WARN  wgpu_hal::vulkan::conv] Unrecognized present mode 1000361000\n[2025-06-26T07:52:36Z ERROR iced_winit::program] Error Outdated when presenting surface.\n```\n\n</details>\n\n<details>\n<summary>niri config</summary>\n\n```log\ninput {\n    keyboard {\n        xkb {\n\n        }\n    }\n\n    touchpad {\n        tap\n        natural-scroll\n    }\n\n    mouse {\n    }\n\n\n}\n\noutput \"eDP-1\" {\n\n    mode \"1920x1080@144.002\"\n\n\n    transform \"normal\"\n\n\n}\n\nlayout {\n    gaps 16\n\n    center-focused-column \"never\"\n\n    preset-column-widths {\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n    }\n\n    default-column-width { proportion 0.5; }\n\n\n    focus-ring {\n\n\n        width 3\n\n\n        active-color \"#08ced1\"\n        inactive-color \"#50505000\"\n\n\n    }\n\n    border {\n        off\n        width 2\n        active-gradient from=\"#f38ba8\" to=\"#f9e2af\" angle=45 relative-to=\"workspace-view\"\n        inactive-gradient from=\"#585b70\" to=\"#7f849c\" angle=45 relative-to=\"workspace-view\"\n\n    }\n\n    struts {\n    }\n}\n\nspawn-at-startup \"xwayland-satellite\"\nenvironment{\n    DISPLAY \":1\"\n}\nprefer-no-csd\n\nwindow-rule {\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n\nanimations {\n\n}\n\n\n\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n    match app-id=\"firefox-nightly\"\n    block-out-from \"screen-capture\"\n\n    block-out-from \"screencast\"\n}\nwindow-rule {\n    draw-border-with-background false\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\nbinds {\n\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    Mod+T { spawn \"konsole\"; }\n    Mod+E { spawn \"anyrun\"; }\n    Mod+Z { spawn \"firefox-nightly\"; }\n    Mod+x { spawn \"cosmic-files\"; }\n    Super+Alt+L { spawn \"swaylock\"; }\n\n\n\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n    XF86AudioPause       allow-when-locked=true { spawn \"playerctl\" \"pause\";}\n    XF86AudioPlay        allow-when-locked=true { spawn \"playerctl\" \"play-pause\";}\n    XF86AudioPrev        allow-when-locked=true { spawn \"playerctl\" \"previous\";}\n    XF86AudioNext        allow-when-locked=true { spawn \"playerctl\" \"next\";}\n    XF86MonBrightnessDown  allow-when-locked=true { spawn \"brightnessctl\" \"set\" \"10%-\";}\n    XF86MonBrightnessUp    allow-when-locked=true { spawn \"brightnessctl\" \"set\" \"10%+\";}\n\n    Mod+Q { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+A     { focus-column-left; }\n    Mod+D     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+A     { move-column-left; }\n\n\n    Mod+S     { focus-window-or-workspace-down; }\n    Mod+W    { focus-window-or-workspace-up; }\n    Mod+Ctrl+S     { move-window-down-or-to-workspace-down; }\n    Mod+Ctrl+W    { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+A     { focus-monitor-left; }\n    Mod+Shift+S     { focus-monitor-down; }\n    Mod+Shift+W     { focus-monitor-up; }\n    Mod+Shift+D     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n\n\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n\n\n    Mod+Comma  { consume-window-into-column; }\n    Mod+Period { expel-window-from-column; }\n\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n    Mod+C { center-column; }\n\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    Mod+Shift+E { quit; }\n\n    Mod+Shift+P { power-off-monitors; }\n}\nworkspace \"\"\nworkspace \"\"\nworkspace \"\"\nwindow-rule{\n    match app-id=\"dev.zed.Zed\"\n    match app-id=\"code\"\n    open-on-workspace \"\"\n}\nwindow-rule{\n    match app-id=\"thunderbird\"\n\n    open-on-workspace \"\"\n}\nwindow-rule{\n    match app-id=\"thunderbird\"\n    match app-id=\"firefox-nightly\"\n    open-maximized true\n}\n```\n\n</details>\n\n\n### System infomation:\n\nniri version : niri 25.05\n\ndistro: Arch linux\n\nCPU : AMD Ryzen 7 8745H\n\nGPU: NVIDIA GeForce RTX 4060 Max-Q",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1910/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1906",
      "id": 3174601698,
      "node_id": "I_kwDOKFkxdc69OJPi",
      "number": 1906,
      "title": "Make Mod+LMB/RMB/touch work in the screenshot UI",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-06-25T07:52:41Z",
      "updated_at": "2025-06-25T07:52:41Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "They should move and resize the existing selection similar to moving and resizing a window.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1906/reactions",
        "total_count": 5,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1902",
      "id": 3173040629,
      "node_id": "I_kwDOKFkxdc69IMH1",
      "number": 1902,
      "title": "window/layer rules: color+gradient merge is unintuitive/wrong",
      "user": {
        "login": "sodiboo",
        "id": 37938646,
        "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
        "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sodiboo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-06-24T19:21:22Z",
      "updated_at": "2025-06-25T05:34:38Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nI have a config like this:\n\n```kdl\nlayout {\n    focus-ring { off; }\n\n    border {\n        active-gradient from=\"white\" to=\"black\"\n    }\n}\nwindow-rule {\n    border {\n        active-color \"red\"\n    }\n}\n\nwindow-rule {\n    border {\n        active-gradient from=\"red\" to=\"blue\"\n    }\n}\n\nwindow-rule {\n    border {\n        active-color \"blue\"\n    }\n}\n```\n\nIntuitively, each window rule to overwrite the last. But this doesn't happen.\n\nIf i comment out all window rules, and then uncomment just one at a time in order, i can see that:\n\n- With no window rules, my window has a white-to-black gradient\n- With the first window rule, the gradient is overwritten with a red solid color\n- With the second window rule, the solid red color is overwritten by a red-to-blue gradient\n- With the third window rule, the gradient is **not** overwritten, and the border **remains** in a red-to-blue gradient.\n\nI'd expect the last rule defining a solid color to overwrite the gradient, since it occurs later. But instead, **if any window rule defines a gradient**, then a window rule's gradient will always take effect. This is not symmetric with the treatment of the base `layout` config, where window rules defining just a color and no gradient *can* in fact overwrite the gradient. But they can only overwrite the gradient *in the `layout` position*, and not from other window rules.\n\nFrom a glance at the code, this appears to be the behaviour of all `color`/`gradient` pairs in the config (insert hint, tab indicator, focus ring), but i tested the actual behaviour just with the border rule.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri unstable 2025-06-19 (commit e0b0b04b445f7044f383e50104f861e632e1c905)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS 25.11 Xantusia\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon RX 7800 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 5 7600X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1902/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1880",
      "id": 3166347977,
      "node_id": "I_kwDOKFkxdc68uqLJ",
      "number": 1880,
      "title": "Mouse cursor texture corruption after S3 wake with AMD GPU",
      "user": {
        "login": "snoopdouglas",
        "id": 4892574,
        "node_id": "MDQ6VXNlcjQ4OTI1NzQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4892574?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/snoopdouglas",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-06-22T23:05:26Z",
      "updated_at": "2025-07-19T07:49:59Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Weirdly enough, I can't get a screenshot of this - so here's a photo. Note how I'm actually in the screenshot interface here:\n\n![Photo of screen](https://github.com/user-attachments/assets/746da87f-4ddb-4906-a00d-7951718d505d)\n\nI have a Radeon RX 6600. When my computer wakes from S3, the cursor becomes a translucent white box, though specks (presumed corruption) are also present.\n\nThis only happens with my Radeon. My Intel laptop has an identical Niri config and is fine.\n\nChanging the cursor a couple of times, by eg. hovering on/off links, fixes the problem, but it happens again on every S3 wake.\n\nOne weird thing to note about the above picture. The corruption was originally present with my normal cursor, yet it _disappeared_ from the screenshot image, and instead appeared with the screenshot crosshair cursor.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (unknown commit)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Void\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon RX 6600\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 3700X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1880/reactions",
        "total_count": 6,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 2,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1871",
      "id": 3165794335,
      "node_id": "I_kwDOKFkxdc68sjAf",
      "number": 1871,
      "title": "Multi Monitor setup issue",
      "user": {
        "login": "enigmapx",
        "id": 34688629,
        "node_id": "MDQ6VXNlcjM0Njg4NjI5",
        "avatar_url": "https://avatars.githubusercontent.com/u/34688629?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/enigmapx",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 14,
      "created_at": "2025-06-22T09:11:09Z",
      "updated_at": "2026-02-12T14:19:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I Installed Niri via the yay repo on EndeavourOS. I have a Multi-Monitor Setup, 3 external Monitors and 1 Internal Laptop that is on a docking station. My Laptop is always docked, lid closed and I use the 3 external Monitors. \n\nThe issue is when I log into Niri the Monitors are connected randomly instead of what is configured in the config file. For example I can get DP-2 and DP-3 connected and DP-4 disconnected  or DP-3 and DP-4 connected and DP-2 disconnected or DP-4 and DP-2 connected and DP-3 disconnected. Instead of all 3 Monitors connecting at the same time\n\nniri msg outputs and wl-randr will show only 2 external and the 1 internal as connected instead of all 4 Monitors\nI have Cosmic and Sway installed and they both connect all the Monitor consistently with no issues.wl-randr in both sway  and cosmic will show all 4 monitors are connected.   \n\nSetup\nDell Latitude E7240 \nCPU: Intel(R) Core(TM) i5-4300U (4) @ 2.90 GHz\nGPU:Intel Haswell-ULT Integrated Graphics Controller @ 1.10 GHz [Integrated]\nEndeavourOS x86_64\nLinux 6.15.2-arch1-1\n\nNiri output when I randomly have all 3 Monitors detected and connected \n niri msg outputs\nOutput \"Dell Inc. DELL P190S CHRYK07JBM6L\" (DP-3)\n  Current mode: 1280x1024 @ 60.020 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 380x300 mm\n  Logical position: 2974, 0\n  Logical size: 1024x1280\n  Scale: 1\n  Transform: 90° counter-clockwise\n  Available modes:\n    1280x1024@60.020 (current, preferred)\n    1280x1024@75.025\n    1152x864@75.000\n    1024x768@75.029\n    1024x768@60.004\n    800x600@75.000\n    800x600@60.317\n    640x480@75.000\n    640x480@59.940\n    720x400@70.082\n\nOutput \"Dell Inc. DELL P190S CHRYK07JBMSL\" (DP-2)\n  Current mode: 1280x1024 @ 60.020 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 380x300 mm\n  Logical position: 1694, 0\n  Logical size: 1280x1024\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1280x1024@60.020 (current, preferred)\n    1280x1024@75.025\n    1152x864@75.000\n    1024x768@75.029\n    1024x768@60.004\n    800x600@75.000\n    800x600@60.317\n    640x480@75.000\n    640x480@59.940\n    720x400@70.082\n\nOutput \"Lenovo Group Limited LT1952p Wide 6V9RPNZ1\" (DP-4)\n  Current mode: 1440x900 @ 59.887 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 410x260 mm\n  Logical position: 254, 0\n  Logical size: 1440x900\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1440x900@59.887 (current, preferred)\n    1280x1024@75.025\n    1280x1024@72.048\n    1280x1024@60.020\n    1440x900@74.984\n    1152x864@75.000\n    1024x768@75.029\n    1024x768@70.069\n    1024x768@60.004\n    800x600@75.000\n    800x600@72.188\n    800x600@60.317\n    640x480@75.000\n    640x480@72.809\n    640x480@66.667\n    640x480@59.940\n    720x400@70.082\n\nWlr-randr when all 3 Monitors randomly get detected and connected\nwlr-randr\nDP-2 \"Dell Inc. - DELL P190S - DP-2\"\n  Make: Dell Inc.\n  Model: DELL P190S\n  Serial: CHRYK07JBMSL\n  Physical size: 380x300 mm\n  Enabled: yes\n  Modes:\n    1280x1024 px, 60.020000 Hz (preferred, current)\n    1280x1024 px, 75.025002 Hz\n    1152x864 px, 75.000000 Hz\n    1024x768 px, 75.028999 Hz\n    1024x768 px, 60.004002 Hz\n    800x600 px, 75.000000 Hz\n    800x600 px, 60.317001 Hz\n    640x480 px, 75.000000 Hz\n    640x480 px, 59.939999 Hz\n    720x400 px, 70.082001 Hz\n  Position: 1694,0\n  Transform: normal\n  Scale: 1.000000\n  Adaptive Sync: disabled\nDP-3 \"Dell Inc. - DELL P190S - DP-3\"\n  Make: Dell Inc.\n  Model: DELL P190S\n  Serial: CHRYK07JBM6L\n  Physical size: 380x300 mm\n  Enabled: yes\n  Modes:\n    1280x1024 px, 60.020000 Hz (preferred, current)\n    1280x1024 px, 75.025002 Hz\n    1152x864 px, 75.000000 Hz\n    1024x768 px, 75.028999 Hz\n    1024x768 px, 60.004002 Hz\n    800x600 px, 75.000000 Hz\n    800x600 px, 60.317001 Hz\n    640x480 px, 75.000000 Hz\n    640x480 px, 59.939999 Hz\n    720x400 px, 70.082001 Hz\n  Position: 2974,0\n  Transform: 90\n  Scale: 1.000000\n  Adaptive Sync: disabled\nDP-4 \"Lenovo Group Limited - LT1952p Wide - DP-4\"\n  Make: Lenovo Group Limited\n  Model: LT1952p Wide\n  Serial: 6V9RPNZ1\n  Physical size: 410x260 mm\n  Enabled: yes\n  Modes:\n    1440x900 px, 59.887001 Hz (preferred, current)\n    1280x1024 px, 75.025002 Hz\n    1280x1024 px, 72.047997 Hz\n    1280x1024 px, 60.020000 Hz\n    1440x900 px, 74.984001 Hz\n    1152x864 px, 75.000000 Hz\n    1024x768 px, 75.028999 Hz\n    1024x768 px, 70.069000 Hz\n    1024x768 px, 60.004002 Hz\n    800x600 px, 75.000000 Hz\n    800x600 px, 72.188004 Hz\n    800x600 px, 60.317001 Hz\n    640x480 px, 75.000000 Hz\n    640x480 px, 72.808998 Hz\n    640x480 px, 66.667000 Hz\n    640x480 px, 59.939999 Hz\n    720x400 px, 70.082001 Hz\n  Position: 254,0\n  Transform: normal\n  Scale: 1.000000\n  Adaptive Sync: disabled\n\nNiri when only 2/3 Monitors are connected \nniri msg outputs\nOutput \"Dell Inc. DELL P190S CHRYK07JBM6L\" (DP-3)\n  Current mode: 1280x1024 @ 60.020 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 380x300 mm\n  Logical position: 2720, 0\n  Logical size: 1024x1280\n  Scale: 1\n  Transform: 90° counter-clockwise\n  Available modes:\n    1280x1024@60.020 (current, preferred)\n    1280x1024@75.025\n    1152x864@75.000\n    1024x768@75.029\n    1024x768@60.004\n    800x600@75.000\n    800x600@60.317\n    640x480@75.000\n    640x480@59.940\n    720x400@70.082\n\nOutput \"Dell Inc. DELL P190S CHRYK07JBMSL\" (DP-2)\n  Current mode: 1280x1024 @ 60.020 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 380x300 mm\n  Logical position: 1440, 0\n  Logical size: 1280x1024\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1280x1024@60.020 (current, preferred)\n    1280x1024@75.025\n    1152x864@75.000\n    1024x768@75.029\n    1024x768@60.004\n    800x600@75.000\n    800x600@60.317\n    640x480@75.000\n    640x480@59.940\n    720x400@70.082\n\nOutput \"LG Display 0x03DC Unknown\" (eDP-1)\n  Disabled\n  Variable refresh rate: not supported\n  Physical size: 280x160 mm\n  Available modes:\n    1366x768@59.987 (preferred)\n    1366x768@39.991",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1871/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1862",
      "id": 3164217062,
      "node_id": "I_kwDOKFkxdc68mh7m",
      "number": 1862,
      "title": "Plugging a monitor into laptop disables internal display",
      "user": {
        "login": "sudoharun",
        "id": 123123333,
        "node_id": "U_kgDOB1a2hQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/123123333?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sudoharun",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-06-20T19:35:46Z",
      "updated_at": "2025-10-22T16:08:58Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nWhen plugging a monitor into my laptop, **sometimes** the laptop display just disables itself. It happens completely randomly however it happens often.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<details>\n\n<summary>Config</summary>\n\n```\ninput {\n    keyboard {\n        xkb {\n            layout \"us\"\n        }\n    }\n\n    touchpad {\n        tap\n        dwt\n    }\n\n    mouse { }\n\n    // warp-mouse-to-focus\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\noutput \"eDP-1\" {\n    mode \"1920x1080@60\"\n    scale 1\n    transform \"normal\"\n    position x=0 y=0\n    background-color \"#00000000\"\n}\n\noutput \"HDMI-A-1\" {\n    mode \"1920x1080@60\"\n    scale 1\n    transform \"normal\"\n    position x=1920 y=0\n    background-color \"#00000000\"\n}\n\nlayout {\n    gaps 16\n    center-focused-column \"on-overflow\"\n\n    preset-column-widths {\n        proportion 0.25\n        proportion 0.5\n        proportion 0.75\n    }\n\n    preset-window-heights { }\n\n    default-column-width { proportion 0.75; }\n\n    focus-ring {\n        off\n        width 4\n        active-color \"rgba(0, 0, 0, 0.0)\"\n        inactive-color \"#505050\"\n    }\n\n    border {\n        width 1\n        active-color \"#505050\"\n        inactive-color \"#505050\"\n    }\n\n    shadow {\n        on\n        draw-behind-window true\n        softness 15\n        spread 0\n        offset x=0 y=0\n        color \"#000000\"\n    }\n\n    struts {\n        left 0\n        right 0\n        top 0\n        bottom 0\n    }\n}\n\nspawn-at-startup \"systemctl\" \"--user\" \"import-environment\" \"WAYLAND_DISPLAY\" \"XDG_CURRENT_DESKTOP\"\nspawn-at-startup \"dbus-update-activation-environment\" \"--systemd\" \"--all\"\nspawn-at-startup \"xwayland-satellite\"\nspawn-at-startup \"hypridle\"\nspawn-at-startup \"sh\" \"-c\" \"ignis init & disown\"\nspawn-at-startup \"waypaper\" \"--restore\"\nspawn-at-startup \"/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1\"\n\nenvironment {\n    DISPLAY \":0\"\n    XDG_SESSION_TYPE \"wayland\"\n    MOZ_ENABLE_WAYLAND \"1\"\n    ELECTRON_OZONE_PLATFORM_HINT \"auto\"\n    WINIT_UNIX_BACKEND \"wayland\"\n    CLUTTER_BACKEND \"wayland\"\n    QT_AUTO_SCREEN_SCALE_FACTOR \"1\"\n    QT_QPA_PLATFORM \"wayland;xcb\"\n    QT_QPA_PLATFORMTHEME \"qt6ct\"\n    QT_SCALE_FACTOR \"1\"\n    QT_WAYLAND_DISABLE_WINDOWDECORATION \"1\"\n    SDL_VIDEODRIVER \"wayland,x11,windows\"\n    SDL_VIDEO_DRIVER \"wayland,x11,windows\"\n}\n\nprefer-no-csd\n\n// I would have put %d-%m-%Y but %Y-%m-%d sorts better\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\ncursor {\n    xcursor-theme \"Bibata-Modern-Classic\"\n    xcursor-size 24\n}\n\nhotkey-overlay {\n    skip-at-startup\n}\n\n// For bouncy: spring damping-ratio=0.6 stiffness=600 epsilon=0.0001\n// For normal: spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001\n\nanimations {\n    workspace-switch {\n        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001\n    }\n\n    window-open {\n        duration-ms 150\n        curve \"ease-out-expo\"\n    }\n\n    window-close {\n        duration-ms 150\n        curve \"ease-out-quad\"\n    }\n\n    horizontal-view-movement {\n        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001\n    }\n\n    window-movement {\n        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001\n    }\n\n    window-resize {\n        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001\n    }\n\n    config-notification-open-close {\n        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001\n    }\n\n    screenshot-ui-open {\n        duration-ms 200\n        curve \"ease-out-quad\"\n    }\n}\n\noverview {\n    zoom 0.5\n    backdrop-color \"#363636\"\n    workspace-shadow {\n        off\n    }\n}\n\nlayer-rule {\n    match namespace=\"swww-daemon\"\n    place-within-backdrop true // Set to true for overview background\n}\n\nwindow-rule {\n    geometry-corner-radius 8\n    clip-to-geometry true\n}\n\nwindow-rule {\n    match is-focused=false\n    opacity 0.8\n}\n\n// window-rule {\n//     match is-floating=true\n//     baba-is-float true\n// }\n\nwindow-rule {\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n    opacity 1.0\n}\n\n// window-rule {\n//     match app-id=\"^steam$\"\n//     geometry-corner-radius 0\n// }\n\n// window-rule {\n//     match app-id=\"thunar\"\n//     default-column-width { proportion 0.6; }\n// }\n\nwindow-rule {\n    match app-id=\"thunar\" title=\"File Operation Progress\"\n    match app-id=\"gcr-prompter\"\n    open-floating true\n}\n\nwindow-rule {\n    match app-id=r#\"firefox$\"# title=\"^YouTube$\"\n    open-focused true\n}\n\nwindow-rule {\n    match app-id=\"wlroots\"\n    match app-id=\"labwc\"\n    match app-id=\"gamescope\"\n    open-fullscreen true\n}\n\nswitch-events {\n    lid-close { spawn \"pidof\" \"swaylock\" \"||\" \"swaylock\"; }\n}\n\nbinds {\n    Mod+Shift+Slash { show-hotkey-overlay; }\n    Mod+Tab { toggle-overview; }\n\n    Mod+Return { spawn \"foot\"; }\n    Mod+B { spawn \"firefox\"; }\n    Mod+Shift+B { spawn \"firefox\" \"--private-window\"; }\n    Mod+R { spawn \"sh\" \"-c\" \"ignis run-file $HOME/.config/ignis/scripts/open_apps_launcher.py\"; }\n    Mod+F { spawn \"thunar\"; }\n    Super+L { spawn \"swaylock\"; }\n\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.05+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.05-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"set\" \"10%+\"; }\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"set\" \"10%-\"; }\n\n    XF86AudioPlay { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioPause { spawn \"playerctl\" \"play-pause\"; }\n    XF86AudioNext { spawn \"playerctl\" \"next\"; }\n    XF86AudioPrev { spawn \"playerctl\" \"previous\"; }\n\n    Mod+Q { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+A     { focus-column-left; }\n    Mod+S     { focus-window-down; }\n    Mod+W     { focus-window-up; }\n    Mod+D     { focus-column-right; }\n\n    Mod+Shift+Left  { move-column-left; }\n    Mod+Shift+Down  { move-window-down; }\n    Mod+Shift+Up    { move-window-up; }\n    Mod+Shift+Right { move-column-right; }\n    Mod+Shift+A  { move-column-left; }\n    Mod+Shift+S  { move-window-down; }\n    Mod+Shift+W    { move-window-up; }\n    Mod+Shift+D { move-column-right; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Alt+Home { move-column-to-first; }\n    Alt+End  { move-column-to-last; }\n\n    Mod+Ctrl+Left  { focus-monitor-left; }\n    Mod+Ctrl+Down  { focus-monitor-down; }\n    Mod+Ctrl+Up    { focus-monitor-up; }\n    Mod+Ctrl+Right { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Shift+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Shift+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Alt+WheelScrollDown      { focus-column-right; }\n    Alt+WheelScrollUp        { focus-column-left; }\n    Alt+Shift+WheelScrollDown { move-column-right; }\n    Alt+Shift+WheelScrollUp   { move-column-left; }\n\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Alt+1 { move-column-to-workspace 1; }\n    Alt+2 { move-column-to-workspace 2; }\n    Alt+3 { move-column-to-workspace 3; }\n    Alt+4 { move-column-to-workspace 4; }\n    Alt+5 { move-column-to-workspace 5; }\n    Alt+6 { move-column-to-workspace 6; }\n    Alt+7 { move-column-to-workspace 7; }\n    Alt+8 { move-column-to-workspace 8; }\n    Alt+9 { move-column-to-workspace 9; }\n\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    Mod+Comma  { consume-window-into-column; }\n    Mod+Period { expel-window-from-column; }\n\n    Mod+Shift+R { switch-preset-column-width; }\n    Mod+Escape { fullscreen-window; }\n    Alt+Escape { maximize-column; }\n\n    Mod+C { center-column; }\n\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    Alt+F       { toggle-window-floating; }\n    Alt+Shift+F { switch-focus-between-floating-and-tiling; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Shift+Print { screenshot-window; }\n\n    Mod+M { quit; }\n\n    Mod+Shift+P { power-off-monitors; }\n}\n\ndebug {\n    honor-xdg-activation-with-invalid-serial\n}\n```\n\n</details>\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA GTX 1650 Mobile\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 5 5600H\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1862/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1847",
      "id": 3159000322,
      "node_id": "I_kwDOKFkxdc68SoUC",
      "number": 1847,
      "title": "Poor framerate and inconsistent frame-pacing on chromium/google chrome",
      "user": {
        "login": "johannesrld",
        "id": 71744831,
        "node_id": "MDQ6VXNlcjcxNzQ0ODMx",
        "avatar_url": "https://avatars.githubusercontent.com/u/71744831?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/johannesrld",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-06-19T05:31:31Z",
      "updated_at": "2025-12-22T05:22:26Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nChromium seems to be locked at 60fps on my 144hz monitor on niri, with incredibly inconsistent frame pacing making it feel incredibly choppy, I can't seem to replicate this on other compositors such as mutter under GNOME. I also get a similar experience with proprietary Google Chrome as well.\n\nChromium under GNOME with the ozone platform set to \"Wayland\":\n\n![Image](https://github.com/user-attachments/assets/8b67ecee-780f-4e4f-9034-3c315298ba77)\n\nChromium under niri with the ozone platform set to \"Wayland\":\n\n![Image](https://github.com/user-attachments/assets/7e3e5b69-29e5-46cf-aa95-97563ede1972)\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: `niri 25.05.1 (8ba57fc)`\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD RX580\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 5 5600\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1847/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1833",
      "id": 3154542012,
      "node_id": "I_kwDOKFkxdc68Bn28",
      "number": 1833,
      "title": "Programs specified with spawn-at-startup sometimes fail to launch when starting Niri via GDM, TTY, or greetd —works with SDDM",
      "user": {
        "login": "4fd485",
        "id": 158203519,
        "node_id": "U_kgDOCW3-fw",
        "avatar_url": "https://avatars.githubusercontent.com/u/158203519?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/4fd485",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 21,
      "created_at": "2025-06-17T19:26:12Z",
      "updated_at": "2025-12-14T13:22:33Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen launching Niri through GDM, TTY, or greetd, it appears that programs specified with spawn-at-startup (such as xwayland-satellite, ironbar, or others) are either ignored or inconsistently getting started. when launching Niri via SDDM — all spawn-at-startup programs launch correctly and reliably.\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n```\ninput {\n    keyboard {\n        xkb {\n            layout \"de,us\"\n            options \"ctrl:nocaps\"\n        }\n\n        repeat-delay 400\n        repeat-rate 25\n        track-layout \"global\"\n    }\n\n    touchpad {\n        tap\n        accel-profile \"flat\"\n        scroll-method \"two-finger\"\n    }\n\n    mouse {\n        accel-profile \"flat\"\n        middle-emulation\n    }\n\n    warp-mouse-to-focus\n    focus-follows-mouse max-scroll-amount=\"100%\"\n}\n\noutput \"HDMI-A-1\" {\n    scale 1.25\n    background-color \"#4fd485\"\n    position x=1280 y=0\n}\n\nlayout {\n    gaps 7\n    center-focused-column \"never\"\n\n    preset-column-widths {\n        proportion 0.25\n        proportion 0.5\n        proportion 0.75\n        proportion 0.99\n    }\n\n    preset-window-heights {\n        proportion 0.25\n        proportion 0.5\n        proportion 0.75\n        proportion 1.0\n    }\n\n    default-column-width { proportion 0.99; }\n\n    focus-ring {\n        off\n    }\n\n    border {\n        width 3\n        active-color \"#4fd485\"\n        inactive-color \"#4fd485\"\n    }\n}\n\nspawn-at-startup \"/usr/lib/polkit-kde-authentication-agent-1\"\nspawn-at-startup \"/usr/lib/xdg-desktop-portal-kde\"\nspawn-at-startup \"xwayland-satellite\"\nspawn-at-startup \"ironbar\"\nspawn-at-startup \"waypaper\" \"--restore\"\nspawn-at-startup \"swaync\"\nspawn-at-startup \"swayidle\" \"-w\"\nspawn-at-startup \"quickshell\"\n\nprefer-no-csd\n\nenvironment {\n    DISPLAY \":1\"\n    QT_QPA_PLATFORM \"wayland\"\n}\n\nhotkey-overlay {\n    skip-at-startup\n}\n\ncursor {\n    xcursor-size 10\n    hide-after-inactive-ms 5000\n}\n\nscreenshot-path \"~/Pictures/Screenshots/ from %Y-%m-%d %H-%M-%S.png\"\n\n\nwindow-rule {\n    geometry-corner-radius 8\n    clip-to-geometry true\n    opacity 0.95\n}\n\nwindow-rule {\n    match app-id=r#\"kitty$\"# title=\"^tty-clock$\"\n    open-floating true\n    default-column-width { proportion 0.3; }\n    default-window-height { proportion 0.3; }\n    default-floating-position x=7 y=7 relative-to=\"top-right\"\n    open-focused false\n    opacity 0.97\n}\n\nwindow-rule {\n    match app-id=r#\"librewolf$\"# title=\"^Picture-in-Picture$\"\n    match app-id=r#\"librewolf$\"# title=\"^Library$\"\n    match app-id=r#\"waypaper$\"#\n    match app-id=r#\"Audacity$\"#\n    open-floating true\n    opacity 1.0\n}\n\nwindow-rule {\n    match app-id=r#\"librewolf$\"#\n    match app-id=r#\"chromium$\"#\n    match app-id=r#\"vivaldi-stable$\"#\n    match app-id=r#\"virt-manager$\"#\n    match app-id=r#\"^com\\.obsproject\\.Studio$\"#\n    opacity 1.0\n}\n\nwindow-rule {\n    match app-id=r#\"^com\\.obsproject\\.Studio$\"#\n    min-width 800\n}\n\nbinds {\n    Mod+Shift+B { show-hotkey-overlay; } // Show hotkey overlay\n\n    Mod+Return { spawn \"kitty\"; } // Launch terminal\n    Mod+Y { spawn \"harmonymusic\"; } // Launch HarmonyMusic\n    Mod+F { spawn \"librewolf\"; } // Launch LibreWolf\n    Mod+E { spawn \"kitty\" \"-e\" \"yazi\"; } // Launch Yazi file manager in Kitty\n    Mod+Space { spawn \"fuzzel\"; } // Launch Fuzzel (app launcher)\n    Mod+Shift+Q { close-window; } // Close focused window\n\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.05+\"; } // Increase volume\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.05-\"; } // Decrease volume\n    XF86AudioMute allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; } // Toggle audio mute\n    XF86AudioMicMute allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; } // Toggle mic mute\n    XF86MonBrightnessUp cooldown-ms=50 allow-when-locked=true { spawn \"brightnessctl\" \"s\" \"5%+\"; } // Increase brightness\n    XF86MonBrightnessDown cooldown-ms=50 allow-when-locked=true { spawn \"brightnessctl\" \"s\" \"5%-\"; } // Decrease brightness\n    Shift+XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.01+\"; } //  volume up\n    Shift+XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.01-\"; } // volume down\n\n    Mod+Left { focus-column-left; } // Move focus to column on the left\n    Mod+Down { focus-window-down; } // Move focus to window below\n    Mod+Up { focus-window-up; } // Move focus to window above\n    Mod+Right { focus-column-right; } // Move focus to column on the right\n\n    Mod+Shift+Left { move-column-left; } // Move column to the left\n    Mod+Shift+Down { move-window-down; } // Move window down in column\n    Mod+Shift+Up { move-window-up; } // Move window up in column\n    Mod+Shift+Right { move-column-right; } // Move column to the right\n\n    Mod+Home { focus-column-first; } // Focus first column\n    Mod+End { focus-column-last; } // Focus last column\n\n    Mod+Ctrl+Right { focus-workspace-down; } // Switch to next workspace\n    Mod+Ctrl+Left { focus-workspace-up; } // Switch to previous workspace\n    Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } // Scroll down to next workspace\n    Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } // Scroll up to previous workspace\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } // Move column to next workspace\n    Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } // Move column to previous workspace\n\n    Mod+WheelScrollRight { focus-column-right; } // Scroll right to focus next column\n    Mod+WheelScrollLeft { focus-column-left; } // Scroll left to focus previous column\n    Mod+Ctrl+WheelScrollRight { move-column-right; } // Move column right via scroll\n    Mod+Ctrl+WheelScrollLeft { move-column-left; } // Move column left via scroll\n\n    Mod+Shift+WheelScrollDown { focus-column-right; } // Focus right column via Shift+scroll\n    Mod+Shift+WheelScrollUp { focus-column-left; } // Focus left column via Shift+scroll\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } // Move column right via Ctrl+Shift+scroll\n    Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } // Move column left via Ctrl+Shift+scroll\n\n    Mod+1 { focus-workspace 1; } // Focus workspace 1\n    Mod+2 { focus-workspace 2; } // Focus workspace 2\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n\n    Mod+Shift+1 { move-window-to-workspace 1; } // Send window to workspace 1\n    Mod+Shift+2 { move-window-to-workspace 2; }\n    Mod+Shift+3 { move-window-to-workspace 3; }\n    Mod+Shift+4 { move-window-to-workspace 4; }\n    Mod+Shift+5 { move-window-to-workspace 5; }\n    Mod+Shift+6 { move-window-to-workspace 6; }\n    Mod+Shift+7 { move-window-to-workspace 7; }\n    Mod+Shift+8 { move-window-to-workspace 8; }\n    Mod+Shift+9 { move-window-to-workspace 9; }\n\n    Mod+BracketLeft { consume-or-expel-window-left; } // Move window to/from left column\n    Mod+BracketRight { consume-or-expel-window-right; } // Move window to/from right column\n    Mod+Comma { consume-window-into-column; } // Merge window into current column\n    Mod+Period { expel-window-from-column; } // Detach window from column\n    Mod+R { switch-preset-column-width; } // Cycle column width presets\n    Mod+Shift+R { switch-preset-window-height; } // Cycle window height presets\n    Mod+Ctrl+R { reset-window-height; } // Reset window height\n\n    Mod+M { maximize-column; } // Maximize current column\n    Mod+C { center-column; } // Center the current column\n    Mod+Shift+C { center-window; } // Center current window\n\n    Mod+Minus { set-column-width \"-5%\"; } // Decrease column width\n    Mod+Equal { set-column-width \"+5%\"; } // Increase column width\n    Mod+Shift+Minus { set-window-height \"-5%\"; } // Decrease window height\n    Mod+Shift+Equal { set-window-height \"+5%\"; } // Increase window height\n\n    Mod+W { toggle-window-floating; } // Toggle window between floating and tiling\n    Mod+Shift+W { switch-focus-between-floating-and-tiling; } // Focus between floating and tiling windows\n    Mod+K { switch-layout \"next\"; } // Switch to next layout\n\n    End { screenshot-screen; } // Fullscreen screenshot\n    Alt+End { screenshot; } // Region screenshot\n    Ctrl+End { screenshot-window; } // Window screenshot\n\n    Mod+Shift+E { quit; } // Quit\n    Mod+Shift+P { power-off-monitors; } // Turn off displays\n\n    Mod+O repeat=false { toggle-overview; } // Toggle overview mode\n\n    // Keyboard layout switching\n    Mod+Shift+K { switch-layout \"next\"; } // Cycle between 'de' and 'us' layouts\n}\n\n```\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \nniri 25.05.1 (8ba57fc)\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: \nArch\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \nAMD RX 6800\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\nAMD Ryzen 5 5600",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1833/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1818",
      "id": 3149140518,
      "node_id": "I_kwDOKFkxdc67tBIm",
      "number": 1818,
      "title": "Snap floating windows to monitor edges when dragging",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-06-16T08:59:05Z",
      "updated_at": "2025-06-16T08:59:05Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Or to be more precise to the working area. Need to check the logic in Mutter and do the same.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1818/reactions",
        "total_count": 17,
        "+1": 16,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 1,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1813",
      "id": 3148991965,
      "node_id": "I_kwDOKFkxdc67sc3d",
      "number": 1813,
      "title": "Cant set Keybind to `Mod`",
      "user": {
        "login": "theNoof",
        "id": 173896447,
        "node_id": "U_kgDOCl1y_w",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/theNoof",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-06-16T08:12:21Z",
      "updated_at": "2026-02-26T17:13:37Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nI would like to bind `toggle-overview` to `Mod`. i seemingly cant do that, since niri requires a Modifier and an action Key for a keybind.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\nmy niri config (using nixos niri-flake): https://codeberg.org/noofel/config/src/branch/main/programs/wm/compositors/niri/default.nix\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: `niri 25.05 (unknown commit)`\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: `NixOS 25.11 (Unstable Branch)`\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \n(i have no idea sorry, also dont think its important)\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel i5-8350 @ 1.7GHz x8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1813/reactions",
        "total_count": 8,
        "+1": 8,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        2456
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1811",
      "id": 3148168082,
      "node_id": "I_kwDOKFkxdc67pTuS",
      "number": 1811,
      "title": "A fixed height window can take up the whole column, and behaves unexpectedly compared to a visually-identical auto-height window.",
      "user": {
        "login": "sodiboo",
        "id": 37938646,
        "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
        "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sodiboo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-06-15T23:50:23Z",
      "updated_at": "2025-06-16T06:17:08Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "# Background\n\n[Spotted in Brodie's new video](https://www.youtube.com/watch?v=DeYx2exm04M&t=6m45s), this is actually an issue i've experienced a lot but was never a big enough annoyance for me to investigate. I was reminded of it just now, and realized i knew what was going on to cause this.\n\n[As this code comment so helpfully describes](https://github.com/YaLTeR/niri/blob/f3f6e79eeca8924ff9cfea4b30006e5b782bc93e/src/layout/scrolling.rs#L221-L233), niri allows at most one window in a column to be non-auto size. By default, when a new column is created, its lone window has a size of `WindowHeight::Auto(1.0)`; which means to fill all available space.\n\n# Explanation\n\nThat video shows a window on the left which has been manually resized in the vertical axis. But, it was put *back* to the max height possible. It now looks just like a newly created column. It is indistuinguishable from `WindowHeight::Auto(1.0)`, but it is actually `WindowHeight::Fixed(_)` with a maximal height.\n\nSo, when another window is consumed into its column, *that* window is autosized beneath a window taking up the whole column, and the newly consumed window only gets its minimum height. That's certainly never what i intend to do, or expect, when i consume a window into a column that *looks* like it is auto-sized to take up the full height.\n\n# Steps to Reproduce\n\n1. Spawn two terminals.\n2. Focus the left one.\n3. Resize it vertically in a way that cancels out to an identity transform:\n    - `set-window-height -10%`\n    - `set-window-height +10%`\n4. `consume-window-into-column` the right terminal into the left one.\n5. Observe that the right terminal is now only taking up its minimum height, rather than being split fairly.\n\nIf you take the same steps, but skip resizing the left terminal, then they will be split evenly, as expected.\n\nAlternatively, after step 3, you can `reset-window-height` the left terminal. This has absolutely zero visual effect, as it does not affect the height of the window, but it will reset the internal state of the column to be `WindowHeight::Auto(1.0)`, and then consuming the right terminal will split them evenly, as expected.\n\n# How i think it should work\n\nI reckon, if we have a column that contains exactly one tile, and it is resized to take up the max height of the column, then it should be normalized into being auto-sized. But this check should only happen when it is manually resized.\n\nIf it was *not* manually resized vertically in order to become full-height, it should *not* be normalized like this. Currently, you can move a single-window column to a smaller display; it will visually update to have a smaller height; and then you can move it back to the larger display; and it will remember its height. In this case, the window has height `WindowHeight::Fixed(_)` with a height *larger* than the screen height. I think this makes a lot of sense, and the height should not be normalized to `WindowHeight::Auto(1.0)` when moving across displays.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1811/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1765",
      "id": 3135380728,
      "node_id": "I_kwDOKFkxdc664hz4",
      "number": 1765,
      "title": "Scanout TrancheFlags break some native wayland apps on NVIDIA (wine wayland, vkcube)",
      "user": {
        "login": "trgeiger",
        "id": 18582917,
        "node_id": "MDQ6VXNlcjE4NTgyOTE3",
        "avatar_url": "https://avatars.githubusercontent.com/u/18582917?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/trgeiger",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-06-11T03:43:54Z",
      "updated_at": "2025-11-09T10:51:17Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nI've been trying to figure out what's going on with [this](https://github.com/Smithay/smithay/issues/1754) issue of poor performance in the smithay compositors that I've been testing out when running proton/wine with the native wayland driver, as well as vkcube run with --wsi wayland. You can read my longer explanation in that issue, but in short I have been able to fix the performance issue by removing the add_preference_tranche() calls in tty.rs in this section:\n\n```rust\n    // Prefer the primary-plane-only formats, then primary-or-overlay-plane formats. This will\n    // increase the chance of scanning out a client even with our disabled-by-default overlay\n    // planes.\n    let scanout = builder\n        .clone()\n        .add_preference_tranche(\n            surface_render_node.dev_id(),\n            Some(TrancheFlags::Scanout),\n            primary_scanout_formats,\n        )\n        .add_preference_tranche(\n            surface_render_node.dev_id(),\n            Some(TrancheFlags::Scanout),\n            primary_or_overlay_scanout_formats,\n        )\n        .build()?;\n```\n\nWith those lines commented out/gone, there's no longer a tranche_flags(1) call in the WAYLAND_DEBUG output when running any of these programs and they start up just fine (with one other caveat for vkcube which I outline in the smithay issue--maybe should open a separate one for that).\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (v25.05.1-17-g0407ac5e-modified)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Fedora 42 Silverblue\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA 4090 mobile hybrid\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) i9-14900HX\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1765/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1742",
      "id": 3126698329,
      "node_id": "I_kwDOKFkxdc66XaFZ",
      "number": 1742,
      "title": "Niri sometimes crashes on long running sessions due to out of memory",
      "user": {
        "login": "phuhl",
        "id": 16835755,
        "node_id": "MDQ6VXNlcjE2ODM1NzU1",
        "avatar_url": "https://avatars.githubusercontent.com/u/16835755?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/phuhl",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187358,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI53g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/kind:crash",
          "name": "kind:crash",
          "color": "d93f0b",
          "default": false,
          "description": "Crashes and panics"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-06-07T08:13:37Z",
      "updated_at": "2026-02-25T07:47:41Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen running niri for multiple days, sometimes (even when I am afk) niri will crash unexpectetly.\n\nThis is the systemd status output after the crash:\n\n```\n× niri.service - A scrollable-tiling Wayland compositor\n     Loaded: loaded (/usr/lib/systemd/user/niri.service; static)\n     Active: failed (Result: oom-kill) since Sat 2025-06-07 08:09:10 CEST; 1h 56min ago\n   Duration: 1d 22h 24min 48.736s\n Invocation: b17cdab2a3aa4de5bd3b72936e749e1f\n    Process: 2074 ExecStart=/usr/bin/niri --session (code=killed, signal=TERM)\n   Main PID: 2074 (code=killed, signal=TERM)\n   Mem peak: 27G (swap: 28.4G)\n        CPU: 19h 12min 32.549s\n\nJun 06 19:31:07 xps13plus pcmanfm-qt[2114]: qt.qpa.wayland.textinput: virtual void QtWaylandClient::QWaylandTextInputv3::enableSurface(wl_surface*) Try to enable surface 0x556ff671fdf0 with focusing surface 0x556ff661d630\nJun 06 19:34:17 xps13plus niri[2074]: 2025-06-06T17:34:17.358332Z  INFO niri::niri: locking session\nJun 06 21:48:28 xps13plus niri[2074]: 2025-06-06T19:48:28.184794Z DEBUG niri_config: loaded config from \"/home/philipp/.config/niri/config.kdl\"\nJun 07 05:28:24 xps13plus niri[2074]: 2025-06-07T03:28:24.140698Z DEBUG niri_config: loaded config from \"/home/philipp/.config/niri/config.kdl\"\nJun 07 08:09:10 xps13plus systemd[1973]: niri.service: A process of this unit has been killed by the OOM killer.\nJun 07 08:09:10 xps13plus keepassxc[354576]: The Wayland connection broke. Did the Wayland compositor die?\nJun 07 08:09:10 xps13plus pcmanfm-qt[2114]: aboutToQuit\nJun 07 08:09:10 xps13plus pcmanfm-qt[2114]: Failed to write to the pipe: Bad file descriptor.\nJun 07 08:09:10 xps13plus systemd[1973]: niri.service: Failed with result 'oom-kill'.\nJun 07 08:09:10 xps13plus systemd[1973]: niri.service: Consumed 19h 12min 32.549s CPU time, 27G memory peak, 28.4G memory swap peak.\n```\n\n<details>\n\n<summary>`journalctl -b /usr/bin/niri -o short-full --no-pager` output:</summary>\n\n`journalctl -b /usr/bin/niri -o short-full --no-pager` output:\n\n```\nThu 2025-06-05 09:44:18 CEST xps13plus niri[2074]: 2025-06-05T07:44:18.947786Z  INFO niri: starting version 25.05.1 (8ba57fc)\nThu 2025-06-05 09:44:18 CEST xps13plus niri[2074]: 2025-06-05T07:44:18.970436Z DEBUG niri_config: loaded config from \"/home/philipp/.config/niri/config.kdl\"\nThu 2025-06-05 09:44:19 CEST xps13plus niri[2074]: 2025-06-05T07:44:19.008512Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/renderD128\"\nThu 2025-06-05 09:44:19 CEST xps13plus niri[2074]: 2025-06-05T07:44:19.070501Z DEBUG niri::backend::tty: device added: 57857 \"/dev/dri/card1\"\nThu 2025-06-05 09:44:20 CEST xps13plus niri[2074]: 2025-06-05T07:44:20.096850Z DEBUG niri::backend::tty: this is the primary node\nThu 2025-06-05 09:44:20 CEST xps13plus niri[2074]: 2025-06-05T07:44:20.096869Z DEBUG niri::backend::tty: this is the primary render node\nThu 2025-06-05 09:44:20 CEST xps13plus niri[2074]: 2025-06-05T07:44:20.149558Z DEBUG niri::backend::tty: device changed: 57857\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.409660Z DEBUG niri::backend::tty: new connector: eDP-1 \"Sharp Corporation 0x1551 Unknown\"\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.409715Z DEBUG niri::backend::tty: new connector: DP-6 \"Dell Inc. DELL U2719DC BRM3Y13\"\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.409734Z DEBUG niri::backend::tty: new connector: DP-7 \"Dell Inc. DELL U2719D F8FJY13\"\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.409763Z DEBUG niri::backend::tty: connecting connector: DP-7\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.409780Z DEBUG niri::backend::tty: picking mode: Mode { name: \"2560x1440\", clock: 241500, size: (2560, 1440), hsync: (2608, 2640, 2720), vsync: (1443, 1448, 1481), hskew: 0, vscan: 0, vrefresh: 60, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.409855Z DEBUG niri::backend::tty: set max bpc to 8\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.416333Z DEBUG niri::niri: putting output DP-7 at x=0 y=0\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.416542Z DEBUG niri::backend::tty: connecting connector: DP-6\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.416556Z DEBUG niri::backend::tty: picking mode: Mode { name: \"2560x1440\", clock: 241500, size: (2560, 1440), hsync: (2608, 2640, 2720), vsync: (1443, 1448, 1481), hskew: 0, vscan: 0, vrefresh: 60, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.416594Z DEBUG niri::backend::tty: set max bpc to 8\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.420558Z DEBUG niri::niri: putting output DP-6 at x=2560 y=0\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.420583Z DEBUG niri::backend::tty: connecting connector: eDP-1\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.420618Z DEBUG niri::backend::tty: picking mode: Mode { name: \"3840x2400\", clock: 592500, size: (3840, 2400), hsync: (3888, 3920, 4000), vsync: (2403, 2409, 2469), hskew: 0, vscan: 0, vrefresh: 60, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.420712Z DEBUG niri::backend::tty: set max bpc to 8\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.426920Z DEBUG niri::niri: putting output eDP-1 at x=5120 y=0\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.427216Z  INFO niri: listening on Wayland socket: wayland-1\nThu 2025-06-05 09:44:21 CEST xps13plus niri[2074]: 2025-06-05T07:44:21.427220Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.2074.sock\nThu 2025-06-05 09:44:24 CEST xps13plus niri[2074]: 2025-06-05T07:44:24.035824Z DEBUG niri::protocols::output_management: OutputConfiguration: request from an outdated configuration\nThu 2025-06-05 09:44:24 CEST xps13plus niri[2074]: 2025-06-05T07:44:24.496427Z DEBUG niri_config: loaded config from \"/home/philipp/.config/niri/config.kdl\"\nThu 2025-06-05 09:45:54 CEST xps13plus niri[2074]: 2025-06-05T07:45:54.113601Z  INFO niri::niri: locking session\nThu 2025-06-05 10:32:49 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 923ms, your system is too slow\nThu 2025-06-05 10:32:58 CEST xps13plus niri[2074]: 2025-06-05T08:32:58.641932Z  INFO niri::niri: unlocking session\nThu 2025-06-05 10:35:19 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 34ms, your system is too slow\nThu 2025-06-05 10:35:24 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 35ms, your system is too slow\nThu 2025-06-05 10:36:04 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 32ms, your system is too slow\nThu 2025-06-05 10:36:24 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 34ms, your system is too slow\nThu 2025-06-05 10:36:39 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 30ms, your system is too slow\nThu 2025-06-05 10:36:39 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nThu 2025-06-05 10:41:25 CEST xps13plus niri[2074]: 2025-06-05T08:41:25.858085Z  INFO niri::niri: locking session\nThu 2025-06-05 10:52:20 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 1073ms, your system is too slow\nThu 2025-06-05 10:52:22 CEST xps13plus niri[2074]: 2025-06-05T08:52:22.742719Z  INFO niri::niri: unlocking session\nThu 2025-06-05 10:55:34 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 40ms, your system is too slow\nThu 2025-06-05 11:21:59 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 34ms, your system is too slow\nThu 2025-06-05 11:33:11 CEST xps13plus niri[2074]: 2025-06-05T09:33:11.064177Z  INFO niri::niri: locking session\nThu 2025-06-05 11:47:12 CEST xps13plus niri[2074]: 2025-06-05T09:47:12.100954Z  INFO niri::niri: unlocking session\nThu 2025-06-05 11:58:15 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 43ms, your system is too slow\nThu 2025-06-05 11:58:35 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 39ms, your system is too slow\nThu 2025-06-05 11:59:40 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 35ms, your system is too slow\nThu 2025-06-05 12:00:30 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 45ms, your system is too slow\nThu 2025-06-05 12:04:05 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 36ms, your system is too slow\nThu 2025-06-05 12:04:05 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nThu 2025-06-05 12:11:40 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 24ms, your system is too slow\nThu 2025-06-05 12:15:30 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 28ms, your system is too slow\nThu 2025-06-05 12:16:25 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 37ms, your system is too slow\nThu 2025-06-05 12:16:45 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 31ms, your system is too slow\nThu 2025-06-05 12:17:55 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 25ms, your system is too slow\nThu 2025-06-05 12:17:55 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nThu 2025-06-05 12:39:06 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: kernel bug: Touch jump detected and discarded.\nThu 2025-06-05 12:39:06 CEST xps13plus niri[2074]: See https://wayland.freedesktop.org/libinput/doc/1.28.1/touchpad-jumping-cursors.html for details\nThu 2025-06-05 12:58:55 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 23ms, your system is too slow\nThu 2025-06-05 12:59:16 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 36ms, your system is too slow\nThu 2025-06-05 13:01:02 CEST xps13plus niri[2074]: 2025-06-05T11:01:02.317872Z  INFO niri::niri: locking session\nThu 2025-06-05 14:48:55 CEST xps13plus niri[2074]: 2025-06-05T12:48:55.608117Z  INFO niri::niri: unlocking session\nThu 2025-06-05 14:53:43 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 28ms, your system is too slow\nThu 2025-06-05 14:54:53 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 22ms, your system is too slow\nThu 2025-06-05 14:55:43 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 42ms, your system is too slow\nThu 2025-06-05 14:55:53 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 32ms, your system is too slow\nThu 2025-06-05 14:56:56 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 24ms, your system is too slow\nThu 2025-06-05 14:56:56 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nThu 2025-06-05 15:17:58 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 44ms, your system is too slow\nThu 2025-06-05 15:18:43 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 24ms, your system is too slow\nThu 2025-06-05 15:20:43 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 30ms, your system is too slow\nThu 2025-06-05 15:21:25 CEST xps13plus niri[2074]: 2025-06-05T13:21:25.102742Z  INFO niri::niri: locking session\nThu 2025-06-05 15:24:49 CEST xps13plus niri[2074]: 2025-06-05T13:24:49.773022Z  INFO niri::niri: unlocking session\nThu 2025-06-05 15:33:13 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 36ms, your system is too slow\nThu 2025-06-05 15:54:33 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 22ms, your system is too slow\nThu 2025-06-05 15:55:08 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 33ms, your system is too slow\nThu 2025-06-05 15:56:48 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 28ms, your system is too slow\nThu 2025-06-05 15:57:08 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 24ms, your system is too slow\nThu 2025-06-05 16:05:29 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 33ms, your system is too slow\nThu 2025-06-05 16:05:29 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nThu 2025-06-05 16:10:24 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 32ms, your system is too slow\nThu 2025-06-05 16:10:24 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nThu 2025-06-05 16:15:13 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: kernel bug: Touch jump detected and discarded.\nThu 2025-06-05 16:15:13 CEST xps13plus niri[2074]: See https://wayland.freedesktop.org/libinput/doc/1.28.1/touchpad-jumping-cursors.html for details\nThu 2025-06-05 16:17:48 CEST xps13plus niri[2074]: 2025-06-05T14:17:48.517332Z  INFO niri::niri: locking session\nThu 2025-06-05 16:29:48 CEST xps13plus niri[2074]: 2025-06-05T14:29:48.339546Z  INFO niri::niri: unlocking session\nThu 2025-06-05 16:34:43 CEST xps13plus niri[2074]: 2025-06-05T14:34:43.545765Z  INFO niri::niri: locking session\nThu 2025-06-05 17:37:55 CEST xps13plus niri[2074]: 2025-06-05T15:37:55.486439Z  INFO niri::niri: unlocking session\nThu 2025-06-05 17:42:15 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 29ms, your system is too slow\nThu 2025-06-05 17:43:50 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 38ms, your system is too slow\nThu 2025-06-05 17:51:45 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 25ms, your system is too slow\nThu 2025-06-05 17:58:25 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 25ms, your system is too slow\nThu 2025-06-05 18:01:15 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 41ms, your system is too slow\nThu 2025-06-05 18:04:20 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 31ms, your system is too slow\nThu 2025-06-05 18:05:30 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 36ms, your system is too slow\nThu 2025-06-05 18:05:30 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nThu 2025-06-05 18:11:55 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 27ms, your system is too slow\nThu 2025-06-05 18:28:57 CEST xps13plus niri[2074]: 2025-06-05T16:28:57.494535Z  INFO niri::niri: locking session\nThu 2025-06-05 18:44:13 CEST xps13plus niri[2074]: 2025-06-05T16:44:13.114648Z  INFO niri::niri: unlocking session\nThu 2025-06-05 18:46:11 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 22ms, your system is too slow\nThu 2025-06-05 18:49:56 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 32ms, your system is too slow\nThu 2025-06-05 18:54:16 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 52ms, your system is too slow\nThu 2025-06-05 18:59:11 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 32ms, your system is too slow\nThu 2025-06-05 19:01:01 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 22ms, your system is too slow\nThu 2025-06-05 19:05:11 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 25ms, your system is too slow\nThu 2025-06-05 19:06:51 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 28ms, your system is too slow\nThu 2025-06-05 19:06:51 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nThu 2025-06-05 19:12:36 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 29ms, your system is too slow\nThu 2025-06-05 19:13:36 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 28ms, your system is too slow\nThu 2025-06-05 19:19:36 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 34ms, your system is too slow\nThu 2025-06-05 19:31:21 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 31ms, your system is too slow\nThu 2025-06-05 19:31:21 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nThu 2025-06-05 19:43:36 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: kernel bug: Touch jump detected and discarded.\nThu 2025-06-05 19:43:36 CEST xps13plus niri[2074]: See https://wayland.freedesktop.org/libinput/doc/1.28.1/touchpad-jumping-cursors.html for details\nThu 2025-06-05 19:43:36 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: kernel bug: Touch jump detected and discarded.\nThu 2025-06-05 19:43:36 CEST xps13plus niri[2074]: See https://wayland.freedesktop.org/libinput/doc/1.28.1/touchpad-jumping-cursors.html for details\nThu 2025-06-05 19:43:36 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: kernel bug: Touch jump detected and discarded.\nThu 2025-06-05 19:43:36 CEST xps13plus niri[2074]: See https://wayland.freedesktop.org/libinput/doc/1.28.1/touchpad-jumping-cursors.html for details\nThu 2025-06-05 19:43:36 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: WARNING: log rate limit exceeded (5 msgs per 24h). Discarding future messages.\nThu 2025-06-05 19:53:22 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 38ms, your system is too slow\nThu 2025-06-05 19:55:47 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 33ms, your system is too slow\nThu 2025-06-05 20:03:20 CEST xps13plus niri[2074]: 2025-06-05T18:03:20.666880Z  INFO niri::niri: locking session\nThu 2025-06-05 21:47:35 CEST xps13plus niri[2074]: 2025-06-05T19:47:35.069542Z DEBUG niri_config: loaded config from \"/home/philipp/.config/niri/config.kdl\"\nFri 2025-06-06 05:28:53 CEST xps13plus niri[2074]: 2025-06-06T03:28:53.372700Z DEBUG niri_config: loaded config from \"/home/philipp/.config/niri/config.kdl\"\nFri 2025-06-06 09:08:29 CEST xps13plus niri[2074]: 2025-06-06T07:08:29.606237Z  INFO niri::niri: unlocking session\nFri 2025-06-06 09:19:10 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 22ms, your system is too slow\nFri 2025-06-06 09:34:55 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 24ms, your system is too slow\nFri 2025-06-06 09:39:35 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 22ms, your system is too slow\nFri 2025-06-06 09:46:05 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 34ms, your system is too slow\nFri 2025-06-06 09:55:46 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 29ms, your system is too slow\nFri 2025-06-06 10:00:13 CEST xps13plus niri[2074]: 2025-06-06T08:00:13.549678Z  INFO niri::niri: locking session\nFri 2025-06-06 10:02:28 CEST xps13plus niri[2074]: 2025-06-06T08:02:28.060617Z  INFO niri::niri: unlocking session\nFri 2025-06-06 10:02:32 CEST xps13plus niri[2074]: 2025-06-06T08:02:32.405890Z  INFO niri::niri: locking session\nFri 2025-06-06 10:37:42 CEST xps13plus niri[2074]: 2025-06-06T08:37:42.248234Z  INFO niri::niri: unlocking session\nFri 2025-06-06 10:46:01 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 38ms, your system is too slow\nFri 2025-06-06 10:48:46 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 22ms, your system is too slow\nFri 2025-06-06 10:48:56 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 31ms, your system is too slow\nFri 2025-06-06 10:49:21 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 37ms, your system is too slow\nFri 2025-06-06 10:50:26 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 36ms, your system is too slow\nFri 2025-06-06 10:54:06 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 29ms, your system is too slow\nFri 2025-06-06 10:58:05 CEST xps13plus niri[2074]: 2025-06-06T08:58:05.465973Z  INFO niri::niri: locking session\nFri 2025-06-06 11:10:22 CEST xps13plus niri[2074]: 2025-06-06T09:10:22.971764Z  INFO niri::niri: unlocking session\nFri 2025-06-06 11:36:22 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 30ms, your system is too slow\nFri 2025-06-06 11:43:47 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 23ms, your system is too slow\nFri 2025-06-06 11:43:47 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nFri 2025-06-06 11:50:23 CEST xps13plus niri[2074]: 2025-06-06T09:50:23.748563Z  INFO niri::niri: locking session\nFri 2025-06-06 12:00:39 CEST xps13plus niri[2074]: 2025-06-06T10:00:39.457928Z  INFO niri::niri: unlocking session\nFri 2025-06-06 12:00:42 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 26ms, your system is too slow\nFri 2025-06-06 12:00:42 CEST xps13plus niri[2074]: 2025-06-06T10:00:42.710533Z  INFO niri::niri: locking session\nFri 2025-06-06 13:59:30 CEST xps13plus niri[2074]: 2025-06-06T11:59:30.478301Z  INFO niri::niri: unlocking session\nFri 2025-06-06 14:01:39 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 35ms, your system is too slow\nFri 2025-06-06 14:11:18 CEST xps13plus niri[2074]: 2025-06-06T12:11:18.487462Z  INFO niri::niri: locking session\nFri 2025-06-06 14:33:29 CEST xps13plus niri[2074]: 2025-06-06T12:33:29.606796Z  INFO niri::niri: unlocking session\nFri 2025-06-06 14:34:20 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 30ms, your system is too slow\nFri 2025-06-06 14:35:20 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 24ms, your system is too slow\nFri 2025-06-06 14:43:00 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 26ms, your system is too slow\nFri 2025-06-06 14:43:50 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 27ms, your system is too slow\nFri 2025-06-06 14:46:55 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 33ms, your system is too slow\nFri 2025-06-06 14:47:35 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 46ms, your system is too slow\nFri 2025-06-06 14:49:55 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 40ms, your system is too slow\nFri 2025-06-06 14:49:55 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nFri 2025-06-06 15:07:01 CEST xps13plus niri[2074]: 2025-06-06T13:07:01.854277Z  INFO niri::niri: locking session\nFri 2025-06-06 15:08:34 CEST xps13plus niri[2074]: 2025-06-06T13:08:34.438069Z  INFO niri::niri: unlocking session\nFri 2025-06-06 15:22:30 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 28ms, your system is too slow\nFri 2025-06-06 15:34:00 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 32ms, your system is too slow\nFri 2025-06-06 15:36:55 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 42ms, your system is too slow\nFri 2025-06-06 15:47:30 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 26ms, your system is too slow\nFri 2025-06-06 15:49:27 CEST xps13plus niri[2074]: 2025-06-06T13:49:27.319145Z  INFO niri::niri: locking session\nFri 2025-06-06 15:50:44 CEST xps13plus niri[2074]: 2025-06-06T13:50:44.220391Z  INFO niri::niri: unlocking session\nFri 2025-06-06 16:13:20 CEST xps13plus niri[2074]: 2025-06-06T14:13:20.735134Z  INFO niri::niri: locking session\nFri 2025-06-06 16:13:59 CEST xps13plus niri[2074]: 2025-06-06T14:13:59.859613Z  INFO niri::niri: unlocking session\nFri 2025-06-06 16:19:21 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 40ms, your system is too slow\nFri 2025-06-06 16:22:46 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 34ms, your system is too slow\nFri 2025-06-06 16:33:45 CEST xps13plus niri[2074]: 2025-06-06T14:33:45.309348Z  INFO niri::niri: locking session\nFri 2025-06-06 16:35:26 CEST xps13plus niri[2074]: 2025-06-06T14:35:26.203573Z  INFO niri::niri: unlocking session\nFri 2025-06-06 16:41:21 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 24ms, your system is too slow\nFri 2025-06-06 16:41:31 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 25ms, your system is too slow\nFri 2025-06-06 16:43:06 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 43ms, your system is too slow\nFri 2025-06-06 16:45:41 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 26ms, your system is too slow\nFri 2025-06-06 16:47:11 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 39ms, your system is too slow\nFri 2025-06-06 16:56:26 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 45ms, your system is too slow\nFri 2025-06-06 17:05:36 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 38ms, your system is too slow\nFri 2025-06-06 17:05:51 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 28ms, your system is too slow\nFri 2025-06-06 17:05:51 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: WARNING: log rate limit exceeded (5 msgs per 60min). Discarding future messages.\nFri 2025-06-06 17:18:41 CEST xps13plus niri[2074]: libinput error: event6  - USB-HID Keyboard Consumer Control: client bug: event processing lagging behind by 24ms, your system is too slow\nFri 2025-06-06 17:20:31 CEST xps13plus niri[2074]: libinput error: event4  - USB-HID Keyboard: client bug: event processing lagging behind by 21ms, your system is too slow\nFri 2025-06-06 17:43:16 CEST xps13plus niri[2074]: 2025-06-06T15:43:16.903282Z  INFO niri::niri: locking session\nFri 2025-06-06 17:44:41 CEST xps13plus niri[2074]: 2025-06-06T15:44:41.100335Z  INFO niri::niri: unlocking session\nFri 2025-06-06 17:55:17 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 22ms, your system is too slow\nFri 2025-06-06 17:55:47 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 25ms, your system is too slow\nFri 2025-06-06 17:56:37 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 22ms, your system is too slow\nFri 2025-06-06 18:12:12 CEST xps13plus niri[2074]: 2025-06-06T16:12:12.671912Z  INFO niri::niri: locking session\nFri 2025-06-06 18:45:25 CEST xps13plus niri[2074]: 2025-06-06T16:45:25.759402Z  INFO niri::niri: unlocking session\nFri 2025-06-06 19:28:57 CEST xps13plus niri[2074]: libinput error: event8  - Apple Inc. Magic Trackpad: client bug: event processing lagging behind by 29ms, your system is too slow\nFri 2025-06-06 19:34:17 CEST xps13plus niri[2074]: 2025-06-06T17:34:17.358332Z  INFO niri::niri: locking session\nFri 2025-06-06 21:48:28 CEST xps13plus niri[2074]: 2025-06-06T19:48:28.184794Z DEBUG niri_config: loaded config from \"/home/philipp/.config/niri/config.kdl\"\nSat 2025-06-07 05:28:24 CEST xps13plus niri[2074]: 2025-06-07T03:28:24.140698Z DEBUG niri_config: loaded config from \"/home/philipp/.config/niri/config.kdl\"\n``` \n\n</details>\n\nThe config changes you can see are from `darkman` which runs a script to change my color scheme in the niri config file.\n\nMy current config can be found here: https://github.com/phuhl/.dotfiles/blob/2348bab991ab62ae4295b34e1b513083b0b27552/ansible/roles/niri/templates/copy/home/.config/niri/config.kdl\n\nLet me know if you need any other info. As this happens only sporadically, it might take some time until this bug occurs again, and I can supply additional logging of any sorts.\n\nMight be a memory leak? Related?:\n- https://github.com/YaLTeR/niri/issues/1457\n- https://github.com/YaLTeR/niri/issues/321\n- https://github.com/YaLTeR/niri/issues/772 (btw I use swaylock)\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: 6.14.7-arch2-1\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Corporation Alder Lake-P GT2 [Iris Xe Graphics] (rev 0c) (XPS 13)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: 12th Gen Intel(R) Core(TM) i7-1260P\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1742/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1739",
      "id": 3124114386,
      "node_id": "I_kwDOKFkxdc66NjPS",
      "number": 1739,
      "title": "Overview gestures with tablet pen",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-06-06T08:52:27Z",
      "updated_at": "2025-06-06T08:52:27Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Like on a touchscreen. Requires https://github.com/Smithay/smithay/issues/1753",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1739/reactions",
        "total_count": 5,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1738",
      "id": 3124112060,
      "node_id": "I_kwDOKFkxdc66Niq8",
      "number": 1738,
      "title": "Interactive window move with Mod+tablet pen",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-06-06T08:51:44Z",
      "updated_at": "2025-06-06T08:51:44Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Requires https://github.com/Smithay/smithay/issues/1753",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1738/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1736",
      "id": 3124047460,
      "node_id": "I_kwDOKFkxdc66NS5k",
      "number": 1736,
      "title": "Firefox hover popups trying to open a new column then collapse (Xwayland Remote Desktop)",
      "user": {
        "login": "lukeflo",
        "id": 103174551,
        "node_id": "U_kgDOBiZRlw",
        "avatar_url": "https://avatars.githubusercontent.com/u/103174551?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/lukeflo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191928,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJLuA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:xwayland-satellite",
          "name": "not niri:xwayland-satellite",
          "color": "bbbbbb",
          "default": false,
          "description": "xwayland-satellite issues"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-06-06T08:30:09Z",
      "updated_at": "2026-02-26T17:13:04Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For my work I often have to connect to a remote machine via `x2go` and \"pull\" a browser window from the remote to interact with some server software.\n\nOf course, `x2go` uses Xwayland when running on a Wayland compositor like `niri`. In general, using Xwayland through `xwayland-sattelite` works fine (nevertheless, I try to avoid it as much as possible).\n\nBut I encountered a strange behaviour within the Firefox browser from the remote machine running in Xwayland:\n\nMy regular Firefox open hover popups as the should:\n\n![Image](https://github.com/user-attachments/assets/6dcc4bfa-d70b-4105-b59b-7d9325306f2f)\n\nBut when I hover over a button in the remote Firefox instance, `niri` tries to open the hover popup in a new column. Its the same when tryin to open the settings (from the button shown in the picture above). Which results in the focus flipping to the right for half a second and then back to the browser. This is not a real issue but can be very annoying.\n\nI think `niri` interprets such hover popups from a Xwayland instance differently than those from a Wayland instance.\n\nAre there any ideas how to fix this?\n\n(I know thats not a real bug by `niri`. If you prefer this as discussion, please move it there)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1736/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1733",
      "id": 3120183110,
      "node_id": "I_kwDOKFkxdc65-jdG",
      "number": 1733,
      "title": "Mouse release on menus doesn't work in Qt apps",
      "user": {
        "login": "stefonarch",
        "id": 10681413,
        "node_id": "MDQ6VXNlcjEwNjgxNDEz",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/stefonarch",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-06-05T07:42:53Z",
      "updated_at": "2025-06-11T21:51:43Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "\n\nWhen hovering menu items with left button still pressed the release does'nt trigger the action. I never used this, only noticed by reading https://github.com/labwc/labwc/issues/2787\n\nProbably more a smithay thing, not sure. Can see it in pcmanfm-qt' menu's for example\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version:  25.05.1\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: arch\n\n\n\nTwice  while button pressed and released, 3rd second press:\nhttps://github.com/user-attachments/assets/d46ea67f-4879-4bed-9b50-396dc30a9efb\n\nAquamarine is fine as wlroots 0.18 is.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1733/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1731",
      "id": 3119227692,
      "node_id": "I_kwDOKFkxdc6566Ms",
      "number": 1731,
      "title": "Visual Studio Code (Flatpak) not launching",
      "user": {
        "login": "ChallAcustica",
        "id": 214905057,
        "node_id": "U_kgDODM8w4Q",
        "avatar_url": "https://avatars.githubusercontent.com/u/214905057?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ChallAcustica",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-06-04T21:53:49Z",
      "updated_at": "2025-12-08T01:54:12Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "VSCode flatpak does not launch on niri. I am unsure if the natively packaged version works, but this is working if I use GNOME. (I am on Alpine and I need extensions from the mainstream VSCode, so using the apk is not an option). XWayland is installed, and other apps seem to be working (alacritty, firefox, gnome app installer). I do not launch it in any special way to make it work in GNOME.\n\nThe error I get trying to launch it from the terminal is:\nWarning: 'ms-enable-electron-run-as-node' is not in the list of known options, but still passed to Electron/Chromium.\nLaunching it from fuzzel gives no error message at all. Btop shows that it did run for a second, so I imagine this same error happened in the background.\n\n### System Information\n\n* niri version: niri 25.05.1\n\n* Distro: Alpine Linux v3.22\n\n* GPU: Intel Arc Graphics\n\n* CPU: Intel(R) Core(TM) Ultra 9 185H (22)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1731/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1723",
      "id": 3112464974,
      "node_id": "I_kwDOKFkxdc65hHJO",
      "number": 1723,
      "title": "weird windows inline scaling",
      "user": {
        "login": "bobblkabb",
        "id": 7815101,
        "node_id": "MDQ6VXNlcjc4MTUxMDE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7815101?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/bobblkabb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-06-03T05:32:18Z",
      "updated_at": "2025-07-25T05:04:31Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version:  25.05.1\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: openSUSE Tumbleweed\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel UHD Graphics 630 @ 1.05 GHz [Integrated]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) i5-9400 (6) @ 4.10 GHz\n\nHello,\n\nI have a problem with SAPGUI for Java. It is a Java program that I start via “GDK_BACKEND=x11” because it is not wayland capable.\nThe program has a kind of inline window which does not scale with the frame. I can scale the inline window myself, like a frame, with ALT + mouse button.\nUnder hyprland I do not have this behavior. There is no inline window here.\n\nWhat could be the cause?\nHow do I correct it?\n\n![Image](https://github.com/user-attachments/assets/47e9412c-ad22-4aef-a55b-44619d8ac5f2)\n![Image](https://github.com/user-attachments/assets/3430b9a5-fbdb-4366-bb59-3f747353e4a7)\n\n[start-prompt.txt](https://github.com/user-attachments/files/20562667/start-prompt.txt)\n\nBR,\nMichael",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1723/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1722",
      "id": 3112062704,
      "node_id": "I_kwDOKFkxdc65fk7w",
      "number": 1722,
      "title": "niri still thinks a monitor is connected when it no longer is",
      "user": {
        "login": "midnightveil",
        "id": 117518347,
        "node_id": "U_kgDOBwEwCw",
        "avatar_url": "https://avatars.githubusercontent.com/u/117518347?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/midnightveil",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 21,
      "created_at": "2025-06-03T01:20:55Z",
      "updated_at": "2026-01-24T15:02:36Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nCurrently, after going from home (external usb-c monitor) to work (external usb-c monitor), niri still thinks my home's external monitor is still plugged in:\n\n```\n$ niri msg outputs\nOutput \"Dell Inc. DELL P2419HC 1NS6C53\" (DP-4)\n  Disabled                                  // I had to manually disable it\n  Variable refresh rate: not supported\n  Physical size: 530x300 mm\n  Available modes:\n    1920x1080@60.000 (preferred)\n    ...\n\nOutput \"Dell Inc. DELL U2722DE CXGP3H3\" (DP-2)\n  Current mode: 2560x1440 @ 59.951 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 600x340 mm\n  Logical position: 1920, 0\n  Logical size: 2560x1440\n  Scale: 1\n  Transform: normal\n  Available modes:\n    2560x1440@59.951 (current, preferred)\n    ...\n\nOutput \"Lenovo Group Limited 0x40A9 Unknown\" (eDP-1)\n  Current mode: 1920x1080 @ 60.012 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 310x170 mm\n  Logical position: 0, 0\n  Logical size: 1920x1080\n  Scale: 1\n  Transform: normal\n  Available modes:\n    1920x1080@60.012 (current, preferred)\n    ...\n```\n\nLogs:\n\n```\nJun 02 23:05:18 miaplacidus swaylock[282712]: pam_unix(swaylock:auth): authentication failure; logname=julia uid=1000 euid=1000 tty= ruser= rhost=  user=julia\nJun 02 23:05:23 miaplacidus niri[130490]: 2025-06-02T13:05:23.348305Z  INFO niri::niri: unlocking session\nJun 02 23:17:31 miaplacidus niri[130490]: 2025-06-02T13:17:31.634864Z  INFO niri::niri: locking session\nJun 02 23:17:38 miaplacidus niri[130490]: 2025-06-02T13:17:38.076597Z DEBUG niri::input: lid switch closed\nJun 02 23:17:38 miaplacidus niri[130490]: 2025-06-02T13:17:38.076655Z DEBUG niri::backend::tty: disconnecting connector: \"eDP-1\"\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.083497Z DEBUG niri::input: lid switch opened\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.083691Z DEBUG niri::backend::tty: connecting connector: eDP-1\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.083809Z DEBUG niri::backend::tty: picking mode: Mode { name: \"1920x1080\", clock: 141400, size: (1920, 1080), hsync: (1968, 2000, 2142), vsync: (1083, 1089, 1100), hskew: 0, vscan: 0, vrefresh: 60, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.083912Z DEBUG niri::backend::tty: set max bpc to 8\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.088304Z DEBUG niri::niri: putting output eDP-1 at x=0 y=0\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.089131Z DEBUG niri::backend::tty: device changed: 57857\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.095073Z DEBUG niri::backend::tty: new connector: DP-2 \"Dell Inc. DELL U2722DE CXGP3H3\"\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.095360Z DEBUG niri::backend::tty: connecting connector: DP-2\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.095416Z DEBUG niri::backend::tty: picking mode: Mode { name: \"2560x1440\", clock: 241500, size: (2560, 1440), hsync: (2608, 2640, 2720), vsync: (1443, 1448, 1481), hskew: 0, vscan: 0, vrefresh: 60, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.095496Z DEBUG niri::backend::tty: set max bpc to 8\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.101215Z  WARN niri::niri: output DP-2 at x=1920 y=0 sized 2560x1440 overlaps an existing output at x=1920 y=0 sized 1920x1080, falling back to automatic placement\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.101242Z DEBUG niri::niri: putting output DP-2 at x=3840 y=0\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.102435Z DEBUG niri::backend::tty: device changed: 57857\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.108928Z DEBUG niri::backend::tty: device changed: 57857\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.114585Z DEBUG niri::backend::tty: device changed: 57857\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.121529Z DEBUG niri::backend::tty: device changed: 57857\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.131726Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:06:55 miaplacidus niri[130490]: 2025-06-03T01:06:55.963088Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:06:56 miaplacidus niri[130490]: 2025-06-03T01:06:56.007599Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:06:56 miaplacidus niri[130490]: 2025-06-03T01:06:56.035889Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:06:56 miaplacidus niri[130490]: 2025-06-03T01:06:56.162554Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:06:57 miaplacidus niri[130490]: 2025-06-03T01:06:57.139913Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:06:59 miaplacidus niri[130490]: 2025-06-03T01:06:59.098283Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:06:59 miaplacidus niri[130490]: 2025-06-03T01:06:59.173793Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:00 miaplacidus niri[130490]: 2025-06-03T01:07:00.135977Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:01 miaplacidus niri[130490]: 2025-06-03T01:07:01.320070Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:02 miaplacidus niri[130490]: 2025-06-03T01:07:02.943365Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:04 miaplacidus niri[130490]: 2025-06-03T01:07:04.439894Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:05 miaplacidus niri[130490]: 2025-06-03T01:07:05.133206Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:05 miaplacidus niri[130490]: 2025-06-03T01:07:05.322352Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:06 miaplacidus niri[130490]: 2025-06-03T01:07:06.133193Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:06 miaplacidus niri[130490]: 2025-06-03T01:07:06.204844Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:07 miaplacidus niri[130490]: 2025-06-03T01:07:07.133778Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:07 miaplacidus niri[130490]: 2025-06-03T01:07:07.220634Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:07 miaplacidus niri[130490]: 2025-06-03T01:07:07.680436Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:08 miaplacidus niri[130490]: 2025-06-03T01:07:08.135346Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:08 miaplacidus niri[130490]: 2025-06-03T01:07:08.138419Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:09 miaplacidus niri[130490]: 2025-06-03T01:07:09.133415Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:09 miaplacidus niri[130490]: 2025-06-03T01:07:09.137802Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\n...\nJun 03 11:07:16 miaplacidus niri[130490]: 2025-06-03T01:07:16.449648Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:16 miaplacidus niri[130490]: 2025-06-03T01:07:16.591373Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:16 miaplacidus niri[130490]: 2025-06-03T01:07:16.796474Z  INFO niri::niri: unlocking session\nJun 03 11:07:16 miaplacidus niri[130490]: 2025-06-03T01:07:16.801699Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:16 miaplacidus niri[130490]: 2025-06-03T01:07:16.805028Z ERROR smithay::backend::renderer::gles: [GL] GL_INVALID_VALUE in glTexSubImage2D(yoffset 0 + height 1100 > 1076)\nJun 03 11:07:16 miaplacidus niri[130490]: 2025-06-03T01:07:16.808774Z ERROR smithay::backend::renderer::gles: [GL] GL_INVALID_VALUE in glTexSubImage2D(yoffset 0 + height 1100 > 1076)\nJun 03 11:07:16 miaplacidus niri[130490]: 2025-06-03T01:07:16.813501Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:17 miaplacidus niri[130490]: 2025-06-03T01:07:17.134699Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:18 miaplacidus niri[130490]: 2025-06-03T01:07:18.135070Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:19 miaplacidus niri[130490]: 2025-06-03T01:07:19.135018Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\n...\nJun 03 11:07:22 miaplacidus niri[130490]: 2025-06-03T01:07:22.945924Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:22 miaplacidus niri[130490]: 2025-06-03T01:07:22.960667Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:22 miaplacidus niri[130490]: 2025-06-03T01:07:22.970945Z ERROR smithay::backend::renderer::gles: [GL] GL_INVALID_VALUE in glTexSubImage2D(yoffset 0 + height 1100 > 1076)\nJun 03 11:07:23 miaplacidus niri[130490]: 2025-06-03T01:07:23.136196Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:23 miaplacidus niri[130490]: 2025-06-03T01:07:23.146758Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:23 miaplacidus niri[130490]: 2025-06-03T01:07:23.264816Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:23 miaplacidus niri[130490]: 2025-06-03T01:07:23.268882Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:07:23 miaplacidus niri[130490]: 2025-06-03T01:07:23.636254Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\n...\n(replugging the external monitor that is connected, i.e. DP-2)\nJun 03 11:10:00 miaplacidus niri[130490]: 2025-06-03T01:10:00.007334Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:10:26 miaplacidus niri[130490]: 2025-06-03T01:10:26.719619Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:10:39 miaplacidus niri[130490]: 2025-06-03T01:10:39.193793Z DEBUG niri::backend::tty: device changed: 57857\nJun 03 11:10:39 miaplacidus niri[130490]: 2025-06-03T01:10:39.196785Z DEBUG niri::backend::tty: disconnecting connector: \"DP-2\"\nJun 03 11:10:39 miaplacidus niri[130490]: 2025-06-03T01:10:39.428050Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\n... (disabling the output DP-4)\nJun 03 11:12:48 miaplacidus niri[130490]: 2025-06-03T01:12:48.153226Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(73))\nJun 03 11:12:48 miaplacidus niri[130490]: 2025-06-03T01:12:48.173478Z DEBUG niri::backend::tty: disconnecting connector: \"DP-4\"\nJun 03 11:12:48 miaplacidus niri[130490]: 2025-06-03T01:12:48.174206Z  WARN niri::backend::tty: error getting properties: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }\nJun 03 11:14:22 miaplacidus niri[130490]: 2025-06-03T01:14:22.996034Z DEBUG niri::backend::tty: device changed: 57857\nJun 03 11:14:23 miaplacidus niri[130490]: 2025-06-03T01:14:23.005708Z DEBUG niri::backend::tty: new connector: DP-2 \"Dell Inc. DELL U2722DE CXGP3H3\"\nJun 03 11:14:23 miaplacidus niri[130490]: 2025-06-03T01:14:23.005761Z DEBUG niri::backend::tty: connecting connector: DP-2\nJun 03 11:14:23 miaplacidus niri[130490]: 2025-06-03T01:14:23.005830Z DEBUG niri::backend::tty: picking mode: Mode { name: \"2560x1440\", clock: 241500, size: (2560, 1440), hsync: (2608, 2640, 2720), vsync: (1443, 1448, 1481), hskew: 0, vscan: 0, vrefresh: 60, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\nJun 03 11:14:23 miaplacidus niri[130490]: 2025-06-03T01:14:23.005966Z DEBUG niri::backend::tty: set max bpc to 8\nJun 03 11:14:23 miaplacidus niri[130490]: 2025-06-03T01:14:23.010659Z DEBUG niri::niri: putting output DP-2 at x=1920 y=0\nJun 03 11:14:23 miaplacidus niri[130490]: 2025-06-03T01:14:23.010711Z  WARN niri::backend::tty: error getting properties: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }\nlines 3533-3594/3594 (END)\n```\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: fedora (niri-25.05-4.fc42.src.rpm)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon Vega 8 Graphics (integrated APU)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 5 3500U\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1722/reactions",
        "total_count": 9,
        "+1": 9,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1714",
      "id": 3108236317,
      "node_id": "I_kwDOKFkxdc65Q-wd",
      "number": 1714,
      "title": "Window/context menu artifacts",
      "user": {
        "login": "Mrlunsuper",
        "id": 29702044,
        "node_id": "MDQ6VXNlcjI5NzAyMDQ0",
        "avatar_url": "https://avatars.githubusercontent.com/u/29702044?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Mrlunsuper",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-06-02T01:46:06Z",
      "updated_at": "2025-07-07T07:03:56Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "First of all, thanks for creating such a smooth and beautiful compositor — Niri feels great to use!\n\nI'm running Niri on **Fedora 42** with an **NVIDIA GTX 1660 SUPER** (proprietary driver, Wayland session). I'm noticing **visual artifacts** when switching between windows or opening context menus — such as ghosting or lingering trails.\n\nI haven't tested this thoroughly yet, but wanted to report it in case it's a known NVIDIA issue or something worth tracking.\n\nThanks again!\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n```\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            // layout \"us,ru\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n        }\n\n        // Enable numlock on startup, omitting this setting disables it.\n        numlock\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        // drag false\n        // drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\noutput \"DP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@120.030\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1.5\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=0 y=0\n}\n\ncursor {\n    // xcursor-theme \"breeze_cursors\"\n    xcursor-size 20\n\n    // hide-when-typing\n    // hide-after-inactive-ms 1000\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 10\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        // off\n\n        width 2\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // Color of the border around windows that request your attention.\n        urgent-color \"#9b0000\"\n\n        // active-gradient from=\"#ffbb66\" to=\"#ffc880\" angle=45 relative-to=\"workspace-view\"\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        // \n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        // \n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\nspawn-at-startup \"waybar\"\nspawn-at-startup \"hyprpaper\"\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    slowdown 1.3\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n\n}\n\nwindow-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nwindow-rule {\n    match app-id=\"thunar\"\n    open-floating true\n    max-width 900\n    min-width 600\n    max-height 600\n    min-height 400\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    Mod+T hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"alacritty\"; }\n    Mod+D hotkey-overlay-title=\"Run an Application: fuzzel\" { spawn \"fuzzel\"; }\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\n\n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument in the end.\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+O repeat=false { toggle-overview; }\n\n    Mod+Q { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+A     { focus-column-left; }\n    Mod+S     { focus-column-right; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Center all fully visible columns on screen.\n    Mod+Ctrl+C { center-visible-columns; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n    Mod+E {spawn \"thunar\";}\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n\n    // Mod + Shift + W reload waybar\n    Mod+Shift+W { spawn \"notify-send 'Waybar reloaded' && killall waybar && waybar &\"; }\n}\n```\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n--> \nAp /home/dani/Applications/Windsurf/windsurf\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Fedora 42\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Nvidia GTX 1660 Super\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Ryzen 5 5600\n\n![Image](https://github.com/user-attachments/assets/191b54ad-fdfe-4149-8b2f-9c31281edd1f)\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1714/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1681",
      "id": 3092037932,
      "node_id": "I_kwDOKFkxdc64TMEs",
      "number": 1681,
      "title": "`vesktop` is sporadically lagging on text input",
      "user": {
        "login": "ficd0",
        "id": 15144201,
        "node_id": "MDQ6VXNlcjE1MTQ0MjAx",
        "avatar_url": "https://avatars.githubusercontent.com/u/15144201?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ficd0",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-05-26T20:51:05Z",
      "updated_at": "2025-06-10T00:21:34Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nI noticed this after the new Niri update. Vesktop, the Discord wrapper, sporadically lags on keyboard input and becomes unusable -- it's like the pressed keys are \"queued up\" and then typed out all at once after a few second. This issue persists with every installable form of vesktop (Flatpak, AUR (built from source & `bin` release), AppImage, etc.). \n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (8ba57fc)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon RX 7900 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 7800X3D (16) @ 5.05 GHz\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1681/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1653",
      "id": 3085690831,
      "node_id": "I_kwDOKFkxdc636-fP",
      "number": 1653,
      "title": "`wl_display_sync` stalls with wayland backend",
      "user": {
        "login": "kennylevinsen",
        "id": 176245,
        "node_id": "MDQ6VXNlcjE3NjI0NQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/176245?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kennylevinsen",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-05-23T08:53:34Z",
      "updated_at": "2025-07-16T16:18:45Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In #wlroots, a question was asked about smithay, wlroots and some other compositors having wildly different `glmark2-es2-wayland` scores. When testing with nested backends, I was seeing that while sway was pushing some 20-30k fps, niri seemed capped to the screen refresh rate of 60fps.\n\nIt seems that every `wl_display_sync` is stalling for almost a full refresh period, causing unexpected blocking in the client:\n\n```\n[2640755.993] {mesa egl surface queue}  -> wl_surface#14.attach(wl_buffer#18, 0, 0)\n[2640755.999] {mesa egl surface queue}  -> wl_surface#14.damage_buffer(0, 0, 2147483647, 2147483647)\n[2640756.005] {mesa egl surface queue}  -> wl_surface#14.commit()\n[2640756.010] {mesa egl surface queue}  -> wl_display#1.sync(new id wl_callback#20)\n[2640756.019] {Default Queue}  -> wl_display#1.sync(new id wl_callback#17)\n[2640769.156] {Display Queue} wl_display#1.delete_id(20)\n[2640769.167] {Display Queue} wl_display#1.delete_id(17)\n[2640769.172] {Default Queue} wl_callback#17.done(0)\n[2640769.210] {mesa egl surface queue} wl_buffer#19.release()\n[2640769.222] {mesa egl surface queue} wl_callback#20.done(0)\n[2640769.387] {mesa egl surface queue}  -> wl_surface#14.attach(wl_buffer#19, 0, 0)\n[2640769.399] {mesa egl surface queue}  -> wl_surface#14.damage_buffer(0, 0, 2147483647, 2147483647)\n[2640769.404] {mesa egl surface queue}  -> wl_surface#14.commit()\n[2640769.408] {mesa egl surface queue}  -> wl_display#1.sync(new id wl_callback#20)\n[2640769.420] {Default Queue}  -> wl_display#1.sync(new id wl_callback#17)\n[2640782.170] {Display Queue} wl_display#1.delete_id(20)\n[2640782.179] {Display Queue} wl_display#1.delete_id(17)\n[2640782.183] {Default Queue} wl_callback#17.done(0)\n[2640782.254] {mesa egl surface queue} wl_buffer#18.release()\n[2640782.259] {mesa egl surface queue} wl_callback#20.done(0)\n[2640782.402] {mesa egl surface queue}  -> wl_surface#14.attach(wl_buffer#18, 0, 0)\n[2640782.407] {mesa egl surface queue}  -> wl_surface#14.damage_buffer(0, 0, 2147483647, 2147483647)\n[2640782.412] {mesa egl surface queue}  -> wl_surface#14.commit()\n[2640782.416] {mesa egl surface queue}  -> wl_display#1.sync(new id wl_callback#20)\n[2640782.426] {Default Queue}  -> wl_display#1.sync(new id wl_callback#17)\n[2640794.981] {Display Queue} wl_display#1.delete_id(20)\n[2640795.003] {Display Queue} wl_display#1.delete_id(17)\n[2640795.010] {Default Queue} wl_callback#17.done(0)\n[2640795.067] {mesa egl surface queue} wl_buffer#19.release()\n[2640795.076] {mesa egl surface queue} wl_callback#20.done(0)\n[2640795.321] {mesa egl surface queue}  -> wl_surface#14.attach(wl_buffer#19, 0, 0)\n[2640795.339] {mesa egl surface queue}  -> wl_surface#14.damage_buffer(0, 0, 2147483647, 2147483647)\n[2640795.348] {mesa egl surface queue}  -> wl_surface#14.commit()\n[2640795.355] {mesa egl surface queue}  -> wl_display#1.sync(new id wl_callback#20)\n[2640795.373] {Default Queue}  -> wl_display#1.sync(new id wl_callback#17)\n[2640809.337] {Display Queue} wl_display#1.delete_id(20)\n[2640809.349] {Display Queue} wl_display#1.delete_id(17)\n[2640809.354] {Default Queue} wl_callback#17.done(0)\n[2640809.406] {mesa egl surface queue} wl_buffer#18.release()\n[2640809.411] {mesa egl surface queue} wl_callback#20.done(0)\n```\n\nWith the drm backend things seem fine, with some 20k fps (short of sway's 30k fps, but comparing GPU load was not the point here).\n\nI am not familiar with the current state of wayland-rs/smithay, so I'm playing it safe and filing it here to begin with. I'm thinking the issue might be something along the lines of:\n\n1. The Wayland backend doing a blocking dispatch for a frame event, such as through the mesa WSI\n2. If `libwayland-server`'s auto-response to wl_display_sync is still in use, perhaps there's an issue where the event loop does not end up flushing the respective wl_client before going to sleep when the Wayland backend is in use.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1653/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1639",
      "id": 3082927419,
      "node_id": "I_kwDOKFkxdc63wb07",
      "number": 1639,
      "title": "Support trackpoint scrolling in the overview",
      "user": {
        "login": "skoove",
        "id": 53106860,
        "node_id": "MDQ6VXNlcjUzMTA2ODYw",
        "avatar_url": "https://avatars.githubusercontent.com/u/53106860?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/skoove",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-05-22T10:43:44Z",
      "updated_at": "2025-09-14T18:45:52Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen attempting to scroll using the track point and middle button on the new overview menu, the menu does not scroll. It does scroll when using the two finger touch pad gesture.\n<!-- Attaching your full niri config can help diagnose the problem. -->\n<details>\n<summary>config (nix)</summary>\n<pre><code>\n{ config , pkgs , osConfig , ... }:\nlet\n  mod = \"Super\";\n  menu = \"fuzzel\";\n  terminal = \"footclient\";\n  alt_terminal = \"foot\";\n\n  hostname = osConfig.networking.hostName;\nin {\n  imports = [\n    ./waybar.nix # bar\n    ./dunst.nix  # notification daemon\n    ./fish.nix   # Scripts and such required by several things.\n  ];\n\n  home.packages = with pkgs; [\n    xwayland-satellite\n    swaylock-effects   # Lockscreen.\n    swayidle           # for turning off screen after 5 min when screen is locked\n  ];\n\n  xdg.portal ={\n    enable = true;\n    config.common.default = \"*\";\n    \n    extraPortals = with pkgs; [\n      xdg-desktop-portal-gnome\n      xdg-desktop-portal-gtk\n    ];\n  };\n\n\n  services.hyprpaper.enable = true;\n\n  programs.niri = {\n    settings = {\n      prefer-no-csd = true;\n\n      # TODO: this seriously needs to be cleaned up\n      spawn-at-startup =[\n        { command = [ \"sh\" \"-c\" \"systemctl --user enable --now waybar.service\" ]; }\n        { command = [ \"sh\" \"-c\" \"systemctl --user enable --now syncthingtray.service\" ]; }\n        { command = [ \"sh\" \"-c\" \"systemctl --user enable --now hyprpaper.service\" ]; }\n        # this (hopefully) fixes waybar being really slow to load\n        { command = [ \"sh\" \"-c\" \"dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY\" ]; }\n        { command = [ \"xwayland-satellite\" ]; }\n        { command = [ \"foot\" \"-s\" ]; }\n      ] ++ (\n        if hostname == \"nixos-desktop\" then [\n          { command = [ \"sh\" \"-c\" \"discord --start-minimized\" ]; }\n          { command = [ \"sh\" \"-c\" \"steam -silent\" ]; }\n        ] else []\n      );\n\n      environment = {\n        QT_QPA_PLATFORM = \"wayland\";\n        ELECTRON_OZONE_PLATFORM_HINT = \"wayland\";\n        DISPLAY = \":0\";\n      };\n\n      input = {\n        mouse = {\n          accel-profile = \"flat\";\n          accel-speed = 0.3;\n        };\n\n        trackpoint = {\n          accel-profile = \"adaptive\";\n          accel-speed = 0.6;\n        };\n\n        tablet.map-to-output = \"HDMI-A-1\";\n      };\n\n      layout = {\n        always-center-single-column = true;\n        empty-workspace-above-first = true;\n        border.width = 2;\n        gaps = 0;\n\n        struts =\n        let\n        side_struts = 15;\n        in {\n          left = side_struts;\n          right = side_struts;\n        };\n      };\n\n      outputs = {\n        # laptop monitor\n        \"HDMI-A-1\" = {\n          scale = 1.0;\n          mode = {\n            width = 1920;\n            height = 1080;\n            refresh = 100.0;\n          };\n        };\n\n        # primary desktop monitor\n        \"DVI-D-1\" = {\n          scale = 1.0;\n          mode = {\n            width = 1920;\n            height = 1080;\n            refresh = 100.0;\n          };\n        };\n\n        # left desktop monitor\n        \"eDP-1\" = {\n          scale = 1.0;\n          mode = {\n            width = 1920;\n            height = 1080;\n            refresh = 100.0;\n          };\n        };\n      };\n      \n      binds = with config.lib.niri.actions;\n      let\n        # for shell scripts remember to actually run them\n        # with fish, see cleddy bind\n        fish = spawn \"fish\" \"-c\";\n      in {\n        # misc\n        # edit text then save to clipboard\n        \"${mod}+E\".action = fish \"fish ${../scripts/eddy.fish}\";\n        # edit clipboard\n        \"${mod}+Shift+E\".action = fish \"fish ${../scripts/cleddy.fish}\";\n        \n        # open things\n        \"${mod}+D\".action = fish menu;\n        \"${mod}+Return\".action = fish terminal;\n        \"${mod}+Shift+Return\".action = fish alt_terminal;\n        \"${mod}+Shift+M\".action = quit;\n        \"${mod}+T\".action = fish \"bemoji -c -n\";\n        \"${mod}+P\".action = fish \"fish ${../scripts/lock-screen.fish}\";\n        \"${mod}+C\".action = fish \"fish ${../scripts/command-runner.fish}\";\n\n        # reorient\n        \"${mod}+Q\".action = close-window;\n        \"${mod}+F\".action = maximize-column;\n        \"${mod}+Shift+F\".action = fullscreen-window;\n        \"${mod}+Ctrl+F\".action = toggle-window-floating;\n\n        # open things\n        \"${mod}+1\".action = spawn \"floorp\";\n        \"${mod}+2\".action = spawn \"obsidian\";\n        \"${mod}+3\".action = spawn \"discord\";\n        \"${mod}+4\".action = spawn \"steam\";\n\n        # refocus\n        \"${mod}+K\".action = focus-window-or-workspace-up;\n        \"${mod}+J\".action = focus-window-or-workspace-down;\n        \"${mod}+H\".action = focus-column-or-monitor-left;\n        \"${mod}+L\".action = focus-column-or-monitor-right;\n\n        # move things\n        \"${mod}+Shift+K\".action = move-window-up-or-to-workspace-up;\n        \"${mod}+Shift+J\".action = move-window-down-or-to-workspace-down;\n        \"${mod}+Shift+H\".action = move-column-left-or-to-monitor-left;\n        \"${mod}+Shift+L\".action = move-column-right-or-to-monitor-right;\n\n        # stack and unstack\n        \"${mod}+Comma\".action = consume-or-expel-window-left;\n        \"${mod}+Period\".action = consume-or-expel-window-right;\n\n        # screenshotting\n        \"${mod}+S\".action = screenshot;\n        \"${mod}+Shift+S\".action = screenshot-window;\n        \"${mod}+A\".action = fish \"wl-paste | satty -f - --fullscreen --copy-command 'wl-copy'\";\n\n        # resize things\n        \"Mod+Equal\".action = set-column-width \"+10%\";\n        \"Mod+Minus\".action = set-column-width \"-10%\";\n        \"Mod+Shift+1\".action = set-column-width \"50%\";\n        \"Mod+Shift+Equal\".action = set-window-height \"+10%\";\n        \"Mod+Shift+Minus\".action = set-window-height \"-10%\";\n\n        \"XF86AudioRaiseVolume\".action = fish \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+\";\n        \"XF86AudioLowerVolume\".action = fish \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-\";\n        \"XF86AudioMute\".action = fish \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\";\n        \"XF86AudioMicMute\".action = fish \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\";\n        \"XF86MonBrightnessUp\".action = fish \"brightnessctl s 10%+\";\n        \"XF86MonBrightnessDown\".action = fish \"brightnessctl s 10%-\";\n      };\n    };\n  };\n}\n\n</code></pre>\n</details>\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \nniri unstable 2025-05-22 (commit f369a0f810710cfbbbc1e847cf2fc7f6392af31f)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS 25.11 (Xantusia) (nixpkgs unstable)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel UHD Graphics 620 @ 1.10 GHz [Integrated]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) i5-8350U (8) @ 3.60 GHz\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1639/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1630",
      "id": 3080545871,
      "node_id": "I_kwDOKFkxdc63nWZP",
      "number": 1630,
      "title": "Expose screencasts in IPC",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-05-21T15:01:52Z",
      "updated_at": "2025-08-11T09:12:00Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Something like a list of ongoing screencasts with IDs and their screencast targets, ability to stop a cast by ID, and set a cast target by ID (like dynamic cast target but for any cast).\n\nPipeWire casts are already sort of available through the Mutter D-Bus API, but this doesn't include wlr-screencopy \"casts\". While those are a bit fuzzy (no good way to tell apart a \"screencast\" that repeatedly takes non-damaged screenshots), would be nice to expose at least the damaged casts. (Though, not sure if there's a good way to dynamically change the target for these.)\n\nExample uses:\n- putting an ongoing screencast indicator on a bar\n- a button to stop all screencasts",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1630/reactions",
        "total_count": 6,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 1,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1584",
      "id": 3069746829,
      "node_id": "I_kwDOKFkxdc62-J6N",
      "number": 1584,
      "title": "Mapping horizontal scroll inhibits vertical scroll (MX Master 3)",
      "user": {
        "login": "0C3L0T",
        "id": 27887267,
        "node_id": "MDQ6VXNlcjI3ODg3MjY3",
        "avatar_url": "https://avatars.githubusercontent.com/u/27887267?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/0C3L0T",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 12,
      "created_at": "2025-05-16T19:30:08Z",
      "updated_at": "2026-02-10T07:03:20Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen mapping to WheelScrollRight/Left without any additional modifiers, the vertical scroll wheel stops working. Using wev to check if input gets registered results in observing no input whatsoever.\n\nAdding this to the niri config file should reproduce the issue (no vertical scrolling on mouse, touchpad still works):\n```kdl\nbinds {\n    WheelScrollRight      { focus-column-right; }\n    WheelScrollLeft       { focus-column-left; }\n}\n```\nMake sure `thumbweel.divert` is set to `false` in your logiops config.\n\nTested with MX master 3 using logiops driver.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.02 (unknown commit)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: 6.14.6-arch1-1\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: N/A\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: 11th Gen Intel(R) Core(TM) i7-1165G7\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1584/reactions",
        "total_count": 5,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1558",
      "id": 3054724424,
      "node_id": "I_kwDOKFkxdc62E2VI",
      "number": 1558,
      "title": "Implement ext-image-copy-capture",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-05-11T05:08:34Z",
      "updated_at": "2026-01-06T15:08:14Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://wayland.app/protocols/ext-image-copy-capture-v1\n\nShould be somewhat similar to wlr-screencopy.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1558/reactions",
        "total_count": 11,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 3,
        "eyes": 6
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1555",
      "id": 3054469240,
      "node_id": "I_kwDOKFkxdc62D4B4",
      "number": 1555,
      "title": "Firefox Webcam sharing does not work when firefox is launched via `niri msg action spawn -- firefox` but does when launched via `firefox`",
      "user": {
        "login": "wucke13",
        "id": 20400405,
        "node_id": "MDQ6VXNlcjIwNDAwNDA1",
        "avatar_url": "https://avatars.githubusercontent.com/u/20400405?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/wucke13",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 12,
      "created_at": "2025-05-10T19:02:04Z",
      "updated_at": "2025-05-13T07:53:10Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nFirefox Webcam sharing does not work when firefox is launched via `niri msg action spawn -- firefox`.\nWhen launching it just using `firefox` from the command line, it does work however. I'm really flabbergasted as to why.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.02 (unknown commit)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS 24.11\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Radeon 780M\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 PRO 7840U\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1555/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1546",
      "id": 3049508223,
      "node_id": "I_kwDOKFkxdc61w81_",
      "number": 1546,
      "title": "Keyboard gets remapped when using `wtype`",
      "user": {
        "login": "mentalblock",
        "id": 1371873,
        "node_id": "MDQ6VXNlcjEzNzE4NzM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1371873?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mentalblock",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-05-08T16:21:25Z",
      "updated_at": "2025-05-08T16:25:29Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I use `wofi-pass` to emit passwords into forms. Under the hood, it uses `wtype` to simulate typing out the password into the form from my password vault. I noticed that my passwords are not being entered correctly into forms and deduced that, under Niri, that my keyboard gets \"corrupted\" temporarily.\n\nHere is the reproduction steps in my case. In my Alacritty terminal, I type\n```\n> wtype hello\n```\nIt prints out \"hello\" as expected, but afterwards when I press my ESC key, it inputs the 'h' key instead. Other key inputs are remapped as well. One way I discovered to reset the issue is to move focus to another window. Once that is done the key inputs are restored back to normal.\n\nAs a comparison, I logged into Hyprland and the steps to reproduce the issue do not cause the corrupted keymapping.\n\nThank you for helping me investigate this issue. I thoroughly enjoy using Niri.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: 25.02\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Radeon RX 7900 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 9 5900X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1546/reactions",
        "total_count": 2,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1533",
      "id": 3042299295,
      "node_id": "I_kwDOKFkxdc61Vc2f",
      "number": 1533,
      "title": "Add support for monitor bit depth configuration",
      "user": {
        "login": "Gwenodai",
        "id": 14289733,
        "node_id": "MDQ6VXNlcjE0Mjg5NzMz",
        "avatar_url": "https://avatars.githubusercontent.com/u/14289733?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gwenodai",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 26,
      "created_at": "2025-05-06T10:13:22Z",
      "updated_at": "2026-01-03T22:39:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently you can set resolution, refresh rate, vrr, scale, transform, etc for each output. However, there's no way to control the bit depth of a display through Niri (Such as running a display in 8 or 10 bit mode).\n\nThis seems like a strange thing to not have access to considering all of the other output options available. Maybe it was just forgotten?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1533/reactions",
        "total_count": 57,
        "+1": 57,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1519",
      "id": 3037641889,
      "node_id": "I_kwDOKFkxdc61Dryh",
      "number": 1519,
      "title": "LSGT key not considered for keybinds across different keyboard layouts",
      "user": {
        "login": "postsolar",
        "id": 120750161,
        "node_id": "U_kgDOBzKAUQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/120750161?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/postsolar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-05-03T22:18:16Z",
      "updated_at": "2025-06-22T11:43:27Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nWith the following config\n\n```kdl\ninput {\n  keyboard {\n    xkb {\n      layout \"us,ee,ru\"\n      variant \"colemak_dh_iso,,ruu\"\n    }\n  }\n}\n\nbinds {\n  Mod+Z { spawn \"notify-send\" \"hi\"; }\n  Mod+Slash { spawn \"notify-send\" \"oops\"; }\n}\n```\n\nPressing Mod+Z (Mod+LSGT key) on US layout will work as expected (\"hi\"), but on RU layout it will instead trigger the Mod+Slash bind (\"oops\").\n\n\n[config (koopia).kdl.txt](https://github.com/user-attachments/files/20025191/config.koopia.kdl.txt)\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri unstable 2025-05-01 (commit 6c9705dd4b2eaba25f024d1a3efd7943fd393632)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS, installed via sodiboo/niri-flake\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1519/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1510",
      "id": 3035195486,
      "node_id": "I_kwDOKFkxdc606Whe",
      "number": 1510,
      "title": "add shadow around tab indicator line",
      "user": {
        "login": "Axlefublr",
        "id": 101342105,
        "node_id": "U_kgDOBgpbmQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/101342105?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Axlefublr",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-05-02T05:10:33Z",
      "updated_at": "2025-05-02T05:14:31Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "\nI rotate through a lot of differently colored wallpapers, and make use of borders and a shadow for the windows to provide enough contrast. \\\nThe tab indicator uses neither of those, and so there's no one color I can pick that won't look muted / hard to see across all the wallpapers.\n\nI've tried making the tab indicator big and painfully orange, but even this I wouldn't say helps. If I could have a shadow and/or border around the indicator, that would completely solve my issue.\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1510/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1473",
      "id": 3020535646,
      "node_id": "I_kwDOKFkxdc60Cbde",
      "number": 1473,
      "title": "Hot corner with barriers",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-04-25T16:37:58Z",
      "updated_at": "2025-12-08T18:30:41Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently, hot corner is a simple implementation which triggers when the mouse lands on the pixel at x=1 y=1 of the monitor. It would be better to instead use a barrier implementation similar to what GNOME Shell does, where you need to move the mouse a bit \"against\" the corner to make it trigger. This will help to avoid some misfires.\n\nhttps://gitlab.gnome.org/GNOME/gnome-shell/-/blob/6d86bd0dfa62ff2b0b1d21d4be90aa29803e3fd0/js/ui/layout.js?page=2#L1164",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1473/reactions",
        "total_count": 28,
        "+1": 28,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        3016
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1470",
      "id": 3019476447,
      "node_id": "I_kwDOKFkxdc6z-Y3f",
      "number": 1470,
      "title": "Overview: generate mipmaps for nicer downscaled rendering",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-04-25T09:15:06Z",
      "updated_at": "2025-04-25T09:15:06Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Window contents get aliasing artifacts when scaled down below 50% zoom level. Mipmaps solve this.\n\nHowever, I'm not sure what the performance impact is. In gnome-shell for instance, mipmaps are generated only after a window hasn't redrawn for a little bit. I'd like to have GPU profiling Tracy integration complete in Smithay and niri first to determine how bad the impact is and whether it's necessary to do this sort of debounce.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1470/reactions",
        "total_count": 13,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 12,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1469",
      "id": 3019471481,
      "node_id": "I_kwDOKFkxdc6z-Xp5",
      "number": 1469,
      "title": "Overview: animate workspaces moving, dis/appearing",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-04-25T09:12:58Z",
      "updated_at": "2025-04-25T09:12:58Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Workspace actions are not animated. This was mostly invisible until the Overview, now it's visible.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1469/reactions",
        "total_count": 6,
        "+1": 6,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1468",
      "id": 3019469102,
      "node_id": "I_kwDOKFkxdc6z-XEu",
      "number": 1468,
      "title": "Overview: DnD entire workspaces",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-04-25T09:11:53Z",
      "updated_at": "2026-01-07T10:23:39Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Right now you can drag-and-drop individual windows. A natural extension is do be able to drag-and-drop entire workspaces to reorder them or to a different monitor.\n\nI'm thinking Mod+LMB for this, and Mod+touch on a touchscreen.\n\nIt should work roughly the same as tiling window DnD where you need to \"drag\" a workspace \"out\" a bit first.\n\nI expect this to require quite a big refactor.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1468/reactions",
        "total_count": 26,
        "+1": 25,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1467",
      "id": 3019461320,
      "node_id": "I_kwDOKFkxdc6z-VLI",
      "number": 1467,
      "title": "Overview: fix thin border flickering, other 1 px jank",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-04-25T09:08:29Z",
      "updated_at": "2025-04-25T09:08:29Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The root cause for all of these issues is that when we round element sizes and positions to physical pixels, we don't consider the overview zoom level. Unfortunately, the refactor to do this is quite involved and complicated.\n\nRoughly, the plan is:\n1. Add `OriginRescaleRenderElement` that rescales about `(0., 0.)` and thereby can avoid the intermediate rounding in `Element::geometry()` and other methods (by passing through `scale * zoom`). Use it instead of `RescaleRenderElement` for the overview zoom.\n2. Thread overview_progress (used for computing the zoom level) down from `Monitor` to `Workspace`, `ScrollingSpace`, `Tile`.\n3. Use zoom together with scale for rounding sizes and positions where it makes sense and don't use it where it doesn't make sense.\n\nI had a go at steps 2 and 3 in this commit: https://github.com/YaLTeR/niri/commit/9cb2fe4eeb7430893f56d5e77d6161189177463f\n\nUnfortunately, it started spiraling out of control with lots of duplicate methods (`column_xs()` vs. `visual_column_xs()` and such). The main problem is that gaps and border sizes must remain rounded only to output scale when doing window layout (don't want to ask windows to resize when opening the overview), while they must be rounded to output scale * zoom for the overview rendering. Need to figure out how to deal with this.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1467/reactions",
        "total_count": 11,
        "+1": 10,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1457",
      "id": 3010226611,
      "node_id": "I_kwDOKFkxdc6zbGmz",
      "number": 1457,
      "title": "Niri leaking memory when displays are enabled and disabled repeatedly",
      "user": {
        "login": "Kirottu",
        "id": 56396750,
        "node_id": "MDQ6VXNlcjU2Mzk2NzUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/56396750?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Kirottu",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-04-22T07:43:03Z",
      "updated_at": "2026-01-14T23:18:38Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\nI've lately noticed that after my machine has been on for long periods of time (only suspending it when not needing it), Niri's memory usage has been really high. It would seem after toggling from my desktop setup to my TV setup and vice versa, a decent amount of RAM gets reserved by Niri (looks like around ~50 MB or so but am not completely certain). This has lead to Niri consuming around 2 GB of RAM on my current session, of which 1.9 GB seems to be shared memory.\n\n![Image](https://github.com/user-attachments/assets/a50cb032-3f3f-4e80-80f3-5aec998853f3)\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.02 (unknown commit)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: RX 6700 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Ryzen 7 5700X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1457/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1445",
      "id": 3006588478,
      "node_id": "I_kwDOKFkxdc6zNOY-",
      "number": 1445,
      "title": "low fps animations when focusing away from mpv & firefox",
      "user": {
        "login": "BennoLossin",
        "id": 94611769,
        "node_id": "U_kgDOBaOpOQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/94611769?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BennoLossin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-04-19T18:13:22Z",
      "updated_at": "2025-04-22T13:42:10Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nWindow animations stutter/have low fps when switching away from a maximized (also fullscreen) mpv or firefox window.\nThis only happens when switching to a window beside it on the same workspace\n(`focus-column-right`/`focus-column-left`), switching workspace via `focus-workspace <num>` is\ntotally smooth.\n\nI have not observed this happening with any other applications, but I also don't really run anything fancy.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\nI have a lot of keyboard bindings, which I have removed, as I don't think that they are relevant.\n\n```kdl\noutput \"DP-1\" {\n    mode \"3440x1440@144.001\"\n}\nanimations {\n    slowdown 0.75\n}\nwindow-rule {\n    match app-id=\"mpv\"\n    open-focused false\n    open-maximized true\n}\nlayout {\n    gaps 12\n    focus-ring {\n        width 2\n    }\n}\ninput {\n    touchpad {\n        tap\n        natural-scroll\n    }\n    mouse {\n        accel-profile \"flat\"\n    }\n    focus-follows-mouse\n}\n\nenvironment {\n    // make electron apps use wayland backends\n    NIXOS_OZONE_WL \"1\"\n}\n\ndebug {\n    // niri seems to auto-pick the iGPU.\n    render-drm-device \"/dev/dri/renderD128\"\n}\n```\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\nI don't have Xorg/XWayland installed.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: `niri 25.02 (unknown commit)`\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: `NixOs unstable (25.05)`\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: `NVIDIA GTX 1080`\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: `AMD Ryzen 9 9950X`\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1445/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1441",
      "id": 3004768442,
      "node_id": "I_kwDOKFkxdc6zGSC6",
      "number": 1441,
      "title": "OpenTabletDriver not working under Niri",
      "user": {
        "login": "iErik",
        "id": 3172683,
        "node_id": "MDQ6VXNlcjMxNzI2ODM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3172683?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/iErik",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 13,
      "created_at": "2025-04-18T11:37:37Z",
      "updated_at": "2025-11-09T02:31:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nDrawing tablet doesn't work properly in Niri when using OpenTabletDriver (0.6.5 and 0.7.0), cursor doesn't move but apparently tablet button bindings work.\n\nI have tried:\n1. Adding the line `Environment=\"WAYLAND_DISPLAY=wayland-1\"` to `opentabletdriver.service` systemd unit file\n2. Starting `otd-daemon` using `spawn-at-startup` instead of provided user systemd unit file\n3. Removing the line `SUBSYSTEM==\"input\", ATTRS{idVendor}==\"256c\", ATTRS{idProduct}==\"0068\", ENV{LIBINPUT_IGNORE_DEVICE}=\"1\"` or setting `ENV{LIBINPUT_IGNORE_DEVICE}` value to `\"0\"` in `70-opentabletdriver.rules` udev rules file\n\nSame tablet works perfectly fine with OpenTabletDriver under different Wayland compositors (tested on Hyprland, Plasma), and works fine if I disabled OpenTabletDriver or use the official Huion driver utility\n\nconfig.kdl:\n```kdl\n//spawn-at-startup \"/usr/bin/xwayland-satellite\"\nspawn-at-startup \"/usr/bin/otd-daemon\"\nspawn-at-startup \"swaync\"\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\nprefer-no-csd\n\nenvironment {\n  DISPLAY \":0\"\n  QT_AUTO_SCREEN_SCALE_FACTOR \"1\"\n  QT_WAYLAND_DISABLE_WINDOWDECORATION \"1\"\n  QT_QPA_PLATFORMTHEME \"qt6ct\"\n\n  QT_QPA_PLATFORM \"wayland\"\n  GDK_BACKEND \"wayland,x11,*\"\n  SDL_VIDEODRIVER \"wayland\"\n  CLUTTER_BACKEND \"wayland\"\n\n  XDG_MENU_PREFIX \"plasma-\"\n  XDG_CURRENT_DESKTOP \"niri\"\n  XDG_SESSION_DESKTOP \"niri\"\n  XDG_SESSION_TYPE \"wayland\"\n  XCURSOR_SIZE \"24\"\n\n  ELECTRON_OZONE_PLATFORM_HINT \"auto\"\n}\n\ncursor {\n  xcursor-theme \"Bibata-Rainbow-Modern\"\n  xcursor-size 24\n}\n\nclipboard {\n  disable-primary\n}\n\ninput {\n  focus-follows-mouse\n  //workspace-auto-back-and-forth\n  mod-key \"Super\"\n\n  keyboard {\n    xkb {\n      layout \"us\"\n      variant \"altgr-intl\"\n      model \"pc86\"\n      options \"compose:ralt,caps:escape\"\n      rules \"\"\n    }\n\n    repeat-rate 40\n    repeat-delay 200\n  }\n\n  mouse {\n    accel-speed 0.0\n    accel-profile \"adaptive\"\n    scroll-factor 1.0\n    //scroll-method \"no-scroll\"\n    scroll-button 273\n    middle-emulation\n  }\n\n  trackpoint {\n\n  }\n\n  touchpad {\n  }\n\n  tablet {\n    //map-to-output \"DP-2\"\n    //calibration-matrix 1.0 1.0 1.0 1.0 1.0 1.0\n  }\n\n  touch {\n    map-to-output \"DP-2\"\n  }\n}\n\noutput \"DP-2\" {\n  mode \"2560x1080@60.0\"\n  scale 1.0\n  position x=1920 y=0\n  focus-at-startup\n}\n\noutput \"DP-3\" {\n  mode \"2560x1080@60.0\"\n  position x=4480 y=-1080\n  transform \"270\"\n  scale 1.0\n}\n\noutput \"HDMI-A-1\" {\n  mode \"1920x1080@60.0\"\n  position x=0 y=0\n}\n\noutput \"HDMI-A-2\" {\n  mode \"4096x2160@30.0\"\n  position x=5560 y=0\n}\n\n\nlayout {\n  gaps 9\n\n  center-focused-column \"never\"\n\n  default-column-width { proportion 0.5; }\n\n  border {\n    width 2\n  }\n\n  focus-ring {\n    off\n  }\n\n  shadow {\n    on\n  }\n\n  tab-indicator {\n    //hide-when-single-tab\n    //place-within-column\n    position \"bottom\"\n    gap 2\n  }\n\n  insert-hint {\n\n  }\n\n  struts { }\n}\n\nbinds {\n  // 1.0 Spawn\n  // ---------\n\n  Mod+Return { spawn \"kitty\"; }\n  Mod+D {\n    spawn \"rofi\" \"-matching\" \"fuzzy\" \"-show\" \"combi\";\n  }\n\n  Mod+Q { close-window; }\n\n  // 2.0 Movement\n  // ------------\n\n  // -> 2.1 Window Movement\n  // -------------------\n\n  Mod+Left { focus-column-left; }\n  Mod+Down { focus-window-down; }\n  Mod+Up { focus-window-up; }\n  Mod+Right { focus-column-right; }\n\n  Mod+H { focus-column-left; }\n  Mod+J { focus-window-down; }\n  Mod+K { focus-window-up; }\n  Mod+L { focus-column-right; }\n\n  Mod+Ctrl+Left { move-column-left; }\n  Mod+Ctrl+Down { move-window-down; }\n  Mod+Ctrl+Up { move-window-up; }\n  Mod+Ctrl+Right { move-column-right; }\n\n  Mod+Ctrl+H { move-column-left; }\n  Mod+Ctrl+J { move-window-down; }\n  Mod+Ctrl+K { move-window-up; }\n  Mod+Ctrl+L { move-column-right; }\n\n  Mod+Home { focus-column-first; }\n  Mod+End { focus-column-last; }\n  Mod+Ctrl+Home { move-column-to-first; }\n  Mod+Ctrl+End { move-column-to-last; }\n\n  // -> 1.2 Monitor/Workspace Movement\n  // -----------------------------\n\n  Mod+bracketleft { focus-monitor-left; }\n  Mod+bracketright { focus-monitor-right; }\n\n  Mod+Alt+J { focus-workspace-down; }\n  Mod+Alt+K { focus-workspace-up; }\n\n  Mod+Shift+J { move-column-to-workspace-down; }\n  Mod+Shift+K { move-column-to-workspace-up; }\n\n  Mod+1 { focus-workspace 1; }\n  Mod+2 { focus-workspace 2; }\n  Mod+3 { focus-workspace 3; }\n  Mod+4 { focus-workspace 4; }\n  Mod+5 { focus-workspace 5; }\n  Mod+6 { focus-workspace 6; }\n  Mod+7 { focus-workspace 7; }\n  Mod+8 { focus-workspace 8; }\n  Mod+9 { focus-workspace 9; }\n\n  Mod+Shift+1 { move-column-to-workspace 1; }\n  Mod+Shift+2 { move-column-to-workspace 2; }\n  Mod+Shift+3 { move-column-to-workspace 3; }\n  Mod+Shift+4 { move-column-to-workspace 4; }\n  Mod+Shift+5 { move-column-to-workspace 5; }\n  Mod+Shift+6 { move-column-to-workspace 6; }\n  Mod+Shift+7 { move-column-to-workspace 7; }\n  Mod+Shift+8 { move-column-to-workspace 8; }\n  Mod+Shift+9 { move-column-to-workspace 9; }\n\n  // 3.0 Actions\n  // -----------\n\n  Mod+Escape { quit; }\n  Ctrl+Alt+Delete { quit; }\n\n  Mod+Shift+P { power-off-monitors; }\n\n  Print { screenshot; }\n\n  // 4.0 Layout\n  // ----------\n\n  Mod+W { toggle-column-tabbed-display; }\n  Mod+backslash { expel-window-from-column; }\n  Mod+Shift+backslash { consume-window-into-column; }\n\n  Mod+V { toggle-window-floating; }\n\n  Mod+C { center-column; }\n  Mod+F { maximize-column; }\n  Mod+Shift+F { fullscreen-window; }\n  Mod+apostrophe { expand-column-to-available-width; }\n\n  Mod+Minus { set-column-width \"-5%\"; }\n  Mod+Equal { set-column-width \"+5%\"; }\n\n  Mod+Shift+Minus { set-window-height \"-5%\"; }\n  Mod+Shift+Equal { set-window-height \"+5%\"; }\n}\n\nanimations {\n\n}\n\ngestures {\n\n}\n```\n\n### System Information\n\nOS: Arch Linux\nCPU: AMD Ryzen 9 7950x 16-Core\nGPU: AMD Radeon RX 6700 XT\nDrawing Tablet: Huion Inspiroy 2L (H1061P)\nNiri version: v25.02-133-g7884d3bf (`niri-git` AUR package)\nOpenTabletDriver version: 0.7.0.0-pre",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1441/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1407",
      "id": 2980596171,
      "node_id": "I_kwDOKFkxdc6xqEnL",
      "number": 1407,
      "title": "VK Messenger doesn't let me log in when using ONLY Niri",
      "user": {
        "login": "doccnova",
        "id": 123438051,
        "node_id": "U_kgDOB1uD4w",
        "avatar_url": "https://avatars.githubusercontent.com/u/123438051?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/doccnova",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 13,
      "created_at": "2025-04-08T18:11:35Z",
      "updated_at": "2025-07-07T10:22:19Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Issue\nIn case any inconvenience will come out, I use the AppImage version of VK Messenger - vk.me/app\n\nHello. Since I use 2 DEs and 2 WMs - GNOME, KDE Plasma, Hyprland and Niri, I spotted something actually... funny. The app starts via XWayland (it doesn't support Wayland, yet works flawlessly on the rest of environments I listed above), but doesn't let me log in (usually, there are 3 ways to log in - QR code, web browser and Sferum account). When I press Log in, it simply refreshes the page, when, by default, should show the log in QR code.\n\n### Laptop specs\nOS: Arch Linux\nLaptop - Lenovo ideapad Y700-15ISK\nCPU: Intel Core i5-6300HQ\nGPUs: Intel HD Graphics 530 + Nvidia GeForce GTX 960M\nRAM: 16 GB (2x8)\nDrives: Transcend TSM250GB 250GB + Gigabyte GB240 240 GB\nScreen and monitor: eDP-1 - 1920x1080, IPS; HDMI-A-1 - Samsung SyncMaster 710N, 1280x1024, 75 Hz, Tn + Film\nNiri version: 25.02\n\n### Niri Configuration, aka ~/.config/niri/config.kdl\n\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // Keyboard layouts - for me, it's Russian and English, and classic Win+Space toggle\n            layout \"us,ru\"\n            options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n        }\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n// Экран ноутбука\noutput \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@60\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1.25\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=1280 y=0\n}\n// Монитор\noutput \"HDMI-A-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1280x1024@75\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 1\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=0 y=0\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 16\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n       // active-gradient from=\"#ffbb66\" to=\"#ffc880\" angle=45 relative-to=\"workspace-view\"\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n// spawn-at-startup \"alacritty\" \"-e\" \"fish\"\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    // Бинды, как изменённые дефолтные, так и свои\n    Mod+T { spawn \"kitty\"; }\n    Alt+Space { spawn \"walker\"; }\n    Super+Alt+L { spawn \"hyprlock\"; }\n    Mod+B { spawn \"zen-browser\"; }\n    Mod+E { spawn \"cosmic-files\"; }\n    Alt+Tab { spawn \"rofi\" \"-show\" \"window\"; }\n\n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument in the end.\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n\n    Alt+F4 { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n    Mod+C { center-column; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Alt+Q { spawn \"wlogout\"; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n\n// Start the XWayland Satellite, which'll allow the apps work normally\n\nspawn-at-startup \"xwayland-satellite\"\n\n//Set the display for XWayland\n\nenvironment{\n\tDISPLAY \":1\"\n}\n\n// Автостарт\n\nspawn-at-startup \"waybar\"\nspawn-at-startup \"startup\"\nspawn-at-startup \"swaync\"\nspawn-at-startup \"swww-daemon\"\nspawn-at-startup \"lxqt-policykit-agent\"\n\n// Именные виртуальные рабочие столы\nworkspace \"games\"\nworkspace \"browser\"\nworkspace \"chat\"\nworkspace \"office\"\n\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1407/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1402",
      "id": 2975926914,
      "node_id": "I_kwDOKFkxdc6xYQqC",
      "number": 1402,
      "title": "Two 50% windows don't always exactly fit on screen with fractional scale",
      "user": {
        "login": "kosz85",
        "id": 2547425,
        "node_id": "MDQ6VXNlcjI1NDc0MjU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2547425?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kosz85",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-04-07T07:42:58Z",
      "updated_at": "2025-12-23T08:07:31Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nWhen switching focus between windows (with option `on-overflow`) there is no way to have both windows on screen in 2 columns. There is always only one centered. If I resize window to have few less pixels, then I can have back both columns on single screen.\n\nI assume it's result of fractional rest of width. I have standard scale 1.25 set on this display. Don't know if it's important but I have 2 monitors and the main one is scaled 1.0 and it behaves without any problems there.\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n```\n➜ niri msg outputs\nOutput \"Dell Inc. DELL*****\" (DP-1)\n  Current mode: 3840x2160 @ 59.997 Hz (preferred)\n  Variable refresh rate: not supported\n  Physical size: 700x390 mm\n  Logical position: 1920, -1300\n  Logical size: 3072x1728\n  Scale: 1.25\n  Transform: normal\n  Available modes:\n    3840x2160@59.997 (current, preferred)\n...\n```\n\n```\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 3\n    center-focused-column \"on-overflow\"\n```\n\nSwitching  scale to 1 or 1.2 it works properly, switching back to 1.25 it has overflow and always center window.\n\n\n<!--\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.02 (v25.02-98-g7cfecf4b)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Ubuntu 24.04.2 LTS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Radeon RX Vega 6 (Ryzen 4000/5000 Mobile Series)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 PRO 4750U with Radeon Graphics\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1402/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1359",
      "id": 2957884362,
      "node_id": "I_kwDOKFkxdc6wTbvK",
      "number": 1359,
      "title": "Dynamic cast area target",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-03-29T09:09:09Z",
      "updated_at": "2025-07-27T18:29:23Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Something like niri msg action pick-dynamic-cast-area that lets you draw a rectangle on an output to cast just that rectangle. \n\nThough, need to consider that we will want a dynamic cast workspace target too in the future, and area selection makes sense for it too, in addition to a whole output.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1359/reactions",
        "total_count": 8,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 5,
        "rocket": 0,
        "eyes": 2
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1358",
      "id": 2957848569,
      "node_id": "I_kwDOKFkxdc6wTS_5",
      "number": 1358,
      "title": "Make preset size and move across monitors binds work in the screenshot UI",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-03-29T07:45:26Z",
      "updated_at": "2025-06-25T07:52:52Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Now that https://github.com/YaLTeR/niri/pull/1279 made basic move and resize work, the logical next steps are preset resizes and moving across monitors.\n\n- switch-preset-window-width/height: basically do the same as layout/floating.rs. Will be a bit annoying to keep track of preset widths/heights so that they're the same as in the layout Options.\n- move-window-to-monitor-right/left/up/down should probably also do the same as layout/floating.rs, i.e. preserve the relative position of the top-left corner of the selection. Need to make sure that moving back and forth preserves the position and size (for now, 1 px difference due to rounding is allowable, to avoid a big screenshot UI refactor).\n- center-column/window to center the selection.\n- move-floating-window for precise movement.\n- fullscreen-window to expand the selection to the entire screen.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1358/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1348",
      "id": 2951062519,
      "node_id": "I_kwDOKFkxdc6v5aP3",
      "number": 1348,
      "title": "Add timeout for block-out-from to make matching by name more usable",
      "user": {
        "login": "schrottkatze",
        "id": 68819302,
        "node_id": "MDQ6VXNlcjY4ODE5MzAy",
        "avatar_url": "https://avatars.githubusercontent.com/u/68819302?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/schrottkatze",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-03-27T00:38:20Z",
      "updated_at": "2025-12-23T06:19:27Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nUsing a match rule, I'm blocking out firefox if it has a certain tab open. The blocking out works normally on switching to said tab, but when leaving it, the content is briefly visible.\n\nMy suggestion would be to allow a timeout for the blockout that's user specified of n seconds if a rule doesn't apply anymore.\n\nhttps://github.com/user-attachments/assets/ba67de22-b358-4314-9108-d3f76fced2b2\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: niri stable v25.02 (commit b94a5db8790339cf9134873d8b490be69e02ac71)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS Unstable [(It's complicated, though)](https://forge.katzen.cafe/schrottkatze/nix-configs/src/commit/2de0639d54e3c24a813e432cfa25eb4d8302cd58/flake.nix#L5-L8)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD RX 6700 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 9 5950X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1348/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        2826
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1336",
      "id": 2942519932,
      "node_id": "I_kwDOKFkxdc6vY0p8",
      "number": 1336,
      "title": "Implement the ext-foreign-toplevel-list protocol",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-03-24T09:03:37Z",
      "updated_at": "2026-01-07T14:56:08Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Requested in https://github.com/YaLTeR/niri/discussions/1333",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1336/reactions",
        "total_count": 7,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 7,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1291",
      "id": 2926708421,
      "node_id": "I_kwDOKFkxdc6ucgbF",
      "number": 1291,
      "title": "Touchpad horizontal view movement (three-finger swiping left/right) doesn't respect `warp-mouse-to-focus`",
      "user": {
        "login": "yrkv",
        "id": 11140316,
        "node_id": "MDQ6VXNlcjExMTQwMzE2",
        "avatar_url": "https://avatars.githubusercontent.com/u/11140316?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/yrkv",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-03-18T00:29:41Z",
      "updated_at": "2025-03-18T05:29:24Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nI have `warp-mouse-to-focus` set in the `input` section of my configuration, but using touchpad gestures to move within the workspace (horizontal view movement) frequently results in a different window being focused than the one under the mouse after swipe gestures, which doesn't happen for binding-based focus changing. I believe it should apply, as in all other ways, touchpad gestures behave equivalent to moving the focus via binds or `niri msg action`.\n\nThis is inconvenient for my usage as when it occurs it makes scrolling and typing go to two different windows after touchpad gestures. This would not happen with other ways of changing which window is focused.\n\nMy expected behavior is for `warp-mouse-to-focus` to cause the mouse to warp to the newly focused window upon the completion of a touchpad left/right swipe gesture.\n\n### System Information\nSystem information shouldn't matter for this, it's a behavior thing.\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: niri 25.02 (0a4cc29a-modified)\n(my local changes do not affect any part of this behavior)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: archlinux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Corporation CoffeeLake-H GT2 [UHD Graphics 630]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1291/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1274",
      "id": 2922311675,
      "node_id": "I_kwDOKFkxdc6uLu_7",
      "number": 1274,
      "title": "Faulty Layer Shell Client Crashes Niri",
      "user": {
        "login": "Riolku",
        "id": 41458184,
        "node_id": "MDQ6VXNlcjQxNDU4MTg0",
        "avatar_url": "https://avatars.githubusercontent.com/u/41458184?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Riolku",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 12,
      "created_at": "2025-03-15T17:16:49Z",
      "updated_at": "2025-03-15T17:46:13Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nI believe I am out of spec, but attaching one WlSurface to two different LayerShell surfaces causes a Niri panic (please do confirm if I am out of spec, I am not 100% sure).\n\nThe panic is [here](https://github.com/YaLTeR/niri/blob/62576796be91a5425abb6a1e8af35ebeca3fbcad/src/handlers/layer_shell.rs#L42).\n\nHere's a simple MWE with wayrs:\n\n```toml\n[package]\nname = \"mwe\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[dependencies]\nwayrs-client = \"1.3.0\"\nwayrs-protocols = { version = \"0.14.7\", features = [\"wlr-layer-shell-unstable-v1\"] }\n```\n\n```rs\nuse wayrs_protocols::wlr_layer_shell_unstable_v1::zwlr_layer_shell_v1::Layer;\nuse wayrs_protocols::wlr_layer_shell_unstable_v1::ZwlrLayerShellV1;\nuse wayrs_client::protocol::WlCompositor;\nuse wayrs_client::Connection;\n\nfn main() {\n    let mut conn: Connection<()> = Connection::connect().expect(\"Connection failed\");\n    conn.blocking_roundtrip().expect(\"Roundtrip failed\");\n\n    let compositor: WlCompositor = conn.bind_singleton(1..=6).expect(\"Failed to bind compositor\");\n    let layer_shell: ZwlrLayerShellV1 = conn.bind_singleton(1).expect(\"Failed to bind layershell\");\n\n    let surface = compositor.create_surface(&mut conn);\n    layer_shell.get_layer_surface(&mut conn, surface, None, Layer::Background, c\"background\".into());\n\n    layer_shell.get_layer_surface(&mut conn, surface, None, Layer::Background, c\"background\".into());\n\n    conn.blocking_roundtrip().expect(\"Roundtrip failed\");\n}\n```\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: niri 25.02 (v25.02-64-g62576796)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD 6700 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 5 5600X 6-Core\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1274/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1231",
      "id": 2905124862,
      "node_id": "I_kwDOKFkxdc6tKK_-",
      "number": 1231,
      "title": "Not able to use Dual Touchscreens Properly",
      "user": {
        "login": "aldenparker",
        "id": 32986873,
        "node_id": "MDQ6VXNlcjMyOTg2ODcz",
        "avatar_url": "https://avatars.githubusercontent.com/u/32986873?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/aldenparker",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-03-09T01:28:58Z",
      "updated_at": "2025-04-20T05:16:01Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When using Niri on my Asus Zenbook Duo, the two touch screens seem to be registered, but do not actual initiate mouse clicks. When I tap the screen, the mouse cursor disappears and the focus is shifted, but only once and then doesn't do it again until make another mouse input. I have setup touchpad configuration below.\n\n\n### System Information\nTouchpad Config (Nix)\n```\ntouchpad = {\n  tap = true;\n  natural-scroll = true;\n  click-method = \"clickfinger\";\n};\n```\n\nRelevant Libinput Device Output\n```\nDevice:           ELAN1406:00 04F3:3101 Mouse\nKernel:           /dev/input/event23\nGroup:            7\nSeat:             seat0, default\nCapabilities:     pointer \nTap-to-click:     n/a\nTap-and-drag:     n/a\nTap drag lock:    n/a\nLeft-handed:      disabled\nNat.scrolling:    disabled\nMiddle emulation: n/a\nCalibration:      n/a\nScroll methods:   *button\nClick methods:    none\nDisable-w-typing: n/a\nDisable-w-trackpointing: n/a\nAccel profiles:   flat *adaptive custom\nRotation:         n/a\n\nDevice:           ELAN1406:00 04F3:3101 Touchpad\nKernel:           /dev/input/event24\nGroup:            7\nSeat:             seat0, default\nSize:             58x81mm\nCapabilities:     pointer gesture\nTap-to-click:     disabled\nTap-and-drag:     enabled\nTap drag lock:    disabled\nLeft-handed:      disabled\nNat.scrolling:    disabled\nMiddle emulation: disabled\nCalibration:      n/a\nScroll methods:   *two-finger edge \nClick methods:    *button-areas clickfinger \nDisable-w-typing: enabled\nDisable-w-trackpointing: enabled\nAccel profiles:   flat *adaptive custom\nRotation:         n/a\n\nDevice:           ELAN1406:00 04F3:3101 Keyboard\nKernel:           /dev/input/event25\nGroup:            7\nSeat:             seat0, default\nCapabilities:     keyboard \nTap-to-click:     n/a\nTap-and-drag:     n/a\nTap drag lock:    n/a\nLeft-handed:      n/a\nNat.scrolling:    n/a\nMiddle emulation: n/a\nCalibration:      n/a\nScroll methods:   none\nClick methods:    none\nDisable-w-typing: n/a\nDisable-w-trackpointing: n/a\nAccel profiles:   n/a\nRotation:         0.0\n\nDevice:           ELAN9008:00 04F3:29B6\nKernel:           /dev/input/event14\nGroup:            8\nSeat:             seat0, default\nSize:             332x188mm\nCapabilities:     touch \nTap-to-click:     n/a\nTap-and-drag:     n/a\nTap drag lock:    n/a\nLeft-handed:      n/a\nNat.scrolling:    n/a\nMiddle emulation: n/a\nCalibration:      identity matrix\nScroll methods:   none\nClick methods:    none\nDisable-w-typing: n/a\nDisable-w-trackpointing: n/a\nAccel profiles:   n/a\nRotation:         0.0\n\nDevice:           ELAN9008:00 04F3:29B6 Stylus\nKernel:           /dev/input/event27\nGroup:            8\nSeat:             seat0, default\nSize:             343x194mm\nCapabilities:     tablet \nTap-to-click:     n/a\nTap-and-drag:     n/a\nTap drag lock:    n/a\nLeft-handed:      n/a\nNat.scrolling:    n/a\nMiddle emulation: n/a\nCalibration:      identity matrix\nScroll methods:   none\nClick methods:    none\nDisable-w-typing: n/a\nDisable-w-trackpointing: n/a\nAccel profiles:   none\nRotation:         n/a\n\nDevice:           ELAN9009:00 04F3:29A1\nKernel:           /dev/input/event16\nGroup:            9\nSeat:             seat0, default\nSize:             332x96mm\nCapabilities:     touch \nTap-to-click:     n/a\nTap-and-drag:     n/a\nTap drag lock:    n/a\nLeft-handed:      n/a\nNat.scrolling:    n/a\nMiddle emulation: n/a\nCalibration:      identity matrix\nScroll methods:   none\nClick methods:    none\nDisable-w-typing: n/a\nDisable-w-trackpointing: n/a\nAccel profiles:   n/a\nRotation:         0.0\n\nDevice:           ELAN9009:00 04F3:29A1 Stylus\nKernel:           /dev/input/event19\nGroup:            9\nSeat:             seat0, default\nSize:             343x98mm\nCapabilities:     tablet \nTap-to-click:     n/a\nTap-and-drag:     n/a\nTap drag lock:    n/a\nLeft-handed:      n/a\nNat.scrolling:    n/a\nMiddle emulation: n/a\nCalibration:      identity matrix\nScroll methods:   none\nClick methods:    none\nDisable-w-typing: n/a\nDisable-w-trackpointing: n/a\nAccel profiles:   none\nRotation:         n/a\n```\n\n* niri version: niri stable v25.02 (commit b94a5db8790339cf9134873d8b490be69e02ac71)\n* Distro: NixOS Stable (24.11)\n* GPU: NVIDIA GeForce RTX 2060 Mobile\n* CPU: Intel(R) Core(TM) i9-10980HK\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1231/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        1856
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1225",
      "id": 2903971015,
      "node_id": "I_kwDOKFkxdc6tFxTH",
      "number": 1225,
      "title": "Niri shouldn't only use raw keys when resolving key binds",
      "user": {
        "login": "feathecutie",
        "id": 53912746,
        "node_id": "MDQ6VXNlcjUzOTEyNzQ2",
        "avatar_url": "https://avatars.githubusercontent.com/u/53912746?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/feathecutie",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-03-07T21:24:51Z",
      "updated_at": "2025-03-11T06:28:40Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I use a multi-layered keyboard layout that is a derivative of the [Neo keyboard layout](https://en.wikipedia.org/wiki/Neo_(keyboard_layout)).\n\nThis keyboard layout has arrow keys bound to `ISO_Level5_Shift+{S,E,D,F}`, which I want to be able to use as arrow keys in my niri keybinds. However, I can't get any keybinds involving arrow keys to activate using these keys.\nI have confirmed that these arrow keys work in every other piece of software I tested and even get reported correctly by `wev`.\n\nAfter looking at the input code in niri and logging some variables, I saw that the relevant keys actually get resolved correctly in the `modified` variable that gets passed to the `find_bind` function, but that variable simply gets ignored when actually looking up the keybinds:\n\nhttps://github.com/YaLTeR/niri/blob/88fcf0c2a996ef61bb1f51cb02afa7686de1bbe1/src/input/mod.rs#L3097-L3141\n\nI assume that I could somehow work around this issue by hardcoding my keybinds to e.g. `Mod+ISO_Level5_Shift+F` instead of `Mod+Right`, but that would make my niri config dependent on my keyboard layout, which I sometimes have to switch on the fly.\n\nIt would be great if Niri could allow looking up keybinds based on the `modified` variable, and not just based on the raw key, potentially even making this configurable in case this is unwanted by some users.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1225/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1218",
      "id": 2901109831,
      "node_id": "I_kwDOKFkxdc6s62xH",
      "number": 1218,
      "title": "double scaling of .exe running via wine wayland driver",
      "user": {
        "login": "MarkGhanz",
        "id": 104331300,
        "node_id": "U_kgDOBjf4JA",
        "avatar_url": "https://avatars.githubusercontent.com/u/104331300?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MarkGhanz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 10,
      "created_at": "2025-03-06T18:16:49Z",
      "updated_at": "2025-05-25T07:20:43Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "![Image](https://github.com/user-attachments/assets/9ec8ca25-e0f0-468f-baee-3e90886861ff)\n\nRunning a game via wine wayland driver (setting env var DISPLAY= ) results in the game, although fullscreen, being scaled two times. The display scale is 2.\n<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: \nniri 25.02 (unknown commit)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: \nArch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \nAMD Radeon 780M\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\nAMD Ryzen 7 7840U\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1218/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1214",
      "id": 2899229440,
      "node_id": "I_kwDOKFkxdc6szrsA",
      "number": 1214,
      "title": "Add a way to skip cursor-only updates during VRR",
      "user": {
        "login": "Gwenodai",
        "id": 14289733,
        "node_id": "MDQ6VXNlcjE0Mjg5NzMz",
        "avatar_url": "https://avatars.githubusercontent.com/u/14289733?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gwenodai",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 14,
      "created_at": "2025-03-06T03:27:43Z",
      "updated_at": "2025-05-06T09:17:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nI recently decided to give Niri another shot considering there's been quite a bit of development since I last checked in. Everything is really great so far, but I did notice something that makes me hesitant to use Niri as my daily driver, or at least not when I want to play certain games.\n\nNormally when VRR is enabled the games refresh rate dictactes the the monitors refresh rate. However, with games where there is a visible on screen cursor this doesn't seem to be the case. Of the few games I've tested that make use of a visible cursor (BG3 and Mini Airways) they both seem to ignore the game refresh rate when the cursor is in motion. In that situation the cursor gets updated at the speed of the monitor, which for me is 144hz. This causes output to the monitor to be delivered at a full 144hz despite the game itself outputing a much lower framerate.\n\nI'm not sure if this is expected behaviour in Niri at this point in its development or not, so I figured I should make a bug report. Especially since I'd previously made a [similar bug report](https://github.com/YaLTeR/niri/issues/855) which turned out to be a different issue due to my particular hardware situation at the time (which is no longer the case). \n\nI will note that I've tried the `disable-cursor-plane` debug flag in hopes that it might solve the issue, but it didn't work (although I doubted it would help here).\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: niri 25.02 (0.0.git.1904.26618f8d)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Fedora 41\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD RX 6700 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD R9 3900X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1214/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1197",
      "id": 2889608031,
      "node_id": "I_kwDOKFkxdc6sO-tf",
      "number": 1197,
      "title": "external display background color incorrect after suspend",
      "user": {
        "login": "emenel",
        "id": 13215,
        "node_id": "MDQ6VXNlcjEzMjE1",
        "avatar_url": "https://avatars.githubusercontent.com/u/13215?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/emenel",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-03-02T15:11:27Z",
      "updated_at": "2025-03-21T18:30:11Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When waking from suspend, with my laptop closed and an external monitor connected, the background color of the desktop is wrong. \n\nBefore sleep the color is correct based on my settings. It then turns grey when the monitor turns back on after suspend.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: niri unstable 2025-03-01 (commit 36b28d9b96107441e3f8502a61f598fb666ec492)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Phoenix3 / NVIDIA GeForce RTX 4070\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 9 8945HS\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1197/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1194",
      "id": 2889284076,
      "node_id": "I_kwDOKFkxdc6sNvns",
      "number": 1194,
      "title": "niri does not send a wl_pointer::enter event when layer surfaces spawn on the pointer",
      "user": {
        "login": "zeroeightysix",
        "id": 27009727,
        "node_id": "MDQ6VXNlcjI3MDA5NzI3",
        "avatar_url": "https://avatars.githubusercontent.com/u/27009727?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zeroeightysix",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-03-02T02:38:01Z",
      "updated_at": "2025-03-11T06:30:27Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'm writing a wayland client using sctk and running into the problem that pointer events aren't getting through if the surface's input region covers the pointer when it spawns. Sctk will refuse to pass on any motion events until it has seen a `wl_pointer::enter`:\n\nhttps://github.com/Smithay/client-toolkit/blob/4cf0deff833012bc93e3b58d0f1c1c33bc0ee8bf/src/seat/pointer/mod.rs#L372\n\nThe wording of `wl_pointer::enter`:\n> \"Notification that this seat's pointer is focused on a certain surface.\"\n\nseems to suggest that this really does need to be sent once the compositor decides that any new pointer events will go to this surface, and not only when the pointer moves from one region to another?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1194/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1174",
      "id": 2878830811,
      "node_id": "I_kwDOKFkxdc6rl3jb",
      "number": 1174,
      "title": "Bring newly active window into view before freezing for interactive move",
      "user": {
        "login": "Hofer-Julian",
        "id": 30049909,
        "node_id": "MDQ6VXNlcjMwMDQ5OTA5",
        "avatar_url": "https://avatars.githubusercontent.com/u/30049909?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Hofer-Julian",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-02-25T15:48:55Z",
      "updated_at": "2025-02-25T16:01:00Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Since DnD scroll was introduced moving Windows to the left or right became a bit more annoying.\nI would have expected a drop target at the left like I think it used to be, but I have to scroll quite a bit further until I can drop the window. \n\nhttps://github.com/user-attachments/assets/26a93de3-903c-410d-a5c9-3a122af70e71",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1174/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1126",
      "id": 2852010835,
      "node_id": "I_kwDOKFkxdc6p_jtT",
      "number": 1126,
      "title": "Fragments of wayneko sprites all along bottom of the screen after locking and unlocking",
      "user": {
        "login": "Anomalocaridid",
        "id": 29845794,
        "node_id": "MDQ6VXNlcjI5ODQ1Nzk0",
        "avatar_url": "https://avatars.githubusercontent.com/u/29845794?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Anomalocaridid",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-02-13T20:14:35Z",
      "updated_at": "2025-02-18T07:21:39Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nWhen using [wayneko](https://sr.ht/~leon_plickat/wayneko/), under certain circumstances, such as after locking and unlocking the screen, the bottom of the screen gets peppered with random fragments of sprites that do not go away unless wayneko's cat walks over them.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: `niri stable v25.01 (commit e05bc269e678ecf828b96ae79c991c13b00b38a5)`\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS unstable\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon RX 580 Series\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 3700X\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1126/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1120",
      "id": 2844861574,
      "node_id": "I_kwDOKFkxdc6pkSSG",
      "number": 1120,
      "title": "Focus application on overlay layer doesn't turn back to it when parent windows are closed",
      "user": {
        "login": "stefonarch",
        "id": 10681413,
        "node_id": "MDQ6VXNlcjEwNjgxNDEz",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/stefonarch",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-02-11T09:46:27Z",
      "updated_at": "2025-02-11T14:18:05Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri 25.01 (v0.1.10-349-g20769b4c)\n\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: arch\n\nIn Qterminal git \"Preferences\" and \"fontdialog\" windows open on the overlay layer too, as qterminal dropdown mode does, using `F12 { spawn \"qterminal\" \"-d\"; }`. \n\nWhen closing the font dialog focus should go back to \"Preferences\" but goes to the underlying top level window, same when closing \"Preferences\" dialog: focus should go back to the dropdown terminal.\n\nEven when `focus-follows-mouse max-scroll-amount=\"0%\"` is enabled this happens, terminal needs a click to get back focus.\n\nProbably not many applications are on overlay windows, it looks like only kwin and hyprland get that focus handling right.\n\n\n\n\n\n\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1120/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1116",
      "id": 2844381688,
      "node_id": "I_kwDOKFkxdc6pidH4",
      "number": 1116,
      "title": "Explore making modal dialogs float inside the scrolling layout",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-02-11T06:25:33Z",
      "updated_at": "2025-02-11T06:25:33Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It is somewhat of a frequent request to be able to put floating windows into the scrolling layout so that they scroll together with other windows. However, this doesn't really work well in general.\n\n1. The floating window can easily get lost in the scrolling layout, e.g. end up outside to the right, beyond all other windows, making it unreachable. This could be somewhat fixed by clamping its position.\n \n    However, even then, the floating window will appear to randomly jump around the layout, since the window coordinates change abruptly. For example, closing a window to the left of the active window appears to preserve the active window's position, but actually it jumps the active window and all subsequent windows to the left.\n\n    This will be visible if there's a floating window inside the layout because it will just randomly jump around. You can observe it with a closing window animation if you make it slow enough, since it's a floating element inside the scrolling layout.\n\n2. There's no longer an obvious/consistent way to navigate to the floating window with keyboard. If `focus-column-left/right` moves by columns, then how do you focus the floating window between the columns? How do you switch between that floating window and floating windows in the normal floating layout? How do you move windows between floating \"inside\" scrolling and floating \"outside\"?\n\nFortunately, there's a case that solves both 1 and 2: modal dialogs. They are most commonly used by GTK apps (only by GTK apps?), and only just recently a public Wayland protocol was merged that lets windows indicate the modal state: https://wayland.app/protocols/xdg-dialog-v1\n\nModal dialogs are dialogs (= has a parent window) that block input to the parent window.\n\n1. They solve problem 1 by having a parent window. We can pin their position to that parent window in the scrolling layout.\n2. They solve problem 2 by blocking input to the parent window. Which means that we can leave all keyboard navigation unchanged, and simply focus the dialog instead of the parent window when the parent window would get focus.\n\nThe way I envision this would work is similar to GNOME/Mutter: modal dialogs are always centered \"over\" their parent window, and you cannot separate the two. Though, it's still not entirely clear to me how some things will work from the niri side, e.g. what if the dialog goes bigger than the parent. I think in this case we can treat the dialog min size as the parent min size, and expand the column to accommodate it.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1116/reactions",
        "total_count": 16,
        "+1": 14,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 2
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1115",
      "id": 2844212875,
      "node_id": "I_kwDOKFkxdc6phz6L",
      "number": 1115,
      "title": "[WAIT FOR UPSTREAM] chromium windows in tabs don't well with fcitx5",
      "user": {
        "login": "Bot-wxt1221",
        "id": 74451279,
        "node_id": "MDQ6VXNlcjc0NDUxMjc5",
        "avatar_url": "https://avatars.githubusercontent.com/u/74451279?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Bot-wxt1221",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 27,
      "created_at": "2025-02-11T03:56:04Z",
      "updated_at": "2025-06-16T10:45:30Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If I open two microsoft-edge in the same tab. First input in one then switch to another.\n\n### System Information\n\n\n* niri version: niri unstable 2025-02-10 (commit 20769b4c2f843566880f020f117e7bde36edc332)\n\nHow can I upload a mkv?\n\nhttps://github.com/user-attachments/assets/4c491e58-96f8-4029-a8fa-72c4757a9f6a\n\nTo be honest, it is not a big problem. Konsole can't reduce this error.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1115/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1084",
      "id": 2829101756,
      "node_id": "I_kwDOKFkxdc6ooKq8",
      "number": 1084,
      "title": "Pinebook Pro display experiences significant graphical corruption",
      "user": {
        "login": "Bluberry-Kat",
        "id": 20749209,
        "node_id": "MDQ6VXNlcjIwNzQ5MjA5",
        "avatar_url": "https://avatars.githubusercontent.com/u/20749209?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Bluberry-Kat",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-02-04T04:33:26Z",
      "updated_at": "2025-08-02T22:55:27Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nNiri doesn't run on the Pinebook Pro out of the box (similarly to the PinePhone in #320), but can be made to launch by modifying `render-drm-device`.  \nWhen launched the environment looks as follows:\n\n![Photo of the corrupted screen. The background (which should be grey) is green, the text is purple, and in general the exposure is mega blown-out.](https://github.com/user-attachments/assets/33a147d1-71d7-4055-9b4e-60401e4492d1)\nTwo interesting notes:\n* The issue _is not reproduced_ when running niri in a nested session (i.e Sway).\n* The graphical corruption persists until a functioning graphical environment is present (i.e When `niri-session` is ran via a TTY the corruption still persists after niri exits, but does not persist when being ran via SDDM).\n\nLog output is included here:\n[niri.log](https://github.com/user-attachments/files/18651690/niri.log)\n\nThis issue has been briefly mentioned before in the matrix. My Pinebook is hardly a daily driver, so I'm willing to tinker with it extensively if you need more information.\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: 25.01-1\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Manjaro ARM\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Mali T864\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Rockchip RK3399\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1084/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1071",
      "id": 2821306013,
      "node_id": "I_kwDOKFkxdc6oKbad",
      "number": 1071,
      "title": "Vertical layout option for portrait monitors",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187133,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI4_Q",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:layout",
          "name": "area:layout",
          "color": "fbca04",
          "default": false,
          "description": "Columns, workspaces, scrolling, fullscreen, resize"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 29,
      "created_at": "2025-01-30T16:40:36Z",
      "updated_at": "2026-03-01T07:06:13Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Instead of infinite horizontal and fixed vertical space, for portrait monitors it makes sense to have infinite vertical and fixed horizontal space. So the same scrolling layout, but going down instead of to the right. And I guess workspaces go sideways then?\n\nOriginally requested in: https://github.com/YaLTeR/niri/discussions/757\n\nUnfortunately, this would be quite an annoying and complex refactor in the code.\n\nAs an easier alternative, #401 will let you open windows as maximized by default on the portrait monitor.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1071/reactions",
        "total_count": 155,
        "+1": 133,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 8,
        "rocket": 0,
        "eyes": 14
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1067",
      "id": 2817570484,
      "node_id": "I_kwDOKFkxdc6n8La0",
      "number": 1067,
      "title": "vscode context menu appears on wrong workspace",
      "user": {
        "login": "notpeelz",
        "id": 920910,
        "node_id": "MDQ6VXNlcjkyMDkxMA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/920910?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/notpeelz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-01-29T08:42:02Z",
      "updated_at": "2025-02-13T15:31:50Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When multiple vscode windows are open (on different workspaces), the context menu doesn't appear on the correct window.\n\nhttps://github.com/user-attachments/assets/adbe019c-bcc5-4b14-a566-4bc4be2711b0\n\nI wasn't able to reproduce this on sway or labwc.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: niri 25.01 (v0.1.10-260-gbeef2da6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD RX 6900 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 9 3900X",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1067/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1024",
      "id": 2799810267,
      "node_id": "I_kwDOKFkxdc6m4bbb",
      "number": 1024,
      "title": "Zoom/magnifier",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 17,
      "created_at": "2025-01-20T16:31:57Z",
      "updated_at": "2026-02-03T19:10:01Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Accessibility feature that zooms in the screen around the cursor.\n\nThis works https://github.com/negrel/wooz but is a bit fiddly to run.\n\nNeed to see how the magnifier works in other compositors, especially GNOME and KDE. I pretty much never used it so I'm not sure what the expected UX is.\n\nTentatively, I'm thinking discrete actions could look something like:\n```\nbinds {\n    Mod+Alt+WheelScrollUp   { set-zoom-level \"+10%\"; }\n    Mod+Alt+WheelScrollDown { set-zoom-level \"-10%\"; }\n}\n```\n\nBut it should ideally be a gesture to use high-precision touchpad swipe input and high-precision scroll inputs (if the mouse supports it).\n\nFor other monitors (the ones where the cursor currently *isn't*) I guess we don't do any zooming?\n\nWhen opening the screenshot UI, need to see what would feel good to use.\n\nImplementation-wise, idk how cursed it would be to simply scale all render elements on an output? If it works, then it's probably fine for the first implementation. Though, it will do bilinear scaling rather than nearest.\n\nIf this doesn't work, or for nearest scaling, we would probably want to render into a texture, then render that texture, upscaled around the cursor with the nearest filter. Not sure how this will work with damage tracking though.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1024/reactions",
        "total_count": 66,
        "+1": 42,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 15,
        "rocket": 0,
        "eyes": 9
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/1012",
      "id": 2797445834,
      "node_id": "I_kwDOKFkxdc6mvaLK",
      "number": 1012,
      "title": "Workspace window rules",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-01-19T05:53:40Z",
      "updated_at": "2025-06-19T12:02:51Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'm thinking, just have the window rule blocks inside a `workspace \"name\" {` block. (And, as a separate issue, a `layout {}` block too?)\n\nThe alternative is `match workspace=\"name\"`, but this will cycle with `open-on-workspace`, which the solution above avoids.\n\nExample use: having a \"sensitive\" workspace where all windows are blocked out from screencast: https://github.com/YaLTeR/niri/discussions/1009",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/1012/reactions",
        "total_count": 7,
        "+1": 7,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/978",
      "id": 2787865936,
      "node_id": "I_kwDOKFkxdc6mK3VQ",
      "number": 978,
      "title": "Add `default-floating-position relative-to=\"cursor\"` window rule",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-01-14T17:31:29Z",
      "updated_at": "2026-02-04T12:51:15Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "See: https://github.com/YaLTeR/niri/discussions/972\r\n\r\nIf the cursor (or rather, the window) is on a different output or workspace, then just ignore the window rule.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/978/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/955",
      "id": 2781744098,
      "node_id": "I_kwDOKFkxdc6lzgvi",
      "number": 955,
      "title": "One-to-many swap-window-left/right changes the view position when columns have different width",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-01-11T10:10:18Z",
      "updated_at": "2025-01-11T10:10:18Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Some cases might be tricky to fix since windows don't change size immediately. We don't want to do any waiting for the window to change size before changing the view position. Also check how consume/expel/move handle this.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/955/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/951",
      "id": 2777966093,
      "node_id": "I_kwDOKFkxdc6llGYN",
      "number": 951,
      "title": "Window rule for CSD and/or Tiled state",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-01-09T14:18:44Z",
      "updated_at": "2026-03-01T22:54:53Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Our `prefer-no-csd` flag is global and only applies to newly spawned applications. The reason for this is that many versions of SDL 2 shipped with a bug where if an xdg-decoration global is present at window creation but signals CSD preference, the window would never show up. So the way `prefer-no-csd` is implemented in niri is by straight up hiding the xdg-decoration global from all clients when it's off.\r\n\r\nHowever, if the client already sees the xdg-decoration global, nothing prevents us from asking it to use CSD, so let's add a window rule like `force-csd true` for that. (`prefer-no-csd` combined with a blanket `force-csd true` rule will trigger the aforementioned SDL 2 bug, but we won't have that in the default config, so it's fine.)\r\n\r\nThe Tiled state is an entirely orthogonal concept from xdg-shell. Niri uses it together with `prefer-no-csd` because it makes GTK 4 and other clients square their rounded corners. It would also be useful to control that from a window rule, e.g. to switch from square-corner SSD to rounded-corner CSD for floating windows. Or to disable the Tiled state when `prefer-no-csd` is set for whatever reason. Something like `tiled-state true/false`.\r\n\r\nNote that this prevents us from adding an `is-tiled=true` matcher so as not to introduce a window rule cycle. I think that a tiled state rule should be more useful than the tiled state matcher, so let's add the rule.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/951/reactions",
        "total_count": 8,
        "+1": 7,
        "-1": 0,
        "laugh": 0,
        "hooray": 1,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/932",
      "id": 2769140887,
      "node_id": "I_kwDOKFkxdc6lDbyX",
      "number": 932,
      "title": "Pinned/sticky/show on all workspaces floating windows",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 10,
      "created_at": "2025-01-05T06:41:48Z",
      "updated_at": "2026-02-01T20:16:48Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Add some way to show a floating window on all workspaces. For things like picture-in-picture, webcam, etc.\r\n\r\nI'm not entirely sure what would be the best way to structure the code.\r\n\r\n1. UX-wise, it would make sense to have an extra floating space for pinned windows on a Monitor, that renders above all workspaces. This would require somehow integrating keyboard navigation between workspace-local and pinned floating spaces, so e.g. `focus-window-up` considers windows in both.\r\n1. Other compositors seem to duplicate pinned windows in all workspaces. So they look like they sit inside each workspace's own floating space, but on all workspaces at once. This makes keyboard navigation obvious, but our Layout code really doesn't expect one window to live in several places at once.\r\n\r\nI think option 1 should be easier to implement and result in clearer UX, but as usual, need to try to see what kind of roadblocks I bump into.\r\n\r\nOf course both of these should have actions to toggle/set pinned status, a window rule to open-pinned, probably a window rule matcher for is-pinned.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/932/reactions",
        "total_count": 347,
        "+1": 307,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 22,
        "rocket": 18,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/915",
      "id": 2765238989,
      "node_id": "I_kwDOKFkxdc6k0jLN",
      "number": 915,
      "title": "Spawn with a custom window rule",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-01-01T20:07:46Z",
      "updated_at": "2026-02-25T03:10:39Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Add a custom window rule argument to `niri msg action spawn` that applies properties to the first window created by the spawned process. For example, to spawn just one application window as floating, or at specific coordinates.\r\n\r\n```\r\nniri msg action spawn --rule 'open-floating true; default-floating-position x=100 y=100' -- foot\r\n```\r\n\r\nOne question is how to represent this in the IPC structures. It would make sense to accept the same KDL as in the config for `niri msg action spawn`. However, it would also make sense to write out the window rule properties inside IPC structures, and pass them along with the rest of the action as JSON. And on the contrary, I don't like the idea of having a `rule: String` in IPC which is then parsed as KDL inside the niri server process.\r\n\r\nSo maybe we could put the window rule properties into the IPC structures and parse the config KDL in the client `niri msg` process? This unfortunately results in some duplication of window rule structures between the config and the IPC, but I guess that's not too bad.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/915/reactions",
        "total_count": 39,
        "+1": 27,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 11,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/914",
      "id": 2765236584,
      "node_id": "I_kwDOKFkxdc6k0ilo",
      "number": 914,
      "title": "Bind/run multiple actions at once",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 16,
      "created_at": "2025-01-01T20:01:10Z",
      "updated_at": "2026-02-19T15:40:05Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Allow binds to run several actions sequentially, e.g.:\r\n\r\n```\r\nMod+G {\r\n    focus-column-right\r\n    consume-or-expel-window-left\r\n}\r\n```\r\n\r\nAnd, more importantly, add some way to run several actions as a batch through IPC and `niri msg action`. This will allow doing several actions as one atomic sequence and with no delay in-between, which is currently impossible.\r\n\r\nHere the binds and the IPC part should be straightforward, but I'm not sure how to parse the arguments in `niri msg action`. Maybe clap offers something?\r\n\r\nAnother question is what to do if only one action in the sequence fails a check like `allow-when-locked`. Here I guess we ignore just the action that fails the check, same as what would happen if you were to run several `niri msg action` commands one after another.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/914/reactions",
        "total_count": 39,
        "+1": 38,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/913",
      "id": 2765234125,
      "node_id": "I_kwDOKFkxdc6k0h_N",
      "number": 913,
      "title": "Long-running custom shaders",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 24,
      "created_at": "2025-01-01T19:53:50Z",
      "updated_at": "2026-02-18T15:46:56Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently you can set a custom shader for short animations (window open, close, resize) but not for something long-running. For example, you can't put a custom shader on a window or an output in general.\r\n\r\nThis can be used for fun effects, but also for things like grayscale mode, or desaturating unfocused windows and such.\r\n\r\nThe reason I haven't added it yet is that it requires some damage tracking design. While short animations can sidestep the problem and always draw with full damage, anything long-running should report correct damage whenever possible since this massively affects power consumption and background system load.\r\n\r\nI have two ideas on how to handle this.\r\n\r\nOne is to have a property that you must set when using a custom shader that tells niri how it affects damage. The two obvious values are: does not affect damage (i.e. the shader changes each pixel independently), requires full damage (the shader can do whatever it wants, but same input texture always produces the same output texture), and requires full damage and is animated (the shader can do whatever it wants and accepts current time as input for animations).\r\n\r\nSecond idea is to also offer different shader interfaces for these values. Like, for shaders that do not affect damage, offer a `vec4 process(vec4 color)` interface that processes each pixel individually. I suspect this could be unnecessarily limiting, and well, if you're writing a custom shader and set the damage property wrong, then the worst thing that can happen is you get some weird redrawing on screen.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/913/reactions",
        "total_count": 85,
        "+1": 47,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 27,
        "rocket": 0,
        "eyes": 11
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/888",
      "id": 2754496189,
      "node_id": "I_kwDOKFkxdc6kLka9",
      "number": 888,
      "title": "KDL 2",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2024-12-22T05:25:36Z",
      "updated_at": "2025-12-02T21:59:22Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It's out, and kdl-rs has a killer feature where it can parse v1 or v2 and then convert to v1: https://github.com/YaLTeR/niri/discussions/887\r\n\r\nThis means we can migrate without breaking backwards compatibility!\r\n\r\nWill need to play around with it a bit, see if there's any v2-specific changes I want to make. In particular, maybe I can make it so some [deprecated config syntax](https://github.com/YaLTeR/niri/discussions/447) doesn't work in v2.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/888/reactions",
        "total_count": 23,
        "+1": 12,
        "-1": 0,
        "laugh": 0,
        "hooray": 11,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/881",
      "id": 2748209038,
      "node_id": "I_kwDOKFkxdc6jzleO",
      "number": 881,
      "title": "Min-width vs set-column-width",
      "user": {
        "login": "ItsLemmy",
        "id": 2170677,
        "node_id": "MDQ6VXNlcjIxNzA2Nzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2170677?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ItsLemmy",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2024-12-18T16:04:03Z",
      "updated_at": "2024-12-18T18:34:22Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\nI have a window rule set as \r\n```\r\nwindow-rule {\r\n  min-width 300\r\n}\r\n\r\n```\r\nThe window-rule is working fine and limit the display width accordingly. \r\n\r\nThat being said when I use my key-bind to reduce the width of a column (via set-column-width \"-5%\";) \r\n\r\nIf I keep repeating the -5% command **once the window reached the minimum**,  it does nothing visually which is fine but it seems the logical window size is still updated below the min-width. So I can go below the min-width specified in the window rule.\r\n\r\nSo when I want to grow back the column-width with (set-column-width \"+5%\") I sometimes have to press it multiples times until the column size actually grow.\r\n\r\nIt's a bit hard to describe, hope you understand ;P\r\n\r\n\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/881/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/869",
      "id": 2740036514,
      "node_id": "I_kwDOKFkxdc6jUaOi",
      "number": 869,
      "title": "Crash / Freeze when pluggin in monitor (via USB-C dock)",
      "user": {
        "login": "sternenseemann",
        "id": 3154475,
        "node_id": "MDQ6VXNlcjMxNTQ0NzU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3154475?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sternenseemann",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2024-12-14T18:00:05Z",
      "updated_at": "2025-03-17T11:37:56Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n\r\nI have an USB-C dock and a 2K monitor plugged into it via DisplayPort. When I'm already plugged in before niri is started or when I'm pluggin it in after freshly starting niri (or maybe it's just inconsistent), it works fine.\r\n\r\nOn other occasions when pluggin into the dock, I've experienced the following issues. Either\r\n\r\n- Everything freezes completely (I think I can't even manually switch TTY, but I may be wrong) until I unplug again. (I've experienced this in 0.1.9 and 0.1.10.1.) The other monitor is not activated.\r\n- Everything started by niri crashes, but niri remains. (only experienced this in 0.1.10.1). The other monitor is not activated.\r\n\r\nIt is possible that the crash always happens after some time, I think I've plugged it out relatively quickly in most cases. When it happened, I wasn't actually in the room, so I don't know how quickly it happened.\r\n\r\nThe logs always contain the following entries:\r\n\r\n```\r\nDec 14 18:57:09 wolfgang niri[2279]: 2024-12-14T17:57:09.609582Z DEBUG niri::backend::tty: device changed: 57857\r\nDec 14 18:57:09 wolfgang niri[2279]: 2024-12-14T17:57:09.743209Z  WARN niri::backend::tty: error getting properties: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }\r\nDec 14 18:57:09 wolfgang niri[2279]: 2024-12-14T17:57:09.743278Z  WARN niri::backend::tty: error getting EDID info for DP-4: no EDID property\r\nDec 14 18:57:09 wolfgang niri[2279]: 2024-12-14T17:57:09.743303Z  WARN niri::backend::tty: error getting properties: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }\r\nDec 14 18:57:09 wolfgang niri[2279]: 2024-12-14T17:57:09.743316Z ERROR niri::backend::tty: output ID missing for crtc: crtc::Handle(72)\r\n```\r\n\r\nThe EDID-related entries then get repeated many times.\r\n\r\nIn all cases, a bogus entry to `niri msg outputs` is created that remains even after unplugging:\r\n\r\n```\r\nOutput \"Unknown Unknown Unknown\" (DP-4)\r\n  Current mode: 2560x1440 @ 59.951 Hz (preferred)\r\n  Variable refresh rate: not supported\r\n  Physical size: 550x310 mm\r\n  Logical position: 0, 0\r\n  Logical size: 2560x1440\r\n  Scale: 1\r\n  Transform: normal\r\n  Available modes:\r\n    2560x1440@59.951 (current, preferred)\r\n    2048x1152@60.000\r\n    1920x1200@59.885\r\n    1920x1080@60.000\r\n    1920x1080@60.000\r\n    1920x1080@59.940\r\n    1920x1080@50.000\r\n    1920x1080@30.000\r\n    1920x1080@29.970\r\n    1920x1080@25.000\r\n    1920x1080@24.000\r\n    1920x1080@23.976\r\n    1600x1200@60.000\r\n    1680x1050@59.954\r\n    1280x1024@75.025\r\n    1280x1024@60.020\r\n    1200x960@59.994\r\n    1152x864@75.000\r\n    1280x720@60.000\r\n    1280x720@60.000\r\n    1280x720@59.940\r\n    1280x720@50.000\r\n    1024x768@75.029\r\n    1024x768@60.004\r\n    800x600@75.000\r\n    800x600@60.317\r\n    720x576@50.000\r\n    720x480@60.000\r\n    720x480@60.000\r\n    720x480@59.940\r\n    720x480@59.940\r\n    720x480@59.940\r\n    640x480@75.000\r\n    640x480@60.000\r\n    640x480@59.940\r\n    640x480@59.940\r\n    720x400@70.082\r\n```\r\n\r\nAfter the freeze/crash the following will continue to be logged many times every second, probably due to the bogus monitor entry:\r\n\r\n```\r\nDec 14 18:50:07 wolfgang niri[2279]: 2024-12-14T17:50:07.362731Z  WARN niri::backend::tty: error queueing frame: The underlying drm surface encountered an error: Atomic Test failed for new properties on crtc (crtc::Handle(72))\r\n```\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri 0.1.10-1 (unknown commit)\r\n\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: NixOS\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: Intel Corporation HD Graphics 620 (rev 02)\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz\r\n",
      "closed_by": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/869/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/861",
      "id": 2734886614,
      "node_id": "I_kwDOKFkxdc6jAw7W",
      "number": 861,
      "title": "RTL language (right justification) support",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2024-12-12T05:37:47Z",
      "updated_at": "2025-11-17T21:11:38Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Also see discussion: https://github.com/YaLTeR/niri/discussions/658\r\n\r\nRTL languages like Arabic expect the visual layout to be mirrored horizontally somewhat. In case of niri, there isn't much layout to mirror: mainly we need right justification where windows instead of spawning and tending to the left, spawn and tend to the right side of the screen.\r\n\r\nThis is generally useful outside RTL languages, so maybe it could be a setting on its own, but RTL languages should turn it on by default.\r\n\r\nOur navigation keys (e.g. focus-column-left, focus-column-right) are for the most part directional so they shouldn't need any special changes. Though, I'm not sure about focus-column-first and focus-column-last. What do text editors do when you hit Home and End on RTL? Does Home go to the start of the line (on the right)?\r\n\r\nFor determining whether the current language is RTL, here's what GTK does: https://gitlab.gnome.org/GNOME/gtk/-/blob/72718b719387d15a29bf4524bc721eec490b357e/gtk/gtkmain.c#L774\r\n\r\nFinally, we'll also need to mirror the table in Important Hotkeys. (But maybe not until we actually have translations?) I can't think of anything else right away.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/861/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/856",
      "id": 2730711662,
      "node_id": "I_kwDOKFkxdc6iw1pu",
      "number": 856,
      "title": "Add example to config describing how to power off monitors after locking",
      "user": {
        "login": "Hofer-Julian",
        "id": 30049909,
        "node_id": "MDQ6VXNlcjMwMDQ5OTA5",
        "avatar_url": "https://avatars.githubusercontent.com/u/30049909?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Hofer-Julian",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2024-12-10T17:16:04Z",
      "updated_at": "2025-09-25T13:56:40Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "With the current default behavior, `Mod + Alt + L` opens `swaylock`, but doesn't power off monitors. The config should include a commented out example showing how to add the power-off after logging out.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/856/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/855",
      "id": 2728743492,
      "node_id": "I_kwDOKFkxdc6ipVJE",
      "number": 855,
      "title": "Mouse events cause VRR redraws when direct scanout is inactive",
      "user": {
        "login": "Gwenodai",
        "id": 14289733,
        "node_id": "MDQ6VXNlcjE0Mjg5NzMz",
        "avatar_url": "https://avatars.githubusercontent.com/u/14289733?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gwenodai",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 10,
      "created_at": "2024-12-10T02:01:31Z",
      "updated_at": "2024-12-10T07:58:25Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Niri currently doesn't have a way to prevent cursor updates from incurring a frame draw event seperate from those requested by a fullscreen application. This leads to issues with VRR, particularly in games where the mouse is used as an input. For example; in a first person shooter with a framerate cap of 60fps and VRR enabled on a 144Hz monitor, moving the mouse causes the end result rendered framerate to spike up to the max capable refresh rate of the monitor (144Hz) in spite of what the fullscreen game is actually rendering at (60Hz). Obviously the same goes for games where to cursor is visible as well. This also isn't isolated to mouse movements, but also to mouse button events as well, however that only makes a quick 1 frame spike which might make it hard to spot depending on what info your monitor's OSD allows you to see.\r\n\r\nI believe this is a common issue with many Wayland compositors, but I was unsure if this was on Niri's radar so I figured I'd add it to the issues list. I'm not sure what the correct way of fixing this issue should be, but I know Hyprland implemented a band-aid fix for it which mostly works. As for if other WM's or DE's have properly fixed it, I have no idea.\r\n\r\nI'm honestly unsure if this should be classified as a bug report or maybe an enhancement, but since it causes VRR to function oddly I've reported it as a bug.\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri 0.1.10 (0.0.git.1533.9824321f)\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: Fedora 41\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: AMD RX 470 + AMD RX 6700 XT\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: AMD Ryzen 9 3900X\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/855/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/848",
      "id": 2725159057,
      "node_id": "I_kwDOKFkxdc6ibqCR",
      "number": 848,
      "title": "Open/close animations for built-in dialogs",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-12-08T11:40:07Z",
      "updated_at": "2024-12-08T11:40:07Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'm thinking to just use window-open and window-close settings, at least for the initial impl.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/848/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/846",
      "id": 2725156912,
      "node_id": "I_kwDOKFkxdc6ibpgw",
      "number": 846,
      "title": "Binding modes/binding submaps",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 54,
      "created_at": "2024-12-08T11:35:24Z",
      "updated_at": "2026-01-14T15:58:49Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The ability to configure multiple binding modes with separate binds.\r\n\r\nAn example use-case is a \"launcher\" mode, where e.g. you press Super+D, then instead of the normal binds, you have binds to run applications, like F for firefox, N for nautilus, T for terminal, etc. So you press Super+D+F to run firefox.\r\n\r\nThere's a WIP implementation for binding modes: https://github.com/YaLTeR/niri/pull/532. The author's GitHub account had disappeared, but I remember about the PR and will get to it at some point.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/846/reactions",
        "total_count": 79,
        "+1": 79,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/845",
      "id": 2725151016,
      "node_id": "I_kwDOKFkxdc6iboEo",
      "number": 845,
      "title": "Scratch workspaces",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-12-08T11:26:48Z",
      "updated_at": "2024-12-08T11:26:49Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "These are special workspaces that you can bring up on top of the current workspace. They don't show up in the workspace list.\r\n\r\nOne example use is putting a volume control window on a scratch workspace, so that you can bring it up anywhere you are. Or a dropdown terminal like thing (on a scratch workspace instead of dropdown).\r\n\r\nSee this discussion for more details and design: https://github.com/YaLTeR/niri/discussions/329",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/845/reactions",
        "total_count": 105,
        "+1": 102,
        "-1": 0,
        "laugh": 0,
        "hooray": 1,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/844",
      "id": 2725148104,
      "node_id": "I_kwDOKFkxdc6ibnXI",
      "number": 844,
      "title": "Tearing flip support",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2024-12-08T11:24:04Z",
      "updated_at": "2025-12-14T02:59:33Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Useful for games and stuff to get the lowest input latency.\r\n\r\nWe're mainly waiting for https://github.com/Smithay/smithay/pull/1335 which is waiting for some driver stuff (?). Then on the niri side we can make tearing a window rule just like [on-demand VRR](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#variable-refresh-rate).\r\n\r\nThere's also https://github.com/Smithay/smithay/pull/1325 for the Wayland protocol, which is needed so windows can automatically request tearing without a manual window rule.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/844/reactions",
        "total_count": 52,
        "+1": 52,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/843",
      "id": 2725144791,
      "node_id": "I_kwDOKFkxdc6ibmjX",
      "number": 843,
      "title": "Explicit sync/drm-syncobj support",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2024-12-08T11:21:10Z",
      "updated_at": "2025-07-13T12:53:01Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Waiting for Cosmic to iron out all the bugs and merge it over here: https://github.com/pop-os/cosmic-comp/pull/411",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/843/reactions",
        "total_count": 9,
        "+1": 9,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/842",
      "id": 2724799979,
      "node_id": "I_kwDOKFkxdc6iaSXr",
      "number": 842,
      "title": "4 monitor setup very choppy and flickering",
      "user": {
        "login": "jens-hj",
        "id": 33258502,
        "node_id": "MDQ6VXNlcjMzMjU4NTAy",
        "avatar_url": "https://avatars.githubusercontent.com/u/33258502?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jens-hj",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 12,
      "created_at": "2024-12-07T20:22:01Z",
      "updated_at": "2025-01-03T12:09:53Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n### Problem\r\nI have 3 2k monitors and one 4k (Samsung TV). Previously I have been unable to get the 4k one detected at all, but it seems to be able to do so now. However, in order to get all monitors to display a proper image I have to lower their refresh rate to ~120Hz each, whereas they are all 165Hz monitors except for the 4k TV.\r\n\r\nSometimes I am able to put two of the three 2k monitors to 165Hz with no issues, but increasing the third above 100Hz will make it flicker at a very high rate, almost looking like it's at half brightness due to being off/showing black half the time, but the flicker itself is also noticeable.\r\n\r\nIt seems completely random to me which of the 3 2k monitors that happen to be the one that wants to flicker on each reboot.\r\n\r\nFurthermore, even though I am able to run the monitors at 120Hz this is not what I see at all, I perceive something much closer to 30-60Hz at most. It is very noticeably choppy and laggy, also very obvious upon scrolling or with animations.\r\n\r\nResult of `niri msg outputs`: [niri-msg-outputs.txt](https://github.com/user-attachments/files/18049753/niri-msg-outputs.txt)\r\nMy outputs configuration: [niri-output-config.txt](https://github.com/user-attachments/files/18049778/niri-output-config.txt)\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri stable 0.1.10-1\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: NixOS 25.05.20241201.ac35b10 (Warbler)\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: NVIDIA RTX 2070S\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: Intel Core i5 12600K\r\n\r\n\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/842/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/837",
      "id": 2704468362,
      "node_id": "I_kwDOKFkxdc6hMumK",
      "number": 837,
      "title": "Problems when opening laptop lid",
      "user": {
        "login": "gro-david",
        "id": 99834433,
        "node_id": "U_kgDOBfNaQQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/99834433?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gro-david",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 11,
      "created_at": "2024-11-29T09:18:01Z",
      "updated_at": "2025-01-01T20:13:21Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\nWhen I open the laptop lid the display turns on, then freezes and turns off again. After pressing any input the display either just turns on and it works from then on, or the behavior above repeats multiple times. Sometimes the same thing happens when I put the system to sleep (either with systemctl suspend or with systemctl hybrid-sleep), or sometimes when I just simply lock the laptop.\r\n\r\nThe whole bug seems very random and does not occur every time or every time the same way.\r\n\r\nHere is my log in journalctl (in this case the display froze and turned off one time after I opened the lid, and after the first input it turned back on and worked from then.) \r\n```\r\nNov 29 09:53:02 gro-david-dell niri[1344]: 2024-11-29T08:53:02.184394Z DEBUG niri::input: lid switch closed\r\nNov 29 10:08:49 gro-david-dell niri[1344]: 2024-11-29T09:08:49.007447Z DEBUG niri::input: lid switch opened\r\nNov 29 10:08:49 gro-david-dell niri[1344]: 2024-11-29T09:08:49.061089Z DEBUG niri::backend::tty: device changed: 57857\r\nNov 29 10:08:52 gro-david-dell niri[1344]: 2024-11-29T09:08:52.312423Z DEBUG niri::backend::tty: device changed: 57857\r\n```\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri 0.1.10-1 (unknown commit)\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: Arch Linux, 6.6.63-1-lts\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: Radeon 780M (Integrated Laptop GPU)\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: AMD Ryzen 7 8840U w/ Radeon 780M Graphics\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/837/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/826",
      "id": 2686339991,
      "node_id": "I_kwDOKFkxdc6gHkuX",
      "number": 826,
      "title": "Modifiers aren't sent to clients with pointer focus",
      "user": {
        "login": "sodiboo",
        "id": 37938646,
        "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
        "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sodiboo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2024-11-23T17:39:03Z",
      "updated_at": "2024-11-23T20:31:23Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n\r\nThe documentation for [`wl_keyboard::modifiers`](https://wayland.app/protocols/wayland#wl_keyboard:event:modifiers) states:\r\n\r\n> The compositor may send this event without a surface of the client having keyboard focus, for example to tie modifier information to pointer focus instead.\r\n\r\nBut niri doesn't currently do this. It only sends this event upon keyboard focus.\r\n\r\n---\r\n\r\nYou can notice this in e.g. a web browser. Focusing a tab in firefox, then *focusing a different window entirely* (and *not* another firefox window), then holding **Shift** and then pressing a *different tab* should cause the range of tabs to be selected. Instead, it only focuses the second tab. Do the same thing but don't focus a different window, and the range will be selected as expected.\r\n\r\nThis can also be noticed in my wayland backend branch, which now handles the `modifiers` event (https://github.com/sodiboo/niri/commit/8c1a0c529fca7823766da7574e27d2427b79ce8b). Unfocus the nested compositor, then hold **Alt** to initiate an interactive move, and try to move a window by LMB-dragging anywhere on it. Nothing will happen. You can only initiate interactive move with the modifier if the nested compositor is already focused. This is how i noticed the issue exists in the first place.\r\n\r\n---\r\n\r\nGiven that routing of such events is mostly handled by Smithay, this *might* be an entirely smithay-side issue? But i'm not quite sure, and didn't feel like investigating to be honest. I have not extensively investigated whether other compositors have the same issue, but i'm *pretty sure* labwc does have the same issue.\r\n\r\n---\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri unstable 2024-11-10 (commit 8b5084576cafd6161ccfe4409f958ec558dda3f3)\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: NixOS 24.11.20241109.76612b1 (Vicuna)\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: AMD Radeon RX 7800 XT\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: AMD Ryzen 5 7600X\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/826/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/823",
      "id": 2679372356,
      "node_id": "I_kwDOKFkxdc6fs_pE",
      "number": 823,
      "title": "Implement input capture portal",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2024-11-21T13:01:47Z",
      "updated_at": "2025-12-19T12:29:47Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Needs EIS most likely.\r\n\r\n### Discussed in https://github.com/YaLTeR/niri/discussions/821",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/823/reactions",
        "total_count": 123,
        "+1": 79,
        "-1": 0,
        "laugh": 0,
        "hooray": 4,
        "confused": 0,
        "heart": 40,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/807",
      "id": 2663007321,
      "node_id": "I_kwDOKFkxdc6eukRZ",
      "number": 807,
      "title": "Not Screenshots",
      "user": {
        "login": "rediskap",
        "id": 110164761,
        "node_id": "U_kgDOBpD7GQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/110164761?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rediskap",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187447,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI6Nw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/not%20niri:smithay",
          "name": "not niri:smithay",
          "color": "bbbbbb",
          "default": false,
          "description": "Smithay issues"
        },
        "1": {
          "id": 10168191280,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJMA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:screencasting",
          "name": "area:screencasting",
          "color": "fbca04",
          "default": false,
          "description": "Screen sharing, PipeWire, screencast portal"
        },
        "2": {
          "id": 10168191396,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJpA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:screencopy",
          "name": "area:screencopy",
          "color": "fbca04",
          "default": false,
          "description": "Issues with wlr/ext-screencopy code"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 58,
      "created_at": "2024-11-15T20:06:06Z",
      "updated_at": "2026-02-22T04:59:43Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: 0.1.10.1-1\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: ArchLinux\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU:  Intel Mobile 4 Series Chipset Integrated G]\r\n\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: Intel(R) Celeron(R)          900 @ 2.19 GHz\r\n* Screenshots are not created at all! When you try to create a screenshot, the screenshot folder is not created. When created in the home directory, according to ~/.config/niri/config.kdl (screenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"). Log: https://pastebin.c yuom/AbS2sd16.\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/807/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/781",
      "id": 2631336969,
      "node_id": "I_kwDOKFkxdc6c1wQJ",
      "number": 781,
      "title": "KDE applications crash when configuring custom keyboard shortcuts",
      "user": {
        "login": "purkka",
        "id": 71334845,
        "node_id": "MDQ6VXNlcjcxMzM0ODQ1",
        "avatar_url": "https://avatars.githubusercontent.com/u/71334845?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/purkka",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2024-11-03T17:10:01Z",
      "updated_at": "2024-11-04T06:25:22Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\nWhen configuring keyboard shortcuts in KDE applications, such as Kate, the application crashes immediately. From the core dump it seems that this is related to Wayland based on the crash occurring in `wl_proxy_get_version`. Not sure if this is a KDE or niri error, but decided to report first since setting shortcuts works on KDE Wayland. Here is a coredump of Kate:\r\n[kate-coredump.zip](https://github.com/user-attachments/files/17611310/kate-coredump.zip)\r\n\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: `niri 0.1.9 (unknown commit)`\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: CachyOS\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: AMD Radeon 780M [Integrated]\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: AMD Ryzen 7 7840U w/ Radeon  780M Graphics (16) @ 3.30 GHz\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/781/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/738",
      "id": 2587992100,
      "node_id": "I_kwDOKFkxdc6aQaAk",
      "number": 738,
      "title": "Pointer input is glitched on flipped-90 outputs",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-10-15T08:11:48Z",
      "updated_at": "2024-10-15T08:11:49Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'm fairly sure it worked at some point before. Haven't looked into it yet.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/738/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/684",
      "id": 2550611198,
      "node_id": "I_kwDOKFkxdc6YBzz-",
      "number": 684,
      "title": "Severe Freeze Upon Re-Entry ",
      "user": {
        "login": "KoshulaDora",
        "id": 97489280,
        "node_id": "U_kgDOBc-RgA",
        "avatar_url": "https://avatars.githubusercontent.com/u/97489280?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KoshulaDora",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 17,
      "created_at": "2024-09-26T13:34:04Z",
      "updated_at": "2026-01-23T14:26:48Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Niri causes a freeze upon re-entry from display manager. The degree of freeze is so severe that none of tty can be called up on with alt+ctrl+f1-6. Nothing moves. Nothing shows. Nothing functions. You will have to force reboot the pc if you want to keep using it. \r\n\r\n### System Information\r\n* niri version: niri 0.1.9 (unknown commit)\r\n* Distro: ArchLinux\r\n* GPU: AMD rx 590\r\n* CPU: Amd Ryzen 5800x\r\n\r\n#### Additional Info\r\n* Display manager: Lightdm\r\n\r\nThis issue doesn't happen with hyprland, sway, i3, or any other wm. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/684/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/678",
      "id": 2533189558,
      "node_id": "I_kwDOKFkxdc6W_We2",
      "number": 678,
      "title": "Check if drm force scan fixes suspended dGPU monitor hotplug and if so do it on some commands",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-09-18T09:24:26Z",
      "updated_at": "2024-09-18T09:24:26Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "On my laptop, as it turns out, the AMD dGPU can get in some sort of power saving state where it doesn't detect hotplugged monitors until a TTY switch or, apparently, even simply running `lspci`. I should check if force-probbing connectors with `DrmScanner` helps this (same thing as in `device_changed()`). If so, maybe it would be worth to force-probe when trying to run `niri msg outputs` and such.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/678/reactions",
        "total_count": 2,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 2
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/676",
      "id": 2531208044,
      "node_id": "I_kwDOKFkxdc6W3yts",
      "number": 676,
      "title": "Race with kanshi loses output configuration when connected outputs change",
      "user": {
        "login": "vilhalmer",
        "id": 201439,
        "node_id": "MDQ6VXNlcjIwMTQzOQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/201439?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/vilhalmer",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2024-09-17T13:42:56Z",
      "updated_at": "2026-02-27T18:46:38Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081258,
        "node_id": "IT_kwDOD3jSk84B2kMq",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-05T12:19:48Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I just switched from sway and carried over my `kanshi` config to disable the internal display on my laptop when at my desk (at least until #145 :). Enable/disabling outputs works correctly when I connect the laptop to my dock, but some sort of race is occurring which causes niri's output config to be ignored when kanshi toggles the internal output right as the external one becomes available. I noticed this because it resets the external display's scale, but I added a `transform \"90\"` to debug and confirmed that it is ignored after the hotplug as well.\r\n\r\nI use an LG DualUp and this also occurs when I split/unsplit the display into two for use with my second machine, which causes the vertical resolution reported to the system to be cut in half/doubled respectively. I think this just appears as a display disconnecting and reconnecting, so probably the same code path. I used this to test below, but the behavior is identical if I physically unplug and replug the laptop dock.\r\n\r\nMy output config:\r\n```\r\noutput \"eDP-1\" {\r\n    scale 1.2\r\n    background-color \"black\"\r\n}\r\n\r\noutput \"LG Electronics LG SDQHD 204NTTQ2H201\" {\r\n    background-color \"black\"\r\n    scale 1\r\n    position x=0 y=0\r\n}\r\n```\r\n\r\nHere are the debug logs at startup, with kanshi launched using `spawn-at-startup`:\r\n```\r\n2024-09-17T13:10:05.456944Z  INFO niri: starting version 0.1.9 (v0.1.9-1-g6ee5b5a)\r\n2024-09-17T13:10:05.464105Z DEBUG niri_config: loaded config from \"/home/vil/.config/niri/config.kdl\"\r\n2024-09-17T13:10:05.532829Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/renderD128\"\r\n2024-09-17T13:10:05.549878Z DEBUG niri::backend::tty: device added: 57857 \"/dev/dri/card1\"\r\n2024-09-17T13:10:05.913167Z DEBUG niri::backend::tty: this is the primary node\r\n2024-09-17T13:10:05.913190Z DEBUG niri::backend::tty: this is the primary render node\r\n2024-09-17T13:10:05.928221Z DEBUG niri::backend::tty: device changed: 57857\r\n2024-09-17T13:10:06.713149Z DEBUG niri::backend::tty: connecting connector: eDP-1\r\n2024-09-17T13:10:06.713440Z DEBUG niri::backend::tty: picking mode: Mode { name: \"2256x1504\", clock: 235690, size: (2256, 1504), hsync: (2304, 2336, 2536), vsync: (1507, 1513, >\r\n2024-09-17T13:10:06.713554Z DEBUG niri::backend::tty: set max bpc to 8\r\n2024-09-17T13:10:06.722257Z DEBUG niri::niri: putting output eDP-1 at x=0 y=0\r\n2024-09-17T13:10:06.722295Z DEBUG niri::backend::tty: connecting connector: DP-1\r\n2024-09-17T13:10:06.722378Z DEBUG niri::backend::tty: picking mode: Mode { name: \"2560x1440\", clock: 241500, size: (2560, 1440), hsync: (2608, 2640, 2720), vsync: (1443, 1448, >\r\n2024-09-17T13:10:06.722417Z DEBUG niri::backend::tty: set max bpc to 8\r\n2024-09-17T13:10:06.726922Z DEBUG niri::niri: putting output DP-1 at x=0 y=0\r\n2024-09-17T13:10:06.726937Z DEBUG niri::niri: putting output eDP-1 at x=2560 y=0\r\n2024-09-17T13:10:06.727046Z  INFO niri: listening on Wayland socket: wayland-1\r\n2024-09-17T13:10:06.727053Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.94603.sock\r\n2024-09-17T13:10:08.137425Z DEBUG niri::backend::tty: disconnecting connector: \"eDP-1\"\r\n2024-09-17T13:10:08.635988Z ERROR niri::backend::tty: missing surface in vblank callback for crtc crtc::Handle(131)\r\n2024-09-17T13:10:08.636576Z DEBUG niri::protocols::output_management: OutputConfiguration: request from an outdated configuration\r\n2024-09-17T13:10:35.992652Z DEBUG niri::backend::tty: device changed: 57857\r\n2024-09-17T13:10:36.203896Z DEBUG niri::backend::tty: disconnecting connector: \"DP-1\"\r\n2024-09-17T13:10:36.282352Z DEBUG niri::backend::tty: connecting connector: eDP-1\r\n2024-09-17T13:10:36.282430Z DEBUG niri::backend::tty: picking mode: Mode { name: \"2256x1504\", clock: 235690, size: (2256, 1504), hsync: (2304, 2336, 2536), vsync: (1507, 1513, >\r\n2024-09-17T13:10:36.282478Z DEBUG niri::backend::tty: set max bpc to 8\r\n2024-09-17T13:10:36.287868Z DEBUG niri::niri: putting output eDP-1 at x=0 y=0\r\n2024-09-17T13:10:36.526377Z DEBUG niri::protocols::output_management: OutputConfiguration: request from an outdated configuration\r\n2024-09-17T13:10:37.301191Z DEBUG niri::backend::tty: device changed: 57857\r\n2024-09-17T13:10:37.371671Z DEBUG niri::backend::tty: connecting connector: DP-1\r\n2024-09-17T13:10:37.371901Z DEBUG niri::backend::tty: picking mode: Mode { name: \"2560x2880\", clock: 483250, size: (2560, 2880), hsync: (2608, 2640, 2720), vsync: (2883, 2893, >\r\n2024-09-17T13:10:37.371998Z DEBUG niri::backend::tty: set max bpc to 8\r\n2024-09-17T13:10:37.385774Z DEBUG niri::niri: putting output DP-1 at x=1880 y=0\r\n2024-09-17T13:10:38.520847Z DEBUG niri::backend::tty: disconnecting connector: \"eDP-1\"\r\n2024-09-17T13:10:38.520912Z DEBUG niri::niri: putting output DP-1 at x=0 y=0\r\n2024-09-17T13:10:39.009349Z ERROR niri::backend::tty: missing surface in vblank callback for crtc crtc::Handle(131)\r\n2024-09-17T13:10:39.012121Z DEBUG niri::protocols::output_management: OutputConfiguration: request from an outdated configuration\r\n```\r\nYou can also see it initially disabling eDP-1, which works fine and doesn't break the external output's config despite also throwing the \"request from an outdated configuration\" message. The later change at 13:10:35 is me switching the display mode (which is why the chosen mode is now 2880) and thus causing a reconnect. After this, the configuration is lost and the scale is the default 1.25.\r\n\r\nI fixed it with `niri msg output DP-1 scale 1.0`, killed kanshi, and changed the display mode again. This time without kanshi, the internal display remains disabled throughout the disconnect/reconnect:\r\n```\r\n2024-09-17T13:11:55.820910Z DEBUG niri::backend::tty: device changed: 57857\r\n2024-09-17T13:11:56.030063Z DEBUG niri::backend::tty: disconnecting connector: \"DP-1\"\r\n2024-09-17T13:11:57.115855Z DEBUG niri::backend::tty: device changed: 57857\r\n2024-09-17T13:11:57.182944Z DEBUG niri::backend::tty: connecting connector: DP-1\r\n2024-09-17T13:11:57.183024Z DEBUG niri::backend::tty: picking mode: Mode { name: \"2560x1440\", clock: 241500, size: (2560, 1440), hsync: (2608, 2640, 2720), vsync: (1443, 1448, 1481), hskew: 0, vscan: 0, vrefresh: 60, mode_type: >\r\n2024-09-17T13:11:57.183056Z DEBUG niri::backend::tty: set max bpc to 8\r\n2024-09-17T13:11:57.187111Z DEBUG niri::niri: putting output DP-1 at x=0 y=0\r\n```\r\nThe configuration is retained.\r\n\r\nI haven't tested with any other wlr-output-management tools to see if this is common to all of them or kanshi-specific.\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri 0.1.9 (v0.1.9-1-g6ee5b5a)\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: Arch Linux\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: Intel Corporation Raptor Lake-P [Iris Xe Graphics] (rev 04)\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: 13th Gen Intel(R) Core(TM) i5-1340P\r\n\r\nP.S.: I love Niri, I had started writing this exact compositor a while ago but ran out of steam. Thanks for building it!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/676/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/664",
      "id": 2525633777,
      "node_id": "I_kwDOKFkxdc6Wihzx",
      "number": 664,
      "title": "On GPUs which fail to initialize EGL, draw an error screen with Cairo",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-09-13T20:24:36Z",
      "updated_at": "2024-09-13T20:24:36Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Should turn on monitors as usual according to the config, then render and show a dumb buffer saying something like \"Failed to initialize graphics acceleration. Press `Super+Shift+E` then `Enter` to exit niri.\" The target audience is: NixOS users with mesa version mismatch, NVIDIA users with old drivers, VM users who forgot to enable hw accel, kmsro users with the wrong device set in the config.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/664/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/663",
      "id": 2525627839,
      "node_id": "I_kwDOKFkxdc6WigW_",
      "number": 663,
      "title": "Render built-in dialog borders with the border shader",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-09-13T20:20:46Z",
      "updated_at": "2024-09-13T20:20:46Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently, they are drawn with Cairo which has some differences and doesn't do shaders. Using our border shader instead will allow customizing the built-in dialog borders the same way as regular window borders.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/663/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/647",
      "id": 2501156881,
      "node_id": "I_kwDOKFkxdc6VFKAR",
      "number": 647,
      "title": "Add by-id workspace referencing to the `niri msg action` CLI",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-09-02T14:51:37Z",
      "updated_at": "2024-09-02T14:51:37Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Use an explicit `--id` argument to disambiguate from the current name/index argument. Might be worth waiting for the clap derive support for exclusive arg groups represented as enums: https://github.com/clap-rs/clap/pull/5700",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/647/reactions",
        "total_count": 7,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 7,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/640",
      "id": 2495135668,
      "node_id": "I_kwDOKFkxdc6UuL-0",
      "number": 640,
      "title": "Visible window borders with negative struts for maximized windows due to scale rounding",
      "user": {
        "login": "sugar700-old",
        "id": 168804988,
        "node_id": "U_kgDOCg_CfA",
        "avatar_url": "https://avatars.githubusercontent.com/u/168804988?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sugar700-old",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2024-08-29T17:26:33Z",
      "updated_at": "2024-08-29T19:44:39Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n\r\nWith the following layout  configuration (https://git.gay/sugar/nix-config/src/commit/aa22a9fbae6c1a675a462430809e1e19158a9be9/desktop/home-manager/user/niri.nix), borders are visible for maximized windows at 1.25x scale. This doesn't happen at 1x scale.\r\n\r\n```kdl\r\nlayout {\r\n    gaps 0\r\n    struts {\r\n        left -6\r\n        right -6\r\n        top -6\r\n        bottom -6\r\n    }\r\n    focus-ring { off; }\r\n    border {\r\n        width 6\r\n        active-color \"#f5a9B8\"\r\n        inactive-color \"#415a0c\"\r\n    }\r\n    preset-column-widths\r\n    default-column-width\r\n    center-focused-column \"never\"\r\n}\r\n```\r\n\r\n![screenshot of niri with borders](https://github.com/user-attachments/assets/7b24ca0b-21a5-4fbf-948f-08d761a712e1)\r\n\r\n(after zooming in onto this picture, pink window borders are visible)\r\n\r\nThis appears to happen due to effective width being 6 * 1.25 = 7.5, which is not an integer, resulting in rounding issues.\r\n\r\nI don't know if it is an issue, considering it's not clear what the behavior should be here (fractional scaling rounding issues make everything tricky), but figured I would report it just in case.\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri stable 0.1.8\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: NixOS unstable\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: Intel UHD Graphics 620\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: Intel Core i5-8350U",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/640/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/619",
      "id": 2480678336,
      "node_id": "I_kwDOKFkxdc6T3CXA",
      "number": 619,
      "title": "Implement alpha-modifier and single-pixel-buffer protocols",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-08-22T12:34:35Z",
      "updated_at": "2024-08-22T12:34:35Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Important: it's not enough to just delegate them; niri's rendering helpers will also need to learn about these two. For example, snapshotting in https://github.com/YaLTeR/niri/blob/7bfdf87bf0138d602888fc3167921bc1d029b0ab/src/render_helpers/surface.rs#L56",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/619/reactions",
        "total_count": 26,
        "+1": 19,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 7
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/605",
      "id": 2471310303,
      "node_id": "I_kwDOKFkxdc6TTTPf",
      "number": 605,
      "title": "Modifier-only keybinds exist",
      "user": {
        "login": "miku4k",
        "id": 89653242,
        "node_id": "MDQ6VXNlcjg5NjUzMjQy",
        "avatar_url": "https://avatars.githubusercontent.com/u/89653242?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/miku4k",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 24,
      "created_at": "2024-08-17T03:29:47Z",
      "updated_at": "2026-01-27T21:07:52Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n\r\nYou can set a modifier-only shortcut by using the xkb name for the modifier as the second key (e.g. Super+Super_L). Hitting just the modifier, or any keybind that includes the modifier, triggers the mod-only bind. \r\nI've only tested with Super+Super_L and the spawn action, but I believe other combinations behave similarly if not the same.\r\n\r\nChecking that the non-mod key of a keybind isnt secretly a mod should be enough to fix this.\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri 0.1.7 (unknown commit)\r\n(most recent version currently available in NixOS unstable)\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: NixOS (unstable)\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: AMD integrated\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: AMD Ryzen 5 5500u\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/605/reactions",
        "total_count": 15,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 15,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        2456
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/572",
      "id": 2446324575,
      "node_id": "I_kwDOKFkxdc6Rz_Nf",
      "number": 572,
      "title": "focus last workspace across monitors",
      "user": {
        "login": "d3m1gd",
        "id": 3992031,
        "node_id": "MDQ6VXNlcjM5OTIwMzE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3992031?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/d3m1gd",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-08-03T12:13:16Z",
      "updated_at": "2024-08-04T07:20:23Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n\r\nfocus-workspace-previous and workspace-auto-back-and-forth should work across monitors \r\n\r\nrelevant discussion with bug description https://github.com/YaLTeR/niri/discussions/479\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: 0.1.7\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: fedora 40",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/572/reactions",
        "total_count": 6,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 3,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/550",
      "id": 2417209926,
      "node_id": "I_kwDOKFkxdc6QE7JG",
      "number": 550,
      "title": "How does niri handle multi-gpu display output?",
      "user": {
        "login": "WasteOfO2",
        "id": 45941793,
        "node_id": "MDQ6VXNlcjQ1OTQxNzkz",
        "avatar_url": "https://avatars.githubusercontent.com/u/45941793?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/WasteOfO2",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 24,
      "created_at": "2024-07-18T19:24:29Z",
      "updated_at": "2025-08-06T15:07:53Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n\r\nThanks a lot for this amazing project, appreciate this a ton!\r\n\r\nI happen to have a hybrid GPU setup on my laptop( i.e. Nvidia+AMD) and I have confirmed that my display output is wired to my Nvidia card. I cannot seem to determine, though, _what_ is the name of my display output for my HDMI port(I think it is HDMI-A-1, but not much help regardless).\r\n\r\nHence I am having some trouble setting up multi-displays. KDE seems to pick this up nicely, but there seems to be no detection from niri. I will be attaching some relevant logs below.\r\n\r\nNiri is launched using: `niri-session`\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri 0.1.7 (v0.1.7-46-ge98d1ec)\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: Arch 6.9.9-arch1-1\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* dGPU: Nvidia GTX 1650 (mobile)\r\n* iGPU: AMD Radeon Graphics \r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: AMD Ryzen 5 5600H\r\n\r\n### Output of `wlr-randr` (regardless of HDMI being plugged in)\r\n```\r\neDP-1 \"11_24_6 - 22425 - eDP-1\"\r\n  Make: 11_24_6\r\n  Model: 22425\r\n  Serial: (null)\r\n  Physical size: 340x190 mm\r\n  Enabled: yes\r\n  Modes:\r\n    1920x1080 px, 60.056000 Hz (preferred, current)\r\n    1920x1080 px, 40.036999 Hz\r\n    1680x1050 px, 60.056000 Hz\r\n    1280x1024 px, 60.056000 Hz\r\n    1440x900 px, 60.056000 Hz\r\n    1280x800 px, 60.056000 Hz\r\n    1280x720 px, 60.056000 Hz\r\n    1024x768 px, 60.056000 Hz\r\n    800x600 px, 60.056000 Hz\r\n    640x480 px, 60.056000 Hz\r\n  Position: 0,0\r\n  Transform: normal\r\n  Scale: 1.000000\r\n  Adaptive Sync: disabled\r\n```\r\n### Output of `ls /sys/class/drm/`\r\n```\r\ncard0       card0-eDP-1  card1-HDMI-A-1  renderD129\r\ncard0-DP-1  card1        renderD128      version\r\n```\r\n\r\nNote that `card1` refers to Nvidia\r\n\r\nPlease do let me know if further info is needed!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/550/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/545",
      "id": 2406888520,
      "node_id": "I_kwDOKFkxdc6PdjRI",
      "number": 545,
      "title": "Two pointers on two monitors for short time",
      "user": {
        "login": "phuhl",
        "id": 16835755,
        "node_id": "MDQ6VXNlcjE2ODM1NzU1",
        "avatar_url": "https://avatars.githubusercontent.com/u/16835755?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/phuhl",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2024-07-13T12:51:47Z",
      "updated_at": "2024-07-15T15:04:39Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I just bought a Magic Trackpad 3 (lsusb output: `Apple, Inc. Magic Trackpad`) and noticed, when moving the cursor from one screen to another, very quickly, sometimes a \"shadow\" cursor remains on the first screen for a few seconds, while the actual moving cursor is on the second screen.\r\n\r\n![image](https://github.com/user-attachments/assets/e1563ad8-74fc-4220-b562-5c413ed9c17c)\r\n\r\nIt's not big of a deal, but thought, it might be something, you'd want to know.\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri 0.1.7 (v0.1.7-38-ga283c34)\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: 6.9.8-arch1-1\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: Intel Corporation Alder Lake-P GT2 [Iris Xe Graphics] (rev 0c) (XPS 13)\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: 12th Gen Intel(R) Core(TM) i7-1260P\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/545/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/539",
      "id": 2401752444,
      "node_id": "I_kwDOKFkxdc6PJ9V8",
      "number": 539,
      "title": "Off-screen windows are not refreshed for screencasts",
      "user": {
        "login": "sodiboo",
        "id": 37938646,
        "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
        "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sodiboo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-07-10T21:12:28Z",
      "updated_at": "2024-09-29T00:10:15Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n\r\n### Description\r\n\r\nWhen screencasting windows that aren't visible (e.g. scrolled far away, or on a different workspace entirely), they are only refreshed at 1Hz. This is because of https://github.com/YaLTeR/niri/commit/ed8a6afe806fbc3438b1fd467a71919900d04852. Prior to that commit, they wouldn't be refreshed at all. Windows that aren't visible aren't refreshed every frame, because that's wasteful. This calculation doesn't take into consideration the new per-window screencasting [introduced just before 0.1.7 was tagged](https://github.com/YaLTeR/niri/commit/dc92d80b9f8de761df2aa0bfc90b61d53b9c0831). So, those captured windows, when on a separate workspace or otherwise not within the current viewport, look really stuttery on a screencast. But they should be considered as visible. This likely went unnoticed due to testing windowed screencasting on mostly static windows that change when interacted with (and always have focus as a result). To reproduce it, play a youtube video, and open Discord on a separate workspace. Screenshare that browser tab in Discord and observe the stuttery mess it becomes.\r\n\r\n### Discovery\r\n\r\nOriginally discovered by @yuu-fur ([`@yuu.dev:catgirl.cloud`](https://matrix.to/#/@yuu.dev:catgirl.cloud)), who uses a laptop with a NVIDIA-brand dedicated GPU and a hybrid setup. We both thought it might be an NVIDIA issue, but it turned out not to be the case. Changing which GPU anything runs on doesn't help. I later reproduced the issue on my own system, which runs an AMD GPU, completely ruling out the possibility of it being an NVIDIA issue. Since this was happening on Vesktop, i thought it might be https://github.com/Vencord/Vesktop/issues/629 which is caused by an underlying [Chromium bug](https://issues.chromium.org/issues/333945842), but his issue persists in Firefox-based browsers too (Librewolf; tested with web Discord) so that's not it either. We eventually realized it was highly correlated to window focus, and i remembered [that commit from way back about refreshing off-screen windows](https://github.com/YaLTeR/niri/commit/ed8a6afe806fbc3438b1fd467a71919900d04852), and i tested various ways for a window to leave the viewport, all of which resulted in the same stutter. This led me to look into the underlying code.\r\n\r\n<details>\r\n\r\n<summary>\r\n\r\n### Workaround\r\n\r\nDo not use this workaround. It wastes resources by refreshing every window every frame. A real patch that only refreshes the relevant screencapture windows is available. You can expand this to see what i originally had to say about the workaround.\r\n\r\n</summary>\r\n\r\nI wrote this patch to workaround the issue. It does not fundamentally solve the problem, because it just increases the refresh rate of off-screen windows. You can change out the `/ 60` with whatever your refresh rate is. This patch will cause more resource usage, including degraded battery life. It basically disables a power-saving feature (or rather, heavily nerfs it). I created it by looking at https://github.com/YaLTeR/niri/commit/ed8a6afe806fbc3438b1fd467a71919900d04852 and just changing the timer values. [A `Duration::ZERO` is valid for how this is used](https://smithay.github.io/smithay/smithay/desktop/utils/fn.send_frames_surface_tree.html). I didn't try this on my own system, but @yuu-fur did and reports that it worked well and seems to solve the issue (yay! high-refresh-rate screencasting!)\r\n\r\nI don't recommend anyone really run this patch, especially not on a battery-constrained device (think of your battery life! your poor battery!), but it basically confirms the root cause is what i described at the top. You can apply it in my `niri-flake` by saving this patch to a file `niri.patch` and then setting `programs.niri.package = pkgs.niri-unstable.override { patches = [ ./niri.patch ]; };`\r\n\r\n```patch\r\ndiff --git a/src/niri.rs b/src/niri.rs\r\nindex 664aea6..9ae8505 100644\r\n--- a/src/niri.rs\r\n+++ b/src/niri.rs\r\n@@ -147,7 +147,7 @@ const CLEAR_COLOR_LOCKED: [f32; 4] = [0.3, 0.1, 0.1, 1.];\r\n // We'll try to send frame callbacks at least once a second. We'll make a timer that fires once a\r\n // second, so with the worst timing the maximum interval between two frame callbacks for a surface\r\n // should be ~1.995 seconds.\r\n-const FRAME_CALLBACK_THROTTLE: Option<Duration> = Some(Duration::from_millis(995));\r\n+const FRAME_CALLBACK_THROTTLE: Option<Duration> = Some(Duration::ZERO);\r\n \r\n pub struct Niri {\r\n     pub config: Rc<RefCell<Config>>,\r\n@@ -1607,10 +1607,10 @@ impl Niri {\r\n \r\n         event_loop\r\n             .insert_source(\r\n-                Timer::from_duration(Duration::from_secs(1)),\r\n+                Timer::from_duration(Duration::from_secs(1) / 60),\r\n                 |_, _, state| {\r\n                     state.niri.send_frame_callbacks_on_fallback_timer();\r\n-                    TimeoutAction::ToDuration(Duration::from_secs(1))\r\n+                    TimeoutAction::ToDuration(Duration::from_secs(1) / 60)\r\n                 },\r\n             )\r\n             .unwrap();\r\n\r\n\r\n```\r\n\r\n</details>\r\n\r\n### Patch\r\n\r\n- https://github.com/YaLTeR/niri/pull/642\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri unstable 2024-07-08 (commit [1af9f9bd95283544b068dbbe33e923ab9e836243](https://github.com/YaLTeR/niri/commit/1af9f9bd95283544b068dbbe33e923ab9e836243)) -- we both use recent niri unstable package\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: NixOS 24.05 Uakari & NixOS 24.11 Vicuña\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: NVIDIA GeForce GTX 1650 Mobile & AMD Radeon RX 7800 XT\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: Intel Core i7-9750H & AMD Ryzen 5 7600X\r\n\r\n---\r\n\r\n###### how many times can you mention your favorite commit in just one issue?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/539/reactions",
        "total_count": 11,
        "+1": 11,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        642
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/530",
      "id": 2395112480,
      "node_id": "I_kwDOKFkxdc6OwoQg",
      "number": 530,
      "title": "Unified multi-monitor window management checklist",
      "user": {
        "login": "salman-farooq-sh",
        "id": 46742354,
        "node_id": "MDQ6VXNlcjQ2NzQyMzU0",
        "avatar_url": "https://avatars.githubusercontent.com/u/46742354?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/salman-farooq-sh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2024-07-08T09:22:19Z",
      "updated_at": "2025-11-20T01:32:23Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "- [x] `focus-column-or-monitor-left/right`\r\n- [x] `move-column-left/right-or-to-monitor-left/right`\r\n----------------------------------------------------------\r\n- [x] `focus-window-or-monitor-up/down`\r\n- [ ] `move-window-up/down-or-to-monitor-up/down` (nobody working on it yet)\r\n----------------------------------------------------------\r\n- [ ] `focus-window-or-workspace-or-monitor-up/down skip-empty=true/false` (nobody working on it yet)\r\n- [ ] `move-window-up/down-or-to-workspace-up/down-or-to-monitor-up/down skip-empty=true/false` (nobody working on it yet)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/530/reactions",
        "total_count": 2,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 1,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/514",
      "id": 2389682923,
      "node_id": "I_kwDOKFkxdc6Ob6rr",
      "number": 514,
      "title": "Scroll windows in a column into view when they go below the screen edge",
      "user": {
        "login": "salman-farooq-sh",
        "id": 46742354,
        "node_id": "MDQ6VXNlcjQ2NzQyMzU0",
        "avatar_url": "https://avatars.githubusercontent.com/u/46742354?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/salman-farooq-sh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-07-04T00:07:00Z",
      "updated_at": "2024-07-08T09:28:50Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Bottom window should slide (fully) into view.\r\n\r\nAlso happens to be a solution for: https://github.com/YaLTeR/niri/discussions/450\r\n\r\nIt will be super cool to have another \"dimension\" to place windows in in addition to workspaces and horizontal scrolling.\r\n\r\nRelated: https://github.com/YaLTeR/niri/issues/515\r\nRelated: https://github.com/YaLTeR/niri/issues/176",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/514/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/455",
      "id": 2364334008,
      "node_id": "I_kwDOKFkxdc6M7N-4",
      "number": 455,
      "title": "Support SHM format for PipeWire screencasts",
      "user": {
        "login": "thepragmaticmero",
        "id": 169491353,
        "node_id": "U_kgDOCho7mQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/169491353?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/thepragmaticmero",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2024-06-20T12:34:59Z",
      "updated_at": "2025-07-21T03:05:10Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\nKooha, a GTK4 based flatpak screen recorder, works on GNOME, works on sway. But doesn't work on niri. Journalctl for reference.\r\n\r\n```\r\n# journalctl --no-hostname -eb /usr/bin/niri | tail -n 11 | wl-copy\r\nJun 20 07:21:28 niri[13861]: 2024-06-20T12:21:28.985830Z DEBUG niri::dbus::mutter_screen_cast: record_monitor connector=\"DP-1\" properties=RecordMonitorProperties { cursor_mode: Some(Embedded), _is_recording: None }\r\nJun 20 07:21:28 niri[13861]: 2024-06-20T12:21:28.987307Z DEBUG niri::dbus::mutter_screen_cast: start\r\nJun 20 07:21:28 niri[13861]: 2024-06-20T12:21:28.987352Z DEBUG niri::niri: StartCast session_id=3\r\nJun 20 07:21:28 niri[13861]: 2024-06-20T12:21:28.987403Z DEBUG niri::pw_utils: pw stream: state changed: Unconnected -> Connecting\r\nJun 20 07:21:28 niri[13861]: 2024-06-20T12:21:28.988927Z DEBUG niri::pw_utils: pw stream: state changed: Connecting -> Paused\r\nJun 20 07:21:28 niri[13861]: 2024-06-20T12:21:28.988943Z DEBUG niri::pw_utils: pw stream: sending signal with 68\r\nJun 20 07:21:29 niri[13861]: 2024-06-20T12:21:29.030720Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Error(\"no more input formats\")\r\nJun 20 07:21:29 niri[13861]: 2024-06-20T12:21:29.030735Z  WARN niri::pw_utils: pw error id=2 seq=43 res=-32 no more input formats\r\nJun 20 07:21:29 niri[13861]: 2024-06-20T12:21:29.044509Z DEBUG niri::dbus::mutter_screen_cast: stop\r\nJun 20 07:21:29 niri[13861]: 2024-06-20T12:21:29.044652Z DEBUG niri::niri: StopCast session_id=3\r\nJun 20 07:21:29 niri[13861]: 2024-06-20T12:21:29.044809Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Unconnected\r\n```\r\nmore info at: \r\nhttps://github.com/SeaDve/Kooha/issues/301\r\nIn a nutshell.... portals I suppose.\r\n\r\n|           |                                OBS                                 | Kooha|\r\n| :-------------------: | :--------------------------------------------------------------------: |:----: |\r\n|   Sway   |                           :heavy_check_mark:                           | :heavy_check_mark: |\r\n|   GNOME   |                           :heavy_check_mark:                           | :heavy_check_mark: |\r\n|   Niri   |                           :heavy_check_mark:                           |:x: |\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: 0.1.6 \r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: Fedora\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: Rx6600xt\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: Ryzen 3 3100\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/455/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/451",
      "id": 2363300079,
      "node_id": "I_kwDOKFkxdc6M3Rjv",
      "number": 451,
      "title": "'niri msg ...' behaves strangely sometimes ",
      "user": {
        "login": "xorander00",
        "id": 16010664,
        "node_id": "MDQ6VXNlcjE2MDEwNjY0",
        "avatar_url": "https://avatars.githubusercontent.com/u/16010664?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/xorander00",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2024-06-20T00:43:41Z",
      "updated_at": "2025-07-20T14:16:25Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Sometimes when running `niri msg outputs` and `niri msg workspaces`, an error gets thrown about parsing the output (\"EOF while parsing a value at line 1 column 0\").  \r\n  \r\nI'm not able to reliably reproduce it yet, but here's an example...\r\n\r\n```sh\r\n20:29:12 me@roland ~❯ niri msg outputs\r\nOutput \"DP-1\" (Unknown - Unknown - DP-1)\r\n  Current mode: 2560x1440 @ 59.951 Hz (preferred)\r\n  Variable refresh rate: not supported\r\n  Physical size: 600x340 mm\r\n  Logical position: 1600, 1200\r\n  Logical size: 2560x1440\r\n  Scale: 1\r\n  Transform: normal\r\n  Available modes:\r\n    2560x1440@59.951 (current, preferred)\r\n    1920x1200@59.885\r\n    1920x1080@60.000\r\n    1920x1080@60.000\r\n    1920x1080@59.940\r\n    1920x1080@50.000\r\n    1920x1080@24.000\r\n    1920x1080@23.976\r\n    1600x1200@60.000\r\n    1680x1050@59.954\r\n    1280x1024@75.025\r\n    1280x1024@60.020\r\n    1440x900@59.951\r\n    1280x800@59.810\r\n    1152x864@75.000\r\n    1280x720@60.000\r\n    1280x720@60.000\r\n    1280x720@59.940\r\n    1280x720@50.000\r\n    1024x768@75.029\r\n    1024x768@60.004\r\n    800x600@75.000\r\n    800x600@60.317\r\n    720x576@50.000\r\n    720x576@50.000\r\n    720x480@60.000\r\n    720x480@60.000\r\n    720x480@59.940\r\n    720x480@59.940\r\n    720x480@59.940\r\n    640x480@75.000\r\n    640x480@60.000\r\n    640x480@59.940\r\n    640x480@59.940\r\n    720x400@70.082\r\n\r\nOutput \"DP-2\" (Unknown - Unknown - DP-2)\r\n  Current mode: 1600x1200 @ 60.028 Hz (preferred)\r\n  Variable refresh rate: not supported\r\n  Physical size: 410x310 mm\r\n  Logical position: 0, 1440\r\n  Logical size: 1600x1200\r\n  Scale: 1\r\n  Transform: normal\r\n  Available modes:\r\n    1600x1200@60.028 (current, preferred)\r\n    1280x1024@60.020\r\n    1440x900@60.028\r\n    1280x800@60.028\r\n    1152x864@75.000\r\n    1280x720@60.028\r\n    1024x768@84.997\r\n    1024x768@75.029\r\n    1024x768@60.004\r\n    832x624@74.551\r\n    800x600@85.061\r\n    800x600@75.000\r\n    800x600@60.317\r\n    640x480@85.008\r\n    640x480@75.000\r\n    640x480@59.940\r\n    720x400@70.082\r\n\r\nOutput \"DP-3\" (11_0_16 - DELL U2412M - DP-3)\r\n  Current mode: 1920x1200 @ 59.950 Hz (preferred)\r\n  Variable refresh rate: not supported\r\n  Physical size: 520x320 mm\r\n  Logical position: 1920, 0\r\n  Logical size: 1920x1200\r\n  Scale: 1\r\n  Transform: normal\r\n  Available modes:\r\n    1920x1200@59.950 (current, preferred)\r\n    1920x1080@60.000\r\n    1600x1200@60.000\r\n    1680x1050@59.954\r\n    1280x1024@60.020\r\n    1440x900@59.950\r\n    1280x960@60.000\r\n    1280x800@59.950\r\n    1280x720@59.950\r\n    1024x768@60.004\r\n    800x600@60.317\r\n    640x480@59.940\r\n    720x400@70.082\r\n\r\nOutput \"HDMI-A-1\" (11_0_16 - DELL E2414H - HDMI-A-1)\r\n  Current mode: 1920x1080 @ 60.000 Hz (preferred)\r\n  Variable refresh rate: not supported\r\n  Physical size: 530x300 mm\r\n  Logical position: 4160, 720\r\n  Logical size: 1080x1920\r\n  Scale: 1\r\n  Transform: 90° counter-clockwise\r\n  Available modes:\r\n    1920x1080@60.000 (current, preferred)\r\n    1680x1050@60.000\r\n    1600x900@60.000\r\n    1280x1024@75.025\r\n    1280x1024@60.020\r\n    1440x900@60.000\r\n    1280x800@60.000\r\n    1152x864@75.000\r\n    1280x720@60.000\r\n    1024x768@75.029\r\n    1024x768@60.004\r\n    800x600@75.000\r\n    800x600@60.317\r\n    640x480@75.000\r\n    640x480@59.940\r\n    720x400@70.082\r\n\r\n\r\n20:29:17 me@roland ~❯ niri msg workspaces\r\nError: error communicating with niri\r\n\r\nCaused by:\r\n    EOF while parsing a value at line 1 column 0\r\n\r\n\r\n20:29:22 me@roland ~❯ niri msg workspaces\r\nOutput \"DP-1\":\r\n * 1\r\n   2\r\n\r\nOutput \"DP-2\":\r\n * 1\r\n   2\r\n   3\r\n\r\nOutput \"DP-3\":\r\n   1\r\n * 2\r\n   3\r\n\r\nOutput \"HDMI-A-1\":\r\n * 1\r\n   2\r\n\r\n20:29:23 me@roland ~❯ \r\n```\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri 0.1.6 (unknown commit)\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: FreeBSD 14.0 \r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: AMD Radeon RX 6600 XT\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: AMD Ryzen 5 5600 6-Core\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/451/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/434",
      "id": 2347766352,
      "node_id": "I_kwDOKFkxdc6L8BJQ",
      "number": 434,
      "title": "Occasional panic when window closes",
      "user": {
        "login": "sullyj3",
        "id": 3953669,
        "node_id": "MDQ6VXNlcjM5NTM2Njk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3953669?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sullyj3",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2024-06-12T04:15:05Z",
      "updated_at": "2024-07-31T03:38:09Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n\r\nNiri occasionally panics when closing a window.\r\n\r\nI'm not sure exactly how to repro. It's happened 3 or 4 times so far. So far I've only had it happen with wezterm, but that's the window I open and close most frequently.\r\n\r\n<details>\r\n  <summary><code>journalctl --user -u niri --since \"10 minutes ago\" > niri.log</code></summary>\r\n\r\n```\r\nJun 12 13:57:02 dorian niri[588410]: thread 'main' panicked at /home/james/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-backend-0.3.3/src/sys/server_impl/mod.rs:1097:56:\r\nJun 12 13:57:02 dorian niri[588410]: called `Result::unwrap()` on an `Err` value: InvalidId\r\nJun 12 13:57:02 dorian niri[588410]: stack backtrace:\r\nJun 12 13:57:02 dorian niri[588410]:    0: rust_begin_unwind\r\nJun 12 13:57:02 dorian niri[588410]:              at /rustc/36153f1a4e3162f0a143c7b3e468ecb3beb0008e/library/std/src/panicking.rs:652:5\r\nJun 12 13:57:02 dorian niri[588410]:    1: core::panicking::panic_fmt\r\nJun 12 13:57:02 dorian niri[588410]:              at /rustc/36153f1a4e3162f0a143c7b3e468ecb3beb0008e/library/core/src/panicking.rs:72:14\r\nJun 12 13:57:02 dorian niri[588410]:    2: core::result::unwrap_failed\r\nJun 12 13:57:02 dorian niri[588410]:              at /rustc/36153f1a4e3162f0a143c7b3e468ecb3beb0008e/library/core/src/result.rs:1658:5\r\nJun 12 13:57:02 dorian niri[588410]:    3: unwrap<wayland_backend::sys::server::ClientId, wayland_backend::types::server::InvalidId>\r\nJun 12 13:57:02 dorian niri[588410]:              at /rustc/36153f1a4e3162f0a143c7b3e468ecb3beb0008e/library/core/src/result.rs:1081:23\r\nJun 12 13:57:02 dorian niri[588410]:    4: send_event<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:    5: send_event\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-backend-0.3.3/src/sys/server_impl/mod.rs:579:9\r\nJun 12 13:57:02 dorian niri[588410]:    6: send_event\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-backend-0.3.3/src/sys/../server_api.rs:371:9\r\nJun 12 13:57:02 dorian niri[588410]:    7: send_event<wayland_server::protocol::wl_pointer::WlPointer>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-server-0.31.1/src/display.rs:182:21\r\nJun 12 13:57:02 dorian niri[588410]:    8: send_event\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-server-0.31.1/src/lib.rs:123:5\r\nJun 12 13:57:02 dorian niri[588410]:    9: leave\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-server-0.31.1/src/lib.rs:123:5\r\nJun 12 13:57:02 dorian niri[588410]:   10: {closure#3}<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/wayland/seat/pointer.rs:194:13\r\nJun 12 13:57:02 dorian niri[588410]:   11: for_each_focused_pointers<niri::niri::State, smithay::wayland::seat::pointer::{impl#1}::leave::{closure_env#3}<niri::niri::State>>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/wayland/seat/pointer.rs:88:17\r\nJun 12 13:57:02 dorian niri[588410]:   12: leave<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/wayland/seat/pointer.rs:193:9\r\nJun 12 13:57:02 dorian niri[588410]:   13: replace<wayland_server::protocol::wl_surface::WlSurface, niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/input/pointer/mod.rs:155:9\r\nJun 12 13:57:02 dorian niri[588410]:   14: motion<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/input/pointer/mod.rs:796:21\r\nJun 12 13:57:02 dorian niri[588410]:   15: motion<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/input/pointer/mod.rs:571:9\r\nJun 12 13:57:02 dorian niri[588410]:   16: motion<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/input/pointer/grab.rs:216:16\r\nJun 12 13:57:02 dorian niri[588410]:   17: {closure#0}<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/input/pointer/mod.rs:251:13\r\nJun 12 13:57:02 dorian niri[588410]:   18: with_grab<niri::niri::State, smithay::input::pointer::{impl#5}::motion::{closure_env#0}<niri::niri::State>>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/input/pointer/mod.rs:897:17\r\nJun 12 13:57:02 dorian niri[588410]:   19: motion<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/input/pointer/mod.rs:250:9\r\nJun 12 13:57:02 dorian niri[588410]:   20: move_cursor\r\nJun 12 13:57:02 dorian niri[588410]:              at ./dev/niri/src/niri.rs:512:9\r\nJun 12 13:57:02 dorian niri[588410]:   21: move_cursor_to_rect\r\nJun 12 13:57:02 dorian niri[588410]:              at ./dev/niri/src/niri.rs:562:9\r\nJun 12 13:57:02 dorian niri[588410]:   22: move_cursor_to_focused_tile\r\nJun 12 13:57:02 dorian niri[588410]:              at ./dev/niri/src/niri.rs:588:18\r\nJun 12 13:57:02 dorian niri[588410]:   23: maybe_warp_cursor_to_focus\r\nJun 12 13:57:02 dorian niri[588410]:              at ./dev/niri/src/niri.rs:599:9\r\nJun 12 13:57:02 dorian niri[588410]:   24: toplevel_destroyed\r\nJun 12 13:57:02 dorian niri[588410]:              at ./dev/niri/src/handlers/xdg_shell.rs:482:13\r\nJun 12 13:57:02 dorian niri[588410]:   25: destroyed<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/git/checkouts/smithay-b5a338d5236320f6/fb44b24/src/wayland/shell/xdg/handlers/surface/toplevel.rs:160:13\r\nJun 12 13:57:02 dorian niri[588410]:   26: destroyed\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-server-0.31.1/src/dispatch.rs:367:17\r\nJun 12 13:57:02 dorian niri[588410]:   27: destroyed<wayland_protocols::xdg::shell::generated::server::xdg_toplevel::XdgToplevel, smithay::wayland::shell::xdg::handlers::surface::XdgShellSurfaceUserData, niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-server-0.31.1/src/dispatch.rs:292:9\r\nJun 12 13:57:02 dorian niri[588410]:   28: {closure#0}<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-backend-0.3.3/src/sys/server_impl/mod.rs:1610:13\r\nJun 12 13:57:02 dorian niri[588410]:   29: with<(alloc::sync::Arc<std::sync::mutex::Mutex<(dyn wayland_backend::sys::server_impl::ErasedState + core::marker::Send)>, alloc::alloc::Global>, *mut core::ffi::c_void), wayland_backend::sys::server_impl::resource_destructor::{closure_env#0}<niri::niri::State>, ()>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/scoped-tls-1.0.1/src/lib.rs:171:13\r\nJun 12 13:57:02 dorian niri[588410]:   30: resource_destructor<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-backend-0.3.3/src/sys/server_impl/mod.rs:1607:9\r\nJun 12 13:57:02 dorian niri[588410]:   31: <unknown>\r\nJun 12 13:57:02 dorian niri[588410]:   32: wl_client_destroy\r\nJun 12 13:57:02 dorian niri[588410]:   33: <unknown>\r\nJun 12 13:57:02 dorian niri[588410]:   34: wl_event_loop_dispatch\r\nJun 12 13:57:02 dorian niri[588410]:   35: {closure#0}<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-backend-0.3.3/src/sys/server_impl/mod.rs:410:13\r\nJun 12 13:57:02 dorian niri[588410]:   36: set<(alloc::sync::Arc<std::sync::mutex::Mutex<(dyn wayland_backend::sys::server_impl::ErasedState + core::marker::Send)>, alloc::alloc::Global>, *mut core::ffi::c_void), wayland_backend::sys::server_impl::{impl#21}::dispatch_all_clients::{closure_env#0}<niri::niri::State>, i32>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/scoped-tls-1.0.1/src/lib.rs:137:9\r\nJun 12 13:57:02 dorian niri[588410]:   37: dispatch_all_clients<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-backend-0.3.3/src/sys/server_impl/mod.rs:407:19\r\nJun 12 13:57:02 dorian niri[588410]:   38: dispatch_all_clients<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-backend-0.3.3/src/sys/../server_api.rs:575:9\r\nJun 12 13:57:02 dorian niri[588410]:   39: dispatch_clients<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/wayland-server-0.31.1/src/display.rs:59:22\r\nJun 12 13:57:02 dorian niri[588410]:   40: {closure#14}\r\nJun 12 13:57:02 dorian niri[588410]:              at ./dev/niri/src/niri.rs:1454:39\r\nJun 12 13:57:02 dorian niri[588410]:   41: {closure#0}<niri::niri::State, calloop::sources::generic::Generic<wayland_server::display::Display<niri::niri::State>, std::io::error::Error>, niri::niri::{impl#4}::new::{closure_env#14}>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/sources/mod.rs:327:61\r\nJun 12 13:57:02 dorian niri[588410]:   42: process_events<wayland_server::display::Display<niri::niri::State>, std::io::error::Error, calloop::sources::{impl#4}::process_events::{closure_env#0}<niri::niri::State, calloop::sources::generic::Generic<wayland_server::display::Display<niri::niri::State>, std::io::error::Error>, niri::niri::{impl#4}::new::{closure_env#14}>>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/sources/generic.rs:290:9\r\nJun 12 13:57:02 dorian niri[588410]:   43: process_events<niri::niri::State, calloop::sources::generic::Generic<wayland_server::display::Display<niri::niri::State>, std::io::error::Error>, niri::niri::{impl#4}::new::{closure_env#14}>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/sources/mod.rs:326:9\r\nJun 12 13:57:02 dorian niri[588410]:   44: dispatch_events<niri::niri::State>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/loop_logic.rs:445:31\r\nJun 12 13:57:02 dorian niri[588410]:   45: dispatch<niri::niri::State, core::option::Option<core::time::Duration>>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/loop_logic.rs:559:9\r\nJun 12 13:57:02 dorian niri[588410]:   46: run<niri::niri::State, niri::main::{closure_env#4}, core::option::Option<core::time::Duration>>\r\nJun 12 13:57:02 dorian niri[588410]:              at ./.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/loop_logic.rs:596:13\r\nJun 12 13:57:02 dorian niri[588410]:   47: main\r\nJun 12 13:57:02 dorian niri[588410]:              at ./dev/niri/src/main.rs:261:5\r\nJun 12 13:57:02 dorian niri[588410]:   48: call_once<fn() -> core::result::Result<(), alloc::boxed::Box<dyn core::error::Error, alloc::alloc::Global>>, ()>\r\nJun 12 13:57:02 dorian niri[588410]:              at /rustc/36153f1a4e3162f0a143c7b3e468ecb3beb0008e/library/core/src/ops/function.rs:250:5\r\nJun 12 13:57:02 dorian niri[588410]: note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.\r\nJun 12 13:57:02 dorian niri[588410]: 2024-06-12T03:57:02.904285Z DEBUG niri::utils::watcher: exiting watcher thread for /home/james/.config/niri/config.kdl\r\nJun 12 13:57:03 dorian systemd[588286]: niri.service: Main process exited, code=exited, status=101/n/a\r\nJun 12 13:57:03 dorian systemd[588286]: niri.service: Failed with result 'exit-code'.\r\nJun 12 13:57:03 dorian systemd[588286]: niri.service: Consumed 5h 10min 18.075s CPU time, 2.5G memory peak, 310.8M memory swap peak.\r\nJun 12 13:57:41 dorian systemd[588286]: Starting A scrollable-tiling Wayland compositor...\r\nJun 12 13:57:41 dorian niri[2837004]: 2024-06-12T03:57:41.017278Z  INFO niri: starting version 0.1.6 (d193f3e-modified)\r\nJun 12 13:57:41 dorian niri[2837004]: 2024-06-12T03:57:41.036847Z DEBUG niri_config: loaded config from \"/home/james/.config/niri/config.kdl\"\r\nJun 12 13:57:41 dorian niri[2837004]: 2024-06-12T03:57:41.058451Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/renderD128\"\r\nJun 12 13:57:41 dorian niri[2837004]: 2024-06-12T03:57:41.077641Z DEBUG niri::backend::tty: device added: 57857 \"/dev/dri/card1\"\r\nJun 12 13:57:41 dorian niri[2837004]: 2024-06-12T03:57:41.391232Z DEBUG niri::backend::tty: this is the primary node\r\nJun 12 13:57:41 dorian niri[2837004]: 2024-06-12T03:57:41.391247Z DEBUG niri::backend::tty: this is the primary render node\r\nJun 12 13:57:41 dorian niri[2837004]: 2024-06-12T03:57:41.546591Z DEBUG niri::backend::tty: device changed: 57857\r\nJun 12 13:57:42 dorian niri[2837004]: 2024-06-12T03:57:42.196642Z DEBUG niri::backend::tty: connecting connector: eDP-1\r\nJun 12 13:57:42 dorian niri[2837004]: 2024-06-12T03:57:42.196741Z DEBUG niri::backend::tty: picking mode: Mode { name: \"1920x1080\", clock: 142520, size: (1920, 1080), hsync: (1968, 2000, 2080), vsync: (1083, 1088, 1142), hskew: 0, vscan: 0, vrefresh: 60, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\r\nJun 12 13:57:42 dorian niri[2837004]: 2024-06-12T03:57:42.196790Z DEBUG niri::backend::tty: set max bpc to 8\r\nJun 12 13:57:42 dorian niri[2837004]: 2024-06-12T03:57:42.207990Z DEBUG niri::niri: putting output eDP-1 at x=0 y=0\r\nJun 12 13:57:42 dorian niri[2837004]: 2024-06-12T03:57:42.208115Z  INFO niri: listening on Wayland socket: wayland-1\r\nJun 12 13:57:42 dorian niri[2837004]: 2024-06-12T03:57:42.208126Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.2837004.sock\r\nJun 12 13:57:42 dorian systemd[588286]: niri.service: Got notification message from PID 2837056, but reception only permitted for main PID 2837004\r\nJun 12 13:57:42 dorian systemd[588286]: Started A scrollable-tiling Wayland compositor.\r\nJun 12 13:57:42 dorian niri[2837004]: libinput error: client bug: timer event7 hold: scheduled expiry is in the past (-611ms), your system is too slow\r\n```\r\n</details>\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri 0.1.6 (d193f3e-modified)\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: Arch\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: \r\n```\r\n▷ lspci -k| grep -A 2 -E \"(VGA|3D)\"\r\n00:02.0 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)\r\n        Subsystem: Dell Device 0a5c\r\n        Kernel driver in use: i915\r\n```\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: `11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz`\r\n\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/434/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/426",
      "id": 2336941193,
      "node_id": "I_kwDOKFkxdc6LSuSJ",
      "number": 426,
      "title": "Restore window to its column upon unfullscreening",
      "user": {
        "login": "thepragmaticmero",
        "id": 169491353,
        "node_id": "U_kgDOCho7mQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/169491353?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/thepragmaticmero",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187133,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI4_Q",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:layout",
          "name": "area:layout",
          "color": "fbca04",
          "default": false,
          "description": "Columns, workspaces, scrolling, fullscreen, resize"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 27,
      "created_at": "2024-06-05T22:36:01Z",
      "updated_at": "2026-02-27T17:18:00Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Entering fullscreen (Win+Shift+F) expels consumed window, I suppose that it's not intended behaviour. Valve pls fix.\r\n\r\n1. Consumed window\r\n![Screenshot2024-06-05 09-10-32](https://github.com/YaLTeR/niri/assets/169491353/032247a2-309c-424f-8450-b18c347de7ac)\r\n\r\n2. Entering fullscreen window\r\n![Screenshot2024-06-05 09-11-51](https://github.com/YaLTeR/niri/assets/169491353/a872ac08-73f7-4564-b830-8f96e0f87793)\r\n\r\n3. Exiting fullscreen expels consumed window\r\n![Screenshot2024-06-05 09-11-59](https://github.com/YaLTeR/niri/assets/169491353/062cab7d-4445-492c-9811-a58d17a46b01)\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: 0.1.6\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: Fedora 40 Immutable (copr)\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: Intel Graphics\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: N2840 Intel\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/426/reactions",
        "total_count": 29,
        "+1": 26,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 3
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/390",
      "id": 2316656442,
      "node_id": "I_kwDOKFkxdc6KFV86",
      "number": 390,
      "title": "Support the remote desktop portal",
      "user": {
        "login": "thepragmaticmero",
        "id": 169491353,
        "node_id": "U_kgDOCho7mQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/169491353?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/thepragmaticmero",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191280,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJMA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:screencasting",
          "name": "area:screencasting",
          "color": "fbca04",
          "default": false,
          "description": "Screen sharing, PipeWire, screencast portal"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 19,
      "created_at": "2024-05-25T03:34:48Z",
      "updated_at": "2026-02-09T18:57:00Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: 0.1.6\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: Fedora Immutable 40\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: Intel Graphics\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: N2840 Intel\r\n\r\nI tested RustDesk experimental screen sharing on Gnome and KDE and in the current version it works, but not on niri... I don't know why, I also tested OBS-studiio on niri and it works, but RustDesk doesn't. Why could be that?. Some shenanigans about xdg-desktop-portal? The popup appears on Gnome and KDE tho... I'm pretty confused. \r\n\r\nAlso as a curiosity where could I consult the \"Always remember this selection\" list? If I for example wanted to see all the programs that I previously gave permission to use my screen on wayland. Gnome makes automatic use of it with it's gnome-remote-desktop service.... how did the gnome team manage to 'inject' the \"remember this selection\" by default with that program? \r\n\r\nUploading 2024-05-24.mp4…",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/390/reactions",
        "total_count": 16,
        "+1": 16,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/373",
      "id": 2308840535,
      "node_id": "I_kwDOKFkxdc6JnhxX",
      "number": 373,
      "title": "Animation for moving a column between workspaces",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-05-21T18:11:21Z",
      "updated_at": "2024-05-21T18:11:21Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "My idea for this is: the workspaces slide vertically (same as workspace switch), while the target column stays in place on the screen. The target workspace is already scrolled exactly to the right spot to make the target column line up perfectly horizontally in its target spot.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/373/reactions",
        "total_count": 9,
        "+1": 9,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/372",
      "id": 2308823061,
      "node_id": "I_kwDOKFkxdc6JndgV",
      "number": 372,
      "title": "Gesture bindings",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        },
        "1": {
          "id": 6994395392,
          "node_id": "LA_kwDOKFkxdc8AAAABoOYBAA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/needs%20design",
          "name": "needs design",
          "color": "0F94BE",
          "default": false,
          "description": "Need to figure out how exactly to implement this"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 39,
      "created_at": "2024-05-21T18:00:10Z",
      "updated_at": "2026-02-22T12:50:21Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Add some way to customize gesture bindings. I don't have a concrete design yet, but:\r\n1. Users should be able to customize how many fingers to use for the swipe gestures (supersede https://github.com/YaLTeR/niri/pull/315, cc @MagneFire)\r\n2. I should be able to add new gestures without breaking users' configs\r\n3. Users should be able to bind gestures only where it makes sense, i.e. swipe actions to swipe gestures and not to pinch gestures for example\r\n\r\nI'm thinking something like a `binds` section, but for gestures. To satisfy 1. and 2., maybe encode number of fingers explicitly into the \"key\"?\r\n\r\n```\r\ngestures {\r\n    touchpad-swipe-3-horizontal horizontal-view-movement\r\n    touchpad-swipe-3-vertical workspace-switch\r\n    Mod+Mouse3-horizontal horizontal-view-movement\r\n    Mod+touch-swipe-3-horizontal horizontal-view-movement\r\n}\r\n```\r\n\r\nThis way, I can add new defaults when this section is missing from the config, and when it is present in the config the user will just need to add new gestures manually.\r\n\r\nI don't entirely like this though, looks kinda awkward.\r\n\r\nAlso, I can see a problem in the future where there may be a 2D gesture, and so you will need to be able to bind *either* `touchpad-swipe-N` to a 2D gesture, or separate `touchpad-swipe-N-horizontal/vertical` to 1D gestures. But also maybe that's not a problem and can just be verified during parsing.\r\n\r\nAlso, this \"gestures\" section that I have in mind seems to be mainly about continuous gestures (swipe and pinch) and not about discrete gestures like double-resize-click (these seem more fit for the regular binds section).\r\n\r\nAlso, should it be allowed to bind \"vertical\" to \"horizontal\" gestures and vice versa? Maybe not.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/372/reactions",
        "total_count": 54,
        "+1": 49,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 5
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/371",
      "id": 2308790623,
      "node_id": "I_kwDOKFkxdc6JnVlf",
      "number": 371,
      "title": "Specific input device configuration",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 30,
      "created_at": "2024-05-21T17:39:48Z",
      "updated_at": "2025-12-22T14:53:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Ability to configure specific input devices.\r\n\r\nSyntax: something along\r\n```\r\ninput {\r\n    mouse \"identifier\" {\r\n        // Settings for this device.\r\n    }\r\n}\r\n```\r\n\r\nResolution for a given device:\r\n1. Search for settings block matching this device's identifier.\r\n2. If not found, use the general block for this device's type.\r\n\r\nIdentifier: check what other compositors use, guess it's something libinput should be exposing.\r\n\r\nFor keyboards, it should support per-keyboard XKB config.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/371/reactions",
        "total_count": 58,
        "+1": 51,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 6,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/338",
      "id": 2291402370,
      "node_id": "I_kwDOKFkxdc6IlAaC",
      "number": 338,
      "title": "Add a way to set, rather than toggle, window fullscreen",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-05-12T16:16:45Z",
      "updated_at": "2024-05-12T16:16:46Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Discussed in https://github.com/YaLTeR/niri/discussions/337\r\n\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/338/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/320",
      "id": 2270423180,
      "node_id": "I_kwDOKFkxdc6HU-iM",
      "number": 320,
      "title": "Doesn't run out of the box on a TTY on PinePhone Pro",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2024-04-30T03:24:08Z",
      "updated_at": "2025-12-01T05:15:52Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For whenever I do more TTY backend changes. But I'm not sure if I can really fix this without having a device to test.\r\n```\r\n2024-04-30T03:19:47.120722Z  INFO niri: starting version 0.1.5 (v0.1.5-21-gc0d5001)\r\n2024-04-30T03:19:48.319465Z DEBUG niri_config: loaded config from \"/home/alarm/.config/niri/config.kdl\"\r\n2024-04-30T03:19:48.518433Z  WARN niri::backend::tty: error getting the render node for the primary GPU; proceeding anyway\r\n2024-04-30T03:19:48.519744Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/card0\"\r\n2024-04-30T03:19:48.689554Z DEBUG niri::backend::tty: device added: 57857 \"/dev/dri/card1\"\r\n2024-04-30T03:19:48.692392Z  WARN niri::backend::tty: error adding device: DRM access error: Error loading resource handles on device `Some(\"/dev/dri/card1\")` (Operation not supported (os error 95))\r\n\r\nCaused by:\r\n    Operation not supported (os error 95)\r\n2024-04-30T03:19:48.692608Z DEBUG niri::backend::tty: device added: 57856 \"/dev/dri/card0\"\r\n2024-04-30T03:19:48.942066Z DEBUG niri::backend::tty: this is the primary node\r\n2024-04-30T03:19:49.007396Z DEBUG niri::backend::tty: device changed: 57856\r\n2024-04-30T03:19:49.008252Z DEBUG niri::backend::tty: connecting connector: DSI-1\r\n2024-04-30T03:19:49.008436Z DEBUG niri::backend::tty: picking mode: Mode { name: \"720x1440\", clock: 74250, size: (720, 1440), hsync: (760, 806, 846), vsync: (1449, 1456, 1463), hskew: 0, vscan: 0, vrefresh: 60, mode_type: ModeTypeFlags(PREFERRED | DRIVER) }\r\n2024-04-30T03:19:49.008590Z DEBUG niri::backend::tty: error setting max bpc: couldn't find max bpc property\r\n2024-04-30T03:19:49.019291Z DEBUG niri::niri: putting output DSI-1 at x=0 y=0\r\n2024-04-30T03:19:49.019828Z  INFO niri: listening on Wayland socket: wayland-1\r\n2024-04-30T03:19:49.019891Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.23319.sock\r\n2024-04-30T03:19:49.026634Z  WARN niri::backend::tty: error creating renderer for primary GPU: Error::NoDevice(DrmNode { dev: 57856, ty: Primary })\r\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/320/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/306",
      "id": 2257300016,
      "node_id": "I_kwDOKFkxdc6Gi6ow",
      "number": 306,
      "title": "move-window-to-monitor does not maintain window height",
      "user": {
        "login": "Damnjelly",
        "id": 13944407,
        "node_id": "MDQ6VXNlcjEzOTQ0NDA3",
        "avatar_url": "https://avatars.githubusercontent.com/u/13944407?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Damnjelly",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 10168187133,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI4_Q",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:layout",
          "name": "area:layout",
          "color": "fbca04",
          "default": false,
          "description": "Columns, workspaces, scrolling, fullscreen, resize"
        },
        "2": {
          "id": 10168191179,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJIyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:output",
          "name": "area:output",
          "color": "fbca04",
          "default": false,
          "description": "Monitors, scaling, VRR, DPMS"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2024-04-22T19:25:26Z",
      "updated_at": "2026-02-27T17:16:34Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "steps to reproduce:\r\n\r\n1. Open a window\r\n2. Set window height to a size that is not the maximized size\r\n3. Move window to a separate monitor (`move-window-to-monitor-up`, `move-window-to-monitor-down`, `move-window-to-monitor-left`, and `move-window-to-monitor-right` all cause this issue)\r\n\r\n**Expected result:** Window maintains height\r\n\r\n**Actual result:** Window height gets set to maximized size\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: 2024-04-21 (commit 49f5402669012be33f8cd111311c3e39fd4751c0)\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: NVIDIA GeForce RTX 3070\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: Ryzen 5 5600X\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/306/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/283",
      "id": 2229803848,
      "node_id": "I_kwDOKFkxdc6E6BtI",
      "number": 283,
      "title": "Second keyboard layout makes binds behave differently",
      "user": {
        "login": "fyrk",
        "id": 38762910,
        "node_id": "MDQ6VXNlcjM4NzYyOTEw",
        "avatar_url": "https://avatars.githubusercontent.com/u/38762910?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/fyrk",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 5830662347,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYyw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/question",
          "name": "question",
          "color": "d876e3",
          "default": true,
          "description": "Further information is requested"
        },
        "2": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2024-04-07T14:48:44Z",
      "updated_at": "2026-02-27T17:15:49Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Say I have these keybinds configured:\r\n```kdl\r\nMod+odiaeresis { spawn \"org.mozilla.firefox\"; }\r\nMod+R { spawn \"swaylock\"; }\r\n```\r\n(`odiaeresis` is \"Ö\", as reported by wez)\r\n\r\nI use the [Noted](https://github.com/dariogoetz/noted-layout/) layout, and have configured it using `layout \"noted\"`, which makes the keybinds work as expected.\r\n\r\nIf, however, I add a second layout (`layout \"noted,de\"`), the first keybind stops working (just types an \"ö\"), while the second one works as before. Interestingly, changing the first keybind to `Mod+B { spawn \"org.mozilla.firefox\"; }` will make it work with two layouts (Noted's \"Ö\" is <kbd>B</kbd> on a QWERTZ/Y layout)\r\n\r\n### System Information\r\n\r\n* niri version: niri unstable 2024-03-22 (commit 0d2fdb49efa9006a230a89c930929c98ee1f5433)\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/283/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/254",
      "id": 2180837850,
      "node_id": "I_kwDOKFkxdc6B_PHa",
      "number": 254,
      "title": "systemctl import-environment without specifying desired variables is deprecated",
      "user": {
        "login": "jokeyrhyme",
        "id": 479816,
        "node_id": "MDQ6VXNlcjQ3OTgxNg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/479816?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jokeyrhyme",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 10168191459,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJJ4w",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:session",
          "name": "area:session",
          "color": "fbca04",
          "default": false,
          "description": "Screen locking, idle inhibit, suspend/resume"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 63,
      "created_at": "2024-03-12T06:30:54Z",
      "updated_at": "2026-02-27T17:15:23Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Howdie, thanks so much for sharing this project! <3\r\n\r\nI noticed a deprecation message pop up briefly during `niri`'s launch, and I tracked it down to this: https://github.com/systemd/systemd/pull/18137\r\n\r\nAnd we call `systemctl --user import-environment` without specific variable names here: https://github.com/YaLTeR/niri/blob/40cec34aa4a7f99ab12b30cba1a0ee83a706a413/resources/niri-session#L24\r\n\r\nThe thing is, I'm not sure when this will stop working on the `systemctl` side, seeing as it's been deprecated for years\r\n\r\nAnd I'm not even sure what I'd recommend going forward\r\n\r\n- do we drop the line completely? this might break existing user scripts, however, these values will still end up in the environment variables for the `niri` process itself (and thus every child process it launches), just not in the user service manager\r\n- do we provide a list of variables that users are likely to want (e.g. PATH)? that seems like a game of whack-a-mole\r\n\r\nAnother aspect of the current behaviour is that variables from the virtual console environment end up in my user service manager environment, like TERM=linux and PWD which are often unhelpful/confusing once I'm in a GUI desktop environment (but I can probably find workarounds for my own stuff)\r\n\r\nAnyhow, this has probably not been super helpful, but I thought I'd log it, just in case anyone else notices the deprecation message :)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/254/reactions",
        "total_count": 21,
        "+1": 21,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        255
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/229",
      "id": 2152146178,
      "node_id": "I_kwDOKFkxdc6ARyUC",
      "number": 229,
      "title": "Spawn errors leave a lingering child process ",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662299,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYmw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2024-02-24T06:37:18Z",
      "updated_at": "2024-11-01T05:22:08Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This happens because Command::spawn() waits for the child to exit on error, but our intermediate child waits for us to send it an exit signal instead. Might need to move away from Command after all to solve this...",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/229/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/218",
      "id": 2144918350,
      "node_id": "I_kwDOKFkxdc5_2NtO",
      "number": 218,
      "title": "software renderer",
      "user": {
        "login": "thenameisluk",
        "id": 92756992,
        "node_id": "U_kgDOBYdcAA",
        "avatar_url": "https://avatars.githubusercontent.com/u/92756992?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/thenameisluk",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 6994395392,
          "node_id": "LA_kwDOKFkxdc8AAAABoOYBAA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/needs%20design",
          "name": "needs design",
          "color": "0F94BE",
          "default": false,
          "description": "Need to figure out how exactly to implement this"
        },
        "1": {
          "id": 10168187500,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI6bA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/waiting%20for%20upstream",
          "name": "waiting for upstream",
          "color": "5319e7",
          "default": false,
          "description": "Waiting for an upstream project"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 15,
      "created_at": "2024-02-20T17:36:16Z",
      "updated_at": "2026-02-27T17:06:10Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "i run linux (debian trixie) on old chromebook with no gpu drivers since there are no availble atm and probably never will\r\nthat's why for rendering graphics on it i use software renderer\r\nmost wayland window menagers (sawy or gnome/mutter) work on it without any issue\r\nbut niri doesn't really want to\r\nwhen i try to run it says\r\n\r\n2024-02-2016:56:57.0833562\r\nINFO niri: starting version 0.1.2 (unknown commit)\r\n2024-02-2016:56:57.1500902 DEBUG niri _config: loaded config from \"/home/linux/.config/niri/config-kd1\"\r\nthread\r\n'main'\r\npanicked at src/main.rs: 162:6:\r\ncalled\r\nResult:: unwrap()\r\nvalue: error initializing the TTY backend\r\nCaused by:\r\nerror getting the render node for the primary GPU\r\nstack backtrace:\r\n0: rust_begin_unwind\r\nat /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/panicking.rs:645:5\r\n1: core:: panicking:: panic_fmt\r\nat /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/panicking-rs:72:14\r\n2: core: result::unwrap_failed\r\nat /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/result.rs:1649:5\r\n3: unwrap‹niri::niri::State, alloc:: boxed: :Box‹dyn core::error::Error, alloc::alloc::Global>\r\nat /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/result.rs:1073:23\r\nat /home/linux/Pobrane/niri-0.1.2/src/main.rs: 156:21\r\n5: call_once<fn()\r\n→> core::result: :Result‹(), alloc: :boxed: :Box‹dyn core::error::Error, alloc::alloc::Global», (› at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/ops/function.rs:250:5\r\nnote: Some details are omitted, run with 'RUST_BACKTRACE=full for a verbose backtrace.\r\n\r\nmy guess is that it either doesn't have software rendering support\r\nor it is not enabled. i tried going through options and couldn't find anything. So my question is is there an option to enable it or there is no support yet or not planned at all (something like pixman)?\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri 0.1.2 (unknown commit)\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: PowerVR GX6250 (no driver)\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: MediaTek MT8173\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/218/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/176",
      "id": 2123443065,
      "node_id": "I_kwDOKFkxdc5-kSt5",
      "number": 176,
      "title": "Vertically center columns smaller than full height",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2024-02-07T16:39:03Z",
      "updated_at": "2025-12-27T06:40:46Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Ref. https://github.com/YaLTeR/niri/discussions/175",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/176/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/148",
      "id": 2110580751,
      "node_id": "I_kwDOKFkxdc59zOgP",
      "number": 148,
      "title": "Confined pointer is not clamped to confined region",
      "user": {
        "login": "kchibisov",
        "id": 27620401,
        "node_id": "MDQ6VXNlcjI3NjIwNDAx",
        "avatar_url": "https://avatars.githubusercontent.com/u/27620401?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kchibisov",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168187194,
          "node_id": "LA_kwDOKFkxdc8AAAACXhI5Og",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:input",
          "name": "area:input",
          "color": "fbca04",
          "default": false,
          "description": "Keyboard, mouse, touchpad, tablet, gestures, pointer"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2024-01-31T17:10:24Z",
      "updated_at": "2026-02-27T17:13:49Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The pointer getting stuck on confine region boundary when it's logically outside of the region, instead it should continue moving across the boundary.\r\n\r\nYou can repro on confined pointer example and try to move mouse like if it was outside of the window.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/148/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/119",
      "id": 2092457561,
      "node_id": "I_kwDOKFkxdc58uF5Z",
      "number": 119,
      "title": "Transactional updates",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2024-01-21T07:07:03Z",
      "updated_at": "2025-03-13T16:14:50Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In Wayland we can make every frame perfect in a lot of cases. However, this requires very careful handling. Currently niri doesn't do any transactional updates, but they would be nice for cases like:\r\n\r\n1. Struts change (i.e. an exclusive layer-shell surface appears) synchronized with visible windows resizing to a smaller size.\r\n2. Resizing a column with multiple windows so they all size in sync.\r\n3. Consuming a window into a column or expelling a window from a column.\r\n4. Fullscreening a window.\r\n5. Locking with ext-session-lock (waiting for the lock surface to appear on all outputs).\r\n\r\nWhen we're expecting a single resize from multiple windows, we can just set a short timeout on the transaction if the window is too slow (test client: `wleird-slow-ack-configure`). However, we should be careful with continuously-resizing windows.\r\n\r\nOne edge case I can think of is: resizing two windows in a column, when each is committing every other frame, but desynchronized in phase. So window A is committing in response to configure 1, 3, 5, ... and window B is committing in response to configure 2, 4, 6, ..., so there is never a consistent configuration. We probably don't want to drop frames in this case so the animation isn't ruined. Perhaps we'll need to do clipping to handle this case gracefully. A good test client is `wleird-resize-loop`, perhaps with modifications to set min/max size, and maybe to pause occasionally or to drop frames.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/119/reactions",
        "total_count": 3,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/117",
      "id": 2092428057,
      "node_id": "I_kwDOKFkxdc58t-sZ",
      "number": 117,
      "title": "Support xdg-desktop-portal screenshot with multiple monitors",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2024-01-21T05:26:02Z",
      "updated_at": "2024-01-27T05:51:15Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "There are two issues:\r\n1. The code in niri doesn't handle multiple monitor scales yet. Since the portal wants a full all-monitors screenshot in one image, we should pick one scale (largest?) then scale everything to it (with nearest neighbor for integer scale).\r\n2. We don't crop workspaces horizontally because the crop element in Smithay doesn't work as expected, so windows overflow onto adjacent monitors.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/117/reactions",
        "total_count": 7,
        "+1": 7,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/112",
      "id": 2091935370,
      "node_id": "I_kwDOKFkxdc58sGaK",
      "number": 112,
      "title": "Built-in clipboard manager",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2024-01-20T06:49:42Z",
      "updated_at": "2025-11-28T06:33:51Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Store text from clients. Basically exactly what Mutter does, it works perfectly there.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/112/reactions",
        "total_count": 22,
        "+1": 22,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/108",
      "id": 2089758055,
      "node_id": "I_kwDOKFkxdc58jy1n",
      "number": 108,
      "title": "Turn off monitors after inactivity",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 5830662314,
          "node_id": "LA_kwDOKFkxdc8AAAABW4jYqg",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        },
        "1": {
          "id": 6994395392,
          "node_id": "LA_kwDOKFkxdc8AAAABoOYBAA",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/needs%20design",
          "name": "needs design",
          "color": "0F94BE",
          "default": false,
          "description": "Need to figure out how exactly to implement this"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 13,
      "created_at": "2024-01-19T06:51:24Z",
      "updated_at": "2025-11-25T06:06:23Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Can be solved together with #104 because the Smithay PR linked there implements an idle timer perfect for this case.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/108/reactions",
        "total_count": 4,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 2
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/90",
      "id": 2031791808,
      "node_id": "I_kwDOKFkxdc55Gq7A",
      "number": 90,
      "title": "Feature: A more flexible command to move windows around, including into/out of columns",
      "user": {
        "login": "rabidpug",
        "id": 27880212,
        "node_id": "MDQ6VXNlcjI3ODgwMjEy",
        "avatar_url": "https://avatars.githubusercontent.com/u/27880212?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rabidpug",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191617,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJKgQ",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:ipc",
          "name": "area:ipc",
          "color": "fbca04",
          "default": false,
          "description": "niri msg, niri IPC, D-Bus, scripting"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2023-12-08T01:40:22Z",
      "updated_at": "2026-02-27T01:51:59Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I really like the idea of the consume/expel commands, but I think they would benefit from more flexibility if the way windows and columns are managed in Niri allows for it. I confess I don't have any experience developing compositors so I could be way off base, sorry if that's the case!\r\n\r\nI think if there was a command that was a bit more abstract and flexible where the user can define:\r\n- a target window and the context to determine that (within column or within workspace),\r\n- a target column and what to do with the window in relation to the column (move to the left/right of or consume into)\r\n\r\nIdeally the target window/column could be defined as an index relative to the current focus or an absolute index/first/last within the context of the current workspace OR column.\r\n\r\nI think this would open up a lot of window manipulation possibilities, and allow users to configure things to perfectly fit their workflows.\r\n\r\nThanks for your time!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/90/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/72",
      "id": 1975173428,
      "node_id": "I_kwDOKFkxdc51usE0",
      "number": 72,
      "title": "Inhibit shortcuts when running as a winit window",
      "user": {
        "login": "hardBSDk",
        "id": 55782009,
        "node_id": "MDQ6VXNlcjU1NzgyMDA5",
        "avatar_url": "https://avatars.githubusercontent.com/u/55782009?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/hardBSDk",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10211952831,
          "node_id": "LA_kwDOKFkxdc8AAAACYK4Ivw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/backend:winit",
          "name": "backend:winit",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues with the winit (nested window) backend"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2023-11-02T23:02:39Z",
      "updated_at": "2026-02-26T17:23:46Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If you launch the session inside a Wayland window, you can't execute the niri key bindings because the main Wayland compositor is using them, thus the niri window need to capture the keyboard and drop with some key binding (QEMU use Ctrl+Alt+G to drop the mouse grab).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/72/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/issues/54",
      "id": 1958385025,
      "node_id": "I_kwDOKFkxdc50upWB",
      "number": 54,
      "title": "Feature: Blur Support",
      "user": {
        "login": "ozwaldorf",
        "id": 8976745,
        "node_id": "MDQ6VXNlcjg5NzY3NDU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/8976745?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ozwaldorf",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 10168191230,
          "node_id": "LA_kwDOKFkxdc8AAAACXhJI_g",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/area:visuals",
          "name": "area:visuals",
          "color": "fbca04",
          "default": false,
          "description": "Animations, shaders, visual artifacts"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 32,
      "created_at": "2023-10-24T03:00:38Z",
      "updated_at": "2026-02-21T11:28:46Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": {
        "id": 31081259,
        "node_id": "IT_kwDOD3jSk84B2kMr",
        "name": "Enhancement",
        "description": "Improvements to existing functionality or new functionality",
        "color": "blue",
        "created_at": "2026-02-05T12:19:48Z",
        "updated_at": "2026-02-10T06:22:32Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Would love to see blur support included for transparent windows, likely Dual Kawase, and a nice to have would be a configurable noise pass to mitigate banding from the blur algorithm.\n\n> Edit: Please do not comment in the thread asking for the feature. It is confirmed as planned, and therefore will eventually come when the maintainers and upstream frameworks support it.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/niri-wm/niri/issues/54/reactions",
        "total_count": 524,
        "+1": 506,
        "-1": 3,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 15
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    }
  ],
  "pulls": [
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3538",
      "id": 3339537280,
      "node_id": "PR_kwDOKFkxdc7HDUuA",
      "number": 3538,
      "state": "open",
      "locked": false,
      "title": "Fix/floating repeated size request",
      "user": {
        "login": "higorprado",
        "id": 1037397,
        "node_id": "MDQ6VXNlcjEwMzczOTc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1037397?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/higorprado",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Summary\r\n- Fix a floating `request_size_once()` case where a repeated same-size request could be dropped after a stale commit.\r\n- Skip redundant floating configure requests when the requested concrete size already matches the committed window size.\r\n- Preserve interactive-move behavior (no regression).\r\n\r\n## Behavior Changes\r\n- `tests::floating::repeated_size_request`:\r\n  - before: last same-size request after commit could produce no configure\r\n  - after: configure is re-sent correctly\r\n- `tests::floating::resize_to_same_size`:\r\n  - before: redundant configure could be sent even when size already matched\r\n  - after: no configure is sent\r\n\r\n## Validation\r\n- Floating test module passes, including:\r\n  - `repeated_size_request`\r\n  - `resize_to_same_size`\r\n  - `resize_to_different_then_same`\r\n  - `resize_during_interactive_move_propagates_to_floating`",
      "created_at": "2026-02-28T23:36:22Z",
      "updated_at": "2026-02-28T23:36:22Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "917019e564611f40b242ee7ffcb5c8718157b839",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "higorprado:fix/floating-repeated-size-request",
        "ref": "fix/floating-repeated-size-request",
        "sha": "9fd90c87da56b0821f8948de83c697b029820cc6",
        "user": {
          "login": "higorprado",
          "id": 1037397,
          "node_id": "MDQ6VXNlcjEwMzczOTc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1037397?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/higorprado",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1169599054,
          "node_id": "R_kgDORbaqTg",
          "name": "niri",
          "full_name": "higorprado/niri",
          "private": false,
          "owner": {
            "login": "higorprado",
            "id": 1037397,
            "node_id": "MDQ6VXNlcjEwMzczOTc=",
            "avatar_url": "https://avatars.githubusercontent.com/u/1037397?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/higorprado",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/higorprado/niri",
          "created_at": "2026-02-28T23:22:33Z",
          "updated_at": "2026-02-28T23:22:33Z",
          "pushed_at": "2026-02-28T23:32:06Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 6894,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "e708f546153f74acf33eb183b3b2992587a701e5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3538"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3538"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3538"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3538/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3538/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3538/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/9fd90c87da56b0821f8948de83c697b029820cc6"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3536",
      "id": 3337245200,
      "node_id": "PR_kwDOKFkxdc7G6lIQ",
      "number": 3536,
      "state": "open",
      "locked": false,
      "title": "improve config error messages for duplicate binds",
      "user": {
        "login": "Ind-E",
        "id": 30554197,
        "node_id": "MDQ6VXNlcjMwNTU0MTk3",
        "avatar_url": "https://avatars.githubusercontent.com/u/30554197?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Ind-E",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "For config files with duplicate keybinds, an additional error is emitted that points to the previous instance of the bind. If a single bind is repeated 3+ times, only the first duplicate will get an additional error.\r\n\r\nFor example, with this config:\r\n```kdl\r\nbinds {\r\n    Mod+Shift+Slash { show-hotkey-overlay; }\r\n\r\n    Mod+Shift+Slash { show-hotkey-overlay; }\r\n\r\n    Mod+Tab { focus-workspace-previous; }\r\n\r\n    Mod+Tab { focus-workspace-previous; }\r\n\r\n    // ...\r\n\r\n   Mod+Shift+Slash { show-hotkey-overlay; }\r\n}\r\n```\r\n\r\nThis error is shown\r\n```go\r\nError:   × error loading config\r\n  ├─▶ error parsing\r\n  ╰─▶ error parsing KDL\r\n\r\nError:   × duplicate keybind first defined here\r\n     ╭─[config.kdl:337:1]\r\n 337 │ binds {\r\n 338 │     Mod+Shift+Slash { show-hotkey-overlay; }\r\n     ·     ───────┬───────\r\n     ·            ╰── node starts here\r\n 339 │\r\n     ╰────\r\nError:   × duplicate keybind later defined here\r\n     ╭─[config.kdl:339:1]\r\n 339 │\r\n 340 │     Mod+Shift+Slash { show-hotkey-overlay; }\r\n     ·     ───────┬───────\r\n     ·            ╰── unexpected keybind\r\n 341 │\r\n     ╰────\r\nError:   × duplicate keybind first defined here\r\n     ╭─[config.kdl:341:1]\r\n 341 │\r\n 342 │     Mod+Tab { focus-workspace-previous; }\r\n     ·     ───┬───\r\n     ·        ╰── node starts here\r\n 343 │\r\n     ╰────\r\nError:   × duplicate keybind later defined here\r\n     ╭─[config.kdl:343:1]\r\n 343 │\r\n 344 │     Mod+Tab { focus-workspace-previous; }\r\n     ·     ───┬───\r\n     ·        ╰── unexpected keybind\r\n 345 │\r\n     ╰────\r\nError:   × duplicate keybind later defined here\r\n     ╭─[config.kdl:600:1]\r\n 600 │\r\n 601 │     Mod+Shift+Slash { show-hotkey-overlay; }\r\n     ·     ───────┬───────\r\n     ·            ╰── unexpected keybind\r\n 602 │ }\r\n     ╰────\r\n```",
      "created_at": "2026-02-27T20:38:34Z",
      "updated_at": "2026-02-27T20:38:34Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "b2bc6213d9d2ddf48998717df525de0cea672963",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Ind-E:main",
        "ref": "main",
        "sha": "a77caec5787486039040159741c51de04ed624a3",
        "user": {
          "login": "Ind-E",
          "id": 30554197,
          "node_id": "MDQ6VXNlcjMwNTU0MTk3",
          "avatar_url": "https://avatars.githubusercontent.com/u/30554197?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Ind-E",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1062291991,
          "node_id": "R_kgDOP1FKFw",
          "name": "niri",
          "full_name": "Ind-E/niri",
          "private": false,
          "owner": {
            "login": "Ind-E",
            "id": 30554197,
            "node_id": "MDQ6VXNlcjMwNTU0MTk3",
            "avatar_url": "https://avatars.githubusercontent.com/u/30554197?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Ind-E",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Ind-E/niri",
          "created_at": "2025-09-23T04:24:26Z",
          "updated_at": "2026-02-27T20:30:57Z",
          "pushed_at": "2026-02-27T20:30:52Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 10750,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "e708f546153f74acf33eb183b3b2992587a701e5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3536"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3536"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3536"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3536/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3536/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3536/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/a77caec5787486039040159741c51de04ed624a3"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3533",
      "id": 3335331219,
      "node_id": "PR_kwDOKFkxdc7GzR2T",
      "number": 3533,
      "state": "open",
      "locked": false,
      "title": "feat: Added recursion for binds config",
      "user": {
        "login": "spiros132",
        "id": 98518357,
        "node_id": "U_kgDOBd9FVQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/98518357?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/spiros132",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR adds a feature regarding the binds config. It adds the ability for binds to have a more \"organized\" view as shown below. This PR still allows the normal way to create bindings, but also adds the recursive way. \r\n\r\n```kdl\r\nMod {\r\n  D { spawn-sh \"fuzzel\"; }\r\n}\r\n\r\nMod {\r\n  1 { focus-workspace 1; }\r\n  ...\r\n  9 { focus-workspace 9; }  \r\n\r\n  Shift {\r\n    1 { move-column-to-workspace 1; }\r\n    ...\r\n    9 { move-column-to-workspace 9; }\r\n  }\r\n}\r\n\r\nMod+Print { screenshot; }\r\n```\r\n\r\nWhen it comes to bind properties it follows the standard \"OOP idea\", for example if the parent has an allow-when-locked property, the child also follows the parent's allow-when-locked unless overridden. \r\n\r\n```kdl\r\nCtrl allow-when-locked=true {\r\n  // Allow when locked will be true for the Alt+Delete below as well.\r\n  Alt+Delete { quit; }\r\n\r\n  // Override the allow-when-locked to be false\r\n  Q allow-when-locked=false { close-window; }\r\n}\r\n```\r\n\r\nIf something looks weird, there is any bugs or anything could be changed to look better in the code, please do tell me!",
      "created_at": "2026-02-27T11:26:55Z",
      "updated_at": "2026-02-27T11:26:55Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "a097b9c924c03cabc1462c20839b6f2bb89462fe",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "spiros132:main",
        "ref": "main",
        "sha": "efac27145e777430a8a1ab7df163e713a2a41d4c",
        "user": {
          "login": "spiros132",
          "id": 98518357,
          "node_id": "U_kgDOBd9FVQ",
          "avatar_url": "https://avatars.githubusercontent.com/u/98518357?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/spiros132",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1165013166,
          "node_id": "R_kgDORXCwrg",
          "name": "niri",
          "full_name": "spiros132/niri",
          "private": false,
          "owner": {
            "login": "spiros132",
            "id": 98518357,
            "node_id": "U_kgDOBd9FVQ",
            "avatar_url": "https://avatars.githubusercontent.com/u/98518357?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/spiros132",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/spiros132/niri",
          "created_at": "2026-02-23T18:23:23Z",
          "updated_at": "2026-02-27T11:12:00Z",
          "pushed_at": "2026-02-27T11:11:56Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 6893,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3533"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3533"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3533"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3533/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3533/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3533/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/efac27145e777430a8a1ab7df163e713a2a41d4c"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3531",
      "id": 3333896850,
      "node_id": "PR_kwDOKFkxdc7GtzqS",
      "number": 3531,
      "state": "open",
      "locked": false,
      "title": "Feat/transition anim",
      "user": {
        "login": "Atan-D-RP4",
        "id": 113052920,
        "node_id": "U_kgDOBr0M-A",
        "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Atan-D-RP4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Intending to implement full animations for the `do-screen-transition` action with custom-shader support.\r\nRelevant discussion: #1620 \r\n\r\nThe use-case is that I wanted more effects for workspace switch while overview is not enabled.\r\n\r\nExtending the existing switch animation does not make sense design-wise and this action existed so this felt like a pretty natural workaround.\r\n\r\n\r\nhttps://github.com/user-attachments/assets/56020aaf-f52c-41b9-b141-becc02482e0b\r\n\r\n",
      "created_at": "2026-02-27T03:51:33Z",
      "updated_at": "2026-03-01T19:12:10Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "64bb9a79d146a631a1b3c87ce2b8883aaea66f72",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Atan-D-RP4:feat/transition-anim",
        "ref": "feat/transition-anim",
        "sha": "288e16795cd5c5cc561618c645201815206acd58",
        "user": {
          "login": "Atan-D-RP4",
          "id": 113052920,
          "node_id": "U_kgDOBr0M-A",
          "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Atan-D-RP4",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1099970565,
          "node_id": "R_kgDOQZA4BQ",
          "name": "niri",
          "full_name": "Atan-D-RP4/niri",
          "private": false,
          "owner": {
            "login": "Atan-D-RP4",
            "id": 113052920,
            "node_id": "U_kgDOBr0M-A",
            "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Atan-D-RP4",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Atan-D-RP4/niri",
          "created_at": "2025-11-19T17:08:58Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2026-03-01T19:07:14Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 9023,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "e708f546153f74acf33eb183b3b2992587a701e5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3531"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3531"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3531"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3531/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3531/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3531/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/288e16795cd5c5cc561618c645201815206acd58"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3522",
      "id": 3329787974,
      "node_id": "PR_kwDOKFkxdc7GeIhG",
      "number": 3522,
      "state": "open",
      "locked": false,
      "title": "build(deps): bump the rust-dependencies group across 1 directory with 13 updates",
      "user": {
        "login": "dependabot[bot]",
        "id": 49699333,
        "node_id": "MDM6Qm90NDk2OTkzMzM=",
        "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dependabot%5Bbot%5D",
        "type": "Bot",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Bumps the rust-dependencies group with 13 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [bytemuck](https://github.com/Lokathor/bytemuck) | `1.24.0` | `1.25.0` |\n| [clap_complete](https://github.com/clap-rs/clap) | `4.5.65` | `4.5.66` |\n| [futures-util](https://github.com/rust-lang/futures-rs) | `0.3.31` | `0.3.32` |\n| [png](https://github.com/image-rs/image-png) | `0.18.0` | `0.18.1` |\n| [zbus](https://github.com/z-galaxy/zbus) | `5.13.1` | `5.13.2` |\n| [proptest](https://github.com/proptest-rs/proptest) | `1.9.0` | `1.10.0` |\n| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.100` | `1.0.101` |\n| [bitflags](https://github.com/bitflags/bitflags) | `2.10.0` | `2.11.0` |\n| [clap](https://github.com/clap-rs/clap) | `4.5.54` | `4.5.59` |\n| [insta](https://github.com/mitsuhiko/insta) | `1.46.0` | `1.46.3` |\n| [csscolorparser](https://github.com/mazznoer/csscolorparser-rs) | `0.8.1` | `0.8.2` |\n| [regex](https://github.com/rust-lang/regex) | `1.12.2` | `1.12.3` |\n| [schemars](https://github.com/GREsau/schemars) | `1.2.0` | `1.2.1` |\n\n\nUpdates `bytemuck` from 1.24.0 to 1.25.0\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com/Lokathor/bytemuck/blob/main/changelog.md\">bytemuck's changelog</a>.</em></p>\n<blockquote>\n<h1><code>bytemuck</code> changelog</h1>\n<h2>1.25</h2>\n<ul>\n<li><a href=\"https://redirect.github.com/Lokathor/bytemuck/pull/333\">Remove extern &quot;stdcall&quot; fn ptr impls on non-x86-32 windows.</a></li>\n<li><a href=\"https://redirect.github.com/Lokathor/bytemuck/pull/344\">Fix nightly_portable_simd after LaneCount removal.</a></li>\n</ul>\n<h2>1.24</h2>\n<ul>\n<li><a href=\"https://redirect.github.com/Lokathor/bytemuck/pull/322\">use new stable avx512 types from rust 1.89</a></li>\n<li><a href=\"https://redirect.github.com/Lokathor/bytemuck/pull/317\">impl AnyBitPattern for [MaybeUninit&lt;T: AnyBitPattern&gt;; N]</a></li>\n<li>bump <code>derive</code> minimum version.</li>\n</ul>\n<h2>1.23.2</h2>\n<ul>\n<li>bump <code>derive</code> minimum version.</li>\n</ul>\n<h2>1.23.1</h2>\n<ul>\n<li>Added a windows-only <code>ZeroableInOption</code> impl for &quot;stdcall&quot; functions.</li>\n</ul>\n<h2>1.23</h2>\n<ul>\n<li><code>impl_core_error</code> crate feature adds <code>core::error::Error</code> impl.</li>\n<li>More <code>ZeroableInOption</code> impls.</li>\n</ul>\n<h2>1.22</h2>\n<ul>\n<li>Add the <code>pod_saturating</code> feature, which adds <code>Pod</code> impls for <code>Saturating&lt;T&gt;</code>\nwhen <code>T</code> is already <code>Pod</code>.</li>\n<li>A bump in the minimum <code>bytemuck_derive</code> dependency from 1.4.0 to 1.4.1 to\navoid a bug if you have a truly ancient <code>cargo.lock</code> file sitting around.</li>\n<li>Adds <code>Send</code> and <code>Sync</code> impls to <code>BoxBytes</code>.</li>\n</ul>\n<h2>1.21</h2>\n<ul>\n<li>Implement <code>Pod</code> and <code>Zeroable</code> for <code>core::arch::{x86, x86_64}::__m512</code>, <code>__m512d</code> and <code>__m512i</code> without nightly.\nRequires Rust 1.72, and is gated through the <code>avx512_simd</code> cargo feature.</li>\n<li>Allow the use of <code>must_cast_mut</code> and <code>must_cast_slice_mut</code> in const contexts.\nRequires Rust 1.83, and is gated through the <code>must_cast_extra</code> cargo feature.</li>\n<li>internal: introduced the <code>maybe_const_fn</code> macro that allows defining some function\nto be const depending upon some <code>cfg</code> predicate.</li>\n</ul>\n<h2>1.20</h2>\n<ul>\n<li>New functions to allocate zeroed <code>Arc</code> and <code>Rc</code>. Requires Rust 1.82</li>\n<li><code>TransparentWrapper</code> impls for <code>core::cmp::Reverse</code> and <code>core::num::Saturating</code>.</li>\n<li>internal: Simplified the library's <code>fill_zeroes</code> calls to <code>write_bytes</code></li>\n</ul>\n<h2>1.19</h2>\n<!-- raw HTML omitted -->\n</blockquote>\n<p>... (truncated)</p>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/Lokathor/bytemuck/commit/164cedda0eae131bc6cb67902599f4ec253642ca\"><code>164cedd</code></a> chore: Release bytemuck version 1.25.0</li>\n<li><a href=\"https://github.com/Lokathor/bytemuck/commit/10a9319fa47c8161fdb359c936ab03e1b69adf72\"><code>10a9319</code></a> that was a derive PR</li>\n<li><a href=\"https://github.com/Lokathor/bytemuck/commit/a35eaea74a81e0562b583d65c727f7246e0b8600\"><code>a35eaea</code></a> changelog</li>\n<li><a href=\"https://github.com/Lokathor/bytemuck/commit/7009d79870508b50dff8166255761dae5ddcb6ae\"><code>7009d79</code></a> Fix <code>nightly_portable_simd</code> after <code>LaneCount</code> removal. (<a href=\"https://redirect.github.com/Lokathor/bytemuck/issues/344\">#344</a>)</li>\n<li><a href=\"https://github.com/Lokathor/bytemuck/commit/58c62034e9059a2cab5cfb40d45cc45acd3a4d5c\"><code>58c6203</code></a> Make derive(NoUninit) have the same constraints as Pod (<a href=\"https://redirect.github.com/Lokathor/bytemuck/issues/341\">#341</a>)</li>\n<li><a href=\"https://github.com/Lokathor/bytemuck/commit/e4bce3b32c33888c99d1fb1b5ff66f2a03a92f56\"><code>e4bce3b</code></a> docs: fix typo (<a href=\"https://redirect.github.com/Lokathor/bytemuck/issues/337\">#337</a>)</li>\n<li><a href=\"https://github.com/Lokathor/bytemuck/commit/316607cdf1ecd4e2b56e736128b86e5d9ba5f447\"><code>316607c</code></a> Fix CheckedBitPattern derive tests on big-endian (<a href=\"https://redirect.github.com/Lokathor/bytemuck/issues/336\">#336</a>)</li>\n<li><a href=\"https://github.com/Lokathor/bytemuck/commit/92d78d2689ea60cd758fbdecd28cb9e50b4dd5f4\"><code>92d78d2</code></a> Remove <code>extern &quot;stdcall&quot;</code> fn ptr impls on non-x86-32 windows. (<a href=\"https://redirect.github.com/Lokathor/bytemuck/issues/333\">#333</a>)</li>\n<li><a href=\"https://github.com/Lokathor/bytemuck/commit/0afbe8fc2db3d2d540e2a5449ffd39e3e39bc08e\"><code>0afbe8f</code></a> Fix 32bit tests (<a href=\"https://redirect.github.com/Lokathor/bytemuck/issues/331\">#331</a>)</li>\n<li>See full diff in <a href=\"https://github.com/Lokathor/bytemuck/compare/v1.24.0...v1.25.0\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `clap_complete` from 4.5.65 to 4.5.66\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/clap-rs/clap/commit/05bac738ebc886143cceb80dd6905a41b42952bf\"><code>05bac73</code></a> chore: Release</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/d37483586ff582e07a3fc62b10fa98ce7d227b4f\"><code>d374835</code></a> chore: Release</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/b55bf9e69db3e135300be85382addae713e0b2f7\"><code>b55bf9e</code></a> docs(contrib): Update PR conventions from _rust template</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/48c3b1139785a29f24cf18989f551622123275c0\"><code>48c3b11</code></a> chore: Release</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/4589490d18f5f802d40f6e77c041ef4f7e5a63c6\"><code>4589490</code></a> docs: Update changelog</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/78a7962bbb01dd0eb9dbf33af800d6c988f47cf7\"><code>78a7962</code></a> Merge pull request <a href=\"https://redirect.github.com/clap-rs/clap/issues/6243\">#6243</a> from epage/term</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/21828f4c9f50f5239ee06a8baf4af26f9c42a96b\"><code>21828f4</code></a> Merge pull request <a href=\"https://redirect.github.com/clap-rs/clap/issues/6245\">#6245</a> from epage/complete</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/b8c9ad5b3332f63ba4119be1d24187b5caa09e33\"><code>b8c9ad5</code></a> test(complete): Update for new versions</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/54f1ab89309b12f64c2d659901163369a9182331\"><code>54f1ab8</code></a> Merge pull request <a href=\"https://redirect.github.com/clap-rs/clap/issues/6244\">#6244</a> from epage/typo</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/c40ad5c5d59d0387012b03d55a18a27a572843e5\"><code>c40ad5c</code></a> docs: Fix a typo</li>\n<li>Additional commits viewable in <a href=\"https://github.com/clap-rs/clap/compare/clap_complete-v4.5.65...clap_complete-v4.5.66\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `futures-util` from 0.3.31 to 0.3.32\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/rust-lang/futures-rs/releases\">futures-util's releases</a>.</em></p>\n<blockquote>\n<h2>0.3.32</h2>\n<ul>\n<li>Bump MSRV of utility crates to 1.71. (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2989\">#2989</a>)</li>\n<li>Soft-deprecate <code>ready!</code> macro in favor of <code>std::task::ready!</code> added in Rust 1.64 (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2925\">#2925</a>)</li>\n<li>Soft-deprecate <code>pin_mut!</code> macro in favor of <code>std::pin::pin!</code> added in Rust 1.68 (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2929\">#2929</a>)</li>\n<li>Add <code>FuturesOrdered::clear</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2927\">#2927</a>)</li>\n<li>Add <code>mpsc::*Receiver::recv</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2947\">#2947</a>)</li>\n<li>Add <code>mpsc::*Receiver::try_recv</code> and deprecate <code>mpsc::*Receiver::::try_next</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2944\">#2944</a>)</li>\n<li>Implement <code>FusedStream</code> for <code>sink::With</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2948\">#2948</a>)</li>\n<li>Add <code>no_std</code> support for <code>shared</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2868\">#2868</a>)</li>\n<li>Make <code>Mutex::new()</code> const (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2956\">#2956</a>)</li>\n<li>Add <code>#[clippy::has_significant_drop]</code> to guards (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2967\">#2967</a>)</li>\n<li>Remove dependency to <code>pin-utils</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2929\">#2929</a>)</li>\n<li>Remove dependency on <code>num_cpus</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2946\">#2946</a>)</li>\n<li>Performance improvements (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2983\">#2983</a>)</li>\n<li>Documentation improvements (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2925\">#2925</a>, <a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2926\">#2926</a>, <a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2940\">#2940</a>, <a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2971\">#2971</a>)</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md\">futures-util's changelog</a>.</em></p>\n<blockquote>\n<h1>0.3.32 - 2026-02-15</h1>\n<ul>\n<li>Bump MSRV of utility crates to 1.71. (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2989\">#2989</a>)</li>\n<li>Soft-deprecate <code>ready!</code> macro in favor of <code>std::task::ready!</code> added in Rust 1.64 (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2925\">#2925</a>)</li>\n<li>Soft-deprecate <code>pin_mut!</code> macro in favor of <code>std::pin::pin!</code> added in Rust 1.68 (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2929\">#2929</a>)</li>\n<li>Add <code>FuturesOrdered::clear</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2927\">#2927</a>)</li>\n<li>Add <code>mpsc::*Receiver::recv</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2947\">#2947</a>)</li>\n<li>Add <code>mpsc::*Receiver::try_recv</code> and deprecate <code>mpsc::*Receiver::::try_next</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2944\">#2944</a>)</li>\n<li>Implement <code>FusedStream</code> for <code>sink::With</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2948\">#2948</a>)</li>\n<li>Add <code>no_std</code> support for <code>shared</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2868\">#2868</a>)</li>\n<li>Make <code>Mutex::new()</code> const (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2956\">#2956</a>)</li>\n<li>Add <code>#[clippy::has_significant_drop]</code> to guards (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2967\">#2967</a>)</li>\n<li>Remove dependency to <code>pin-utils</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2929\">#2929</a>)</li>\n<li>Remove dependency on <code>num_cpus</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2946\">#2946</a>)</li>\n<li>Performance improvements (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2983\">#2983</a>)</li>\n<li>Documentation improvements (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2925\">#2925</a>, <a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2926\">#2926</a>, <a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2940\">#2940</a>, <a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2971\">#2971</a>)</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/rust-lang/futures-rs/commit/d9bba94c239daa1175a5bb2958f37a5c72db3f6a\"><code>d9bba94</code></a> Release 0.3.32</li>\n<li><a href=\"https://github.com/rust-lang/futures-rs/commit/151e0b90dec62103df5239f0612f42467994f406\"><code>151e0b9</code></a> Add comments on rust-version field in Cargo.toml</li>\n<li><a href=\"https://github.com/rust-lang/futures-rs/commit/4aaf00c35176d7180557559f54b0c151e2e608aa\"><code>4aaf00c</code></a> Bump MSRV of utility crates to 1.71</li>\n<li><a href=\"https://github.com/rust-lang/futures-rs/commit/a4cce12c55942c6e1f2a507061fc6ca94c5b8862\"><code>a4cce12</code></a> perf: improve AtomicWaker::wake performance (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2983\">#2983</a>)</li>\n<li><a href=\"https://github.com/rust-lang/futures-rs/commit/ba9d102ca6e4a941a5068a1a8dcf0ff3a6c9085a\"><code>ba9d102</code></a> Add <code>#[clippy::has_significant_drop]</code> to guards (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2967\">#2967</a>)</li>\n<li><a href=\"https://github.com/rust-lang/futures-rs/commit/20396a83eff35414d17320dc35858243e54f0bc8\"><code>20396a8</code></a> Fix rustdoc::broken_intra_doc_links warning</li>\n<li><a href=\"https://github.com/rust-lang/futures-rs/commit/815f6eb4e40ca9ff81d7d9a25a863d3c1ffdb79e\"><code>815f6eb</code></a> Fix documentation of <code>BiLock::lock</code> (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2971\">#2971</a>)</li>\n<li><a href=\"https://github.com/rust-lang/futures-rs/commit/0f0db0421d4edc9fc56c3643f7e7f3bd23058023\"><code>0f0db04</code></a> futures-util: make <code>Mutex::new()</code> const (<a href=\"https://redirect.github.com/rust-lang/futures-rs/issues/2956\">#2956</a>)</li>\n<li><a href=\"https://github.com/rust-lang/futures-rs/commit/5d6fc5e4083f5da376ccc7a50403d842e553e286\"><code>5d6fc5e</code></a> ci: Test big-endian target (s390x Linux)</li>\n<li><a href=\"https://github.com/rust-lang/futures-rs/commit/9f739fe40b9c3e80b8f40054a739a220428a4675\"><code>9f739fe</code></a> Ignore dead_code lint on Fn1 trait</li>\n<li>Additional commits viewable in <a href=\"https://github.com/rust-lang/futures-rs/compare/0.3.31...0.3.32\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `png` from 0.18.0 to 0.18.1\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com/image-rs/image-png/blob/master/CHANGES.md\">png's changelog</a>.</em></p>\n<blockquote>\n<h2>0.18.1</h2>\n<h3>Additions</h3>\n<ul>\n<li>Added <code>Filter::MinEntropy</code> for encoding, which selects the filter that\nminimizes the Shannon entropy of the filtered row. (<a href=\"https://redirect.github.com/image-rs/image-png/issues/647\">#647</a>)</li>\n<li>Made <code>ScaledFloat::SCALING</code> constant public. (<a href=\"https://redirect.github.com/image-rs/image-png/issues/650\">#650</a>)</li>\n<li>Support skipping chunks without loading them into memory. (<a href=\"https://redirect.github.com/image-rs/image-png/issues/630\">#630</a>)</li>\n<li>Allow full unfiltering for partial data, enabling progressive decoding\nuse cases. (<a href=\"https://redirect.github.com/image-rs/image-png/issues/664\">#664</a>)</li>\n</ul>\n<h3>Changes</h3>\n<ul>\n<li>Improved Paeth unfilter auto-vectorization by changing how loop state\nis maintained. (<a href=\"https://redirect.github.com/image-rs/image-png/issues/635\">#635</a>)</li>\n<li>Added <code>portable_simd</code> Paeth unfiltering for 3bpp and 4bpp images on nightly.\n(<a href=\"https://redirect.github.com/image-rs/image-png/issues/632\">#632</a>, <a href=\"https://redirect.github.com/image-rs/image-png/issues/633\">#633</a>)</li>\n<li>Add early exit for adaptive filter selection when a perfect filter is found.\n(<a href=\"https://redirect.github.com/image-rs/image-png/issues/646\">#646</a>)</li>\n<li>Ignore duplicate <code>acTL</code> chunks instead of producing errors. (<a href=\"https://redirect.github.com/image-rs/image-png/issues/651\">#651</a>)</li>\n<li>Require IDAT chunk(s) before fdAT chunks, as mandated by PNG specification.\n(<a href=\"https://redirect.github.com/image-rs/image-png/issues/653\">#653</a>)</li>\n<li>Enforce <code>acTL</code> frame counts to be valid PNG 4-byte integers (capped at 2^31-1).\n(<a href=\"https://redirect.github.com/image-rs/image-png/issues/673\">#673</a>)</li>\n</ul>\n<h3>Fixes</h3>\n<ul>\n<li>Fixed and improved intra-doc links in documentation comments. (<a href=\"https://redirect.github.com/image-rs/image-png/issues/665\">#665</a>)</li>\n<li>Fixed nightly <code>portable_simd</code> build. (<a href=\"https://redirect.github.com/image-rs/image-png/issues/675\">#675</a>)</li>\n</ul>\n<p><a href=\"https://redirect.github.com/image-rs/image-png/issues/630\">#630</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/630\">image-rs/image-png#630</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/632\">#632</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/632\">image-rs/image-png#632</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/633\">#633</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/633\">image-rs/image-png#633</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/635\">#635</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/635\">image-rs/image-png#635</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/646\">#646</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/646\">image-rs/image-png#646</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/647\">#647</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/647\">image-rs/image-png#647</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/650\">#650</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/650\">image-rs/image-png#650</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/651\">#651</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/651\">image-rs/image-png#651</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/653\">#653</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/653\">image-rs/image-png#653</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/664\">#664</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/664\">image-rs/image-png#664</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/665\">#665</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/665\">image-rs/image-png#665</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/673\">#673</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/673\">image-rs/image-png#673</a>\n<a href=\"https://redirect.github.com/image-rs/image-png/issues/675\">#675</a>: <a href=\"https://redirect.github.com/image-rs/image-png/pull/675\">image-rs/image-png#675</a></p>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li>See full diff in <a href=\"https://github.com/image-rs/image-png/commits\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `zbus` from 5.13.1 to 5.13.2\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/z-galaxy/zbus/releases\">zbus's releases</a>.</em></p>\n<blockquote>\n<h2>zbus-5.13.2</h2>\n<h3>Fixed</h3>\n<ul>\n<li>🐛 fix regression on windows build. <a href=\"https://redirect.github.com/z-galaxy/zbus/issues/1686\">#1686</a></li>\n<li>🐛 Correct Peer interface to work on any arbitrary object path.</li>\n</ul>\n<h2>zbus_macros-5.13.2</h2>\n<h3>Fixed</h3>\n<ul>\n<li>🐛 Allow <code>out_args</code> with multiple names for non-tuple types.</li>\n</ul>\n<h3>Other</h3>\n<ul>\n<li>🤖 release-plz: Fix formatting of CHANGELOG files.</li>\n<li>🤖 release-plz: Use the default header in changelog.</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/z-galaxy/zbus/commit/3c2fae5077a52dc12fe098a403d27a56c414b93b\"><code>3c2fae5</code></a> Merge pull request <a href=\"https://redirect.github.com/z-galaxy/zbus/issues/1688\">#1688</a> from zeenix/zb-release</li>\n<li><a href=\"https://github.com/z-galaxy/zbus/commit/00bbca0accc02b113f00d0c15aad04d291d74b78\"><code>00bbca0</code></a> 🔖 zb,zm: Release 5.13.2</li>\n<li><a href=\"https://github.com/z-galaxy/zbus/commit/fead96310e593bed77303f7419c8a7ccb5b90f3c\"><code>fead963</code></a> 🤖 release-plz: Custom regex for minor version bump</li>\n<li><a href=\"https://github.com/z-galaxy/zbus/commit/fa2794d19cecc4d37947c9bd956549442768bb91\"><code>fa2794d</code></a> Merge pull request <a href=\"https://redirect.github.com/z-galaxy/zbus/issues/1687\">#1687</a> from fmartinsons-una/fm/fix-1686</li>\n<li><a href=\"https://github.com/z-galaxy/zbus/commit/3d4ed5711f417d355e5d7cce7007fcc0982288ce\"><code>3d4ed57</code></a> 🐛 zb: fix regression on windows build</li>\n<li><a href=\"https://github.com/z-galaxy/zbus/commit/f473c1dd77904ea32213f07a4fee400c3a9247bd\"><code>f473c1d</code></a> Merge pull request <a href=\"https://redirect.github.com/z-galaxy/zbus/issues/1685\">#1685</a> from zeenix/zv-revert-hashmap-breakage</li>\n<li><a href=\"https://github.com/z-galaxy/zbus/commit/d28c24d7527eb261a1ba35125a68767f826a7628\"><code>d28c24d</code></a> 🔖 zvariant 5.9.2</li>\n<li><a href=\"https://github.com/z-galaxy/zbus/commit/60bba3d8a51758be47a3df1c345582e7f2a0634f\"><code>60bba3d</code></a> ⏪️ Revert &quot;🐛 zv: Don't impl Type for dicts with non-basic keys&quot;</li>\n<li><a href=\"https://github.com/z-galaxy/zbus/commit/78ab879ed889869576ac73beee4935654a87878e\"><code>78ab879</code></a> Merge pull request <a href=\"https://redirect.github.com/z-galaxy/zbus/issues/1635\">#1635</a> from cachebag/peer-any-path</li>\n<li><a href=\"https://github.com/z-galaxy/zbus/commit/b13974284643d58a280e38512fac0478a5c7de45\"><code>b139742</code></a> 🐛 zb: Correct Peer interface to work on any arbitrary object path</li>\n<li>Additional commits viewable in <a href=\"https://github.com/z-galaxy/zbus/compare/zbus-5.13.1...zbus-5.13.2\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `proptest` from 1.9.0 to 1.10.0\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/proptest-rs/proptest/commit/4814e510f61b402c94d7063086ed61fda732736f\"><code>4814e51</code></a> Merge pull request <a href=\"https://redirect.github.com/proptest-rs/proptest/issues/627\">#627</a> from proptest-rs/release-prep-1.10</li>\n<li><a href=\"https://github.com/proptest-rs/proptest/commit/8221c9a314ccb85209fc1a314736d0e97d1f8650\"><code>8221c9a</code></a> prep 1.10 (and other) release(s)</li>\n<li><a href=\"https://github.com/proptest-rs/proptest/commit/28961bf85a80183e3e8e032f8627ffe3e32493e1\"><code>28961bf</code></a> fix(macro): set <code>Config::test_name</code> to actual fn name (<a href=\"https://redirect.github.com/proptest-rs/proptest/issues/619\">#619</a>)</li>\n<li><a href=\"https://github.com/proptest-rs/proptest/commit/8fb08ffca8e70e16956f5d34fed35ab47f001e88\"><code>8fb08ff</code></a> Update trybuild requirement from =1.0.113 to =1.0.115 (<a href=\"https://redirect.github.com/proptest-rs/proptest/issues/624\">#624</a>)</li>\n<li><a href=\"https://github.com/proptest-rs/proptest/commit/5b7a435151b5755169e04561118c07b40f03e7c4\"><code>5b7a435</code></a> Update convert_case requirement from 0.6 to 0.11 (<a href=\"https://redirect.github.com/proptest-rs/proptest/issues/623\">#623</a>)</li>\n<li><a href=\"https://github.com/proptest-rs/proptest/commit/14d95fcd7f7800ee792a177628c4fcdc4bb03713\"><code>14d95fc</code></a> Merge pull request <a href=\"https://redirect.github.com/proptest-rs/proptest/issues/586\">#586</a> from regexident/range-subset-strategy</li>\n<li><a href=\"https://github.com/proptest-rs/proptest/commit/229e72393f07966965c88a2c24c281be1a6854d0\"><code>229e723</code></a> Merge pull request <a href=\"https://redirect.github.com/proptest-rs/proptest/issues/622\">#622</a> from ssanderson/proptest-macro-fixes</li>\n<li><a href=\"https://github.com/proptest-rs/proptest/commit/3663c38fc8572c90fa76f4d9de2c93dc955d88b7\"><code>3663c38</code></a> Merge pull request <a href=\"https://redirect.github.com/proptest-rs/proptest/issues/621\">#621</a> from wgyt/wgyt-patch</li>\n<li><a href=\"https://github.com/proptest-rs/proptest/commit/1fe04c9345768f37750b3eb557cae6ae7562c936\"><code>1fe04c9</code></a> Fix import of <code>HashMap</code></li>\n<li><a href=\"https://github.com/proptest-rs/proptest/commit/9c644db2becec9c77d038d7d877e444641f9aed7\"><code>9c644db</code></a> Support returning TestCaseResult from #[property_test] tests.</li>\n<li>Additional commits viewable in <a href=\"https://github.com/proptest-rs/proptest/compare/v1.9.0...v1.10.0\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `anyhow` from 1.0.100 to 1.0.101\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/dtolnay/anyhow/releases\">anyhow's releases</a>.</em></p>\n<blockquote>\n<h2>1.0.101</h2>\n<ul>\n<li>Add #[inline] to anyhow::Ok helper (<a href=\"https://redirect.github.com/dtolnay/anyhow/issues/437\">#437</a>, thanks <a href=\"https://github.com/Ibitier\"><code>@​Ibitier</code></a>)</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/dtolnay/anyhow/commit/80bfe291b16071c70f141e90e67e7032d966826b\"><code>80bfe29</code></a> Release 1.0.101</li>\n<li><a href=\"https://github.com/dtolnay/anyhow/commit/dff8c432f95095cac19aa446da5047880b8ebdf3\"><code>dff8c43</code></a> Merge pull request <a href=\"https://redirect.github.com/dtolnay/anyhow/issues/437\">#437</a> from Ibitier/inline-ok-helper</li>\n<li><a href=\"https://github.com/dtolnay/anyhow/commit/85d9ea9a1c7d7490578865e16ff64787efc7d01d\"><code>85d9ea9</code></a> Add #[inline] to anyhow::Ok helper</li>\n<li><a href=\"https://github.com/dtolnay/anyhow/commit/54036cc289b754775b884485f486e000bcda2875\"><code>54036cc</code></a> Update ui test suite to nightly-2026-01-21</li>\n<li><a href=\"https://github.com/dtolnay/anyhow/commit/cce0579d85fd1f6352a5955a9c134fc8655c853d\"><code>cce0579</code></a> Update actions/upload-artifact@v5 -&gt; v6</li>\n<li><a href=\"https://github.com/dtolnay/anyhow/commit/f2c598ca0e8ffd7ffcbcf93b8a6ad4df57c719fd\"><code>f2c598c</code></a> Update actions/upload-artifact@v4 -&gt; v5</li>\n<li><a href=\"https://github.com/dtolnay/anyhow/commit/2c0bda4ce944d943e7141f0316b0ea996602238e\"><code>2c0bda4</code></a> Update to 2021 edition</li>\n<li><a href=\"https://github.com/dtolnay/anyhow/commit/0d822681293d71c72440c9cdd635b4f15da064c4\"><code>0d82268</code></a> Remove rustc version requirement from readme</li>\n<li><a href=\"https://github.com/dtolnay/anyhow/commit/67df01216d29bc3bede925ab4483353b66c159f2\"><code>67df012</code></a> Merge pull request <a href=\"https://redirect.github.com/dtolnay/anyhow/issues/436\">#436</a> from dtolnay/up</li>\n<li><a href=\"https://github.com/dtolnay/anyhow/commit/c8984880a87ae4fd4b04c956cfdc9af5f69eab55\"><code>c898488</code></a> Raise required compiler to Rust 1.68</li>\n<li>Additional commits viewable in <a href=\"https://github.com/dtolnay/anyhow/compare/1.0.100...1.0.101\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `bitflags` from 2.10.0 to 2.11.0\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/bitflags/bitflags/releases\">bitflags's releases</a>.</em></p>\n<blockquote>\n<h2>2.11.0</h2>\n<h2>What's Changed</h2>\n<ul>\n<li>Fix use of Result in macro output by <a href=\"https://github.com/james7132\"><code>@​james7132</code></a> in <a href=\"https://redirect.github.com/bitflags/bitflags/pull/462\">bitflags/bitflags#462</a></li>\n<li>Add methods to get the known/unknown bits from a flags value by <a href=\"https://github.com/WaterWhisperer\"><code>@​WaterWhisperer</code></a> in <a href=\"https://redirect.github.com/bitflags/bitflags/pull/473\">bitflags/bitflags#473</a></li>\n<li>Prepare for 2.11.0 release by <a href=\"https://github.com/KodrAus\"><code>@​KodrAus</code></a> in <a href=\"https://redirect.github.com/bitflags/bitflags/pull/474\">bitflags/bitflags#474</a></li>\n</ul>\n<h2>New Contributors</h2>\n<ul>\n<li><a href=\"https://github.com/james7132\"><code>@​james7132</code></a> made their first contribution in <a href=\"https://redirect.github.com/bitflags/bitflags/pull/462\">bitflags/bitflags#462</a></li>\n<li><a href=\"https://github.com/WaterWhisperer\"><code>@​WaterWhisperer</code></a> made their first contribution in <a href=\"https://redirect.github.com/bitflags/bitflags/pull/473\">bitflags/bitflags#473</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/bitflags/bitflags/compare/2.10.0...2.11.0\">https://github.com/bitflags/bitflags/compare/2.10.0...2.11.0</a></p>\n</blockquote>\n</details>\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com/bitflags/bitflags/blob/main/CHANGELOG.md\">bitflags's changelog</a>.</em></p>\n<blockquote>\n<h1>2.11.0</h1>\n<h2>What's Changed</h2>\n<ul>\n<li>Fix use of Result in macro output by <a href=\"https://github.com/james7132\"><code>@​james7132</code></a> in <a href=\"https://redirect.github.com/bitflags/bitflags/pull/462\">bitflags/bitflags#462</a></li>\n<li>Add methods to get the known/unknown bits from a flags value by <a href=\"https://github.com/WaterWhisperer\"><code>@​WaterWhisperer</code></a> in <a href=\"https://redirect.github.com/bitflags/bitflags/pull/473\">bitflags/bitflags#473</a></li>\n</ul>\n<h2>New Contributors</h2>\n<ul>\n<li><a href=\"https://github.com/james7132\"><code>@​james7132</code></a> made their first contribution in <a href=\"https://redirect.github.com/bitflags/bitflags/pull/462\">bitflags/bitflags#462</a></li>\n<li><a href=\"https://github.com/WaterWhisperer\"><code>@​WaterWhisperer</code></a> made their first contribution in <a href=\"https://redirect.github.com/bitflags/bitflags/pull/473\">bitflags/bitflags#473</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/bitflags/bitflags/compare/2.10.0...2.11.0\">https://github.com/bitflags/bitflags/compare/2.10.0...2.11.0</a></p>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/bitflags/bitflags/commit/60c6a72743c53f43b56cebc8f2f1bd70f63863f8\"><code>60c6a72</code></a> Merge pull request <a href=\"https://redirect.github.com/bitflags/bitflags/issues/474\">#474</a> from bitflags/cargo/2.11.0</li>\n<li><a href=\"https://github.com/bitflags/bitflags/commit/79f4c050c5bfebf7a6cc3bc08765b87dd01c5bf2\"><code>79f4c05</code></a> prepare for 2.11.0 release</li>\n<li><a href=\"https://github.com/bitflags/bitflags/commit/81d5fac0f216b070bb1f933fa1d500423ede3239\"><code>81d5fac</code></a> Merge pull request <a href=\"https://redirect.github.com/bitflags/bitflags/issues/473\">#473</a> from WaterWhisperer/feat/get-unknown-bits</li>\n<li><a href=\"https://github.com/bitflags/bitflags/commit/a1c40f0c523bc902d1acedb0c80a7b25b3073546\"><code>a1c40f0</code></a> Fix clippy error</li>\n<li><a href=\"https://github.com/bitflags/bitflags/commit/b5d15b68786f9cf84438b109615e7d2d3675c8f8\"><code>b5d15b6</code></a> Add tests</li>\n<li><a href=\"https://github.com/bitflags/bitflags/commit/2041dc3ceb1eb06b76893f083211836e135621fa\"><code>2041dc3</code></a> Add methods to get the known/unknown bits from a flags value</li>\n<li><a href=\"https://github.com/bitflags/bitflags/commit/90488e522d51da1c7772fbafdeeee64c5bf2c198\"><code>90488e5</code></a> Merge pull request <a href=\"https://redirect.github.com/bitflags/bitflags/issues/462\">#462</a> from james7132/serde_core</li>\n<li><a href=\"https://github.com/bitflags/bitflags/commit/bc3c4fa8a0afd8edfbf4d8c15dcf3811cfd49a39\"><code>bc3c4fa</code></a> Use serde_core instead of serde</li>\n<li>See full diff in <a href=\"https://github.com/bitflags/bitflags/compare/2.10.0...2.11.0\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `clap` from 4.5.54 to 4.5.59\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/clap-rs/clap/releases\">clap's releases</a>.</em></p>\n<blockquote>\n<h2>v4.5.59</h2>\n<h2>[4.5.59] - 2026-02-16</h2>\n<h3>Fixes</h3>\n<ul>\n<li><code>Command::ignore_errors</code> no longer masks help/version on subcommands</li>\n</ul>\n<h2>v4.5.58</h2>\n<h2>[4.5.58] - 2026-02-11</h2>\n<h2>v4.5.57</h2>\n<h2>[4.5.57] - 2026-02-03</h2>\n<h3>Fixes</h3>\n<ul>\n<li>Regression from 4.5.55 where having an argument with <code>.value_terminator(&quot;--&quot;)</code> caused problems with an argument with <code>.last(true)</code></li>\n</ul>\n<h2>v4.5.56</h2>\n<h2>[4.5.56] - 2026-01-29</h2>\n<h3>Fixes</h3>\n<ul>\n<li>On conflict error, don't show conflicting arguments in the usage</li>\n</ul>\n<h2>v4.5.55</h2>\n<h2>[4.5.55] - 2026-01-27</h2>\n<h3>Fixes</h3>\n<ul>\n<li>Fix inconsistency in precedence between positionals with a <code>value_terminator(&quot;--&quot;)</code> and escapes (<code>--</code>) where <code>./foo -- bar</code> means the first arg is empty, rather than escaping future args</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com/clap-rs/clap/blob/master/CHANGELOG.md\">clap's changelog</a>.</em></p>\n<blockquote>\n<h2>[4.5.59] - 2026-02-16</h2>\n<h3>Fixes</h3>\n<ul>\n<li><code>Command::ignore_errors</code> no longer masks help/version on subcommands</li>\n</ul>\n<h2>[4.5.58] - 2026-02-11</h2>\n<h2>[4.5.57] - 2026-02-03</h2>\n<h3>Fixes</h3>\n<ul>\n<li>Regression from 4.5.55 where having an argument with <code>.value_terminator(&quot;--&quot;)</code> caused problems with an argument with <code>.last(true)</code></li>\n</ul>\n<h2>[4.5.56] - 2026-01-29</h2>\n<h3>Fixes</h3>\n<ul>\n<li>On conflict error, don't show conflicting arguments in the usage</li>\n</ul>\n<h2>[4.5.55] - 2026-01-27</h2>\n<h3>Fixes</h3>\n<ul>\n<li>Fix inconsistency in precedence between positionals with a <code>value_terminator(&quot;--&quot;)</code> and escapes (<code>--</code>) where <code>./foo -- bar</code> means the first arg is empty, rather than escaping future args</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/clap-rs/clap/commit/0bb3ad7e12e729be9f152391558689ac4fdd31ec\"><code>0bb3ad7</code></a> chore: Release</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/5cb5ce3873a882ba2a7d619864202eadef21fffa\"><code>5cb5ce3</code></a> docs: Update changelog</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/245c8ba75a481250a48170f1add11532a7b7fd33\"><code>245c8ba</code></a> Merge pull request <a href=\"https://redirect.github.com/clap-rs/clap/issues/6149\">#6149</a> from epage/wrap</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/dd17a418a9e6665c98ff6e0ba2a039fd1921988e\"><code>dd17a41</code></a> fix(help): Correctly calculate wrap points with ANSI escape codes</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/2cc4e350b9ea8955a9cf229405407426921e7871\"><code>2cc4e35</code></a> test(ui): Avoid override term width</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/93e3559b1e4c8c81377f3598f7249b7708f4c379\"><code>93e3559</code></a> refactor(help): Clarify that we're carrying over indentation</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/b1c46e633c04f5cb0d819b15f25c1fde1a6e42c4\"><code>b1c46e6</code></a> refactor(help): Clarify var name</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/03b9b38df059c1a9a529f295e038f81de295627a\"><code>03b9b38</code></a> test(help): Show styled wrapping behavior</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/c9a39a534c3e95926be272765bec48a80e5ea9e7\"><code>c9a39a5</code></a> Merge pull request <a href=\"https://redirect.github.com/clap-rs/clap/issues/6146\">#6146</a> from clap-rs/renovate/actions-checkout-5.x</li>\n<li><a href=\"https://github.com/clap-rs/clap/commit/58599fb7bf865f8ec0a7a021dea8111f5dffe6d2\"><code>58599fb</code></a> chore(deps): Update actions/checkout action to v5</li>\n<li>Additional commits viewable in <a href=\"https://github.com/clap-rs/clap/compare/clap_complete-v4.5.54...clap_complete-v4.5.59\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `insta` from 1.46.0 to 1.46.3\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/mitsuhiko/insta/releases\">insta's releases</a>.</em></p>\n<blockquote>\n<h2>1.46.3</h2>\n<h2>Release Notes</h2>\n<ul>\n<li>Fix inline escaped snapshots incorrectly stripping leading newlines when content contains control characters like carriage returns. The escaped format (used for snapshots with control chars) now correctly preserves the original content without stripping a non-existent formatting newline. <a href=\"https://redirect.github.com/mitsuhiko/insta/issues/865\">#865</a></li>\n</ul>\n<h2>Install cargo-insta 1.46.3</h2>\n<h3>Install prebuilt binaries via shell script</h3>\n<pre lang=\"sh\"><code>curl --proto '=https' --tlsv1.2 -LsSf https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-installer.sh | sh\n</code></pre>\n<h3>Install prebuilt binaries via powershell script</h3>\n<pre lang=\"sh\"><code>powershell -ExecutionPolicy Bypass -c &quot;irm https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-installer.ps1 | iex&quot;\n</code></pre>\n<h2>Download cargo-insta 1.46.3</h2>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Platform</th>\n<th>Checksum</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><a href=\"https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-aarch64-apple-darwin.tar.xz\">cargo-insta-aarch64-apple-darwin.tar.xz</a></td>\n<td>Apple Silicon macOS</td>\n<td><a href=\"https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-aarch64-apple-darwin.tar.xz.sha256\">checksum</a></td>\n</tr>\n<tr>\n<td><a href=\"https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-apple-darwin.tar.xz\">cargo-insta-x86_64-apple-darwin.tar.xz</a></td>\n<td>Intel macOS</td>\n<td><a href=\"https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-apple-darwin.tar.xz.sha256\">checksum</a></td>\n</tr>\n<tr>\n<td><a href=\"https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-pc-windows-msvc.zip\">cargo-insta-x86_64-pc-windows-msvc.zip</a></td>\n<td>x64 Windows</td>\n<td><a href=\"https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-pc-windows-msvc.zip.sha256\">checksum</a></td>\n</tr>\n<tr>\n<td><a href=\"https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-unknown-linux-gnu.tar.xz\">cargo-insta-x86_64-unknown-linux-gnu.tar.xz</a></td>\n<td>x64 Linux</td>\n<td><a href=\"https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-unknown-linux-gnu.tar.xz.sha256\">checksum</a></td>\n</tr>\n<tr>\n<td><a href=\"https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-unknown-linux-musl.tar.xz\">cargo-insta-x86_64-unknown-linux-musl.tar.xz</a></td>\n<td>x64 MUSL Linux</td>\n<td><a href=\"https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-unknown-linux-musl.tar.xz.sha256\">checksum</a></td>\n</tr>\n</tbody>\n</table>\n<h2>1.46.2</h2>\n<h2>Release Notes</h2>\n<ul>\n<li>Fix inline snapshot corruption with carriage returns. The <code>leading_space()</code> function incorrectly treated <code>\\r</code> as indentation, causing carriage returns to be stripped from snapshot content. <a href=\"https://redirect.github.com/mitsuhiko/insta/issues/866\">#866</a></li>\n<li>Remove <code>&lt; 0.4.17</code> upper bound on globset dependency. <a href=\"https://redirect.github.com/mitsuhiko/insta/issues/864\">#864</a></li>\n</ul>\n<h2>Install cargo-insta 1.46.2</h2>\n<h3>Install prebuilt binaries via shell script</h3>\n<pre lang=\"sh\"><code>curl --proto '=https' --tlsv1.2 -LsSf https://github.com/mitsuhiko/insta/releases/download/1.46.2/cargo-insta-installer.sh | sh\n</code></pre>\n<h3>Install prebuilt binaries via powershell script</h3>\n<pre lang=\"sh\"><code>powershell -ExecutionPolicy Bypass -c &quot;irm https://github.com/mitsuhiko/insta/releases/download/1.46.2/cargo-insta-installer.ps1 | iex&quot;\n</code></pre>\n<h2>Download cargo-insta 1.46.2</h2>\n<!-- raw HTML omitted -->\n</blockquote>\n<p>... (truncated)</p>\n</details>\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com/mitsuhiko/insta/blob/master/CHANGELOG.md\">insta's changelog</a>.</em></p>\n<blockquote>\n<h2>1.46.3</h2>\n<ul>\n<li>Fix inline escaped snapshots incorrectly stripping leading newlines when content contains control characters like carriage returns. The escaped format (used for snapshots with control chars) now correctly preserves the original content without stripping a non-existent formatting newline. <a href=\"https://redirect.github.com/mitsuhiko/insta/issues/865\">#865</a></li>\n</ul>\n<h2>1.46.2</h2>\n<ul>\n<li>Fix inline snapshot corruption with carriage returns. The <code>leading_space()</code> function incorrectly treated <code>\\r</code> as indentation, causing carriage returns to be stripped from snapshot content. <a href=\"https://redirect.github.com/mitsuhiko/insta/issues/866\">#866</a></li>\n<li>Remove <code>&lt; 0.4.17</code> upper bound on globset dependency. <a href=\"https://redirect.github.com/mitsuhiko/insta/issues/864\">#864</a></li>\n</ul>\n<h2>1.46.1</h2>\n<ul>\n<li>Fix inline snapshot corruption when multiple snapshots appear inside <code>with_settings!</code> macro. <a href=\"https://redirect.github.com/mitsuhiko/insta/issues/858\">#858</a></li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/mitsuhiko/insta/commit/13245901751701f45677b9cfe3537c182b47af02\"><code>1324590</code></a> Release 1.46.3 (<a href=\"https://redirect.github.com/mitsuhiko/insta/issues/870\">#870</a>)</li>\n<li><a href=\"https://github.com/mitsuhiko/insta/commit/b26bc7ffe1653d42e274077bb711559f2cd5a553\"><code>b26bc7f</code></a> Fix escaped format inline snapshots not stripping formatting newline (<a href=\"https://redirect.github.com/mitsuhiko/insta/issues/869\">#869</a>)</li>\n<li><a href=\"https://github.com/mitsuhiko/insta/commit/2ab00cc119bdb962735e0d249e641f18ffb2921f\"><code>2ab00cc</code></a> Release 1.46.2 (<a href=\"https://redirect.github.com/mitsuhiko/insta/issues/867\">#867</a>)</li>\n<li><a href=\"https://github.com/mitsuhiko/insta/commit/97c6f57879d8f17416958149587d6b657a0b52ff\"><code>97c6f57</code></a> Fix inline snapshot corruption with carriage returns (<a href=\"https://redirect.github.com/mitsuhiko/insta/issues/866\">#866</a>)</li>\n<li><a href=\"https://github.com/mitsuhiko/insta/commit/2a9f7adb06381655b648681494415ac3d5f14970\"><code>2a9f7ad</code></a> Remove globset version cap (<a href=\"https://redirect.github.com/mitsuhiko/insta/issues/864\">#864</a>)</li>\n<li><a href=\"https://github.com/mitsuhiko/insta/commit/8a5b77531f89bc78d00cab17f2ac8b2c69ceadab\"><code>8a5b775</code></a> Release 1.46.1 (<a href=\"https://redirect.github.com/mitsuhiko/insta/issues/859\">#859</a>)</li>\n<li><a href=\"https://github.com/mitsuhiko/insta/commit/822f404d0a5e2b5bfe3381505861f010e23350bc\"><code>822f404</code></a> Fix inline snapshot corruption with multiple snapshots in with_settings! (<a href=\"https://redirect.github.com/mitsuhiko/insta/issues/858\">#858</a>)</li>\n<li>See full diff in <a href=\"https://github.com/mitsuhiko/insta/compare/1.46.0...1.46.3\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `csscolorparser` from 0.8.1 to 0.8.2\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/mazznoer/csscolorparser-rs/releases\">csscolorparser's releases</a>.</em></p>\n<blockquote>\n<h2>csscolorparser v0.8.2</h2>\n<ul>\n<li>Parse <code>none</code> value in absolute color format.</li>\n<li>Changed <code>impl Display</code> for <code>Color</code> to hex color format.</li>\n<li>Remove unnecessary allocations.</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com/mazznoer/csscolorparser-rs/blob/master/CHANGELOG.md\">csscolorparser's changelog</a>.</em></p>\n<blockquote>\n<h2>[0.8.2]</h2>\n<h3>Changed</h3>\n<ul>\n<li>Parse <code>none</code> value in absolute color format.</li>\n<li>Changed <code>impl Display</code> for <code>Color</code> to hex color format.</li>\n<li>Remove unnecessary allocations.</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/mazznoer/csscolorparser-rs/commit/a7e014a8cd261e89d637aa2dcbaf4745b79292da\"><code>a7e014a</code></a> release v0.8.2</li>\n<li><a href=\"https://github.com/mazznoer/csscolorparser-rs/commit/312b8ae0aa2b5ef739dad32cdca9a9fc1f9b9dfb\"><code>312b8ae</code></a> fix error</li>\n<li><a href=\"https://github.com/mazznoer/csscolorparser-rs/commit/ba2130b69e63464420f46cacff26931a3595d192\"><code>ba2130b</code></a> remove another unnecessary allocation</li>\n<li><a href=\"https://github.com/mazznoer/csscolorparser-rs/commit/366af71360366ec76ce2ff38d194310870afc37c\"><code>366af71</code></a> reduce allocation</li>\n<li><a href=\"https://github.com/mazznoer/csscolorparser-rs/commit/2283b83eba08e36b5b90325cb9da54f52855abc1\"><code>2283b83</code></a> improve tests</li>\n<li><a href=\"https://github.com/mazznoer/csscolorparser-rs/commit/43af2b75a999462e07ee3b03c2a5b38b3b92739c\"><code>43af2b7</code></a> update changelog</li>\n<li><a href=\"https://github.com/mazznoer/csscolorparser-rs/commit/cd16c33d3172894065683bafbbd882ff46f4df95\"><code>cd16c33</code></a> parse multiple values at once</li>\n<li><a href=\"https://github.com/mazznoer/csscolorparser-rs/commit/10ea7eb5008a4a02626680e1acad956e197c49db\"><code>10ea7eb</code></a> changed <code>impl Display</code> for <code>Color</code> to hex color format</li>\n<li><a href=\"https://github.com/mazznoer/csscolorparser-rs/commit/b0b628d1d8b708f6dd4db78590319e3ea2566b8b\"><code>b0b628d</code></a> some improvements</li>\n<li><a href=\"https://github.com/mazznoer/csscolorparser-rs/commit/7d1ebe0f3f23b2ec7fdc75da56e1b501832e4786\"><code>7d1ebe0</code></a> parse <code>none</code> value</li>\n<li>See full diff in <a href=\"https://github.com/mazznoer/csscolorparser-rs/compare/v0.8.1...v0.8.2\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `regex` from 1.12.2 to 1.12.3\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com/rust-lang/regex/blob/master/CHANGELOG.md\">regex's changelog</a>.</em></p>\n<blockquote>\n<h1>1.12.3 (2025-02-03)</h1>\n<p>This release excludes some unnecessary things from the archive published to\ncrates.io. Specifically, fuzzing data and various shell scripts are now\nexcluded. If you run into problems, please file an issue.</p>\n<p>Improvements:</p>\n<ul>\n<li><a href=\"https://redirect.github.com/rust-lang/regex/pull/1319\">#1319</a>:\nSwitch from a Cargo <code>exclude</code> list to an <code>include</code> list, and exclude some\nunnecessary stuff.</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/rust-lang/regex/commit/b028e4f40eac8959d05e82abf8404906b1c565c0\"><code>b028e4f</code></a> 1.12.3</li>\n<li><a href=\"https://github.com/rust-lang/regex/commit/5e195de266e203441b2c8001d6ebefab1161a59e\"><code>5e195de</code></a> regex-automata-0.4.14</li>\n<li><a href=\"https://github.com/rust-lang/regex/commit/a3433f691863d80300dfd6a52e332cb5a568e895\"><code>a3433f6</code></a> regex-syntax-0.8.9</li>\n<li><a href=\"https://github.com/rust-lang/regex/commit/0c07fae444adf0802d84455e689f1143d2dd7790\"><code>0c07fae</code></a> regex-lite-0.1.9</li>\n<li><a href=\"https://github.com/rust-lang/regex/commit/6a810068f030c023a12c93ccae49bc5fd907c4f6\"><code>6a81006</code></a> cargo: exclude development scripts and fuzzing data</li>\n<li><a href=\"https://github.com/rust-lang/regex/commit/4733e28ba4f281f643ce93e4089eccbb9a9d5a5a\"><code>4733e28</code></a> automata: fix <code>onepass::DFA::try_search_slots</code> panic when too many slots are ...</li>\n<li>See full diff in <a href=\"https://github.com/rust-lang/regex/compare/1.12.2...1.12.3\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `schemars` from 1.2.0 to 1.2.1\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/GREsau/schemars/releases\">schemars's releases</a>.</em></p>\n<blockquote>\n<h2>v1.2.1</h2>\n<h3>Fixed</h3>\n<ul>\n<li><code>transform</code> attributes are now applied after the schema is otherwise fully constructed. In particular, they're now applied after all other attributes are processed. (<a href=\"https://redirect.github.com/GREsau/schemars/issues/505\">GREsau/schemars#505</a>)</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com/GREsau/schemars/blob/master/CHANGELOG.md\">schemars's changelog</a>.</em></p>\n<blockquote>\n<h2>[1.2.1] - 2026-02-01</h2>\n<h3>Fixed</h3>\n<ul>\n<li><code>transform</code> attributes are now applied after the schema is otherwise fully constructed. In particular, they're now applied after all other attributes are processed. (<a href=\"https://redirect.github.com/GREsau/schemars/issues/505\">GREsau/schemars#505</a>)</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/GREsau/schemars/commit/5ef5da1e9aecd0e949b591fbb1832fe53fa3e8ba\"><code>5ef5da1</code></a> v1.2.1</li>\n<li><a href=\"https://github.com/GREsau/schemars/commit/4081b98912e1f673cccac5aef3162d5634191995\"><code>4081b98</code></a> Apply <code>extend</code>/<code>transform</code> attributes after any other attributes (<a href=\"https://redirect.github.com/GREsau/schemars/issues/506\">#506</a>)</li>\n<li>See full diff in <a href=\"https://github.com/GREsau/schemars/compare/v1.2.0...v1.2.1\">compare view</a></li>\n</ul>\n</details>\n<br />\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n<details>\n<summary>Dependabot commands and options</summary>\n<br />\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n</details>",
      "created_at": "2026-02-26T08:48:46Z",
      "updated_at": "2026-02-26T08:48:47Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "a6945585afeaa49a485280dd4c0c1dc7981f1505",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {
        "0": {
          "id": 10191842585,
          "node_id": "LA_kwDOKFkxdc8AAAACX3stGQ",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/dependencies",
          "name": "dependencies",
          "color": "0366d6",
          "default": false,
          "description": "Pull requests that update a dependency file"
        },
        "1": {
          "id": 10191842591,
          "node_id": "LA_kwDOKFkxdc8AAAACX3stHw",
          "url": "https://api.github.com/repos/niri-wm/niri/labels/rust",
          "name": "rust",
          "color": "000000",
          "default": false,
          "description": "Pull requests that update rust code"
        }
      },
      "milestone": null,
      "draft": false,
      "head": {
        "label": "niri-wm:dependabot/cargo/rust-dependencies-123a2ee1e0",
        "ref": "dependabot/cargo/rust-dependencies-123a2ee1e0",
        "sha": "6127ae0bc98f2b705172b96cd0255f5f9ea08503",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3522"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3522"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3522"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3522/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3522/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3522/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/6127ae0bc98f2b705172b96cd0255f5f9ea08503"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        3,
        6,
        2,
        1,
        5,
        4,
        8
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3508",
      "id": 3326123317,
      "node_id": "PR_kwDOKFkxdc7GQJ01",
      "number": 3508,
      "state": "open",
      "locked": false,
      "title": "Add open-consume-into-column window rule",
      "user": {
        "login": "y0usaf",
        "id": 74448287,
        "node_id": "MDQ6VXNlcjc0NDQ4Mjg3",
        "avatar_url": "https://avatars.githubusercontent.com/u/74448287?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/y0usaf",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Adds a new initial-configure window rule `open-consume-into-column` that automatically merges a newly opened window into an existing column containing another window with the same rule, rather than creating a new column.\n\nMotivated by longstanding requests:\n\n- #1419: *\"opening a new app/window scrolls my entire screen which I find very disruptive. I normally immediately `consume-or-expel-window-left` the spawned window, but this feels tedious to do every single time.\"* — rizo\n- #410: *\"all of these windows appear next to the main window in their own column, sometimes pushing the main window partly off-screen... Essentially performing an automatic `consume-window-into-column` when the child window is opened.\"* — Nairou\n- #1125: *\"I always want my many browser windows when launched in the same column. Also solve the 'open-new-window' problem.\"* — clotodex\n\n```kdl\nwindow-rule {\n    match app-id=\"^foot$\"\n    default-column-display \"tabbed\"\n    open-consume-into-column \"active\"\n}\n```\n\nTwo strategies:\n\n- `\"active\"` — prefer the column to the left of the new window (the previously active column in the common case), falling back to the first match\n- `\"first\"` — always consume into the first (leftmost) matching column\n\nOnly applies to tiled windows. Floating windows are unaffected.",
      "created_at": "2026-02-25T14:48:37Z",
      "updated_at": "2026-02-25T14:54:52Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "fa207b3fa5370b2e9787f74a27ca80281abd5526",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "y0usaf:feat/open-consume-into-column",
        "ref": "feat/open-consume-into-column",
        "sha": "fc937e642182840350aa7ec3c45dac27dfa4ea71",
        "user": {
          "login": "y0usaf",
          "id": 74448287,
          "node_id": "MDQ6VXNlcjc0NDQ4Mjg3",
          "avatar_url": "https://avatars.githubusercontent.com/u/74448287?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/y0usaf",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1166035261,
          "node_id": "R_kgDORYBJPQ",
          "name": "niri",
          "full_name": "y0usaf/niri",
          "private": false,
          "owner": {
            "login": "y0usaf",
            "id": 74448287,
            "node_id": "MDQ6VXNlcjc0NDQ4Mjg3",
            "avatar_url": "https://avatars.githubusercontent.com/u/74448287?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/y0usaf",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/y0usaf/niri",
          "created_at": "2026-02-24T20:10:35Z",
          "updated_at": "2026-02-24T20:10:58Z",
          "pushed_at": "2026-02-25T14:48:17Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10880,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3508"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3508"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3508"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3508/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3508/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3508/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/fc937e642182840350aa7ec3c45dac27dfa4ea71"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1,
        4
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3507",
      "id": 3326104151,
      "node_id": "PR_kwDOKFkxdc7GQFJX",
      "number": 3507,
      "state": "open",
      "locked": false,
      "title": "Add focus-window-or-workspace-or-monitor-down/up actions",
      "user": {
        "login": "jarylc",
        "id": 1162128,
        "node_id": "MDQ6VXNlcjExNjIxMjg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1162128?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jarylc",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This is my display setup:\r\n<img width=\"529\" height=\"305\" alt=\"image\" src=\"https://github.com/user-attachments/assets/ccabf685-160e-4814-b5ad-1d2fc3e6e117\" />\r\n\r\nI just wanted to have lesser keybinds and more options to traverse niri vertically.\r\n\r\nImplements new actions that try to focus in this order:\r\n1. Next/previous window in current workspace\r\n2. Next/previous workspace on current monitor\r\n3. Monitor below/above the current one\r\n\r\nI've tested this locally, works well!\r\n\r\n![2026-02-26-01-27-10-clip](https://github.com/user-attachments/assets/ba74575a-57d3-471c-9525-ec6313d22d67)\r\n\r\nCan't really catch it at the end, but Waybar's workspace un-focuses with me just pressing SUPER+UP",
      "created_at": "2026-02-25T14:44:34Z",
      "updated_at": "2026-02-25T17:30:51Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "17a76242f3bdee1f5d924634ffe0eaf69c4a89b6",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "jarylc:main",
        "ref": "main",
        "sha": "28eb9225aca0ad813fd331355bfb267ec54019c1",
        "user": {
          "login": "jarylc",
          "id": 1162128,
          "node_id": "MDQ6VXNlcjExNjIxMjg=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1162128?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/jarylc",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1166701767,
          "node_id": "R_kgDORYp0xw",
          "name": "niri",
          "full_name": "jarylc/niri",
          "private": false,
          "owner": {
            "login": "jarylc",
            "id": 1162128,
            "node_id": "MDQ6VXNlcjExNjIxMjg=",
            "avatar_url": "https://avatars.githubusercontent.com/u/1162128?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/jarylc",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/jarylc/niri",
          "created_at": "2026-02-25T14:10:49Z",
          "updated_at": "2026-02-25T14:28:50Z",
          "pushed_at": "2026-02-25T14:28:46Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 6893,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3507"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3507"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3507"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3507/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3507/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3507/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/28eb9225aca0ad813fd331355bfb267ec54019c1"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3506",
      "id": 3325745559,
      "node_id": "PR_kwDOKFkxdc7GOtmX",
      "number": 3506,
      "state": "open",
      "locked": false,
      "title": "feat: added resistance to floating windows",
      "user": {
        "login": "Fexaop",
        "id": 43469241,
        "node_id": "MDQ6VXNlcjQzNDY5MjQx",
        "avatar_url": "https://avatars.githubusercontent.com/u/43469241?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Fexaop",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "for issue #1818\r\n- threshold: 32px",
      "created_at": "2026-02-25T13:23:33Z",
      "updated_at": "2026-02-26T07:28:24Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "9910d26d18549343a25f53b8654ace2f0ce20ba3",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Fexaop:wip/branch",
        "ref": "wip/branch",
        "sha": "9dd4cc3f1bff2b67eb5bd44648a316df9f607eb7",
        "user": {
          "login": "Fexaop",
          "id": 43469241,
          "node_id": "MDQ6VXNlcjQzNDY5MjQx",
          "avatar_url": "https://avatars.githubusercontent.com/u/43469241?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Fexaop",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1166657230,
          "node_id": "R_kgDORYnGzg",
          "name": "niri",
          "full_name": "Fexaop/niri",
          "private": false,
          "owner": {
            "login": "Fexaop",
            "id": 43469241,
            "node_id": "MDQ6VXNlcjQzNDY5MjQx",
            "avatar_url": "https://avatars.githubusercontent.com/u/43469241?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Fexaop",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Fexaop/niri",
          "created_at": "2026-02-25T13:14:27Z",
          "updated_at": "2026-02-25T13:14:27Z",
          "pushed_at": "2026-02-25T13:19:16Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10876,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:wip/branch",
        "ref": "wip/branch",
        "sha": "734d86ec061d15d1980c5b940b2f4dc9aee80cf5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3506"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3506"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3506"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3506/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3506/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3506/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/9dd4cc3f1bff2b67eb5bd44648a316df9f607eb7"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3502",
      "id": 3322791172,
      "node_id": "PR_kwDOKFkxdc7GDcUE",
      "number": 3502,
      "state": "open",
      "locked": false,
      "title": "Fix/quickshell crashing",
      "user": {
        "login": "cmeissl",
        "id": 4582663,
        "node_id": "MDQ6VXNlcjQ1ODI2NjM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4582663?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cmeissl",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": null,
      "created_at": "2026-02-24T22:03:18Z",
      "updated_at": "2026-02-25T19:23:23Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "46a55eef93e3bb6b9c6e420b36845facdd1fa114",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "cmeissl:fix/quickshell_crashing",
        "ref": "fix/quickshell_crashing",
        "sha": "3c38efee46f5456b077358875c2a9229ac8384f8",
        "user": {
          "login": "cmeissl",
          "id": 4582663,
          "node_id": "MDQ6VXNlcjQ1ODI2NjM=",
          "avatar_url": "https://avatars.githubusercontent.com/u/4582663?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/cmeissl",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 712993594,
          "node_id": "R_kgDOKn9rOg",
          "name": "niri",
          "full_name": "cmeissl/niri",
          "private": false,
          "owner": {
            "login": "cmeissl",
            "id": 4582663,
            "node_id": "MDQ6VXNlcjQ1ODI2NjM=",
            "avatar_url": "https://avatars.githubusercontent.com/u/4582663?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/cmeissl",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/cmeissl/niri",
          "created_at": "2023-11-01T16:13:24Z",
          "updated_at": "2026-02-08T06:54:23Z",
          "pushed_at": "2026-03-01T00:50:29Z",
          "homepage": "",
          "size": 8617,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 1,
          "archived": false,
          "disabled": false,
          "open_issues_count": 1,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 1,
          "open_issues": 1,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3502"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3502"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3502"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3502/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3502/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3502/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/3c38efee46f5456b077358875c2a9229ac8384f8"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3495",
      "id": 3316861091,
      "node_id": "PR_kwDOKFkxdc7Fs0ij",
      "number": 3495,
      "state": "open",
      "locked": false,
      "title": "Update environment import command in niri-session",
      "user": {
        "login": "Zamanhuseyinli",
        "id": 198976711,
        "node_id": "U_kgDOC9wkxw",
        "avatar_url": "https://avatars.githubusercontent.com/u/198976711?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Zamanhuseyinli",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Since systemctl's import-environment support is now marked as deprecated and therefore gives a warning, I wanted to make such a correction so that the warning screen disappears, but since systemctl does not support import-environment directly anymore, I think it makes more sense to use only dbus or use systemctl in accordance with its new format.",
      "created_at": "2026-02-23T16:59:36Z",
      "updated_at": "2026-02-26T19:38:57Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "e69ce5857fb43e164f9dbaca4d863a0ab6c10441",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Zamanhuseyinli:patch-1",
        "ref": "patch-1",
        "sha": "db80f5868b24530a0e95b2f273d5d84a6860bef3",
        "user": {
          "login": "Zamanhuseyinli",
          "id": 198976711,
          "node_id": "U_kgDOC9wkxw",
          "avatar_url": "https://avatars.githubusercontent.com/u/198976711?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Zamanhuseyinli",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1164946494,
          "node_id": "R_kgDORW-sPg",
          "name": "niri",
          "full_name": "Zamanhuseyinli/niri",
          "private": false,
          "owner": {
            "login": "Zamanhuseyinli",
            "id": 198976711,
            "node_id": "U_kgDOC9wkxw",
            "avatar_url": "https://avatars.githubusercontent.com/u/198976711?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Zamanhuseyinli",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Zamanhuseyinli/niri",
          "created_at": "2026-02-23T16:55:50Z",
          "updated_at": "2026-02-23T16:55:50Z",
          "pushed_at": "2026-02-23T16:59:22Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10876,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3495"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3495"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3495"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3495/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3495/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3495/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/db80f5868b24530a0e95b2f273d5d84a6860bef3"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3489",
      "id": 3311100683,
      "node_id": "PR_kwDOKFkxdc7FW2ML",
      "number": 3489,
      "state": "open",
      "locked": false,
      "title": "Add support for tilde expansion",
      "user": {
        "login": "BennyDeeDev",
        "id": 45900418,
        "node_id": "MDQ6VXNlcjQ1OTAwNDE4",
        "avatar_url": "https://avatars.githubusercontent.com/u/45900418?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BennyDeeDev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Issue: https://github.com/niri-wm/niri/issues/3488\r\n---\r\nRelated PR: https://github.com/niri-wm/niri/pull/3225",
      "created_at": "2026-02-21T17:25:18Z",
      "updated_at": "2026-02-21T18:28:54Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "628324834b8d19a8cb1340e1be113f82ba694a48",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "BennyDeeDev:bennydeedev/fix-tilde-in-config",
        "ref": "bennydeedev/fix-tilde-in-config",
        "sha": "22afd1adb1f3dd6818dec2019bd20c7c23baa2d4",
        "user": {
          "login": "BennyDeeDev",
          "id": 45900418,
          "node_id": "MDQ6VXNlcjQ1OTAwNDE4",
          "avatar_url": "https://avatars.githubusercontent.com/u/45900418?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/BennyDeeDev",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1163466825,
          "node_id": "R_kgDORVkYSQ",
          "name": "niri",
          "full_name": "BennyDeeDev/niri",
          "private": false,
          "owner": {
            "login": "BennyDeeDev",
            "id": 45900418,
            "node_id": "MDQ6VXNlcjQ1OTAwNDE4",
            "avatar_url": "https://avatars.githubusercontent.com/u/45900418?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/BennyDeeDev",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/BennyDeeDev/niri",
          "created_at": "2026-02-21T17:16:58Z",
          "updated_at": "2026-02-21T17:16:58Z",
          "pushed_at": "2026-02-21T18:28:40Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 6895,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2a52911757cb3b497db9407592f9b4c439571ea",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3489"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3489"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3489"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3489/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3489/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3489/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/22afd1adb1f3dd6818dec2019bd20c7c23baa2d4"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3483",
      "id": 3310686141,
      "node_id": "PR_kwDOKFkxdc7FVQ-9",
      "number": 3483,
      "state": "open",
      "locked": false,
      "title": "The Blur Pull Request",
      "user": {
        "login": "YaLTeR",
        "id": 1794388,
        "node_id": "MDQ6VXNlcjE3OTQzODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YaLTeR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Well, looks like I'm ready to promote this branch to a pull request. All planned features are implemented, all bugs that I knew about and wanted to fix should be fixed.\r\n\r\nPlease test and report any problems and suggestions. See the docs at https://github.com/niri-wm/niri/blob/wip/branch/docs/wiki/Window-Effects.md.\r\n\r\n<img width=\"1217\" height=\"984\" alt=\"image\" src=\"https://github.com/user-attachments/assets/67b0a5cd-fad4-4dfb-8be1-44e3548ddb20\" />\r\n\r\nThere's no \"alpha threshold\" setting for blur, instead clients are encouraged to implement the [`ext-background-effect`](https://wayland.app/protocols/ext-background-effect-v1) protocol which lets them shape their background blur. It's already implemented, or in progress, in:\r\n- Vicinae launcher\r\n- Ghostty: https://github.com/ghostty-org/ghostty/pull/10727\r\n- foot: https://codeberg.org/dnkl/foot/pulls/2198\r\n- kitty: https://github.com/kovidgoyal/kitty/pull/9536\r\n- Quickshell: https://github.com/quickshell-mirror/quickshell/pull/566\r\n- DankMaterialShell: https://github.com/AvengeMedia/DankMaterialShell/tree/blur\r\n\r\n> [!NOTE]\r\n> Currently, this PR doesn't implement `ext-background-effect` for popups and subsurfaces. This is mainly because I don't have any clients that do this to test with. If some client can do it I'll look into it.\r\n\r\nThis PR also implements the KDE blur protocol which makes a bunch of other clients work (Alacritty, kitty, etc.) but I'll remove it before merging because even KDE [has dropped it](https://invent.kde.org/plasma/kwin/-/commit/7f9e0aa1cd2c2ab4fea1097800893b6f780089eb) in favor of ext-background-effect.\r\n\r\nBackground blur turned out to be a massive undertaking. Not because of blur itself, but because window background effects in general required a lot of thinking and additions to the code, especially to make them as efficient as possible. Xray and non-xray background effects, both of which this PR implements, are also pretty much two entirely separate and very different beasts, both of which I had to get working with all other niri features (like block-out-from).\r\n\r\nWhat's left is some code cleanups, and maybe splitting the commits a bit further.\r\n\r\nNon-xray might land a bit later than xray because it depends on a WIP Smithay PR.\r\n\r\nImplements #54, supersedes #1634. Thanks @visualglitch91 for rebasing and maintaining the previous blur PR all this time!",
      "created_at": "2026-02-21T11:14:18Z",
      "updated_at": "2026-03-01T20:00:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "0ec8aeb4baa5086ee9bf3eda7f15664fa6554474",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "niri-wm:wip/branch",
        "ref": "wip/branch",
        "sha": "734d86ec061d15d1980c5b940b2f4dc9aee80cf5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2a52911757cb3b497db9407592f9b4c439571ea",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3483"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3483"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3483"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3483/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3483/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3483/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/734d86ec061d15d1980c5b940b2f4dc9aee80cf5"
        }
      },
      "author_association": "MEMBER",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        5,
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3482",
      "id": 3309335883,
      "node_id": "PR_kwDOKFkxdc7FQHVL",
      "number": 3482,
      "state": "open",
      "locked": false,
      "title": "feat(spawning): make niri spawning work better with PR_SET_PDEATHSIG",
      "user": {
        "login": "nagisa",
        "id": 679122,
        "node_id": "MDQ6VXNlcjY3OTEyMg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/679122?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/nagisa",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "`PR_SET_PDEATHSIG` as commonly used by bubblewrap (`--die-with-parent`) which nixos in turn uses to wrap `steam` and `heroic` appears to keep track not only of the reaper process but also the thread that spawned the command.\r\n\r\nThis is extremely unfortunate, but this seems reasonably straightforward to make better on `niri` side. I quickly whipped this up and confirmed that niri with this change now can spawn `steam` or `heroic` on my system.\r\n\r\nHaving just one thread with a channel may also be ever-so-slightly faster compared to creating a full thread on every command invocation, but it has required me to pick a concrete type to represent the commands. If we want to support arbitrary `OsString`s, that's also possible, although it would require reallocation of the command strings for every non-initial command.",
      "created_at": "2026-02-20T20:15:05Z",
      "updated_at": "2026-02-22T19:40:11Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "32cce330d5985740dd033eb219edbeb1c038735b",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "nagisa:spawning",
        "ref": "spawning",
        "sha": "c39fdc512e8df2a41c5ff578fcd41b79c3ddcbec",
        "user": {
          "login": "nagisa",
          "id": 679122,
          "node_id": "MDQ6VXNlcjY3OTEyMg==",
          "avatar_url": "https://avatars.githubusercontent.com/u/679122?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/nagisa",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 966990081,
          "node_id": "R_kgDOOaMZAQ",
          "name": "niri",
          "full_name": "nagisa/niri",
          "private": false,
          "owner": {
            "login": "nagisa",
            "id": 679122,
            "node_id": "MDQ6VXNlcjY3OTEyMg==",
            "avatar_url": "https://avatars.githubusercontent.com/u/679122?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/nagisa",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/nagisa/niri",
          "created_at": "2025-04-15T18:54:33Z",
          "updated_at": "2026-02-08T06:54:42Z",
          "pushed_at": "2026-02-21T18:28:01Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6893,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2a52911757cb3b497db9407592f9b4c439571ea",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3482"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3482"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3482"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3482/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3482/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3482/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/c39fdc512e8df2a41c5ff578fcd41b79c3ddcbec"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3481",
      "id": 3308699221,
      "node_id": "PR_kwDOKFkxdc7FNr5V",
      "number": 3481,
      "state": "open",
      "locked": false,
      "title": "Feat/layer anims",
      "user": {
        "login": "Atan-D-RP4",
        "id": 113052920,
        "node_id": "U_kgDOBr0M-A",
        "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Atan-D-RP4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Implements layer animations.\r\nThere is surprisingly no open issue for this. Just a couple discussions.\r\n\r\n\r\nhttps://github.com/user-attachments/assets/f21ba05b-539f-4729-b099-092109f1957b\r\n\r\n\r\n",
      "created_at": "2026-02-20T16:57:03Z",
      "updated_at": "2026-02-27T06:11:57Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "4b552ca1a43545ff5bcdf73ca5d06474ac83af00",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Atan-D-RP4:feat/layer-anims",
        "ref": "feat/layer-anims",
        "sha": "4499c6cf38677de92977cd830bf298ad89cbe98b",
        "user": {
          "login": "Atan-D-RP4",
          "id": 113052920,
          "node_id": "U_kgDOBr0M-A",
          "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Atan-D-RP4",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1099970565,
          "node_id": "R_kgDOQZA4BQ",
          "name": "niri",
          "full_name": "Atan-D-RP4/niri",
          "private": false,
          "owner": {
            "login": "Atan-D-RP4",
            "id": 113052920,
            "node_id": "U_kgDOBr0M-A",
            "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Atan-D-RP4",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Atan-D-RP4/niri",
          "created_at": "2025-11-19T17:08:58Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2026-03-01T19:07:14Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 9023,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3481"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3481"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3481"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3481/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3481/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3481/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/4499c6cf38677de92977cd830bf298ad89cbe98b"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3474",
      "id": 3296346233,
      "node_id": "PR_kwDOKFkxdc7EekB5",
      "number": 3474,
      "state": "open",
      "locked": false,
      "title": "add on-output window rule match property",
      "user": {
        "login": "adeci",
        "id": 80290157,
        "node_id": "MDQ6VXNlcjgwMjkwMTU3",
        "avatar_url": "https://avatars.githubusercontent.com/u/80290157?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/adeci",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Closes #2600\r\n\r\nThis adds an on-output match property to window rules, so you can apply different rules to windows depending on which monitor they're on. It matches by connector name, like \"DP-1\", or make/model/serial, same style as output config blocks.\r\n\r\n## Motivation\r\n\r\nI use a Framework 13 laptop with a 32\" external monitor and want different window sizing per display.\r\n\r\nA specific example:\r\n- I want to open a Firefox window at 1/3 width on the big 32\" monitor, but maximized on other screens.\r\n- I want messaging clients (discord, signal, etc) to open at 1/2 width on the 32\" monitor, but maximized on other screens.\r\n\r\nPer-output layout blocks get you part of the way there but they apply to all windows on that output, not specific ones.\r\n\r\nHere's a snippet of what my `config.kdl` looks like now with these things applied:\r\n```kdl\r\n// Firefox: 1/3 width on the MSI 32\"\r\nwindow-rule {\r\n    match app-id=\"firefox\" on-output=\"Microstep MSI MAG321CQR KA3H071804955\"\r\n    default-column-width { proportion 0.33333; }\r\n}\r\n\r\n// Firefox: open maximized on all other displays\r\nwindow-rule {\r\n    match app-id=\"firefox\"\r\n    exclude on-output=\"Microstep MSI MAG321CQR KA3H071804955\"\r\n    open-maximized true\r\n}\r\n\r\n// Messaging clients: 1/2 width on the MSI 32\"\r\nwindow-rule {\r\n    match app-id=r#\"^vesktop$\"# on-output=\"Microstep MSI MAG321CQR KA3H071804955\"\r\n    match app-id=r#\"^Element\"# on-output=\"Microstep MSI MAG321CQR KA3H071804955\"\r\n    match app-id=r#\"^signal$\"# on-output=\"Microstep MSI MAG321CQR KA3H071804955\"\r\n    default-column-width { proportion 0.5; }\r\n}\r\n\r\n// Messaging clients: open maximized on all other displays\r\nwindow-rule {\r\n    match app-id=r#\"^vesktop$\"#\r\n    match app-id=r#\"^Element\"#\r\n    match app-id=r#\"^signal$\"#\r\n    exclude on-output=\"Microstep MSI MAG321CQR KA3H071804955\"\r\n    open-maximized true\r\n}\r\n\r\n```\r\n\r\n## Notes\r\n\r\n### Circular dependency guard\r\nLike discussed in #2600, on-output and open-on-output in the same rule would create a circular dependency so we'd need to know the target output to evaluate the rule, but the rule changes the target output. So this is handled with:\r\n\r\n- A config-level validation that rejects any window rule combining on-output matchers with open-on-output or open-on-workspace\r\n- A two-pass evaluation at window open time. The first pass resolves open-on-output/open-on-workspace redirects without output context, second pass re-evaluates with the resolved target output for on-output matching\r\n\r\nI think this implementation is sensible, I would appreciate any feedback / help with this here!\r\n\r\n## Changes\r\n- niri-config: add on_output field to Match, reject open-on-output/open-on-workspace in rules with on-output\r\n- src/window: thread Option<&OutputName> through ResolvedWindowRules::compute and window_matches\r\n- src/handlers/xdg_shell.rs: two-pass rule evaluation in send_initial_configure, preliminary pass for output/workspace redirects, then full pass with resolved output\r\n- src/niri.rs: pass output context when recomputing rules for mapped/unmapped windows\r\n- Wiki: document on-output with examples and must-fail block for the circular case\r\n",
      "created_at": "2026-02-17T23:09:12Z",
      "updated_at": "2026-02-17T23:09:12Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "047c3b6de9fc4055de482ad3e368ff9e8424e6e1",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "adeci:window-rule-on-output",
        "ref": "window-rule-on-output",
        "sha": "a8f3848dfcdf638f3e3220f6fbe653ade862ea4f",
        "user": {
          "login": "adeci",
          "id": 80290157,
          "node_id": "MDQ6VXNlcjgwMjkwMTU3",
          "avatar_url": "https://avatars.githubusercontent.com/u/80290157?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/adeci",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1158306403,
          "node_id": "R_kgDORQpaYw",
          "name": "niri",
          "full_name": "adeci/niri",
          "private": false,
          "owner": {
            "login": "adeci",
            "id": 80290157,
            "node_id": "MDQ6VXNlcjgwMjkwMTU3",
            "avatar_url": "https://avatars.githubusercontent.com/u/80290157?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/adeci",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/adeci/niri",
          "created_at": "2026-02-15T06:06:40Z",
          "updated_at": "2026-02-15T06:06:41Z",
          "pushed_at": "2026-02-17T20:55:08Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 6907,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2a52911757cb3b497db9407592f9b4c439571ea",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3474"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3474"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3474"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3474/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3474/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3474/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/a8f3848dfcdf638f3e3220f6fbe653ade862ea4f"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2,
        2600
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3465",
      "id": 3291410616,
      "node_id": "PR_kwDOKFkxdc7ELvC4",
      "number": 3465,
      "state": "open",
      "locked": false,
      "title": "Add active-window-* as options for floating window relative-to rule",
      "user": {
        "login": "contagnas",
        "id": 13543610,
        "node_id": "MDQ6VXNlcjEzNTQzNjEw",
        "avatar_url": "https://avatars.githubusercontent.com/u/13543610?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/contagnas",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This adds `\"active-window-*\"` options to the `RelativeTo` enum for `default-floating-position`. These position the new floating window relative to the currently active window. My use case to emulating window parenting for applications` that don't support it, but I could imagine other uses as well.\r\n\r\nDemo:\r\n\r\nhttps://github.com/user-attachments/assets/7cba3091-c6e9-4534-94eb-2d4c2190e7c6\r\n\r\nIf there is no active window the new window goes to the center of the screen.\r\n\r\nConsidered some alternative approaches, because IMO this enum is a little bloated after this change:\r\n\r\n* new option in window-rule like `default-floating-position-relative-to-active-window` that would accept the same `relative-to` options\r\n* hook to an external program that would decide coordinates\r\n\r\nbut just adding these to the enum seems more straightforward and understandable.\r\n\r\n",
      "created_at": "2026-02-16T20:11:02Z",
      "updated_at": "2026-02-16T20:19:57Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "1ac432b5803d40e94fd51789e00cb795ed9135e6",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "contagnas:active-window-relative",
        "ref": "active-window-relative",
        "sha": "d8a1229b22efab7effb46a3cfa27edd1d7af4937",
        "user": {
          "login": "contagnas",
          "id": 13543610,
          "node_id": "MDQ6VXNlcjEzNTQzNjEw",
          "avatar_url": "https://avatars.githubusercontent.com/u/13543610?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/contagnas",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1159499121,
          "node_id": "R_kgDORRyNcQ",
          "name": "niri",
          "full_name": "contagnas/niri",
          "private": false,
          "owner": {
            "login": "contagnas",
            "id": 13543610,
            "node_id": "MDQ6VXNlcjEzNTQzNjEw",
            "avatar_url": "https://avatars.githubusercontent.com/u/13543610?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/contagnas",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/contagnas/niri",
          "created_at": "2026-02-16T19:59:23Z",
          "updated_at": "2026-02-16T19:59:23Z",
          "pushed_at": "2026-02-17T08:57:33Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 7009,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "1fa0338a172a69b05a1a35d55b291693ff1bc29f",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3465"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3465"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3465"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3465/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3465/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3465/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/d8a1229b22efab7effb46a3cfa27edd1d7af4937"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3453",
      "id": 3287258645,
      "node_id": "PR_kwDOKFkxdc7D75YV",
      "number": 3453,
      "state": "open",
      "locked": false,
      "title": "fix: prioritize activation region hits over CSD overflow in scrolling hit testing",
      "user": {
        "login": "odtgit",
        "id": 15870533,
        "node_id": "MDQ6VXNlcjE1ODcwNTMz",
        "avatar_url": "https://avatars.githubusercontent.com/u/15870533?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/odtgit",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## what this fixes\n\nfocus-follows-mouse edge panning doesn't work reliably with CSD windows. with struts enabled and two 0.5-proportion columns side by side, moving the mouse to the screen edge should focus the adjacent peeking column - but CSD windows like firefox and alacritty block it most of the time, while SSD windows work fine.\n\n## root cause\n\nCSD windows have buffers and input regions that extend beyond their `geometry()` bounds (shadows, resize handles etc). in `ScrollingSpace::window_under()`, tiles are checked in render order and the first tile whose `hit()` returns `Some` wins. since `hit()` checks `is_in_input_region()` first - which delegates to the wayland client's input region without clipping to tile bounds - the CSD shadow bleeds into the strut zone, the active column steals the hit, focus-follows-mouse sees the same window already focused, and nothing happens.\n\nSSD windows don't have this issue because their `geometry().loc` is `(0,0)` and their buffer doesn't extend beyond the geometry.\n\nworth noting that `clip-to-geometry` only affects rendering, not input - so it can't help here either.\n\n## the fix\n\ninstead of unconditionally clipping all pointer input to the activation region (which would break legitimate CSD surfaces extending beyond tile bounds, like GTK 3 subsurface popups or non-grabbing popups), this uses a two-pass approach in `ScrollingSpace::window_under()`:\n\n1. **first pass** - only accept hits within the tile's activation region (tile bounds). this means the peeking column wins over the active column's CSD shadow in strut zones.\n2. **second pass** - fall back to the full `hit()` including CSD overflow regions. this preserves normal pointer input on legitimate surfaces extending beyond tile bounds.\n\nthe first pass almost always matches (pointer is within some tile's bounds), so the second pass only runs when the pointer is in a CSD overflow zone outside all tile bounds - negligible performance impact.\n\nadds `Tile::hit_within_activation_region()` which checks activation region first, then input region within it. the original `Tile::hit()` is unchanged.\n\nalso updated `resize_edges_under()` in `workspace.rs` to use `hit_within_activation_region()` for consistency - it had a comment explicitly noting it should match `window_under()` behavior, and resize edge calculations are relative to tile geometry so CSD overflow hits would produce meaningless edges anyway.\n\n## what about other hit testing paths\n\n- **floating windows** - use single-pass `hit_tile()`. CSD overlap between floating windows is a z-order concern, not a strut/peeking issue. left as-is.\n- **interactive move** - uses single-pass `hit_tile()` on the single dragged tile. no overlap with itself, no change needed.\n- **overview mode** - converts all hits to `Activate` and disables resize. unaffected.\n- **tab indicators** - checked before tiles in the first pass so they win correctly. not rechecked in the second pass, but tab indicators don't extend into other columns' CSD zones in practice.\n\n## tested with\n\nsame tight layout - 4px gaps, 2px struts, 2px focus ring border, `clip-to-geometry true`, `prefer-no-csd` on:\n\n```kdl\nlayout {\n    gaps 4\n    struts {\n        left 2\n        right 2\n    }\n    default-column-width { proportion 0.5; }\n    border {\n        width 2\n    }\n}\n```\n\n- edge panning via focus-follows-mouse works consistently on CSD windows (firefox, alacritty, chromium, discord, spotify)\n- normal pointer input on CSD regions extending beyond tile bounds (shadows, resize handles) still works\n- mod+right-click resize behaves correctly at tile edges\n- SSD windows unaffected (hit() and hit_within_activation_region() are equivalent for them)\n- also tested with different gap/strut/border geometries - all working\n\ntried to test for regressions with the second pass (GTK 3 subsurface popups, non-grabbing popups) but couldn't find a good client that reliably produces CSD surfaces extending beyond tile bounds in a way that would exercise the fallback path. if anyone has a test case for that I'm happy to verify.\n\nwould definitely benefit from further testing, but since this enables a purely mouse-driven horizontal scrolling use-case that was broken before, I think it's worth checking out.",
      "created_at": "2026-02-15T17:33:40Z",
      "updated_at": "2026-02-15T20:28:59Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "c6869ae99282d344a75db570aa84b8508f571f47",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "odtgit:fix/csd-edge-panning-input-steal",
        "ref": "fix/csd-edge-panning-input-steal",
        "sha": "305c28a9d8df5b091728a07ce310fcbbcb296040",
        "user": {
          "login": "odtgit",
          "id": 15870533,
          "node_id": "MDQ6VXNlcjE1ODcwNTMz",
          "avatar_url": "https://avatars.githubusercontent.com/u/15870533?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/odtgit",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1158635234,
          "node_id": "R_kgDORQ9e4g",
          "name": "niri",
          "full_name": "odtgit/niri",
          "private": false,
          "owner": {
            "login": "odtgit",
            "id": 15870533,
            "node_id": "MDQ6VXNlcjE1ODcwNTMz",
            "avatar_url": "https://avatars.githubusercontent.com/u/15870533?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/odtgit",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/odtgit/niri",
          "created_at": "2026-02-15T17:33:06Z",
          "updated_at": "2026-02-15T17:33:06Z",
          "pushed_at": "2026-02-15T20:28:58Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10862,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "1fa0338a172a69b05a1a35d55b291693ff1bc29f",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3453"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3453"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3453"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3453/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3453/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3453/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/305c28a9d8df5b091728a07ce310fcbbcb296040"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3414",
      "id": 3258774564,
      "node_id": "PR_kwDOKFkxdc7CPPQk",
      "number": 3414,
      "state": "open",
      "locked": false,
      "title": "Add support for window labels",
      "user": {
        "login": "metlos",
        "id": 19999,
        "node_id": "MDQ6VXNlcjE5OTk5",
        "avatar_url": "https://avatars.githubusercontent.com/u/19999?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/metlos",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Hey!\r\n\r\nFirst of all thanks for an utterly awesome piece of software. Niri makes my time using a GUI actually enjoyable :)\r\n\r\nRecently, I wanted to mark certain windows such that they would render slightly differently (in my case with a red border, to remind me I should be careful working with them. Looking around the config gave me no idea how to do it but I came across several discussions on the topic (https://github.com/YaLTeR/niri/discussions/884, https://github.com/YaLTeR/niri/discussions/3120) and possibly others.\r\n\r\nThis lead me to believe I'm not alone needing this and so I rolled up my sleeves and tried to make my first contribution to your wonderful creation.\r\n\r\nThis PR makes it possible to programmatically tag or label windows where label is a pair of a key and an optional value. There can be multiple labels present on a window and many windows can have the same label. The PR also adds a match rule for these labels, making it possible to change the behavior/look of the windows based on the presence/absence of labels.\r\n\r\nI didn't call the \"tags\", that the above mentioned discussions mention, tags but rather \"labels\" (taking inspiration from Kubernetes) because https://github.com/YaLTeR/niri/discussions/884 mentioned \"tag\" conflicts with the name of a wayland protocol.\r\n\r\nThis PR I think doesn't make https://github.com/YaLTeR/niri/discussions/884 fully possible, because it doesn't add \"tag\" and \"remove-tag\" (or rather \"label\" and \"remove-label\") as window rules but I think something similar could be achieved through scripting. Having \"tag\" both as a window rule and a match (so that it can be reacted upon) is IMHO dangerous because it could lead to infinite loops if used carelessly.\r\n\r\nI think https://github.com/YaLTeR/niri/discussions/3120 would be fully possible with this PR.",
      "created_at": "2026-02-07T23:17:08Z",
      "updated_at": "2026-02-25T22:14:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "4724e0c5a9eb2dc2e277b5ebc5d9f500e4320cfb",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "metlos:window-labels",
        "ref": "window-labels",
        "sha": "8d4e12b7ce4acf7108f0d4a554bbc0b76c8b2502",
        "user": {
          "login": "metlos",
          "id": 19999,
          "node_id": "MDQ6VXNlcjE5OTk5",
          "avatar_url": "https://avatars.githubusercontent.com/u/19999?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/metlos",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1066299330,
          "node_id": "R_kgDOP45vwg",
          "name": "niri",
          "full_name": "metlos/niri",
          "private": false,
          "owner": {
            "login": "metlos",
            "id": 19999,
            "node_id": "MDQ6VXNlcjE5OTk5",
            "avatar_url": "https://avatars.githubusercontent.com/u/19999?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/metlos",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/metlos/niri",
          "created_at": "2025-09-29T09:50:55Z",
          "updated_at": "2026-02-08T06:55:01Z",
          "pushed_at": "2026-02-25T22:14:03Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6898,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3414"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3414"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3414"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3414/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3414/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3414/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/8d4e12b7ce4acf7108f0d4a554bbc0b76c8b2502"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3411",
      "id": 3257736592,
      "node_id": "PR_kwDOKFkxdc7CLR2Q",
      "number": 3411,
      "state": "open",
      "locked": false,
      "title": "Preserve num lock state when loading custom keymap",
      "user": {
        "login": "mgabor3141",
        "id": 9047995,
        "node_id": "MDQ6VXNlcjkwNDc5OTU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/9047995?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mgabor3141",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Normally when you set a custom keymap, the `numlock` setting stops working. This patch fixes that.\r\n\r\nExample config:\r\n```\r\ninput {\r\n    keyboard {\r\n        xkb {\r\n            // layout \"us\"\r\n            file \"~/.config/xkb/keymap.xkb\"\r\n        }\r\n        numlock // Enable numlock on startup\r\n    }\r\n}\r\n```",
      "created_at": "2026-02-07T13:32:24Z",
      "updated_at": "2026-02-07T13:32:24Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "8776f470dbf1950e44e478d72227fc6f5bd9ccfe",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "mgabor3141:feat/numlock-with-xkb",
        "ref": "feat/numlock-with-xkb",
        "sha": "eccf3327cc5b47862149e1ee74f6bcd6893f3a56",
        "user": {
          "login": "mgabor3141",
          "id": 9047995,
          "node_id": "MDQ6VXNlcjkwNDc5OTU=",
          "avatar_url": "https://avatars.githubusercontent.com/u/9047995?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mgabor3141",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1152172674,
          "node_id": "R_kgDORKzCgg",
          "name": "niri",
          "full_name": "mgabor3141/niri",
          "private": false,
          "owner": {
            "login": "mgabor3141",
            "id": 9047995,
            "node_id": "MDQ6VXNlcjkwNDc5OTU=",
            "avatar_url": "https://avatars.githubusercontent.com/u/9047995?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/mgabor3141",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/mgabor3141/niri",
          "created_at": "2026-02-07T13:27:40Z",
          "updated_at": "2026-02-08T06:55:22Z",
          "pushed_at": "2026-02-07T13:28:33Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6859,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "549148d27779d024255a84535b42b947f1c2a113",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3411"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3411"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3411"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3411/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3411/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3411/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/eccf3327cc5b47862149e1ee74f6bcd6893f3a56"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3409",
      "id": 3257209823,
      "node_id": "PR_kwDOKFkxdc7CJRPf",
      "number": 3409,
      "state": "open",
      "locked": false,
      "title": "fix(backend/tty): add delayed rescan for connectors missing EDID on hotplug",
      "user": {
        "login": "coleleavitt",
        "id": 75138914,
        "node_id": "MDQ6VXNlcjc1MTM4OTE0",
        "avatar_url": "https://avatars.githubusercontent.com/u/75138914?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/coleleavitt",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Problem\n\nUSB-C docks with DP MST / alt-mode (e.g. Lenovo ThinkPad USB-C Dock Gen 2) can report connectors as `Connected` to the kernel DRM subsystem **before** EDID data has been read. When this happens:\n\n1. `connector.modes()` returns an empty list\n2. `pick_mode()` returns `None`\n3. `connector_connected()` logs `\"no mode\"` and skips activation\n\nSmithay's `ConnectorScanner` treats `(Connected, Connected)` as a no-op — it does not re-emit events for already-connected connectors. This means the output gets stuck in a permanent \"connected but never activated\" dead state.\n\nWhether activation succeeds depends entirely on timing: if a second `UdevEvent::Changed` fires after EDID completes, the connector recovers. This makes the bug **intermittent** — monitors sometimes come up and sometimes don't on the same hardware.\n\n## Root Cause\n\nThe EDID race is in the kernel/dock firmware timing, but niri had no retry path for connectors that were connected but could not be activated due to missing modes.\n\n## Fix\n\nTwo complementary mechanisms:\n\n### 1. Handle `DrmScanEvent::Changed` (new in smithay PR #1923)\n\nWhen a connector's mode list changes while it stays connected (e.g. EDID arrives after the initial probe returned empty/fallback modes), smithay now emits a `DrmScanEvent::Changed` event. We handle this by registering the crtc in `known_crtcs` (if no surface exists yet) so `on_output_config_changed()` can connect it. If a surface already exists, `on_output_config_changed()` will re-evaluate mode selection automatically.\n\n**Note**: This requires bumping smithay to at least rev `9219bf8a9` (includes the `Changed` variant). The `rev` pin in `Cargo.toml` can be removed once niri updates smithay past this point.\n\n### 2. Bounded rescan timer (defense-in-depth)\n\nThe `Changed` event only fires when `scan_connectors()` is called. It doesn't trigger rescans on its own — the kernel must fire a udev Changed event (or the timer must trigger a rescan). Since the kernel doesn't always fire a second udev event after EDID completes, we keep a bounded retry timer:\n\n- After `device_changed()` processes connectors, `schedule_rescan_if_needed()` checks for connected connectors that have no matching surface (not yet activated) and are not non-desktop connectors\n- If found, schedules a `calloop::Timer` (2 s delay) that re-invokes `device_changed()`, giving the kernel time to complete EDID reads\n- Retries are capped at `MAX_RESCAN_RETRIES` (3) to prevent infinite rescheduling\n- The timer self-clears when all connectors are successfully activated\n- Existing timers are cancelled before scheduling new ones (cancel-and-reschedule)\n- Timers are cleaned up on device removal\n\n### New fields on `OutputDevice`\n\n- `rescan_timer_token: Option<RegistrationToken>` — handle to cancel pending timers\n- `rescan_retry_count: u8` — bounded counter, reset on successful activation\n\n## Testing\n\n- **Hardware**: ThinkPad P16 Gen 3, NVIDIA RTX PRO 4000 (nvidia-drm), Intel iGPU (i915), Lenovo USB-C Dock Gen 2, two LEN S27q-10 monitors (HDMI + DP MST)\n- Builds cleanly (`cargo check`, `cargo clippy`, `cargo build --release`)\n- Follows existing calloop timer patterns used elsewhere in `tty.rs` (e.g. VRR timers, redraw timers)\n\n## Alternatives Considered\n\n- **Polling loop**: Rejected in favor of bounded async timer to avoid blocking the event loop\n- **Infinite retries**: Rejected — capped at 3 to avoid pathological cases\n- **Timer only (no Changed event)**: Works but less responsive. The `Changed` event gives immediate feedback when modes actually arrive, while the timer serves as a fallback.",
      "created_at": "2026-02-07T07:03:21Z",
      "updated_at": "2026-02-22T17:55:21Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "e454c4774abddf3e7fafd77e0b6127843c8d6cd1",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "coleleavitt:fix/monitor-rescan-edid-race",
        "ref": "fix/monitor-rescan-edid-race",
        "sha": "4a3e4eea4e23a1af1e0e74412a953a47aa8b3390",
        "user": {
          "login": "coleleavitt",
          "id": 75138914,
          "node_id": "MDQ6VXNlcjc1MTM4OTE0",
          "avatar_url": "https://avatars.githubusercontent.com/u/75138914?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/coleleavitt",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 945242252,
          "node_id": "R_kgDOOFdAjA",
          "name": "niri",
          "full_name": "coleleavitt/niri",
          "private": false,
          "owner": {
            "login": "coleleavitt",
            "id": 75138914,
            "node_id": "MDQ6VXNlcjc1MTM4OTE0",
            "avatar_url": "https://avatars.githubusercontent.com/u/75138914?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/coleleavitt",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/coleleavitt/niri",
          "created_at": "2025-03-09T01:15:32Z",
          "updated_at": "2026-02-22T17:49:24Z",
          "pushed_at": "2026-02-22T17:55:20Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 10970,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 1,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 1,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2a52911757cb3b497db9407592f9b4c439571ea",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3409"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3409"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3409"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3409/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3409/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3409/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/4a3e4eea4e23a1af1e0e74412a953a47aa8b3390"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3406",
      "id": 3257046300,
      "node_id": "PR_kwDOKFkxdc7CIpUc",
      "number": 3406,
      "state": "open",
      "locked": false,
      "title": "feat: Consume or expel window now moves floating windows",
      "user": {
        "login": "pheenty",
        "id": 66275205,
        "node_id": "MDQ6VXNlcjY2Mjc1MjA1",
        "avatar_url": "https://avatars.githubusercontent.com/u/66275205?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/pheenty",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "~~Resolves #2976~~\r\nRelated to #3431",
      "created_at": "2026-02-07T05:21:40Z",
      "updated_at": "2026-02-15T17:38:06Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "7c39a21b20c6aded8fea032465bd111562fea572",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "pheenty:consorexp",
        "ref": "consorexp",
        "sha": "1a15ee7b308cb41966b0d530c2f57635e5a2627d",
        "user": {
          "login": "pheenty",
          "id": 66275205,
          "node_id": "MDQ6VXNlcjY2Mjc1MjA1",
          "avatar_url": "https://avatars.githubusercontent.com/u/66275205?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/pheenty",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1151925010,
          "node_id": "R_kgDORKj7Eg",
          "name": "niri",
          "full_name": "pheenty/niri",
          "private": false,
          "owner": {
            "login": "pheenty",
            "id": 66275205,
            "node_id": "MDQ6VXNlcjY2Mjc1MjA1",
            "avatar_url": "https://avatars.githubusercontent.com/u/66275205?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/pheenty",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/pheenty/niri",
          "created_at": "2026-02-07T04:55:09Z",
          "updated_at": "2026-02-08T06:55:22Z",
          "pushed_at": "2026-02-07T05:19:01Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6859,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "549148d27779d024255a84535b42b947f1c2a113",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3406"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3406"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3406"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3406/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3406/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3406/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/1a15ee7b308cb41966b0d530c2f57635e5a2627d"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2,
        3,
        2976
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3398",
      "id": 3250341883,
      "node_id": "PR_kwDOKFkxdc7BvEf7",
      "number": 3398,
      "state": "open",
      "locked": false,
      "title": "Add Ctrl+Space to copy screenshot path to clipboard",
      "user": {
        "login": "domenkozar",
        "id": 126339,
        "node_id": "MDQ6VXNlcjEyNjMzOQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/126339?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/domenkozar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "I'd often want to paste the path to screenshot created rather than the image itself, I've added this under `Ctrl+Space`. Also adds `Ctrl-C` to the help text.",
      "created_at": "2026-02-05T13:58:41Z",
      "updated_at": "2026-02-06T09:41:53Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "8e6a60f376ee66d3a13296d55e0b75bbcf1aab66",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "domenkozar:screenshot-copy-path",
        "ref": "screenshot-copy-path",
        "sha": "0d2087132c152f423c84f7996a22568fe643bd3e",
        "user": {
          "login": "domenkozar",
          "id": 126339,
          "node_id": "MDQ6VXNlcjEyNjMzOQ==",
          "avatar_url": "https://avatars.githubusercontent.com/u/126339?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/domenkozar",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1150624630,
          "node_id": "R_kgDORJUjdg",
          "name": "niri",
          "full_name": "domenkozar/niri",
          "private": false,
          "owner": {
            "login": "domenkozar",
            "id": 126339,
            "node_id": "MDQ6VXNlcjEyNjMzOQ==",
            "avatar_url": "https://avatars.githubusercontent.com/u/126339?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/domenkozar",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/domenkozar/niri",
          "created_at": "2026-02-05T13:56:35Z",
          "updated_at": "2026-02-08T06:55:22Z",
          "pushed_at": "2026-02-05T13:57:30Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6853,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "189917c93329c86ac2ddd89f459c26a028d590ba",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3398"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3398"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3398"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3398/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3398/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3398/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/0d2087132c152f423c84f7996a22568fe643bd3e"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3387",
      "id": 3242191775,
      "node_id": "PR_kwDOKFkxdc7BP-uf",
      "number": 3387,
      "state": "open",
      "locked": false,
      "title": "Docs: Added AZERTY input info",
      "user": {
        "login": "Denperidge",
        "id": 27348469,
        "node_id": "MDQ6VXNlcjI3MzQ4NDY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/27348469?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Denperidge",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Hi! I love using Niri and apparently also love using a keyboard layout with a low usershare.\r\n\r\nThe default keybinds do not work for Azerty, and requires some digging using [wev](https://git.sr.ht/~sircmpwn/wev) (or a similar tool) to find the equivalent keynames.\r\n\r\nSo here's a workaround! A docs addition that documents the correct keynames, and has a copy-paste azerty version of the default keybinds",
      "created_at": "2026-02-03T17:24:21Z",
      "updated_at": "2026-02-20T23:16:27Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "890c8d6be5698689a648be9253f1849018959bbb",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Denperidge:patch-1",
        "ref": "patch-1",
        "sha": "b2bb17e2538b6a5ab6da1672dc12c8f6601afa4b",
        "user": {
          "login": "Denperidge",
          "id": 27348469,
          "node_id": "MDQ6VXNlcjI3MzQ4NDY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/27348469?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Denperidge",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1149051412,
          "node_id": "R_kgDORH0iFA",
          "name": "niri",
          "full_name": "Denperidge/niri",
          "private": false,
          "owner": {
            "login": "Denperidge",
            "id": 27348469,
            "node_id": "MDQ6VXNlcjI3MzQ4NDY5",
            "avatar_url": "https://avatars.githubusercontent.com/u/27348469?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Denperidge",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Denperidge/niri",
          "created_at": "2026-02-03T17:04:49Z",
          "updated_at": "2026-02-08T06:55:21Z",
          "pushed_at": "2026-02-20T23:15:45Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 10747,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2a52911757cb3b497db9407592f9b4c439571ea",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3387"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3387"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3387"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3387/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3387/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3387/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/b2bb17e2538b6a5ab6da1672dc12c8f6601afa4b"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3366",
      "id": 3232636317,
      "node_id": "PR_kwDOKFkxdc7Arh2d",
      "number": 3366,
      "state": "open",
      "locked": false,
      "title": "feat: keycode resolution, keycode triggers",
      "user": {
        "login": "tyrypyrking",
        "id": 30118924,
        "node_id": "MDQ6VXNlcjMwMTE4OTI0",
        "avatar_url": "https://avatars.githubusercontent.com/u/30118924?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tyrypyrking",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Solves the issues with multiple layouts and exotic xkb keymaps behaving undesirably. By allowing for binds to physical keys and/or resolving all keybinds against default xkb layout. This allows niri to match behavior of majority of applications in regards with keysym resolution and mapping.\r\n\r\n**Related discussions:** https://github.com/YaLTeR/niri/discussions/3255 (solves), https://github.com/YaLTeR/niri/discussions/2134 (useful proposal, but stale), https://github.com/YaLTeR/niri/discussions/1919 (solves), \r\n**Related issues**: https://github.com/YaLTeR/niri/issues/283 (solves)\r\n**Similar PR:** https://github.com/YaLTeR/niri/pull/1920 (draft)\r\n\r\n**Note on variants:** Pull request contains two variants for the same functionality provided in two commits. Cleaner (var2) and \"Safer\" (var1). Var1 is not much safer because avoiding xkb mutex lock and unwrap doesn't yeild any significant performance, nor will it remove other unwraps used by the libraries handling xkb connection. ",
      "created_at": "2026-02-01T06:21:40Z",
      "updated_at": "2026-02-26T04:55:19Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "51629fe58f9046a271126626d119f0bb59072d7d",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "tyrypyrking:main",
        "ref": "main",
        "sha": "5c8fed2130b6acd2f61cc5d56eba042781e5c525",
        "user": {
          "login": "tyrypyrking",
          "id": 30118924,
          "node_id": "MDQ6VXNlcjMwMTE4OTI0",
          "avatar_url": "https://avatars.githubusercontent.com/u/30118924?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/tyrypyrking",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1146623066,
          "node_id": "R_kgDORFgUWg",
          "name": "niri",
          "full_name": "tyrypyrking/niri",
          "private": false,
          "owner": {
            "login": "tyrypyrking",
            "id": 30118924,
            "node_id": "MDQ6VXNlcjMwMTE4OTI0",
            "avatar_url": "https://avatars.githubusercontent.com/u/30118924?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/tyrypyrking",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/tyrypyrking/niri",
          "created_at": "2026-01-31T12:02:40Z",
          "updated_at": "2026-02-25T15:07:33Z",
          "pushed_at": "2026-02-25T15:03:19Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6894,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3366"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3366"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3366"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3366/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3366/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3366/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/5c8fed2130b6acd2f61cc5d56eba042781e5c525"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3356",
      "id": 3231371444,
      "node_id": "PR_kwDOKFkxdc7AmtC0",
      "number": 3356,
      "state": "open",
      "locked": false,
      "title": "Add SwitchWorkspace action to change workspace without moving focus",
      "user": {
        "login": "feng-yifan",
        "id": 15028843,
        "node_id": "MDQ6VXNlcjE1MDI4ODQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/15028843?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/feng-yifan",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Summary\r\n\r\nThis PR introduces a new `SwitchWorkspace` action that switches to a workspace on its monitor **without** changing the currently focused monitor. This differs from the existing `FocusWorkspace` action, which moves keyboard focus to the target workspace's monitor.\r\n\r\n## Motivation\r\n\r\nThe current `FocusWorkspace` action is useful when you want to immediately start working on another workspace. However, there are valid workflows where you want to change a workspace on another monitor while keeping your current focus position:\r\n\r\n- **Multi-monitor workflow with parallel tasks**: On the primary work monitor, users often run multiple parallel tasks across different workspaces, each requiring auxiliary content from other workspaces on secondary displays. For example:\r\n  - Workspace 1 (coding) + Reference documentation on Monitor 2\r\n  - Workspace 2 (debugging) + Logs on Monitor 2\r\n  - Workspace 3 (code review) + CI status on Monitor 2\r\n\r\n  With `SwitchWorkspace`, the secondary monitor can automatically follow the primary monitor's workspace changes, keeping relevant auxiliary content in sync without requiring the user to manually switch and refocus.\r\n- **Preparing a workspace on another monitor** for an upcoming window move, such as organizing windows before a presentation or screen sharing session.\r\n- **Previewing content** on another monitor without interrupting current work, allowing quick glances at reference material or monitoring dashboards.\r\n- **Setting up workspaces** across multiple monitors before starting a complex task that requires specific window arrangements.\r\n\r\n## Usage\r\n\r\nVia IPC socket:\r\n\r\n```bash\r\n# Connect to niri socket and send SwitchWorkspace action\r\nsocat STDIO \"$NIRI_SOCKET\"\r\n{\"Action\":{\"SwitchWorkspace\":{\"reference\":{\"Id\":2}}}}\r\n```\r\n\r\nVia Rust:\r\n\r\n```rust\r\nlet mut socket = Socket::connect()?;\r\nsocket.send(Request::Action(Action::SwitchWorkspace {\r\n    reference: WorkspaceReferenceArg::Id(2),\r\n}));\r\n```\r\n\r\nImplementation Details\r\n\r\n- niri-ipc: Added SwitchWorkspace variant to the Action enum with WorkspaceReferenceArg parameter\r\n- niri-config: Added SwitchWorkspace action variant and IPC conversion logic\r\n- src/input: Added handler in process_action that finds the output and workspace index, then delegates to the layout\r\n- src/layout: Added switch_workspace_on_output method that switches workspace on a specific output without changing focus\r\n\r\nTesting\r\n\r\n- Compiled successfully with cargo build --release\r\n- Tested locally on my machine - runs well without any issues\r\n- Ran cargo clippy --all --all-targets - no warnings\r\n- Follows existing code patterns and conventions\r\n- Adds 30 lines across 4 files with focused, minimal changes\r\n\r\nBackward Compatibility\r\n\r\nThis change is fully backward compatible. It adds a new optional action without modifying any existing behavior.\r\n\r\nRelated\r\n\r\nRelated to the discussion in #3351 about workspace switching behavior.",
      "created_at": "2026-01-31T19:40:57Z",
      "updated_at": "2026-02-05T21:58:26Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "78c31d917b0347b5f189b1d680172fce6cddc938",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "feng-yifan:main",
        "ref": "main",
        "sha": "95156277ca937b22accd6890bd1ac3cda62cfa78",
        "user": {
          "login": "feng-yifan",
          "id": 15028843,
          "node_id": "MDQ6VXNlcjE1MDI4ODQz",
          "avatar_url": "https://avatars.githubusercontent.com/u/15028843?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/feng-yifan",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1146524085,
          "node_id": "R_kgDORFaRtQ",
          "name": "niri",
          "full_name": "feng-yifan/niri",
          "private": false,
          "owner": {
            "login": "feng-yifan",
            "id": 15028843,
            "node_id": "MDQ6VXNlcjE1MDI4ODQz",
            "avatar_url": "https://avatars.githubusercontent.com/u/15028843?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/feng-yifan",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/feng-yifan/niri",
          "created_at": "2026-01-31T08:27:04Z",
          "updated_at": "2026-02-08T06:55:21Z",
          "pushed_at": "2026-02-05T21:58:25Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6854,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "189917c93329c86ac2ddd89f459c26a028d590ba",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3356"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3356"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3356"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3356/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3356/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3356/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/95156277ca937b22accd6890bd1ac3cda62cfa78"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        3
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3348",
      "id": 3228959788,
      "node_id": "PR_kwDOKFkxdc7AdgQs",
      "number": 3348,
      "state": "open",
      "locked": false,
      "title": "doc: Add note about border and included configs",
      "user": {
        "login": "NicolaiRuckel",
        "id": 831282,
        "node_id": "MDQ6VXNlcjgzMTI4Mg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/831282?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/NicolaiRuckel",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "If you split up the config first and then want to enable borders it is super easy to miss that you have to turn them on explicitly. Hence, I think there should be a note in the border documentation.",
      "created_at": "2026-01-30T19:02:22Z",
      "updated_at": "2026-01-31T05:17:39Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "a627e3673a6be1e9a4eb0199ae6f743048052c9e",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "NicolaiRuckel:main",
        "ref": "main",
        "sha": "108f75610aaebccc6888328dad9f32fc530e327f",
        "user": {
          "login": "NicolaiRuckel",
          "id": 831282,
          "node_id": "MDQ6VXNlcjgzMTI4Mg==",
          "avatar_url": "https://avatars.githubusercontent.com/u/831282?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/NicolaiRuckel",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1146125053,
          "node_id": "R_kgDORFB6_Q",
          "name": "niri",
          "full_name": "NicolaiRuckel/niri",
          "private": false,
          "owner": {
            "login": "NicolaiRuckel",
            "id": 831282,
            "node_id": "MDQ6VXNlcjgzMTI4Mg==",
            "avatar_url": "https://avatars.githubusercontent.com/u/831282?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/NicolaiRuckel",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/NicolaiRuckel/niri",
          "created_at": "2026-01-30T16:51:06Z",
          "updated_at": "2026-02-08T06:55:20Z",
          "pushed_at": "2026-01-31T05:17:08Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6876,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "f30db163b5748e8cf95c05aba77d0d3736f40543",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3348"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3348"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3348"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3348/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3348/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3348/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/108f75610aaebccc6888328dad9f32fc530e327f"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3338",
      "id": 3222414752,
      "node_id": "PR_kwDOKFkxdc7AEiWg",
      "number": 3338,
      "state": "open",
      "locked": false,
      "title": "build(deps): bump accesskit_unix from 0.18.0 to 0.19.1",
      "user": {
        "login": "dependabot[bot]",
        "id": 49699333,
        "node_id": "MDM6Qm90NDk2OTkzMzM=",
        "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dependabot%5Bbot%5D",
        "type": "Bot",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Bumps [accesskit_unix](https://github.com/AccessKit/accesskit) from 0.18.0 to 0.19.1.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/AccessKit/accesskit/releases\">accesskit_unix's releases</a>.</em></p>\n<blockquote>\n<h2>accesskit_unix: v0.19.1</h2>\n<h2><a href=\"https://github.com/AccessKit/accesskit/compare/accesskit_unix-v0.19.0...accesskit_unix-v0.19.1\">0.19.1</a> (2026-01-18)</h2>\n<h3>Dependencies</h3>\n<ul>\n<li>The following workspace dependencies were updated\n<ul>\n<li>dependencies\n<ul>\n<li>accesskit_atspi_common bumped from 0.16.0 to 0.16.1</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<h2>accesskit_unix: v0.19.0</h2>\n<h2><a href=\"https://github.com/AccessKit/accesskit/compare/accesskit_unix-v0.18.0...accesskit_unix-v0.19.0\">0.19.0</a> (2026-01-15)</h2>\n<h3>⚠ BREAKING CHANGES</h3>\n<ul>\n<li>Multiple tree support (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/655\">#655</a>)</li>\n</ul>\n<h3>Features</h3>\n<ul>\n<li>Implement the <code>url</code> property (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/669\">#669</a>) (<a href=\"https://github.com/AccessKit/accesskit/commit/6202e63c667e73216a306b3dd45ff25c364a4f45\">6202e63</a>)</li>\n<li>Multiple tree support (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/655\">#655</a>) (<a href=\"https://github.com/AccessKit/accesskit/commit/c16eb80c49d14f39e8a7defb1694bf22b8ceed6f\">c16eb80</a>)</li>\n</ul>\n<h3>Dependencies</h3>\n<ul>\n<li>The following workspace dependencies were updated\n<ul>\n<li>dependencies\n<ul>\n<li>accesskit bumped from 0.22.0 to 0.23.0</li>\n<li>accesskit_atspi_common bumped from 0.15.0 to 0.16.0</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/a2269bbfdeb3f193e13e753e04f4ba0d1afde68c\"><code>a2269bb</code></a> chore: release main (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/680\">#680</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/13a37d144e2fafceaf26e7645f6acc679ccb2f34\"><code>13a37d1</code></a> fix: Emit initial focus event for active descendant node (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/681\">#681</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/98f9342a420df32c18d567dc7c4ea2522b241ec9\"><code>98f9342</code></a> fix: Use proper bundle key for Android URL property (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/679\">#679</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/828979e5f668bc8c4ceba018d417956a5c69b2bd\"><code>828979e</code></a> fix: Fix next word and line at the end of text runs (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/678\">#678</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/2bb9eac97ce90f80caa59d2b7944b86e4c934c48\"><code>2bb9eac</code></a> chore: release main (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/673\">#673</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/259e83271371007d7564588939c6aafd0b7b3ac0\"><code>259e832</code></a> feat: More text attributes on Windows (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/676\">#676</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/863755d6898c7006a5f49c3661a26cb62d837d1b\"><code>863755d</code></a> fix: Implement the <code>active_descendant</code> property (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/675\">#675</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/6202e63c667e73216a306b3dd45ff25c364a4f45\"><code>6202e63</code></a> feat: Implement the <code>url</code> property (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/669\">#669</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/c2e8487d0a243da0d1c996887fb4c9a7e3beacc7\"><code>c2e8487</code></a> refactor!: Store text decoration style and color in a struct (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/674\">#674</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/c16eb80c49d14f39e8a7defb1694bf22b8ceed6f\"><code>c16eb80</code></a> feat!: Multiple tree support (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/655\">#655</a>)</li>\n<li>See full diff in <a href=\"https://github.com/AccessKit/accesskit/compare/accesskit_unix-v0.18.0...accesskit_unix-v0.19.1\">compare view</a></li>\n</ul>\n</details>\n<br />\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=accesskit_unix&package-manager=cargo&previous-version=0.18.0&new-version=0.19.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n<details>\n<summary>Dependabot commands and options</summary>\n<br />\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n</details>",
      "created_at": "2026-01-29T08:46:59Z",
      "updated_at": "2026-02-09T10:48:32Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "673670785418eec66aeda05d067502b945149614",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "niri-wm:dependabot/cargo/accesskit_unix-0.19.1",
        "ref": "dependabot/cargo/accesskit_unix-0.19.1",
        "sha": "0b375ec23adbaea4610a512a6a5defe47837ca9f",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "f30db163b5748e8cf95c05aba77d0d3736f40543",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3338"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3338"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3338"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3338/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3338/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3338/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/0b375ec23adbaea4610a512a6a5defe47837ca9f"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        6
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3337",
      "id": 3222413990,
      "node_id": "PR_kwDOKFkxdc7AEiKm",
      "number": 3337,
      "state": "open",
      "locked": false,
      "title": "build(deps): bump glam from 0.30.10 to 0.31.0",
      "user": {
        "login": "dependabot[bot]",
        "id": 49699333,
        "node_id": "MDM6Qm90NDk2OTkzMzM=",
        "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dependabot%5Bbot%5D",
        "type": "Bot",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Bumps [glam](https://github.com/bitshifter/glam-rs) from 0.30.10 to 0.31.0.\n<details>\n<summary>Changelog</summary>\n<p><em>Sourced from <a href=\"https://github.com/bitshifter/glam-rs/blob/main/CHANGELOG.md\">glam's changelog</a>.</em></p>\n<blockquote>\n<h2>[0.31.0] - 2026-01-21</h2>\n<h3>Breaking changes</h3>\n<ul>\n<li>\n<p>The signature of <code>Quat::from_affine3(&amp;Affine3A)</code> was changed to\n<code>Quat::from_affine3(&amp;Affine3)</code> with the addition of the <code>Affine3</code> type.</p>\n</li>\n<li>\n<p>Removed deprecated <code>Vec2</code> and <code>DVec2</code> <code>angle_between</code> methods.</p>\n</li>\n<li>\n<p>Consistently use <code>&amp;self</code> for matrix and affine type methods and <code>self</code>\nfor vector, quat and mask types.</p>\n</li>\n</ul>\n<h3>Added</h3>\n<ul>\n<li>\n<p>Added <code>Affine3</code> type.</p>\n</li>\n<li>\n<p>Added <code>diagonal</code> method to matrix types which returns a vector containing the\ndiagonal of the matrix.</p>\n</li>\n<li>\n<p>Added <code>mul_diagonal_scale</code> methods to matrix types which multiply the matrix\nby a scale vector without needing to mulitply by a scale matrix.</p>\n</li>\n<li>\n<p>Added <code>mul_transpose_vecn</code> methods to matrix types which multiply the vector\nby the transpose of the matrix without needing to transpose it first. They can\nbe slightly more efficient for SIMD backed types.</p>\n</li>\n<li>\n<p>Added <code>try_inverse</code> method to matrix types which returns an option containing\nthe inverted matrix or <code>None</code> if the matrix was not invertible.</p>\n</li>\n<li>\n<p>Added <code>inverse_or_zero</code> method to matrix types which returns the inverted\nmatrix or a zero matrix if the matrix was not invertible.</p>\n</li>\n<li>\n<p>Added <code>step</code> and <code>saturate</code> methods to the <code>FloatExt</code> trait.</p>\n</li>\n<li>\n<p>Added <code>step</code>, <code>saturate</code>, <code>sqrt</code>, <code>sin</code>, <code>cos</code> and <code>sin_cos</code> methods to float\nvector types.</p>\n</li>\n<li>\n<p>Added <code>from_rotation_axes</code> method to quaternion types. This method was\npreviously internal only.</p>\n</li>\n</ul>\n</blockquote>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/bitshifter/glam-rs/commit/ecd1576c333823d7dc543264952cc1bcf521e7c3\"><code>ecd1576</code></a> Prepare 0.31.0 release. (<a href=\"https://redirect.github.com/bitshifter/glam-rs/issues/710\">#710</a>)</li>\n<li><a href=\"https://github.com/bitshifter/glam-rs/commit/4f431cf738ce7b321d5217cd0f02b4d721fe9ed2\"><code>4f431cf</code></a> Updated CHANGELOG and add test that was missed.</li>\n<li><a href=\"https://github.com/bitshifter/glam-rs/commit/5dee9afd1e544f4aeac5b435aefacc323bd28f82\"><code>5dee9af</code></a> Make quaternion from_rotation_axes pub. (<a href=\"https://redirect.github.com/bitshifter/glam-rs/issues/708\">#708</a>)</li>\n<li><a href=\"https://github.com/bitshifter/glam-rs/commit/4d8f4fa169d44a93292fbf99c401800248b0cfcd\"><code>4d8f4fa</code></a> Add try_inverse and inverse_or_zero matrix methods. (<a href=\"https://redirect.github.com/bitshifter/glam-rs/issues/707\">#707</a>)</li>\n<li><a href=\"https://github.com/bitshifter/glam-rs/commit/c22793dbbb31a43ba98cf1980c834117b369140f\"><code>c22793d</code></a> Add diagonal method to matrix types. (<a href=\"https://redirect.github.com/bitshifter/glam-rs/issues/706\">#706</a>)</li>\n<li><a href=\"https://github.com/bitshifter/glam-rs/commit/e87a31d8950155b28aa8f084c2641201b7bfc0e8\"><code>e87a31d</code></a> Update iai-callgrind 0.16 to gungraun 0.17.</li>\n<li><a href=\"https://github.com/bitshifter/glam-rs/commit/02444a55e98fdef52e3e2d4fc22f91014daa19cd\"><code>02444a5</code></a> Use self for vector and quat methods and &amp;self for matrix and affine. (<a href=\"https://redirect.github.com/bitshifter/glam-rs/issues/704\">#704</a>)</li>\n<li><a href=\"https://github.com/bitshifter/glam-rs/commit/6065e5d1d0c4c4ac698a9a977b2ea04e95ee9864\"><code>6065e5d</code></a> Important README update.</li>\n<li><a href=\"https://github.com/bitshifter/glam-rs/commit/db8f5cf8abd8e82b28fed7b441a5d922e3015f4a\"><code>db8f5cf</code></a> Remove deprecated methods. (<a href=\"https://redirect.github.com/bitshifter/glam-rs/issues/649\">#649</a>)</li>\n<li><a href=\"https://github.com/bitshifter/glam-rs/commit/15ae30663849f1b04449dfe44a01a0be8b2f1b8f\"><code>15ae306</code></a> Add mul_transpose_vecn method to matrix types (<a href=\"https://redirect.github.com/bitshifter/glam-rs/issues/703\">#703</a>)</li>\n<li>Additional commits viewable in <a href=\"https://github.com/bitshifter/glam-rs/compare/0.30.10...0.31.0\">compare view</a></li>\n</ul>\n</details>\n<br />\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=glam&package-manager=cargo&previous-version=0.30.10&new-version=0.31.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n<details>\n<summary>Dependabot commands and options</summary>\n<br />\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n</details>",
      "created_at": "2026-01-29T08:46:44Z",
      "updated_at": "2026-02-09T10:48:33Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "b625953072e6322277854c7147840996b03f5911",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "niri-wm:dependabot/cargo/glam-0.31.0",
        "ref": "dependabot/cargo/glam-0.31.0",
        "sha": "5e140a32b19d3b78553cb43d9d93d60e95faee4d",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "f30db163b5748e8cf95c05aba77d0d3736f40543",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3337"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3337"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3337"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3337/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3337/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3337/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/5e140a32b19d3b78553cb43d9d93d60e95faee4d"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        7,
        6
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3336",
      "id": 3222413200,
      "node_id": "PR_kwDOKFkxdc7AEh-Q",
      "number": 3336,
      "state": "open",
      "locked": false,
      "title": "build(deps): bump accesskit from 0.22.0 to 0.23.0",
      "user": {
        "login": "dependabot[bot]",
        "id": 49699333,
        "node_id": "MDM6Qm90NDk2OTkzMzM=",
        "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dependabot%5Bbot%5D",
        "type": "Bot",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Bumps [accesskit](https://github.com/AccessKit/accesskit) from 0.22.0 to 0.23.0.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a href=\"https://github.com/AccessKit/accesskit/releases\">accesskit's releases</a>.</em></p>\n<blockquote>\n<h2>accesskit_winit: v0.23.0</h2>\n<h2><a href=\"https://github.com/AccessKit/accesskit/compare/accesskit_winit-v0.22.4...accesskit_winit-v0.23.0\">0.23.0</a> (2024-10-31)</h2>\n<h3>⚠ BREAKING CHANGES</h3>\n<ul>\n<li>Rename <code>name</code> to <code>label</code> and use <code>value</code> for label content (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/475\">#475</a>)</li>\n<li>Rename <code>NodeBuilder</code> to <code>Node</code> and the old <code>Node</code> to <code>FrozenNode</code> (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/476\">#476</a>)</li>\n<li>Drop <code>DefaultActionVerb</code> (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/472\">#472</a>)</li>\n<li>Make the core crate no-std (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/468\">#468</a>)</li>\n</ul>\n<h3>Features</h3>\n<ul>\n<li>Make the core crate no-std (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/468\">#468</a>) (<a href=\"https://github.com/AccessKit/accesskit/commit/2fa0d3f5b2b7ac11ef1751c133706f29e548bd6d\">2fa0d3f</a>)</li>\n</ul>\n<h3>Code Refactoring</h3>\n<ul>\n<li>Drop <code>DefaultActionVerb</code> (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/472\">#472</a>) (<a href=\"https://github.com/AccessKit/accesskit/commit/ef3b0038224459094f650368412650bc3b69526b\">ef3b003</a>)</li>\n<li>Rename <code>name</code> to <code>label</code> and use <code>value</code> for label content (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/475\">#475</a>) (<a href=\"https://github.com/AccessKit/accesskit/commit/e0053a5399929e8e0d4f07aa18de604ed8766ace\">e0053a5</a>)</li>\n<li>Rename <code>NodeBuilder</code> to <code>Node</code> and the old <code>Node</code> to <code>FrozenNode</code> (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/476\">#476</a>) (<a href=\"https://github.com/AccessKit/accesskit/commit/7d8910e35f7bc0543724cc124941a3bd0304bcc0\">7d8910e</a>)</li>\n</ul>\n<h3>Dependencies</h3>\n<ul>\n<li>The following workspace dependencies were updated\n<ul>\n<li>dependencies\n<ul>\n<li>accesskit bumped from 0.16.3 to 0.17.0</li>\n<li>accesskit_windows bumped from 0.23.2 to 0.24.0</li>\n<li>accesskit_macos bumped from 0.17.4 to 0.18.0</li>\n<li>accesskit_unix bumped from 0.12.3 to 0.13.0</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<h2>accesskit_macos: v0.23.0</h2>\n<h2><a href=\"https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.22.2...accesskit_macos-v0.23.0\">0.23.0</a> (2025-12-23)</h2>\n<h3>⚠ BREAKING CHANGES</h3>\n<ul>\n<li>Drop deprecated roles (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/642\">#642</a>)</li>\n<li>Infrastructure for supporting text formatting changes (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/626\">#626</a>)</li>\n</ul>\n<h3>Features</h3>\n<ul>\n<li>Add GridCell role (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/643\">#643</a>) (<a href=\"https://github.com/AccessKit/accesskit/commit/1e5abca737d1ee942c0804fec2c06d3cb08faa94\">1e5abca</a>)</li>\n<li>Implement BrailleLabel and BrailleRoleDescription roles (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/638\">#638</a>) (<a href=\"https://github.com/AccessKit/accesskit/commit/0fdcebb55e308e039ec99fbc31e94e8087a69f2d\">0fdcebb</a>)</li>\n<li>Rename HeaderAsNonLandmark to SectionHeader, FooterAsNonLandmark to SectionFooter (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/635\">#635</a>) (<a href=\"https://github.com/AccessKit/accesskit/commit/dd695260877cb862ece4c2b7d8607308f5fed608\">dd69526</a>)</li>\n</ul>\n<h3>Bug Fixes</h3>\n<!-- raw HTML omitted -->\n</blockquote>\n<p>... (truncated)</p>\n</details>\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/2bb9eac97ce90f80caa59d2b7944b86e4c934c48\"><code>2bb9eac</code></a> chore: release main (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/673\">#673</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/259e83271371007d7564588939c6aafd0b7b3ac0\"><code>259e832</code></a> feat: More text attributes on Windows (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/676\">#676</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/863755d6898c7006a5f49c3661a26cb62d837d1b\"><code>863755d</code></a> fix: Implement the <code>active_descendant</code> property (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/675\">#675</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/6202e63c667e73216a306b3dd45ff25c364a4f45\"><code>6202e63</code></a> feat: Implement the <code>url</code> property (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/669\">#669</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/c2e8487d0a243da0d1c996887fb4c9a7e3beacc7\"><code>c2e8487</code></a> refactor!: Store text decoration style and color in a struct (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/674\">#674</a>)</li>\n<li><a href=\"https://github.com/AccessKit/accesskit/commit/c16eb80c49d14f39e8a7defb1694bf22b8ceed6f\"><code>c16eb80</code></a> feat!: Multiple tree support (<a href=\"https://redirect.github.com/AccessKit/accesskit/issues/655\">#655</a>)</li>\n<li>See full diff in <a href=\"https://github.com/AccessKit/accesskit/compare/accesskit-v0.22.0...accesskit-v0.23.0\">compare view</a></li>\n</ul>\n</details>\n<br />\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=accesskit&package-manager=cargo&previous-version=0.22.0&new-version=0.23.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n<details>\n<summary>Dependabot commands and options</summary>\n<br />\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n</details>",
      "created_at": "2026-01-29T08:46:31Z",
      "updated_at": "2026-02-09T10:48:34Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "41b3ca115f0118ce06dd795d6cc2c19fd1e90d28",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "niri-wm:dependabot/cargo/accesskit-0.23.0",
        "ref": "dependabot/cargo/accesskit-0.23.0",
        "sha": "726cda432592e6d815dac09e14a3aeeb1997c205",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "f30db163b5748e8cf95c05aba77d0d3736f40543",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3336"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3336"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3336"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3336/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3336/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3336/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/726cda432592e6d815dac09e14a3aeeb1997c205"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        4,
        6
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3335",
      "id": 3222412267,
      "node_id": "PR_kwDOKFkxdc7AEhvr",
      "number": 3335,
      "state": "open",
      "locked": false,
      "title": "build(deps): bump the smithay group with 2 updates",
      "user": {
        "login": "dependabot[bot]",
        "id": 49699333,
        "node_id": "MDM6Qm90NDk2OTkzMzM=",
        "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dependabot%5Bbot%5D",
        "type": "Bot",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Bumps the smithay group with 2 updates: [smithay](https://github.com/Smithay/smithay) and [smithay-drm-extras](https://github.com/Smithay/smithay).\n\nUpdates `smithay` from `2928e4f` to `f9d4d7f`\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/Smithay/smithay/commit/f9d4d7ffd82d743fb89737b3ffaed57505b477d1\"><code>f9d4d7f</code></a> Add Otto compositor to compositors list (<a href=\"https://redirect.github.com/Smithay/smithay/issues/1913\">#1913</a>)</li>\n<li><a href=\"https://github.com/Smithay/smithay/commit/ae14fa12f6ee3fc4dd4c766ffb21848f991a6a18\"><code>ae14fa1</code></a> wayland/xdg_foreign: Fix panic when exporting surface with invalid role</li>\n<li>See full diff in <a href=\"https://github.com/Smithay/smithay/compare/2928e4f34541d957b7b3c3b3e13b2539cd44990f...f9d4d7ffd82d743fb89737b3ffaed57505b477d1\">compare view</a></li>\n</ul>\n</details>\n<br />\n\nUpdates `smithay-drm-extras` from `2928e4f` to `f9d4d7f`\n<details>\n<summary>Commits</summary>\n<ul>\n<li><a href=\"https://github.com/Smithay/smithay/commit/f9d4d7ffd82d743fb89737b3ffaed57505b477d1\"><code>f9d4d7f</code></a> Add Otto compositor to compositors list (<a href=\"https://redirect.github.com/Smithay/smithay/issues/1913\">#1913</a>)</li>\n<li><a href=\"https://github.com/Smithay/smithay/commit/ae14fa12f6ee3fc4dd4c766ffb21848f991a6a18\"><code>ae14fa1</code></a> wayland/xdg_foreign: Fix panic when exporting surface with invalid role</li>\n<li>See full diff in <a href=\"https://github.com/Smithay/smithay/compare/2928e4f34541d957b7b3c3b3e13b2539cd44990f...f9d4d7ffd82d743fb89737b3ffaed57505b477d1\">compare view</a></li>\n</ul>\n</details>\n<br />\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n<details>\n<summary>Dependabot commands and options</summary>\n<br />\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n</details>",
      "created_at": "2026-01-29T08:46:16Z",
      "updated_at": "2026-02-26T08:44:53Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "6c8311437cbc005e9cf32a48b22741c90dd128af",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "niri-wm:dependabot/cargo/smithay-363682e0ec",
        "ref": "dependabot/cargo/smithay-363682e0ec",
        "sha": "edad5d729fbf4a5009411a9a35e0ac6d2e02bc49",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3335"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3335"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3335"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3335/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3335/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3335/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/edad5d729fbf4a5009411a9a35e0ac6d2e02bc49"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3327",
      "id": 3217159610,
      "node_id": "PR_kwDOKFkxdc6_wfW6",
      "number": 3327,
      "state": "open",
      "locked": false,
      "title": "backend/winit: DMA-BUF setup for Nvidia support",
      "user": {
        "login": "Fingel",
        "id": 3046397,
        "node_id": "MDQ6VXNlcjMwNDYzOTc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3046397?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Fingel",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Hello! Thank you for your amazing work on Niri, I moved from PaperWM and haven't looked back.\r\n\r\nI wanted to hack on Niri a bit (There's a feature that's been bouncing around my head, I wanted to see if it was feasible first) but when I went to run it using the winit backend (for the quick iteration!) I was met with errors when trying to start any application:\r\n\r\n```\r\n2026-01-28T04:26:33.451301Z  WARN niri::render_helpers::surface: failed to import surface: Error accessing the buffer (BufferAccessError::NotManaged)\r\n2026-01-28T04:26:33.452208Z  WARN niri::layout::tile: error rendering window opening animation: error rendering to offscreen buffer\r\n\r\nCaused by:\r\n    Failed to bind Framebuffer\r\n2026-01-28T04:26:33.452314Z  WARN niri::layout::scrolling: error creating a closing window animation: error rendering contents\r\n\r\nCaused by:\r\n    0: error rendering to texture\r\n    1: error binding texture\r\n    2: Failed to bind Framebuffer\r\n```\r\nTo be clear, this **only happens** on the winit backend, the tty backend has been working perfectly for me. I did some looking around and this appears to be due to the lack of a global DMA buffer, NVIDIA will just not work with wl_drm alone.\r\n\r\nI tried to match the existing structure of the TTY module as much as possible. The rest of the code is basically [copied directly from Smithay/Anvil](https://github.com/Smithay/smithay/blob/f9d4d7ffd82d743fb89737b3ffaed57505b477d1/anvil/src/winit.rs#L148). I'm not super knowledgeable about this stuff so I tried to play follow the leaders here. \r\n\r\nThis fixes the issue on my machine. I also tested in a VM where it follows the fallback code path and works there as well.\r\n\r\nThanks for taking a look! \r\n\r\nOriginal commit message:\r\n--\r\nCreates a dmabuf global in the same manner as the tty backend. This fixes applications failing to launch on Nvidia when using the winit backend.\r\n\r\nThis code is adapted from Smithay's Anvil compositor. See smithay/anvil/src/winit.rs",
      "created_at": "2026-01-28T04:44:03Z",
      "updated_at": "2026-02-04T08:46:40Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "4d0e61ab6d3c84bf2d55d0281a777a1d6098650c",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Fingel:winit-dmabuf",
        "ref": "winit-dmabuf",
        "sha": "5fb4f86b0804918e2600134887c3b45830d3213c",
        "user": {
          "login": "Fingel",
          "id": 3046397,
          "node_id": "MDQ6VXNlcjMwNDYzOTc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/3046397?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Fingel",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1143660086,
          "node_id": "R_kgDORCreNg",
          "name": "niri",
          "full_name": "Fingel/niri",
          "private": false,
          "owner": {
            "login": "Fingel",
            "id": 3046397,
            "node_id": "MDQ6VXNlcjMwNDYzOTc=",
            "avatar_url": "https://avatars.githubusercontent.com/u/3046397?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Fingel",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Fingel/niri",
          "created_at": "2026-01-27T21:13:20Z",
          "updated_at": "2026-02-08T06:55:20Z",
          "pushed_at": "2026-01-28T04:26:59Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6874,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "765a241c5a5075d6d6d20d0b8f9786220a7317ba",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3327"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3327"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3327"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3327/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3327/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3327/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/5fb4f86b0804918e2600134887c3b45830d3213c"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3322",
      "id": 3214360925,
      "node_id": "PR_kwDOKFkxdc6_l0Fd",
      "number": 3322,
      "state": "open",
      "locked": false,
      "title": "allow customizing XDG_CURRENT_DESKTOP",
      "user": {
        "login": "cmm",
        "id": 718298,
        "node_id": "MDQ6VXNlcjcxODI5OA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/718298?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cmm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Through the CLI (`--xdg-current-desktop`) or environment (`NIRI_XDG_CURRENT_DESKTOP`).\r\nSee discussion under #3318 for rationale.",
      "created_at": "2026-01-27T12:20:20Z",
      "updated_at": "2026-01-27T12:20:20Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "6d131b55265b9666a341d8df5f88cd7fa67565e1",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "cmm:overridable-xdg-current-desktop",
        "ref": "overridable-xdg-current-desktop",
        "sha": "8b6c28eafac0f48540a3612f7a10b5742545c9cf",
        "user": {
          "login": "cmm",
          "id": 718298,
          "node_id": "MDQ6VXNlcjcxODI5OA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/718298?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/cmm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1142492540,
          "node_id": "R_kgDORBkNfA",
          "name": "niri",
          "full_name": "cmm/niri",
          "private": false,
          "owner": {
            "login": "cmm",
            "id": 718298,
            "node_id": "MDQ6VXNlcjcxODI5OA==",
            "avatar_url": "https://avatars.githubusercontent.com/u/718298?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/cmm",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/cmm/niri",
          "created_at": "2026-01-26T13:39:29Z",
          "updated_at": "2026-02-08T06:55:19Z",
          "pushed_at": "2026-01-27T12:18:45Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6858,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "e1015ac92f07dba4d030358642d1920a324a8629",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3322"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3322"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3322"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3322/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3322/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3322/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/8b6c28eafac0f48540a3612f7a10b5742545c9cf"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        3
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3317",
      "id": 3210855707,
      "node_id": "PR_kwDOKFkxdc6_YcUb",
      "number": 3317,
      "state": "open",
      "locked": false,
      "title": "feat: add flip option for tab-indicator",
      "user": {
        "login": "kingiler",
        "id": 68145845,
        "node_id": "MDQ6VXNlcjY4MTQ1ODQ1",
        "avatar_url": "https://avatars.githubusercontent.com/u/68145845?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kingiler",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Add support to flip the display of the tab indicator.\nOne can now add the following to config:\n```\ntab-indicator {\n    flip // <--\n    position \"bottom\"\n}\n```\nNow `Mod+J` can be used to move to the window on the left instead of right.\n\n",
      "created_at": "2026-01-26T14:46:03Z",
      "updated_at": "2026-02-28T15:33:37Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "2d0fb5c069999fc0838c6cb56f005780a6fb7485",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "kingiler:flip-tab",
        "ref": "flip-tab",
        "sha": "86cbdb0b221c66a2c99145a913d577bb23632327",
        "user": {
          "login": "kingiler",
          "id": 68145845,
          "node_id": "MDQ6VXNlcjY4MTQ1ODQ1",
          "avatar_url": "https://avatars.githubusercontent.com/u/68145845?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/kingiler",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1142537061,
          "node_id": "R_kgDORBm7ZQ",
          "name": "niri",
          "full_name": "kingiler/niri",
          "private": false,
          "owner": {
            "login": "kingiler",
            "id": 68145845,
            "node_id": "MDQ6VXNlcjY4MTQ1ODQ1",
            "avatar_url": "https://avatars.githubusercontent.com/u/68145845?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/kingiler",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/kingiler/niri",
          "created_at": "2026-01-26T14:41:32Z",
          "updated_at": "2026-02-08T06:55:20Z",
          "pushed_at": "2026-02-28T15:33:36Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 10758,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "e708f546153f74acf33eb183b3b2992587a701e5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3317"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3317"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3317"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3317/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3317/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3317/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/86cbdb0b221c66a2c99145a913d577bb23632327"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3316",
      "id": 3210810369,
      "node_id": "PR_kwDOKFkxdc6_YRQB",
      "number": 3316,
      "state": "open",
      "locked": false,
      "title": "Add toggle-touchpad action",
      "user": {
        "login": "barrulus",
        "id": 201146829,
        "node_id": "U_kgDOC_1BzQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/201146829?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/barrulus",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Summary\n\n- Adds a new `toggle-touchpad` action to toggle the touchpad on/off at runtime without editing the config file\n- Can be bound to a key or invoked via IPC with `niri msg action toggle-touchpad`\n- The toggle state is combined with the config's `off` setting - both must allow the touchpad for it to be enabled\n\n## Notes\n\n- State resets on restart\n- Applies to newly hot-plugged touchpads\n\n## Test plan\n\n- [x] Bind `toggle-touchpad` to a key and verify it toggles touchpad input\n- [x] Test via IPC: `niri msg action toggle-touchpad`\n- [x] Verify interaction with config `off` setting\n- [x] Hot-plug a touchpad while toggled off and verify it stays off",
      "created_at": "2026-01-26T14:32:31Z",
      "updated_at": "2026-02-28T19:18:34Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "907cd76b87049346f14d75a9d7abb910cc029378",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "barrulus:feature/toggle-touchpad",
        "ref": "feature/toggle-touchpad",
        "sha": "1cad151b8cd0c93f411592810ae0f8231a7d5497",
        "user": {
          "login": "barrulus",
          "id": 201146829,
          "node_id": "U_kgDOC_1BzQ",
          "avatar_url": "https://avatars.githubusercontent.com/u/201146829?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/barrulus",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1104670823,
          "node_id": "R_kgDOQdfwZw",
          "name": "biri",
          "full_name": "barrulus/biri",
          "private": false,
          "owner": {
            "login": "barrulus",
            "id": 201146829,
            "node_id": "U_kgDOC_1BzQ",
            "avatar_url": "https://avatars.githubusercontent.com/u/201146829?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/barrulus",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/barrulus/biri",
          "created_at": "2025-11-26T14:24:50Z",
          "updated_at": "2026-02-28T19:17:58Z",
          "pushed_at": "2026-03-01T15:34:19Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 7030,
          "stargazers_count": 1,
          "watchers_count": 1,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 1,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "e708f546153f74acf33eb183b3b2992587a701e5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3316"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3316"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3316"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3316/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3316/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3316/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/1cad151b8cd0c93f411592810ae0f8231a7d5497"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3309",
      "id": 3207793160,
      "node_id": "PR_kwDOKFkxdc6_MwoI",
      "number": 3309,
      "state": "open",
      "locked": false,
      "title": "fix: adapt to newer virtual_keyboard",
      "user": {
        "login": "Bot-wxt1221",
        "id": 74451279,
        "node_id": "MDQ6VXNlcjc0NDUxMjc5",
        "avatar_url": "https://avatars.githubusercontent.com/u/74451279?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Bot-wxt1221",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "https://github.com/Smithay/smithay/pull/1903\n\nFix https://github.com/YaLTeR/niri/issues/2314\n\nFix #3274",
      "created_at": "2026-01-25T04:56:10Z",
      "updated_at": "2026-02-15T02:20:12Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "5842cf709b0b08707721936f5c19e5f8d5a83a95",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "Bot-wxt1221:virtual_keyboard",
        "ref": "virtual_keyboard",
        "sha": "59dd8677536a2b4f723a9fba6e6a3d8606174af1",
        "user": {
          "login": "Bot-wxt1221",
          "id": 74451279,
          "node_id": "MDQ6VXNlcjc0NDUxMjc5",
          "avatar_url": "https://avatars.githubusercontent.com/u/74451279?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Bot-wxt1221",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1038931590,
          "node_id": "R_kgDOPezWhg",
          "name": "niri",
          "full_name": "Bot-wxt1221/niri",
          "private": false,
          "owner": {
            "login": "Bot-wxt1221",
            "id": 74451279,
            "node_id": "MDQ6VXNlcjc0NDUxMjc5",
            "avatar_url": "https://avatars.githubusercontent.com/u/74451279?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Bot-wxt1221",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Bot-wxt1221/niri",
          "created_at": "2025-08-16T05:34:17Z",
          "updated_at": "2026-02-08T06:54:56Z",
          "pushed_at": "2026-02-15T02:20:11Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6921,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "8e3e93b6240dc9dbc702f0b44f20177c2ce737cf",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3309"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3309"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3309"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3309/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3309/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3309/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/59dd8677536a2b4f723a9fba6e6a3d8606174af1"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        3
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3305",
      "id": 3205074809,
      "node_id": "PR_kwDOKFkxdc6_CY95",
      "number": 3305,
      "state": "open",
      "locked": false,
      "title": "Window geometries relative to the output",
      "user": {
        "login": "Szybet",
        "id": 53944559,
        "node_id": "MDQ6VXNlcjUzOTQ0NTU5",
        "avatar_url": "https://avatars.githubusercontent.com/u/53944559?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Szybet",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "I needed a way to know what is seen now on the screen in what parts, exactly where (As current available information (niri msg windows) didn't show anything if for example the window is centered, or offset in any way). I came up with this, I followed https://github.com/YaLTeR/niri/pull/1265 for suggestion on how to implement this. Just a sketch, suggestions are welcome",
      "created_at": "2026-01-23T22:11:52Z",
      "updated_at": "2026-01-27T18:09:31Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "f4dc891d949909187764a98d87a66fd33ea3ef9e",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Szybet:main",
        "ref": "main",
        "sha": "4859fd628d9ca7fd6a13f7bb17c862636f208ca1",
        "user": {
          "login": "Szybet",
          "id": 53944559,
          "node_id": "MDQ6VXNlcjUzOTQ0NTU5",
          "avatar_url": "https://avatars.githubusercontent.com/u/53944559?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Szybet",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1140873764,
          "node_id": "R_kgDORABaJA",
          "name": "niri",
          "full_name": "Szybet/niri",
          "private": false,
          "owner": {
            "login": "Szybet",
            "id": 53944559,
            "node_id": "MDQ6VXNlcjUzOTQ0NTU5",
            "avatar_url": "https://avatars.githubusercontent.com/u/53944559?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Szybet",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Szybet/niri",
          "created_at": "2026-01-23T21:36:45Z",
          "updated_at": "2026-02-08T06:55:19Z",
          "pushed_at": "2026-01-23T21:49:27Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6850,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "d7184a04b904e07113f4623610775ae78d32394c",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3305"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3305"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3305"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3305/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3305/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3305/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/4859fd628d9ca7fd6a13f7bb17c862636f208ca1"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3304",
      "id": 3204264705,
      "node_id": "PR_kwDOKFkxdc6-_TMB",
      "number": 3304,
      "state": "open",
      "locked": false,
      "title": "Add tablet option map-to-active-output",
      "user": {
        "login": "qqwa",
        "id": 11419664,
        "node_id": "MDQ6VXNlcjExNDE5NjY0",
        "avatar_url": "https://avatars.githubusercontent.com/u/11419664?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/qqwa",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Makes it more convenient to use a tablet as a mouse replacement.\r\n\r\nStill needs a separate way to change the active output, like using touch/mouse to move the cursor over the edge or with a key binding for example running the action `focus-monitor-next`.",
      "created_at": "2026-01-23T17:56:27Z",
      "updated_at": "2026-01-23T17:56:27Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "1a62de798c4372eedd09a3552e3d9a308a2763fe",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "qqwa:tablet-map-to-active-output",
        "ref": "tablet-map-to-active-output",
        "sha": "c787c5bbd20dea125ac40dce13370e47379f8056",
        "user": {
          "login": "qqwa",
          "id": 11419664,
          "node_id": "MDQ6VXNlcjExNDE5NjY0",
          "avatar_url": "https://avatars.githubusercontent.com/u/11419664?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/qqwa",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1140692889,
          "node_id": "R_kgDOQ_2XmQ",
          "name": "niri",
          "full_name": "qqwa/niri",
          "private": false,
          "owner": {
            "login": "qqwa",
            "id": 11419664,
            "node_id": "MDQ6VXNlcjExNDE5NjY0",
            "avatar_url": "https://avatars.githubusercontent.com/u/11419664?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/qqwa",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/qqwa/niri",
          "created_at": "2026-01-23T16:20:09Z",
          "updated_at": "2026-02-08T06:55:19Z",
          "pushed_at": "2026-01-23T17:32:54Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6849,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "d7184a04b904e07113f4623610775ae78d32394c",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3304"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3304"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3304"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3304/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3304/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3304/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/c787c5bbd20dea125ac40dce13370e47379f8056"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3302",
      "id": 3203925489,
      "node_id": "PR_kwDOKFkxdc6--AXx",
      "number": 3302,
      "state": "open",
      "locked": false,
      "title": "Add open-sticky window rule for sticky floating windows across workspaces",
      "user": {
        "login": "AtefR",
        "id": 43242743,
        "node_id": "MDQ6VXNlcjQzMjQyNzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/43242743?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AtefR",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Summary\r\n  - Add `open-sticky` window rule to keep a window visible across all workspaces on the current output\r\n  - Add `toggle-window-sticky` action to toggle stickiness via keybinds\r\n  - Add `match is-sticky=true` rule for matching sticky windows\r\n  - Expose `is_sticky` in IPC window info\r\n  - Treat sticky windows as floating for sizing/positioning rules\r\n  - Update docs and hotkey overlay\r\n\r\n  ## Testing\r\n  - `cargo test -p niri`\r\n  - Manual test: open a PiP window with `open-sticky true`, toggle stickiness via keybind, and verify it stays visible across workspace switches\r\n\r\n  ## Notes\r\n  - `open-sticky` implies `open-floating`\r\n  - Developed/implemented with assistance from OpenAI Codex; all changes reviewed and tested by me",
      "created_at": "2026-01-23T16:18:18Z",
      "updated_at": "2026-02-12T12:22:55Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "924b6eb081b7c15e2ab952f045fdb51326c5ab7d",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "AtefR:feature/sticky-windows",
        "ref": "feature/sticky-windows",
        "sha": "31498af82e4f3407d52228d6ea58a6585c3c3129",
        "user": {
          "login": "AtefR",
          "id": 43242743,
          "node_id": "MDQ6VXNlcjQzMjQyNzQz",
          "avatar_url": "https://avatars.githubusercontent.com/u/43242743?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AtefR",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1140685281,
          "node_id": "R_kgDOQ_154Q",
          "name": "niri",
          "full_name": "AtefR/niri",
          "private": false,
          "owner": {
            "login": "AtefR",
            "id": 43242743,
            "node_id": "MDQ6VXNlcjQzMjQyNzQz",
            "avatar_url": "https://avatars.githubusercontent.com/u/43242743?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/AtefR",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/AtefR/niri",
          "created_at": "2026-01-23T16:08:32Z",
          "updated_at": "2026-02-08T06:55:19Z",
          "pushed_at": "2026-02-12T12:22:54Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6956,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "41b5de87692b8262fbdbff7faab93f04ff0be453",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3302"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3302"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3302"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3302/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3302/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3302/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/31498af82e4f3407d52228d6ea58a6585c3c3129"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3291",
      "id": 3194110333,
      "node_id": "PR_kwDOKFkxdc6-YkF9",
      "number": 3291,
      "state": "open",
      "locked": false,
      "title": "Add swap-workspaces-with-monitor-{previous/next} actions",
      "user": {
        "login": "rossnomann",
        "id": 28867223,
        "node_id": "MDQ6VXNlcjI4ODY3MjIz",
        "avatar_url": "https://avatars.githubusercontent.com/u/28867223?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rossnomann",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "See https://github.com/YaLTeR/niri/discussions/3277 for more details",
      "created_at": "2026-01-21T07:30:32Z",
      "updated_at": "2026-01-21T07:30:32Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "6b6b526ec8ddc5f403dcd1b4361caedf45ce98e0",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "rossnomann:feature/swap-workspaces",
        "ref": "feature/swap-workspaces",
        "sha": "2638dd8f1aca2ad26e1d094a0c8dd122e9fc2a93",
        "user": {
          "login": "rossnomann",
          "id": 28867223,
          "node_id": "MDQ6VXNlcjI4ODY3MjIz",
          "avatar_url": "https://avatars.githubusercontent.com/u/28867223?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/rossnomann",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1138774185,
          "node_id": "R_kgDOQ-BQqQ",
          "name": "niri",
          "full_name": "rossnomann/niri",
          "private": false,
          "owner": {
            "login": "rossnomann",
            "id": 28867223,
            "node_id": "MDQ6VXNlcjI4ODY3MjIz",
            "avatar_url": "https://avatars.githubusercontent.com/u/28867223?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/rossnomann",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/rossnomann/niri",
          "created_at": "2026-01-21T05:15:22Z",
          "updated_at": "2026-02-08T06:55:19Z",
          "pushed_at": "2026-01-21T07:29:08Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6851,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "d7184a04b904e07113f4623610775ae78d32394c",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3291"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3291"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3291"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3291/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3291/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3291/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/2638dd8f1aca2ad26e1d094a0c8dd122e9fc2a93"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3246",
      "id": 3168914556,
      "node_id": "PR_kwDOKFkxdc684cx8",
      "number": 3246,
      "state": "open",
      "locked": false,
      "title": "Feat/cursor zoom",
      "user": {
        "login": "Atan-D-RP4",
        "id": 113052920,
        "node_id": "U_kgDOBr0M-A",
        "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Atan-D-RP4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Adds a new ipc action set-cursor-zoom that takes a floating point value and applies a zoom transform to the entire compositor.\r\nTracking issue #1024 \r\nContinued discussion #3285\r\n\r\n---\r\n\r\nAs of commit `5f3b8f67c908ac77617e48230d1891cc7231c547`\r\n\r\nLatest interface:\r\n```kdl\r\nzoom {\r\n   movement-mode \"cursor-follow\" // \"on-edge\" or \"centered\"\r\n   increment-type \"linear\" // \"exponential\"\r\n   max-zoom 10.0\r\n   pinch-sensitivity 1.0\r\n}\r\n\r\n// Will trim this down, since I was experimenting\r\nanimations {\r\n  zoom-focal-pan      { spring damping-ratio=1.0 stiffness=1200 epsilon=0.0001; }\r\n  zoom-level-change   { spring damping-ratio=1.0 stiffness=800 epsilon=0.0001; }\r\n}\r\n\r\ncursor {\r\n   // scale-with-zoom\r\n}\r\n\r\nbinds {\r\n    Mod+Alt+Equal { set-zoom-level \"+0.1\"; }\r\n    Mod+Alt+Minus { set-zoom-level \"-0.1\"; }\r\n    Mod+Alt+WheelScrollUp   { set-zoom-level \"+0.1\"; }\r\n    Mod+Alt+WheelScrollDown { set-zoom-level \"-0.1\"; }\r\n    Mod+Z { set-zoom-level \"1.0\"; }\r\n    Mod+Shift+Z { toggle-zoom-lock; } // locks focal center, will also make it lock level\r\n }\r\n```\r\n\r\n```sh\r\nniri msg action set-zoom-level (+1.0|-1.0|1.0) \"output_name\"\r\nniri msg action toggle-zoom-lock \"output_name\"\r\nniri msg zoom-state\r\n```\r\n\r\n## Gestures\r\n\r\n3f pinch to zoom in/out. Just put 3 fingers down pinch with any 2. Chosen over 2f pinch to avoid collision with app's built-in zoom, like browsers.\r\n\r\nBugs to iron out:\r\n- Jitter while zooming. Somewhat mitigated by animations but still needs to be better.\r\n- Viewport centering when zooming in with gestures and keybinds with on-edge movement-mode.",
      "created_at": "2026-01-13T09:14:32Z",
      "updated_at": "2026-02-28T09:43:06Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "15a6c69e2e48b58ddd450fde1323ccb252a77a01",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Atan-D-RP4:feat/cursor-zoom",
        "ref": "feat/cursor-zoom",
        "sha": "ca7b5e6f853658ee9b7df7e2c2fdb0e779ac224e",
        "user": {
          "login": "Atan-D-RP4",
          "id": 113052920,
          "node_id": "U_kgDOBr0M-A",
          "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Atan-D-RP4",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1099970565,
          "node_id": "R_kgDOQZA4BQ",
          "name": "niri",
          "full_name": "Atan-D-RP4/niri",
          "private": false,
          "owner": {
            "login": "Atan-D-RP4",
            "id": 113052920,
            "node_id": "U_kgDOBr0M-A",
            "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Atan-D-RP4",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Atan-D-RP4/niri",
          "created_at": "2025-11-19T17:08:58Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2026-03-01T19:07:14Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 9023,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2dc6f4482c4eeed75ea8b133d89cad8658d38429",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3246"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3246"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3246"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3246/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3246/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3246/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/ca7b5e6f853658ee9b7df7e2c2fdb0e779ac224e"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1,
        3
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3245",
      "id": 3167525129,
      "node_id": "PR_kwDOKFkxdc68zJkJ",
      "number": 3245,
      "state": "open",
      "locked": false,
      "title": "Add workspace focus navigation with wrap-around",
      "user": {
        "login": "rpodgorny",
        "id": 2897520,
        "node_id": "MDQ6VXNlcjI4OTc1MjA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2897520?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rpodgorny",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Implements FocusWorkspaceDownOrFirst and FocusWorkspaceUpOrLast actions that allow cycling through workspaces with wrap-around behavior when reaching the boundaries.",
      "created_at": "2026-01-12T22:32:15Z",
      "updated_at": "2026-02-05T10:43:51Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "1f361acde26c22caa2ebae3176d79f7f7ae3c487",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "rpodgorny:focus-workspace-wrap-around",
        "ref": "focus-workspace-wrap-around",
        "sha": "5212b160be3138f0755bb340c8f1b1db6532e52d",
        "user": {
          "login": "rpodgorny",
          "id": 2897520,
          "node_id": "MDQ6VXNlcjI4OTc1MjA=",
          "avatar_url": "https://avatars.githubusercontent.com/u/2897520?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/rpodgorny",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1133059823,
          "node_id": "R_kgDOQ4ke7w",
          "name": "niri",
          "full_name": "rpodgorny/niri",
          "private": false,
          "owner": {
            "login": "rpodgorny",
            "id": 2897520,
            "node_id": "MDQ6VXNlcjI4OTc1MjA=",
            "avatar_url": "https://avatars.githubusercontent.com/u/2897520?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/rpodgorny",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/rpodgorny/niri",
          "created_at": "2026-01-12T20:35:03Z",
          "updated_at": "2026-02-08T06:55:17Z",
          "pushed_at": "2026-02-05T10:44:29Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 10696,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "189917c93329c86ac2ddd89f459c26a028d590ba",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3245"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3245"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3245"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3245/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3245/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3245/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/5212b160be3138f0755bb340c8f1b1db6532e52d"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3225",
      "id": 3158317096,
      "node_id": "PR_kwDOKFkxdc68QBgo",
      "number": 3225,
      "state": "open",
      "locked": false,
      "title": "config: expand path start with `~`",
      "user": {
        "login": "HigherOrderLogic",
        "id": 73709188,
        "node_id": "MDQ6VXNlcjczNzA5MTg4",
        "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/HigherOrderLogic",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Expand included path starting with `~` to user's home.\r\n\r\nConsidering applying this to #2564.",
      "created_at": "2026-01-09T03:54:03Z",
      "updated_at": "2026-01-09T03:54:03Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "f27d186366680524b2cd9c6847d99caabc4fa1e4",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "HigherOrderLogic:fix/expand-include",
        "ref": "fix/expand-include",
        "sha": "13cc5c118297b8f7149ba6badb0debfa075ad512",
        "user": {
          "login": "HigherOrderLogic",
          "id": 73709188,
          "node_id": "MDQ6VXNlcjczNzA5MTg4",
          "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/HigherOrderLogic",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 977357099,
          "node_id": "R_kgDOOkFJKw",
          "name": "niri-wm",
          "full_name": "HigherOrderLogic/niri-wm",
          "private": false,
          "owner": {
            "login": "HigherOrderLogic",
            "id": 73709188,
            "node_id": "MDQ6VXNlcjczNzA5MTg4",
            "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/HigherOrderLogic",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/HigherOrderLogic/niri-wm",
          "created_at": "2025-05-04T02:35:01Z",
          "updated_at": "2026-02-08T06:54:43Z",
          "pushed_at": "2026-02-13T13:42:41Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6938,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "10df9f4717cbd4efd20ae796eb6b0aa400127bdc",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3225"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3225"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3225"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3225/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3225/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3225/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/13cc5c118297b8f7149ba6badb0debfa075ad512"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3217",
      "id": 3152212624,
      "node_id": "PR_kwDOKFkxdc674vKQ",
      "number": 3217,
      "state": "open",
      "locked": false,
      "title": "Feat: explicit sync and delayed blocker implementation",
      "user": {
        "login": "Atan-D-RP4",
        "id": 113052920,
        "node_id": "U_kgDOBr0M-A",
        "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Atan-D-RP4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Picks up from #1449 and tracks https://github.com/Smithay/smithay/pull/1720.\r\nCurrently rebases cleanly on main.\r\n\r\nDoesn't actually work yet. Opening up any application that uses GPU immediately hangs the compositor.",
      "created_at": "2026-01-07T11:19:49Z",
      "updated_at": "2026-01-13T18:47:50Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "Atan-D-RP4:feat/explicit-sync",
        "ref": "feat/explicit-sync",
        "sha": "5811620ba19a3c8e494d889e9081c786bd83963c",
        "user": {
          "login": "Atan-D-RP4",
          "id": 113052920,
          "node_id": "U_kgDOBr0M-A",
          "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Atan-D-RP4",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1099970565,
          "node_id": "R_kgDOQZA4BQ",
          "name": "niri",
          "full_name": "Atan-D-RP4/niri",
          "private": false,
          "owner": {
            "login": "Atan-D-RP4",
            "id": 113052920,
            "node_id": "U_kgDOBr0M-A",
            "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Atan-D-RP4",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Atan-D-RP4/niri",
          "created_at": "2025-11-19T17:08:58Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2026-03-01T19:07:14Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 9023,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "3672e79369d72297abda8878245ea4ec327062c6",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3217"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3217"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3217"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3217/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3217/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3217/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/5811620ba19a3c8e494d889e9081c786bd83963c"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3205",
      "id": 3146165691,
      "node_id": "PR_kwDOKFkxdc67hq27",
      "number": 3205,
      "state": "open",
      "locked": false,
      "title": "Add pinned window support",
      "user": {
        "login": "my4ng",
        "id": 17978089,
        "node_id": "MDQ6VXNlcjE3OTc4MDg5",
        "avatar_url": "https://avatars.githubusercontent.com/u/17978089?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/my4ng",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This attempts to implement #932 based on https://github.com/YaLTeR/niri/issues/932#issuecomment-3634047242, by pinning windows to a monitor across its workspaces. More concretely, this means all pinned windows are moved to the new workspace on switching, without introducing a new `PinnedSpace` or duplicating windows across workspaces. \r\n\r\n**EDIT**: Windows are first moved to a temporary space of the monitor, and fully moved to the new workspace only after animation is done (to appear stationary).\r\n\r\nSince pinned windows are just normal windows, navigation between windows remains the same as before. The disadvantage is that pinned windows only appear on the focused workspace in overview, ~~and pinned windows are animated alongside the new workspace on workspace switching~~.\r\n\r\n~~Currently, as long as the pinned windows are on the active workspace *and* floating, regardless of their status when pinned, they will be moved to the newly switched workspace, otherwise they will be unpinned.~~\r\n\r\n**EDIT**: Pinned windows will keep their latent pinned status even if they are not floating on workspace switch, though they won't be carried to the new workspace. As soon as they become floating, they will remain fixed to the monitor on workspace switch.\r\n\r\nWindows can be pinned via the `ToggleWindowPinned` action, e.g.\r\n\r\n```\r\nbinds {\r\n    Mod+P { toggle-window-pinned; }\r\n    ...\r\n}\r\n```\r\n\r\nNew window rules `open-pinned` to open a window pinned (orthogonal to `open-floating`) and `is-pinned` to match:\r\n\r\n```\r\nwindow-rule {\r\n    ...\r\n\r\n    open-pinned true\r\n}\r\n\r\nwindow-rule {\r\n    match is-pinned=true\r\n\r\n    ...\r\n}\r\n\r\n```\r\n\r\nNew IPC action to toggle window pinned status: \r\n\r\n```\r\nniri msg action toggle-window-pinned\r\nniri msg action toggle-window-pinned --id <ID>\r\n```\r\n\r\n**NOTE**: This is only *a* solution to pinned windows, but IMO much, much simpler than alternative designs. Please check it out and provide feedback on the design/pinning behaviour logic if you are interested.",
      "created_at": "2026-01-05T12:38:39Z",
      "updated_at": "2026-02-11T14:28:11Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "my4ng:pinned",
        "ref": "pinned",
        "sha": "277547b8dc6c92742a8e28a80db95a972e2b8bb2",
        "user": {
          "login": "my4ng",
          "id": 17978089,
          "node_id": "MDQ6VXNlcjE3OTc4MDg5",
          "avatar_url": "https://avatars.githubusercontent.com/u/17978089?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/my4ng",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 827162815,
          "node_id": "R_kgDOMU2Avw",
          "name": "niri",
          "full_name": "my4ng/niri",
          "private": false,
          "owner": {
            "login": "my4ng",
            "id": 17978089,
            "node_id": "MDQ6VXNlcjE3OTc4MDg5",
            "avatar_url": "https://avatars.githubusercontent.com/u/17978089?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/my4ng",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/my4ng/niri",
          "created_at": "2024-07-11T06:03:08Z",
          "updated_at": "2026-02-08T06:54:29Z",
          "pushed_at": "2026-01-18T11:05:46Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 10606,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "54c2e2ab476629d17fdba861895f58e7cdac32ab",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3205"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3205"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3205"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3205/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3205/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3205/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/277547b8dc6c92742a8e28a80db95a972e2b8bb2"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        9
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3194",
      "id": 3144254552,
      "node_id": "PR_kwDOKFkxdc67aYRY",
      "number": 3194,
      "state": "open",
      "locked": false,
      "title": "feat: add dynamic overview zoom controls",
      "user": {
        "login": "barrulus",
        "id": 201146829,
        "node_id": "U_kgDOC_1BzQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/201146829?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/barrulus",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Summary\n\n- Add `zoom-presets` config option for overview\n- Add `overview-zoom-cycle`, `overview-zoom-in`, `overview-zoom-out` actions\n- Add `overview-zoom` animation config\n- Zoom changes are animated smoothly\n- Zoom resets to config default when overview closes\n\nThis allows users to dynamically adjust the overview zoom level to see more or fewer workspaces at once.\n\n## Design alignment\n\nThis implementation follows niri's design principles:\n\n- **Animated transitions**: Zoom changes animate smoothly using a configurable spring animation, consistent with other niri animations.\n- **No performance impact when unused**: If `zoom-presets` is not configured, zoom actions are no-ops. The runtime zoom state is minimal (one f64 per monitor).\n- **Mindful of invisible state**: The zoom level resets to the config default when closing the overview, so reopening it always starts from a predictable state. Users won't be surprised by a forgotten zoom level from a previous overview session.\n\n## Example config\n\n```kdl\noverview {\n    zoom 0.5\n    zoom-presets 0.5 0.25 0.1\n}\n\nanimations {\n    overview-zoom {\n        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001\n    }\n}\n\nbinds {\n    Mod+Z { overview-zoom-cycle; }\n    Ctrl+WheelScrollUp cooldown-ms=150 { overview-zoom-in; }\n    Ctrl+WheelScrollDown cooldown-ms=150 { overview-zoom-out; }\n}\n```\n\n## Test plan\n\n- [x] Enter overview → should use config `zoom` value\n- [x] Press zoom cycle key → should animate through presets\n- [x] Ctrl+Scroll → should animate to next/prev preset\n- [x] Close overview → zoom should reset to config default\n- [x] Re-enter overview → should start at config default again\n- [x] No presets configured → zoom actions should no-op\n\nCloses: discussion #3047",
      "created_at": "2026-01-04T08:44:42Z",
      "updated_at": "2026-03-01T12:20:32Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "20d4622f3e3dbe1e8afee79521ef478a970c91e9",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "barrulus:feature/dynamic-overview-zoom",
        "ref": "feature/dynamic-overview-zoom",
        "sha": "56c3786c3246a72ac9e53cf70b99987e4741b14e",
        "user": {
          "login": "barrulus",
          "id": 201146829,
          "node_id": "U_kgDOC_1BzQ",
          "avatar_url": "https://avatars.githubusercontent.com/u/201146829?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/barrulus",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1104670823,
          "node_id": "R_kgDOQdfwZw",
          "name": "biri",
          "full_name": "barrulus/biri",
          "private": false,
          "owner": {
            "login": "barrulus",
            "id": 201146829,
            "node_id": "U_kgDOC_1BzQ",
            "avatar_url": "https://avatars.githubusercontent.com/u/201146829?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/barrulus",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/barrulus/biri",
          "created_at": "2025-11-26T14:24:50Z",
          "updated_at": "2026-02-28T19:17:58Z",
          "pushed_at": "2026-03-01T15:34:19Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 7030,
          "stargazers_count": 1,
          "watchers_count": 1,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 1,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "e708f546153f74acf33eb183b3b2992587a701e5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3194"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3194"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3194"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3194/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3194/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3194/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/56c3786c3246a72ac9e53cf70b99987e4741b14e"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        3
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3192",
      "id": 3143767025,
      "node_id": "PR_kwDOKFkxdc67YhPx",
      "number": 3192,
      "state": "open",
      "locked": false,
      "title": "Feat/per output power control",
      "user": {
        "login": "Atan-D-RP4",
        "id": 113052920,
        "node_id": "U_kgDOBr0M-A",
        "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Atan-D-RP4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Built on-top #3077. Rebases cleanly.\r\nTested it with wlopm and it works. \r\nBut I don't actually have multi-monitor setup so I can't test that part. Can some one who does please take a look at this?\r\nDefinitely needs more tests too.",
      "created_at": "2026-01-03T18:42:38Z",
      "updated_at": "2026-01-19T20:04:12Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "5bc96d3f6f1e02ea7c2c95dc297536c0873b6a2a",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Atan-D-RP4:feat/per-output-power-control",
        "ref": "feat/per-output-power-control",
        "sha": "7353c1145b91dc2e8d6646751f2536ebc47fb47c",
        "user": {
          "login": "Atan-D-RP4",
          "id": 113052920,
          "node_id": "U_kgDOBr0M-A",
          "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Atan-D-RP4",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1099970565,
          "node_id": "R_kgDOQZA4BQ",
          "name": "niri",
          "full_name": "Atan-D-RP4/niri",
          "private": false,
          "owner": {
            "login": "Atan-D-RP4",
            "id": 113052920,
            "node_id": "U_kgDOBr0M-A",
            "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Atan-D-RP4",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Atan-D-RP4/niri",
          "created_at": "2025-11-19T17:08:58Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2026-03-01T19:07:14Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 9023,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "d7184a04b904e07113f4623610775ae78d32394c",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3192"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3192"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3192"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3192/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3192/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3192/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/7353c1145b91dc2e8d6646751f2536ebc47fb47c"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        3
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3191",
      "id": 3143730774,
      "node_id": "PR_kwDOKFkxdc67YYZW",
      "number": 3191,
      "state": "open",
      "locked": false,
      "title": "use real error type",
      "user": {
        "login": "bend-n",
        "id": 70787919,
        "node_id": "MDQ6VXNlcjcwNzg3OTE5",
        "avatar_url": "https://avatars.githubusercontent.com/u/70787919?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/bend-n",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "i think this should work\r\n\r\nthis makes the result type easier to use with anyhow, as it impls Error now.",
      "created_at": "2026-01-03T17:55:47Z",
      "updated_at": "2026-01-03T17:55:47Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "1fad24f91b61b87c32257f51bbbbc412da1e5f05",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "bend-n:⛍",
        "ref": "⛍",
        "sha": "e7f785fcdcff964c3202ea73aebde8f1c970877e",
        "user": {
          "login": "bend-n",
          "id": 70787919,
          "node_id": "MDQ6VXNlcjcwNzg3OTE5",
          "avatar_url": "https://avatars.githubusercontent.com/u/70787919?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/bend-n",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1127338290,
          "node_id": "R_kgDOQzHRMg",
          "name": "niri",
          "full_name": "bend-n/niri",
          "private": false,
          "owner": {
            "login": "bend-n",
            "id": 70787919,
            "node_id": "MDQ6VXNlcjcwNzg3OTE5",
            "avatar_url": "https://avatars.githubusercontent.com/u/70787919?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/bend-n",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/bend-n/niri",
          "created_at": "2026-01-03T17:17:34Z",
          "updated_at": "2026-02-08T06:55:16Z",
          "pushed_at": "2026-01-03T17:46:17Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6600,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 1,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 1,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "d8250fa876d986e3fe5190a8d906b221dadf5333",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3191"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3191"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3191"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3191/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3191/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3191/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/e7f785fcdcff964c3202ea73aebde8f1c970877e"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3180",
      "id": 3142195234,
      "node_id": "PR_kwDOKFkxdc67Shgi",
      "number": 3180,
      "state": "open",
      "locked": false,
      "title": "feat: Add touch gesture support (mostly hardcoded)",
      "user": {
        "login": "Atan-D-RP4",
        "id": 113052920,
        "node_id": "U_kgDOBr0M-A",
        "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Atan-D-RP4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "- Brings the touchscreen gestures to parity with touchpad/trackpad gestures, as best I can tell\r\n- Matches behavior of touchpad gestures closely\r\n- Updated docs with `Since` annotation\r\n- Added natural-scroll config option for touchscreen gestures\r\n\r\n**Testing**:\r\n- 3-finger horizontal swipe correctly adjusts view offsets.\r\n- 3-finger vertical swipe correctly switches workspaces\r\n- 2-finger start into 3rd mid-gesture -> works\r\n- During 3-finger gesture, when one finger is removed mid-gesture, the\r\n  transition is held in place by the two fingers and finishes if a 2nd is\r\n  removed and correctly snaps into place.\r\n- Gestures during:\r\n    - window animations -> works (tested with spawning windows with\r\n      animations enabled)\r\n    - window dragging -> works (though very slow when dragging windows in\r\n",
      "created_at": "2026-01-02T14:07:45Z",
      "updated_at": "2026-02-07T03:33:58Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "35c49308329a74e6762cb3124b721e51f50d5815",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Atan-D-RP4:feat/touch-gestures",
        "ref": "feat/touch-gestures",
        "sha": "cb629a407610b0f6a0f5abe2b4bd67ba1031765b",
        "user": {
          "login": "Atan-D-RP4",
          "id": 113052920,
          "node_id": "U_kgDOBr0M-A",
          "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Atan-D-RP4",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1099970565,
          "node_id": "R_kgDOQZA4BQ",
          "name": "niri",
          "full_name": "Atan-D-RP4/niri",
          "private": false,
          "owner": {
            "login": "Atan-D-RP4",
            "id": 113052920,
            "node_id": "U_kgDOBr0M-A",
            "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Atan-D-RP4",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Atan-D-RP4/niri",
          "created_at": "2025-11-19T17:08:58Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2026-03-01T19:07:14Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 9023,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "549148d27779d024255a84535b42b947f1c2a113",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3180"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3180"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3180"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3180/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3180/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3180/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/cb629a407610b0f6a0f5abe2b4bd67ba1031765b"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3173",
      "id": 3141520109,
      "node_id": "PR_kwDOKFkxdc67P8rt",
      "number": 3173,
      "state": "open",
      "locked": false,
      "title": "docs: add NixOS configuration and clarify file chooser backends",
      "user": {
        "login": "Sunrongguo2008",
        "id": 91547012,
        "node_id": "U_kgDOBXTlhA",
        "avatar_url": "https://avatars.githubusercontent.com/u/91547012?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Sunrongguo2008",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "**Summary**\r\n\r\nThis PR improves the Portals documentation by adding instructions for NixOS users and providing more flexible options for the file chooser backend.\r\n\r\n**Changes**\r\n\r\n* **Added NixOS-specific configuration**: Since NixOS manages portal configurations through Nix options rather than direct file edits in `/usr/share/`, I've added a concise `xdg.portal` code block.\r\n* **Clarified config locations**: Noted that `niri-portals.conf` can also reside in `~/.config/xdg-desktop-portal/` for non-NixOS users who lack root access.\r\n* **Enhanced File Chooser section**: Expanded the explanation on how to switch the file picker backend (e.g., to KDE or GTK) for users who prefer not to install Nautilus.\r\n",
      "created_at": "2026-01-02T05:54:46Z",
      "updated_at": "2026-01-18T12:36:59Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "4cd5a85b029d901c8811449635ec59a36d21c52e",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Sunrongguo2008:main",
        "ref": "main",
        "sha": "336f28efc8fcb1bcedee32ca8fd0052a763823dc",
        "user": {
          "login": "Sunrongguo2008",
          "id": 91547012,
          "node_id": "U_kgDOBXTlhA",
          "avatar_url": "https://avatars.githubusercontent.com/u/91547012?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Sunrongguo2008",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1126544136,
          "node_id": "R_kgDOQyWzCA",
          "name": "niri",
          "full_name": "Sunrongguo2008/niri",
          "private": false,
          "owner": {
            "login": "Sunrongguo2008",
            "id": 91547012,
            "node_id": "U_kgDOBXTlhA",
            "avatar_url": "https://avatars.githubusercontent.com/u/91547012?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Sunrongguo2008",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Sunrongguo2008/niri",
          "created_at": "2026-01-02T05:52:49Z",
          "updated_at": "2026-02-08T06:55:16Z",
          "pushed_at": "2026-01-18T03:35:31Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6857,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "d7184a04b904e07113f4623610775ae78d32394c",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3173"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3173"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3173"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3173/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3173/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3173/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/336f28efc8fcb1bcedee32ca8fd0052a763823dc"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3168",
      "id": 3140924000,
      "node_id": "PR_kwDOKFkxdc67NrJg",
      "number": 3168,
      "state": "open",
      "locked": false,
      "title": "protocols: implement `ext-foreign-toplevel-list-v1`",
      "user": {
        "login": "HigherOrderLogic",
        "id": 73709188,
        "node_id": "MDQ6VXNlcjczNzA5MTg4",
        "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/HigherOrderLogic",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Closes #2044, closes #1450.\r\n\r\nBasically Sodiboo's work but rebased upon latest master and fix merge conflict, and also apply outstanding change requests by Yalter.\r\n\r\nTesting video will follow soon.",
      "created_at": "2026-01-01T16:57:17Z",
      "updated_at": "2026-02-02T15:48:37Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "b5e2b236383f2927a058f6e0ff96b936f75b430b",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "HigherOrderLogic:ext-foreign-toplevel",
        "ref": "ext-foreign-toplevel",
        "sha": "6fa2f3dc0bc701dd4fae19e8c4eee50576bfe364",
        "user": {
          "login": "HigherOrderLogic",
          "id": 73709188,
          "node_id": "MDQ6VXNlcjczNzA5MTg4",
          "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/HigherOrderLogic",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 977357099,
          "node_id": "R_kgDOOkFJKw",
          "name": "niri-wm",
          "full_name": "HigherOrderLogic/niri-wm",
          "private": false,
          "owner": {
            "login": "HigherOrderLogic",
            "id": 73709188,
            "node_id": "MDQ6VXNlcjczNzA5MTg4",
            "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/HigherOrderLogic",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/HigherOrderLogic/niri-wm",
          "created_at": "2025-05-04T02:35:01Z",
          "updated_at": "2026-02-08T06:54:43Z",
          "pushed_at": "2026-02-13T13:42:41Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6938,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "f30db163b5748e8cf95c05aba77d0d3736f40543",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3168"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3168"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3168"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3168/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3168/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3168/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/6fa2f3dc0bc701dd4fae19e8c4eee50576bfe364"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2,
        1,
        2044,
        1450
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3158",
      "id": 3139603317,
      "node_id": "PR_kwDOKFkxdc67Iot1",
      "number": 3158,
      "state": "open",
      "locked": false,
      "title": "Add per output BPC config",
      "user": {
        "login": "my4ng",
        "id": 17978089,
        "node_id": "MDQ6VXNlcjE3OTc4MDg5",
        "avatar_url": "https://avatars.githubusercontent.com/u/17978089?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/my4ng",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This adds per output bits per colour (BPC) config as requested in #1533. \r\n\r\n```\r\noutput \"DP-1\" {\r\n    ...\r\n    bpc 10\r\n}\r\n```\r\n\r\nSupported values are 8, 10. If not explicitly set, niri will not change the existing `max bpc` connector property.",
      "created_at": "2025-12-31T18:52:50Z",
      "updated_at": "2026-02-27T22:21:20Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "7907fda7dee5503100d4abec2d0a6b225928a9f0",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "my4ng:bpc",
        "ref": "bpc",
        "sha": "8da92a5a0700c1f7d058403a5245eebca545740d",
        "user": {
          "login": "my4ng",
          "id": 17978089,
          "node_id": "MDQ6VXNlcjE3OTc4MDg5",
          "avatar_url": "https://avatars.githubusercontent.com/u/17978089?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/my4ng",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 827162815,
          "node_id": "R_kgDOMU2Avw",
          "name": "niri",
          "full_name": "my4ng/niri",
          "private": false,
          "owner": {
            "login": "my4ng",
            "id": 17978089,
            "node_id": "MDQ6VXNlcjE3OTc4MDg5",
            "avatar_url": "https://avatars.githubusercontent.com/u/17978089?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/my4ng",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/my4ng/niri",
          "created_at": "2024-07-11T06:03:08Z",
          "updated_at": "2026-02-08T06:54:29Z",
          "pushed_at": "2026-01-18T11:05:46Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 10606,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "cf0b4bc0ca93ab5c18b562ada1d8609b67b3c4e3",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3158"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3158"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3158"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3158/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3158/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3158/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/8da92a5a0700c1f7d058403a5245eebca545740d"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3156",
      "id": 3139158510,
      "node_id": "PR_kwDOKFkxdc67G8Hu",
      "number": 3156,
      "state": "open",
      "locked": false,
      "title": "Add window stacking order to IPC",
      "user": {
        "login": "my4ng",
        "id": 17978089,
        "node_id": "MDQ6VXNlcjE3OTc4MDg5",
        "avatar_url": "https://avatars.githubusercontent.com/u/17978089?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/my4ng",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This implements #2248.\r\n\r\nThe stacking order is defined by the totally ordered `StackingOrder` struct which contains both a `StackingOrderGroup` and an index, which indicates position within the group. This can be later extended to support always-on-top windows by adding it as a new group. Per convention, a greater index implies a window is more on top. \r\n\r\nWhen a window's stacking order goes from `None -> Some(...)` or vice versa, the change is observed in the existing `WindowOpenedOrChanged` event. Otherwise, `Some(...) -> Some(...)` changes are batched in the `WindowStackingOrdersChanged` event.",
      "created_at": "2025-12-31T13:42:38Z",
      "updated_at": "2025-12-31T17:56:49Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "my4ng:main",
        "ref": "main",
        "sha": "93481a9b2be10f20f7f0b2354b66eb7f077e0b27",
        "user": {
          "login": "my4ng",
          "id": 17978089,
          "node_id": "MDQ6VXNlcjE3OTc4MDg5",
          "avatar_url": "https://avatars.githubusercontent.com/u/17978089?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/my4ng",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 827162815,
          "node_id": "R_kgDOMU2Avw",
          "name": "niri",
          "full_name": "my4ng/niri",
          "private": false,
          "owner": {
            "login": "my4ng",
            "id": 17978089,
            "node_id": "MDQ6VXNlcjE3OTc4MDg5",
            "avatar_url": "https://avatars.githubusercontent.com/u/17978089?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/my4ng",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/my4ng/niri",
          "created_at": "2024-07-11T06:03:08Z",
          "updated_at": "2026-02-08T06:54:29Z",
          "pushed_at": "2026-01-18T11:05:46Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 10606,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "cf0b4bc0ca93ab5c18b562ada1d8609b67b3c4e3",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3156"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3156"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3156"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3156/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3156/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3156/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/93481a9b2be10f20f7f0b2354b66eb7f077e0b27"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3133",
      "id": 3133607408,
      "node_id": "PR_kwDOKFkxdc66xw3w",
      "number": 3133,
      "state": "open",
      "locked": false,
      "title": "Improve OpenRC/non-systemd compatibility",
      "user": {
        "login": "coleleavitt",
        "id": 75138914,
        "node_id": "MDQ6VXNlcjc1MTM4OTE0",
        "avatar_url": "https://avatars.githubusercontent.com/u/75138914?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/coleleavitt",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "- Add runtime check for systemctl/dinitctl before running\r\n- Use POSIX 'command -v' instead of bash 'hash'\r\n- Warn when running on TTY without --session flag\r\n\r\nThis eliminates spurious warnings on OpenRC systems where systemctl doesn't exist, while still running dbus-update-activation-environment.",
      "created_at": "2025-12-29T05:44:46Z",
      "updated_at": "2026-01-11T23:06:09Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "dd0435b09c8d5b92ff03d26d4ff24bab95911032",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "coleleavitt:fix-screencast-session",
        "ref": "fix-screencast-session",
        "sha": "62b1c27341b5437fdc97e4a9701ab42fc55fed88",
        "user": {
          "login": "coleleavitt",
          "id": 75138914,
          "node_id": "MDQ6VXNlcjc1MTM4OTE0",
          "avatar_url": "https://avatars.githubusercontent.com/u/75138914?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/coleleavitt",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 945242252,
          "node_id": "R_kgDOOFdAjA",
          "name": "niri",
          "full_name": "coleleavitt/niri",
          "private": false,
          "owner": {
            "login": "coleleavitt",
            "id": 75138914,
            "node_id": "MDQ6VXNlcjc1MTM4OTE0",
            "avatar_url": "https://avatars.githubusercontent.com/u/75138914?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/coleleavitt",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/coleleavitt/niri",
          "created_at": "2025-03-09T01:15:32Z",
          "updated_at": "2026-02-22T17:49:24Z",
          "pushed_at": "2026-02-22T17:55:20Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 10970,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 1,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 1,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "e9d888cd52f8a783b07e0d6c0ec9a341a81031ca",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3133"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3133"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3133"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3133/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3133/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3133/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/62b1c27341b5437fdc97e4a9701ab42fc55fed88"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3118",
      "id": 3130297336,
      "node_id": "PR_kwDOKFkxdc66lIv4",
      "number": 3118,
      "state": "open",
      "locked": false,
      "title": "Allow trackball scrolling in overview",
      "user": {
        "login": "ArijanJ",
        "id": 56356662,
        "node_id": "MDQ6VXNlcjU2MzU2NjYy",
        "avatar_url": "https://avatars.githubusercontent.com/u/56356662?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ArijanJ",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Simply allows scrolling in the overview with a trackball (on-button-down). Tested on an Arch PC and a Fedora laptop, everything works as expected\r\n\r\nCloses #2544\r\n\r\nI wanted to also handle `mods_with_finger_scroll_binds` (mod+scroll in main view), but that seems pretty coupled with `horizontal_finger_scroll_tracker` so I'm leaving it for now.\r\n\r\nNot sure which sensitivity is used here, but when #2844 is merged we can probably use that value\r\n\r\n![Recording 2025-12-25 at 22 20 30](https://github.com/user-attachments/assets/8e44c882-d4b6-4a91-95cf-fadc5ba46a01)\r\n",
      "created_at": "2025-12-25T21:21:12Z",
      "updated_at": "2026-02-05T00:32:33Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "a29ac598df4e4936e2e52ff57f90ed1872669565",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "ArijanJ:overview-on-button-down",
        "ref": "overview-on-button-down",
        "sha": "f53df5775ece11d0e74edab2d6292b533ba32e05",
        "user": {
          "login": "ArijanJ",
          "id": 56356662,
          "node_id": "MDQ6VXNlcjU2MzU2NjYy",
          "avatar_url": "https://avatars.githubusercontent.com/u/56356662?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ArijanJ",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1075668838,
          "node_id": "R_kgDOQB1nZg",
          "name": "niri",
          "full_name": "ArijanJ/niri",
          "private": false,
          "owner": {
            "login": "ArijanJ",
            "id": 56356662,
            "node_id": "MDQ6VXNlcjU2MzU2NjYy",
            "avatar_url": "https://avatars.githubusercontent.com/u/56356662?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ArijanJ",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/ArijanJ/niri",
          "created_at": "2025-10-13T20:24:31Z",
          "updated_at": "2026-02-08T06:55:03Z",
          "pushed_at": "2026-02-02T23:48:31Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6854,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2a9d0e495a011a124b37532dfcfb3c780fd2eb89",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3118"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3118"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3118"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3118/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3118/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3118/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/f53df5775ece11d0e74edab2d6292b533ba32e05"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2,
        2544
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3105",
      "id": 3126907616,
      "node_id": "PR_kwDOKFkxdc66YNLg",
      "number": 3105,
      "state": "open",
      "locked": false,
      "title": "Implement hyprland-lock-notify-v1",
      "user": {
        "login": "jbms",
        "id": 4211946,
        "node_id": "MDQ6VXNlcjQyMTE5NDY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4211946?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jbms",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Fixes https://github.com/YaLTeR/niri/issues/2573\n",
      "created_at": "2025-12-23T19:19:31Z",
      "updated_at": "2025-12-26T05:23:29Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "c8124dc16be79ebe4e195b2c1aba1d149d253a85",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "jbms:hyprland-lock-notify",
        "ref": "hyprland-lock-notify",
        "sha": "bc2d8721d05e1b75fe3dba51c60929a8246d1b2c",
        "user": {
          "login": "jbms",
          "id": 4211946,
          "node_id": "MDQ6VXNlcjQyMTE5NDY=",
          "avatar_url": "https://avatars.githubusercontent.com/u/4211946?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/jbms",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1121916626,
          "node_id": "R_kgDOQt8W0g",
          "name": "niri",
          "full_name": "jbms/niri",
          "private": false,
          "owner": {
            "login": "jbms",
            "id": 4211946,
            "node_id": "MDQ6VXNlcjQyMTE5NDY=",
            "avatar_url": "https://avatars.githubusercontent.com/u/4211946?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/jbms",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/jbms/niri",
          "created_at": "2025-12-23T19:19:29Z",
          "updated_at": "2026-02-08T06:55:14Z",
          "pushed_at": "2025-12-24T06:16:36Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 10039,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "4d295418ce8e8e110060396bb485c4f0c381d37e",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3105"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3105"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3105"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3105/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3105/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3105/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/bc2d8721d05e1b75fe3dba51c60929a8246d1b2c"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3071",
      "id": 3116934962,
      "node_id": "PR_kwDOKFkxdc65yKcy",
      "number": 3071,
      "state": "open",
      "locked": false,
      "title": "Add appearance-rule blocks for portal appearance settings",
      "user": {
        "login": "joshua-cooper",
        "id": 35612334,
        "node_id": "MDQ6VXNlcjM1NjEyMzM0",
        "avatar_url": "https://avatars.githubusercontent.com/u/35612334?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/joshua-cooper",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR adds portal-driven \"appearance rules\" that let users conditionally apply parts of their config based on system appearance settings exposed via xdg-desktop-portal ([org.freedesktop.appearance](https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.Settings.html)).\r\n\r\nIt introduces a new top-level config block, appearance-rule { ... }, which can override layout, overview, and animations when its match conditions apply.\r\n\r\nThis enables doing things like light/dark mode toggles for niri config without external scripts. This is useful when the config is read-only, for example with NixOS or system wide configs in /etc.\r\n\r\nThe appearance-rule block is intentionally modeled after window-rule / layer-rule since they are all conceptually conditional config. \r\n\r\nThese matchers are supported:\r\n\r\n- `color-scheme`: `\"light\"` or `\"dark\"`\r\n- `contrast`: `\"high\"`\r\n- `reduced-motion`: `true` or `false`\r\n\r\nExample:\r\n\r\n```kdl\r\noverview {\r\n    backdrop-color \"#112233\"\r\n}\r\n\r\nappearance-rule {\r\n    match color-scheme=\"dark\"\r\n\r\n    overview {\r\n        backdrop-color \"#445566\"\r\n    }\r\n}\r\n\r\nappearance-rule {\r\n    match reduced-motion=true\r\n\r\n    animations {\r\n        off\r\n    }\r\n}\r\n```",
      "created_at": "2025-12-19T09:19:21Z",
      "updated_at": "2025-12-19T09:28:09Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "d683d772623d3aa0612931b56fb38b5ebede4ede",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "joshua-cooper:appearance-support",
        "ref": "appearance-support",
        "sha": "7893529d7b3bbfe49958eb55781a275f07288162",
        "user": {
          "login": "joshua-cooper",
          "id": 35612334,
          "node_id": "MDQ6VXNlcjM1NjEyMzM0",
          "avatar_url": "https://avatars.githubusercontent.com/u/35612334?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/joshua-cooper",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1119431511,
          "node_id": "R_kgDOQrkrVw",
          "name": "niri",
          "full_name": "joshua-cooper/niri",
          "private": false,
          "owner": {
            "login": "joshua-cooper",
            "id": 35612334,
            "node_id": "MDQ6VXNlcjM1NjEyMzM0",
            "avatar_url": "https://avatars.githubusercontent.com/u/35612334?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/joshua-cooper",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/joshua-cooper/niri",
          "created_at": "2025-12-19T09:05:02Z",
          "updated_at": "2026-02-08T06:55:13Z",
          "pushed_at": "2025-12-19T09:25:01Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6100,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "c4462d0c7fddfc11c9e98d43e3ef68a5b3c844ca",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3071"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3071"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3071"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3071/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3071/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3071/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/7893529d7b3bbfe49958eb55781a275f07288162"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1,
        4
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3061",
      "id": 3111242199,
      "node_id": "PR_kwDOKFkxdc65ccnX",
      "number": 3061,
      "state": "open",
      "locked": false,
      "title": "feat(input): Add per-device keyboard and mouse configuration",
      "user": {
        "login": "ArthurHeymans",
        "id": 15137817,
        "node_id": "MDQ6VXNlcjE1MTM3ODE3",
        "avatar_url": "https://avatars.githubusercontent.com/u/15137817?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ArthurHeymans",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This enables users to configure different layouts and settings for individual keyboards and mice by device name. For example, you can now have one keyboard with a US layout and another with US+RU layouts, with automatic XKB switching when typing on different devices.\r\n\r\nChanges:\r\n- Add per-device keyboard layout configuration support\r\n- Add per-device mouse settings configuration\r\n- Implement automatic XKB switching based on active keyboard device\r\n- Refactor Keyboard and Mouse types to support multiple device configs\r\n- Add Keyboards and Mice collection types with device name lookup\r\n- Update documentation with per-device configuration examples\r\n- Save numlock state per keyboard (this may look weird as the LED follow the global state but as soon as you type on a keyboard with numlock disabled the LED shuts off)\r\n\r\nDevice names are matched case-insensitively from libinput (use `sudo libinput list-devices` to find device names).\r\n\r\nThis addresses issue #371",
      "created_at": "2025-12-17T20:06:27Z",
      "updated_at": "2025-12-18T07:47:35Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "ebe7a43c894bacc3f91a3dbdfca90978bab91cda",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "ArthurHeymans:PerKeyboardMiceConfig",
        "ref": "PerKeyboardMiceConfig",
        "sha": "97f3070f9889939990f7d5ab9ae2f5f7899c058c",
        "user": {
          "login": "ArthurHeymans",
          "id": 15137817,
          "node_id": "MDQ6VXNlcjE1MTM3ODE3",
          "avatar_url": "https://avatars.githubusercontent.com/u/15137817?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ArthurHeymans",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1104830771,
          "node_id": "R_kgDOQdphMw",
          "name": "niri",
          "full_name": "ArthurHeymans/niri",
          "private": false,
          "owner": {
            "login": "ArthurHeymans",
            "id": 15137817,
            "node_id": "MDQ6VXNlcjE1MTM3ODE3",
            "avatar_url": "https://avatars.githubusercontent.com/u/15137817?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ArthurHeymans",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/ArthurHeymans/niri",
          "created_at": "2025-11-26T18:47:11Z",
          "updated_at": "2026-02-08T06:55:10Z",
          "pushed_at": "2025-12-17T20:02:10Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6012,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2641356d41199a40ccc9a2e9f61bd34d7e7c8220",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3061"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3061"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3061"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3061/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3061/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3061/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/97f3070f9889939990f7d5ab9ae2f5f7899c058c"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        3
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3033",
      "id": 3098363238,
      "node_id": "PR_kwDOKFkxdc64rUVm",
      "number": 3033,
      "state": "open",
      "locked": false,
      "title": "feat: add column alignment actions",
      "user": {
        "login": "MintyDoggo",
        "id": 57547439,
        "node_id": "MDQ6VXNlcjU3NTQ3NDM5",
        "avatar_url": "https://avatars.githubusercontent.com/u/57547439?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MintyDoggo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR aims to be a simple solution to aligning columns on the left or right side of the screen.\r\n\r\n2 new actions were added:\r\n1. `AlignColumnLeft`\r\n2. `AlignColumnRight`\r\n\r\n`CenterColumn` action was left untouched to prevent deprecation. Can be tested by binding these new actions and using them in all different modes: overview, tiled, maximized, fullscreen, etc.\r\n\r\nLastly, I combined the functionality of the `compute_new_view_offset_centered` function to be more general. This now takes in an alignment enum. Let me know if there is any feedback on the design of this new functionality\r\n\r\nRelevant issues/PRs:\r\n- Can be helpful for addressing these issues: \r\n    - https://github.com/YaLTeR/niri/issues/2416 \r\n    - https://github.com/YaLTeR/niri/discussions/1642\r\n    - https://github.com/YaLTeR/niri/discussions/156\r\n    - https://github.com/YaLTeR/niri/discussions/466\r\n- Supplements PR related to window alignment, but not column alignment https://github.com/YaLTeR/niri/pull/1929\r\n\r\nVideo Demo:\r\n\r\nhttps://github.com/user-attachments/assets/5a0baff4-4799-4306-8f2b-54e28921c5c4\r\n\r\n",
      "created_at": "2025-12-13T05:17:53Z",
      "updated_at": "2026-01-24T03:19:14Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "da81d2c5a6187c70701876fe5e602d47bb6c8371",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "MintyDoggo:main",
        "ref": "main",
        "sha": "78d10a28e8a7a046e52ef16ad78bee4cdeee3d81",
        "user": {
          "login": "MintyDoggo",
          "id": 57547439,
          "node_id": "MDQ6VXNlcjU3NTQ3NDM5",
          "avatar_url": "https://avatars.githubusercontent.com/u/57547439?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MintyDoggo",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1115548292,
          "node_id": "R_kgDOQn3qhA",
          "name": "niri",
          "full_name": "MintyDoggo/niri",
          "private": false,
          "owner": {
            "login": "MintyDoggo",
            "id": 57547439,
            "node_id": "MDQ6VXNlcjU3NTQ3NDM5",
            "avatar_url": "https://avatars.githubusercontent.com/u/57547439?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/MintyDoggo",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/MintyDoggo/niri",
          "created_at": "2025-12-13T04:19:57Z",
          "updated_at": "2026-02-08T06:55:13Z",
          "pushed_at": "2026-01-24T03:19:13Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6855,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "d7184a04b904e07113f4623610775ae78d32394c",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3033"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3033"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3033"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3033/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3033/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3033/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/78d10a28e8a7a046e52ef16ad78bee4cdeee3d81"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3016",
      "id": 3087955750,
      "node_id": "PR_kwDOKFkxdc64Dncm",
      "number": 3016,
      "state": "open",
      "locked": false,
      "title": "[WIP] Add Hot Corner Pressure",
      "user": {
        "login": "Fireye04",
        "id": 45439844,
        "node_id": "MDQ6VXNlcjQ1NDM5ODQ0",
        "avatar_url": "https://avatars.githubusercontent.com/u/45439844?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Fireye04",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "fixes #1473 \r\n\r\nThis PR adds pressure to hot corners, requiring users to both mouse over the hot corner and also give a certain amount of pressure to cause it to trigger, reducing accidental activation. \r\n\r\nReviews, test feedback, and comments are, as always, more than welcome.\r\n\r\n## Current Design\r\n\r\nIn summary, `PointerMotionEvent` deltas are being read and added to a `hot_corner_pressure` variable, which is then used to measure total pressure against the hot corner. \r\n\r\nThere are a few values that you can tweak to get the pressure feeling right, listed here:\r\n\r\n- dividend: This is the big one, basically it divides the combined x and y deltas to get the absolute pressure. You can get more extreme values by decreasing this number, or less extreme ones by increasing it.\r\n- pressure_cap: This should change as a function of the dividend. I've found that I want the pressure cap to be reachable if you take a big swipe at the hot corner, but only really in that scenario. This allows you to trigger the hot corner with a large swipe, which is something that I find I do regularly, but was something the original design made significantly more difficult. (Sidenote, but this behavior can be removed if it's found to be generally undesirable)\r\n- target: This is the threshold that the total pressure needs to reach in order to trigger the hot corner. Eg: If your dividend goes down, this will trip faster.\r\n\r\nI don't think I've got the balance all the way down at the moment, but it's close, as tested on my laptop's track pad. I'd like to get a more complete idea of how it interacts with different hardware though, so please feel free to test on whatever you happen to have and let me know how things feel and what settings you prefer.\r\n\r\n## Disclaimers\r\n\r\nA couple of things to take care of before i'd consider this thing usable, as well as some things of note:\r\n\r\nFirst off, this must be tested off the TTY. I'm currently running off `nix develop` and using the following command to obtain program logs `cargo run -- --session 2>&1 | tee logs_tty.txt`. (this is how you can tell if you're hitting your pressure cap)\r\n\r\nCurrently it's only implemented for the bottom left hot-corner (I wanted to tune the pressure settings before handling the boilerplate). Theoretically I could swap to an absolute value implementation, but that might be a bit odd for multiple monitor setups so I think I'm leaning towards a more rigid implementation here.\r\n\r\nFurther, the pointer is not currently being captured on entering a hot corner, which again might create problems for multi-monitor setups where the hot corner is placed between monitors. I'm not sure if this is a desirable behavior, but I reckon it's something good to include unless otherwise determined.\r\n\r\nFinally, we're smack dab in the middle of my uni's finals season, so please forgive me if I end up taking a second to finish polishing this thing up. \r\n\r\n## TODO\r\n- [x] add event stream\r\n- [ ] capture & release pointer\r\n- [ ] implement all four corners (whoaw!)\r\n- [ ] finalize default tuning\r\n- [ ] Implement config\r\n- [ ] Add docs",
      "created_at": "2025-12-10T05:03:54Z",
      "updated_at": "2026-02-06T00:35:21Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "f2065ca4337f6e2080d20fec71a3344f95b9110a",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "Fireye04:feature/pressure-hot-corners",
        "ref": "feature/pressure-hot-corners",
        "sha": "f3b103f72456d749000e62134024b65571dc8a89",
        "user": {
          "login": "Fireye04",
          "id": 45439844,
          "node_id": "MDQ6VXNlcjQ1NDM5ODQ0",
          "avatar_url": "https://avatars.githubusercontent.com/u/45439844?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Fireye04",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1024393159,
          "node_id": "R_kgDOPQ7_xw",
          "name": "niri",
          "full_name": "Fireye04/niri",
          "private": false,
          "owner": {
            "login": "Fireye04",
            "id": 45439844,
            "node_id": "MDQ6VXNlcjQ1NDM5ODQ0",
            "avatar_url": "https://avatars.githubusercontent.com/u/45439844?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Fireye04",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Fireye04/niri",
          "created_at": "2025-07-22T16:17:18Z",
          "updated_at": "2026-02-08T06:54:54Z",
          "pushed_at": "2026-02-06T00:31:47Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 10693,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "189917c93329c86ac2ddd89f459c26a028d590ba",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3016"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3016"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3016"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3016/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3016/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3016/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/f3b103f72456d749000e62134024b65571dc8a89"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1,
        1473
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3008",
      "id": 3083756969,
      "node_id": "PR_kwDOKFkxdc63zmWp",
      "number": 3008,
      "state": "open",
      "locked": false,
      "title": "wiki/include: add path resolution section",
      "user": {
        "login": "imnotpoz",
        "id": 64381190,
        "node_id": "MDQ6VXNlcjY0MzgxMTkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/64381190?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/imnotpoz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "I couldn't find anything related to this in the code so I tested the behaviour manually\r\n\r\ntested on commit ba29735, latest at the time of writing",
      "created_at": "2025-12-09T01:57:51Z",
      "updated_at": "2025-12-09T19:36:18Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "2be6e95b9a3d90cf69f04878bbbd621bd2fa1b58",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "imnotpoz:main",
        "ref": "main",
        "sha": "607df84f12edd0dcff18f879409a24fca0991267",
        "user": {
          "login": "imnotpoz",
          "id": 64381190,
          "node_id": "MDQ6VXNlcjY0MzgxMTkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/64381190?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/imnotpoz",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1112698725,
          "node_id": "R_kgDOQlJvZQ",
          "name": "niri",
          "full_name": "imnotpoz/niri",
          "private": false,
          "owner": {
            "login": "imnotpoz",
            "id": 64381190,
            "node_id": "MDQ6VXNlcjY0MzgxMTkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/64381190?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/imnotpoz",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/imnotpoz/niri",
          "created_at": "2025-12-09T01:31:38Z",
          "updated_at": "2026-02-08T06:55:13Z",
          "pushed_at": "2025-12-09T19:35:29Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5922,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "4d058e611147803f5188e417943c6653d846542f",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3008"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3008"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3008"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3008/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3008/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3008/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/607df84f12edd0dcff18f879409a24fca0991267"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/3004",
      "id": 3082342356,
      "node_id": "PR_kwDOKFkxdc63uM_U",
      "number": 3004,
      "state": "open",
      "locked": false,
      "title": "feat: allow customising the color of the fullscreen backdrop",
      "user": {
        "login": "Rolv-Apneseth",
        "id": 69486699,
        "node_id": "MDQ6VXNlcjY5NDg2Njk5",
        "avatar_url": "https://avatars.githubusercontent.com/u/69486699?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Rolv-Apneseth",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Small PR to allow customising the colour of the fullscreen backdrop, instead of just having a hard-coded black colour. Figured this could be a potential solution for people (like me) who want transparency for fullscreen windows (see #1399), while also giving a bit more customisation to others too. Unfortunately, using a transparent colour lets you see that layer shells like `waybar` don't get hidden, but I believe handling that should be a separate PR.\r\n\r\nTotally understand if you don't want this as a feature for niri, no hard feelings. If you are open to it though, just let me know if you want any changes made.\r\n\r\n**Edit**: Forgot to briefly describe how this is actually achieved:\r\n\r\nAdded a `fullscreen-backdrop-color` option under `layout`, which can be set to any colour (including a transparent one):\r\n\r\n```kdl\r\nlayout {\r\n    fullscreen-backdrop-color \"transparent\"\r\n}\r\n```\r\n\r\nThe backdrop colour also updates when the config is saved, as would be expected.",
      "created_at": "2025-12-08T16:39:47Z",
      "updated_at": "2025-12-30T14:54:03Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "95e1c44013efea73b92e173e87eab33e2e1fafb1",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Rolv-Apneseth:customise_fullscreen_backdrop",
        "ref": "customise_fullscreen_backdrop",
        "sha": "1cb0e72e33b16132a9ddfbef8fb3b729bf98d0b6",
        "user": {
          "login": "Rolv-Apneseth",
          "id": 69486699,
          "node_id": "MDQ6VXNlcjY5NDg2Njk5",
          "avatar_url": "https://avatars.githubusercontent.com/u/69486699?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Rolv-Apneseth",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1112441663,
          "node_id": "R_kgDOQk6DPw",
          "name": "niri",
          "full_name": "Rolv-Apneseth/niri",
          "private": false,
          "owner": {
            "login": "Rolv-Apneseth",
            "id": 69486699,
            "node_id": "MDQ6VXNlcjY5NDg2Njk5",
            "avatar_url": "https://avatars.githubusercontent.com/u/69486699?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Rolv-Apneseth",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Rolv-Apneseth/niri",
          "created_at": "2025-12-08T16:20:38Z",
          "updated_at": "2026-02-08T06:55:12Z",
          "pushed_at": "2025-12-30T14:54:01Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6453,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ba29735fbbd8cf8319c71ccb55b54a0580007c80",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3004"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/3004"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3004"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/3004/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3004/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/3004/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/1cb0e72e33b16132a9ddfbef8fb3b729bf98d0b6"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2998",
      "id": 3079665953,
      "node_id": "PR_kwDOKFkxdc63j_kh",
      "number": 2998,
      "state": "open",
      "locked": false,
      "title": "layout: add anchor [left|right]",
      "user": {
        "login": "markstos",
        "id": 25829,
        "node_id": "MDQ6VXNlcjI1ODI5",
        "avatar_url": "https://avatars.githubusercontent.com/u/25829?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/markstos",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Controls whether windows are laid out left to right, the default or\r\nright to left.\r\n\r\nanchor \"[left|right]\" is a new config option with layout {},\r\nor may be overridden by a per-output layout{} section.\r\n\r\nFixes: https://github.com/YaLTeR/niri/discussions/1642\r\nFixes: https://github.com/YaLTeR/niri/discussions/658\r\n\r\n## Naming\r\n\r\nThere are other names which might well for this. Suggestions welcome if you have a better idea!\r\n## Using\r\n\r\nAs noted in the commit, with this patch you an add\r\n\r\n`anchor \"right\"` to the top level `layout {}` block\r\nor have per-output overrides within an output's `layout` block.\r\n\r\n`anchor \"left\"` is also supported, but is the same as not adding this\r\nat all.\r\n\r\n## Status\r\n\r\nWorks for basic cases. In draft state for feedback.\r\n\r\n## Known issues\r\n\r\n### Shrinking a window\r\n\r\nIf a window is resized to be smaller on an output with anchor=right, the right edge of the window should stay fixed (anchored!) and the left edge should move towards it.\r\n\r\n### Growing the width of the output\r\n\r\n- If you resize an output to be wider, a window that was right-anchored will lose the anchor. This is visually different behavior than left anchored. This is because the window is being widened by adding space on the right.\r\nNot sure if we could widen the output on the left side in this case, or if we'd run into a problem with negative numbers.\r\n\r\n### Combining with `always-center-single-column`\r\n\r\nIf using `always-center-single-column` in combining with anchor=right,\r\nwhen adding a second window, the second window appear on the left as expected, and both windows will move to become right-aligned. This is nice, but differs from the anchor=left behavior. With the default anchor=left behavior, the first window centered, and add the second window to the right of it.\r\n\r\nTo me, the anchor=left behavior looks more like a bug-- as soon as there is more than one window, I would expect left or right anchoring to apply.\r\n\r\n### Restoring state when unfullscreening.\r\n\r\nIf a right-anchored window is fullscreened and then unfullscreened, it returns to be left-anchored instead of right anchored. \r\n\r\n## Scope\r\n\r\nExcluded from scope is the concept of anchoring windows\r\nto the center. That is, a first window might\r\nappear in the center, then when a second window appears\r\nthey move so that both are centered.\r\n\r\nFirst, there really *two* center anchoring options people\r\nmight like, one where the second window appears on the right\r\nand a second where the window appears on the left.\r\n\r\nThere are also already actions for \"center-column\", \"center-window\"\r\nand \"center-visible-columns\", so if you want to you center columns,\r\nthere are already ways to do that.\r\n\r\n",
      "created_at": "2025-12-07T23:59:37Z",
      "updated_at": "2026-02-10T15:23:48Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "cfcafbb3238a7dcfa7d6e9806e67d1c27e9ce2fc",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "markstos:add-output-anchor",
        "ref": "add-output-anchor",
        "sha": "58a5a1f074a867229cfc2778e934429bc5612ec6",
        "user": {
          "login": "markstos",
          "id": 25829,
          "node_id": "MDQ6VXNlcjI1ODI5",
          "avatar_url": "https://avatars.githubusercontent.com/u/25829?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/markstos",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1105664375,
          "node_id": "R_kgDOQecZdw",
          "name": "niri",
          "full_name": "markstos/niri",
          "private": false,
          "owner": {
            "login": "markstos",
            "id": 25829,
            "node_id": "MDQ6VXNlcjI1ODI5",
            "avatar_url": "https://avatars.githubusercontent.com/u/25829?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/markstos",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/markstos/niri",
          "created_at": "2025-11-28T01:13:55Z",
          "updated_at": "2026-02-08T06:55:11Z",
          "pushed_at": "2026-01-05T15:19:46Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 10632,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "b7eb8a635b7f75705808eaed85c016f02ae4fd2d",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2998"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2998"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2998"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2998/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2998/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2998/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/58a5a1f074a867229cfc2778e934429bc5612ec6"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2997",
      "id": 3079647156,
      "node_id": "PR_kwDOKFkxdc63j6-0",
      "number": 2997,
      "state": "open",
      "locked": false,
      "title": "Hidden workspaces",
      "user": {
        "login": "argosnothing",
        "id": 225423001,
        "node_id": "U_kgDODW-umQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/225423001?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/argosnothing",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "# Hidden Workspaces\r\n\r\n### Justification\r\n[this thread](https://github.com/YaLTeR/niri/discussions/329#discussioncomment-15181848) proposes several implementations of a niri-scratchpad system. These implementations tend to rely on a declared `stash` workspace. Currently these workspaces are visible and treated by the compositor like any other workspace. My proposol is to introduce a flag to workspaces through the Workspace { hide true } option that effectively hides that workspace in the overview, drawn windows inside the overview, and socket. \r\n\r\nIn addition, there are workflows that will benefit from being able to dynamically \"hide\" a workspace in this fashion, consider a workflow in which you have a workspace you dedicate to social media, or any category that you have no reason to navigate to or see information from, you could add windows to that workspace, \"hide\" it, and then bring it back later when you actually need to use it in the same session. ( https://github.com/YaLTeR/niri/pull/2997#issuecomment-3632460562 )\r\n\r\n### Implementation\r\nHere is what I did:  \r\n* Added: `hidden` option to workspace config\r\n* Added: `ToggleWorkspaceVisibility` to binds\r\n* On workspaces i've added both `hidden` and `original_idx fields`\r\n* Changes, mainly in monitor.rs for updates on how to handle idx with hidden-aware behavior. \r\n\r\n### Justification for Implementation\r\nMy goal is to try and touch as little of the workspace logic as possible, with minimal additions to the code. Having a nullable idx, for example would require substantial changes to everything that works with workspaces to handle variants. \r\n\r\n\r\nUpdate in workspace logic. \r\n* If a workspace is hidden, we do not want it to be shown on bars or anything consuming niri workspace state, they should be effectively hidden from tools consuming that state unless explicitly requested, ( through `niri msg workspaces-with-hidden` ). I have omitted hidden workspaces from the event stream, but keep them in the state for `workspaces-with-hidden`. \r\n* If a workspace is hidden, we do not want it to present any gaps in workspaces that are visible, therefor we need to maintain that all hidden workspaces are at idx past any visible workspace. This means i've had to adjust several spots that deal with adding workspaces to bottom, and cleaning up workspace code. \r\n* A workspace, on hide should maintain it's original idx before being hidden, so it can \"return\" to said idx on unhide. \r\n\r\n- [x] Hidden option for workspace in config. \r\n- [x] Hidden workspaces are not viewable in overview\r\n- [x] Hidden workspaces are not navigable to through up and down bindings\r\n- [x] Hidden workspaces do not display in ext/workspaces\r\n- [x] Hidden workspaces do not show through IPC ( partial, needs rewrite to maintain compatibility with code using ipc_crate ) \r\n- [x] Hidden workspaces id management. When hidden a hidden workspace should not cause *skips* in nonhidden workspace ids. \r\n- [x] Hidden workspaces *remember* their last position when unhidden. \r\n- [x] Hidden workspaces can be toggled through a binding. partial https://github.com/YaLTeR/niri/pull/2997/commits/d5f4772c9fad73ae4772f44410177037c1d0a436#diff-608918babe5a4eb5db908e910f16f33a173c6821eb12ef6e1077bf277160da76\r\n- [x] Hidden workspace windows do not display in recent windows, including `All`\r\n- [x] Clean up dead code added when experimenting with alternative IPC\r\n- [ ] Edge case: monitor with only empty workspace, but a hidden stash workspace, shows a empty workspace below when it shouldn't. \r\n- [x] Crash on config change that adds hidden true to a named workspace. \r\n- [x] Navigating to a workspace by Idx still allows you to reach, and then interact with a hidden workspace ( even though it's windows are still hidden ). Behavior should be the same as navigating to a workspace that's higher than the last visible workspace instead, meaning if it's past the last visible workspace, it should instead snap you to the last visible workspace.\r\n- [ ] Handle Unset workspace name, and workspaces that have names. On unset workspace name, the workspace needs to lose any hidden it has. \r\n- [x] Binds that change focus to a workspace through that workspaces name should unhide the workspace while in their view. \r\n- [x] Workspaces revealed through go to workspace [name] should rehide on leaving the workspace. \r\n- [ ] Monitor disconnect/reconnect, hidden workspaces becoming visible/undefined behavior\r\n- [x] https://github.com/YaLTeR/niri/pull/2997#issuecomment-3787416682 \r\n## Config add\r\n\r\n```kdl\r\nworkspace \"stash\" {\r\n    hidden true\r\n}\r\n```\r\n\r\n### Other\r\nIf anything I would just like to use this to start a dialogue about how we could go about implementing hidden workspaces. I believe there are many different ways to go about a scratchpad implementation, and it's understandable that it will take some time. In the meantime I think having more flexibility for how the user regards workspaces can only be a good thing and allow third party implementations to act as a temporary stopgap. \r\n\r\n\r\n### Dailing this PR:\r\nI try and keep this PR itself up to date with master so any potential merge will be easier, but for dailing I am matching the latest release as a separate branch from my repository. I have come back to niri, and due to some issues with recent smithay versions i'd had to make a new version off the release commit. \r\n\r\n[Latest Release PR](https://github.com/argosnothing/niri/tree/v25.11-hidden-workspaces) . I recommend you use this if you want hidden workspaces, unless you really want to run off main. :)",
      "created_at": "2025-12-07T23:34:36Z",
      "updated_at": "2026-02-17T16:33:48Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "266989f8879106a64fd40283ca2c0eb3edcdd050",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "argosnothing:hidden-workspaces",
        "ref": "hidden-workspaces",
        "sha": "eab116015a5a4d8f027c915dbd7b0a90e1e9a5e1",
        "user": {
          "login": "argosnothing",
          "id": 225423001,
          "node_id": "U_kgDODW-umQ",
          "avatar_url": "https://avatars.githubusercontent.com/u/225423001?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/argosnothing",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1111266673,
          "node_id": "R_kgDOQjyVcQ",
          "name": "niri",
          "full_name": "argosnothing/niri",
          "private": false,
          "owner": {
            "login": "argosnothing",
            "id": 225423001,
            "node_id": "U_kgDODW-umQ",
            "avatar_url": "https://avatars.githubusercontent.com/u/225423001?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/argosnothing",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/argosnothing/niri",
          "created_at": "2025-12-06T15:54:19Z",
          "updated_at": "2026-02-11T19:27:14Z",
          "pushed_at": "2026-02-17T00:43:28Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 10784,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "41b5de87692b8262fbdbff7faab93f04ff0be453",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2997"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2997"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2997"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2997/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2997/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2997/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/eab116015a5a4d8f027c915dbd7b0a90e1e9a5e1"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2987",
      "id": 3076693621,
      "node_id": "PR_kwDOKFkxdc63Yp51",
      "number": 2987,
      "state": "open",
      "locked": false,
      "title": "Add delay to hot corner",
      "user": {
        "login": "CodeTriangle",
        "id": 7889707,
        "node_id": "MDQ6VXNlcjc4ODk3MDc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7889707?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/CodeTriangle",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "# Rationale\r\n\r\nThe hot corner feature is very useful but I end up triggering it all the time when I do not mean to. This PR implements a configurable short delay during which the cursor must be held in the hot corner before the overview is opened, similar to KDE's hot corner functionality.\r\n\r\n# Changes\r\n\r\n* Added the field `open-delay-ms` to the `hot-corners` configuration object.\r\n* The overview opening is now controlled by a callback triggering `open-delay-ms` milliseconds after the cursor enters the hot corner region. The callback is canceled upon leaving the hot corner region.\r\n* To aid the user in positioning the cursor in the hot corner for the full time, two new options have been added to the `hot-corners` configuration object, `open-region-width` and `open-region-height`.\r\n* The hot corner triggers if the cursor is within `open-region-width` horizontal pixels of the corner and `open-region-height` vertical pixels of the corner.\r\n\r\n# Remarks\r\n\r\nThis PR is functional, but I am not fully satisfied with the code quality. Reviews are *heavily* requested to ensure that the code conforms to the style preferred by active niri developers. I think that my additions to the hot corners configuration could certainly be cleaned up, but I got lost in the complexity of changing the configuration format too much.\r\n\r\nThis PR also provides no documentation or tests. This is intentional as through the review process the exact form of the feature and its configuration is liable to change. I will write both, but I may need guidance through some aspects.\r\n\r\nI have tested the code on my end, however, and a screencast showing the correct functioning of all added features will be forthcoming.",
      "created_at": "2025-12-05T23:42:25Z",
      "updated_at": "2025-12-06T04:48:07Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "CodeTriangle:hot-corner-delay",
        "ref": "hot-corner-delay",
        "sha": "a6d41903d1a1a5176704800b1f88949451a389d6",
        "user": {
          "login": "CodeTriangle",
          "id": 7889707,
          "node_id": "MDQ6VXNlcjc4ODk3MDc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7889707?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/CodeTriangle",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1110468503,
          "node_id": "R_kgDOQjBnlw",
          "name": "niri",
          "full_name": "CodeTriangle/niri",
          "private": false,
          "owner": {
            "login": "CodeTriangle",
            "id": 7889707,
            "node_id": "MDQ6VXNlcjc4ODk3MDc=",
            "avatar_url": "https://avatars.githubusercontent.com/u/7889707?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/CodeTriangle",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/CodeTriangle/niri",
          "created_at": "2025-12-05T08:36:17Z",
          "updated_at": "2026-02-08T06:55:12Z",
          "pushed_at": "2025-12-06T01:21:21Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6025,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ba29735fbbd8cf8319c71ccb55b54a0580007c80",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2987"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2987"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2987"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2987/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2987/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2987/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/a6d41903d1a1a5176704800b1f88949451a389d6"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2962",
      "id": 3068854631,
      "node_id": "PR_kwDOKFkxdc626wFn",
      "number": 2962,
      "state": "open",
      "locked": false,
      "title": "Add serialize/deserialize to EventStreamState in niri-ipc",
      "user": {
        "login": "Perodactyl",
        "id": 81657800,
        "node_id": "MDQ6VXNlcjgxNjU3ODAw",
        "avatar_url": "https://avatars.githubusercontent.com/u/81657800?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Perodactyl",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": null,
      "created_at": "2025-12-03T20:38:50Z",
      "updated_at": "2025-12-07T16:39:59Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Perodactyl:niri-ipc-serde",
        "ref": "niri-ipc-serde",
        "sha": "179b54f3920e8494ef3d6e3051bbe97b9789186d",
        "user": {
          "login": "Perodactyl",
          "id": 81657800,
          "node_id": "MDQ6VXNlcjgxNjU3ODAw",
          "avatar_url": "https://avatars.githubusercontent.com/u/81657800?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Perodactyl",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1109447163,
          "node_id": "R_kgDOQiDR-w",
          "name": "niri",
          "full_name": "Perodactyl/niri",
          "private": false,
          "owner": {
            "login": "Perodactyl",
            "id": 81657800,
            "node_id": "MDQ6VXNlcjgxNjU3ODAw",
            "avatar_url": "https://avatars.githubusercontent.com/u/81657800?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Perodactyl",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Perodactyl/niri",
          "created_at": "2025-12-03T20:20:50Z",
          "updated_at": "2026-02-08T06:55:11Z",
          "pushed_at": "2025-12-03T20:37:28Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5919,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "f874b2fce50e0f7ba21e270c86cfa168a1506b82",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2962"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2962"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2962"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2962/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2962/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2962/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/179b54f3920e8494ef3d6e3051bbe97b9789186d"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2926",
      "id": 3055964386,
      "node_id": "PR_kwDOKFkxdc62JlDi",
      "number": 2926,
      "state": "open",
      "locked": false,
      "title": "ipc: add output toggle option",
      "user": {
        "login": "markstos",
        "id": 25829,
        "node_id": "MDQ6VXNlcjI1ODI5",
        "avatar_url": "https://avatars.githubusercontent.com/u/25829?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/markstos",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Output toggling is part of the Sway IPC.\n\nIn a multi-monitor setup, it can be useful to bind a key\nto toggle a secondary monitor and off to temporary increase focus or save energy.\n\n## Context about the change\n\nUnlike the `on` and `off` commands, the `toggle` option has to first read the state, so a bit of refactoring was needed. This required for some code to be re-indented, which makes the diff look larger than it is.\n\n## QA Log\n\n- Tested that docs appear in CLI\n- Tested manually toggling a monitor on and off.\n",
      "created_at": "2025-11-29T23:57:58Z",
      "updated_at": "2025-11-30T13:15:17Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "cac2419751307c07d8e98b4cfd761dd193527166",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "markstos:add-output-toggle-to-ipc",
        "ref": "add-output-toggle-to-ipc",
        "sha": "719fa5f3b0c4e84f63ebce833a023545e641abf0",
        "user": {
          "login": "markstos",
          "id": 25829,
          "node_id": "MDQ6VXNlcjI1ODI5",
          "avatar_url": "https://avatars.githubusercontent.com/u/25829?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/markstos",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1105664375,
          "node_id": "R_kgDOQecZdw",
          "name": "niri",
          "full_name": "markstos/niri",
          "private": false,
          "owner": {
            "login": "markstos",
            "id": 25829,
            "node_id": "MDQ6VXNlcjI1ODI5",
            "avatar_url": "https://avatars.githubusercontent.com/u/25829?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/markstos",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/markstos/niri",
          "created_at": "2025-11-28T01:13:55Z",
          "updated_at": "2026-02-08T06:55:11Z",
          "pushed_at": "2026-01-05T15:19:46Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 10632,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "b35bcae35b3f9665043c335e55ed5828af77db85",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2926"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2926"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2926"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2926/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2926/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2926/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/719fa5f3b0c4e84f63ebce833a023545e641abf0"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2910",
      "id": 3052947925,
      "node_id": "PR_kwDOKFkxdc61-EnV",
      "number": 2910,
      "state": "open",
      "locked": false,
      "title": "input: add support for trackpoint",
      "user": {
        "login": "skoove",
        "id": 53106860,
        "node_id": "MDQ6VXNlcjUzMTA2ODYw",
        "avatar_url": "https://avatars.githubusercontent.com/u/53106860?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/skoove",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Adding in track point scrolling by just putting it in with touch pad scrolling, as from what I understand, they are *very* similar\r\n\r\nCurrent issues:\r\n- Need to test with actual keybinds (out side of simply scrolling in the overview)\r\n- The way I am doing it feels a little yuck, maybe I should not just put it on top of the touchpad?\r\n- I need to look at what else outputs the `Continuous` scroll method, as more nuance may be needed for the handling\r\n\r\nfixes: #1639",
      "created_at": "2025-11-28T05:19:01Z",
      "updated_at": "2026-02-01T20:31:17Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "ca62abf50107eab2054a72699b41d70fecdc428c",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "skoove:trackpoint-overview-scroll",
        "ref": "trackpoint-overview-scroll",
        "sha": "cfee9ffdae23ac9f9e3f5425d547d74e500080eb",
        "user": {
          "login": "skoove",
          "id": 53106860,
          "node_id": "MDQ6VXNlcjUzMTA2ODYw",
          "avatar_url": "https://avatars.githubusercontent.com/u/53106860?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/skoove",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1056822487,
          "node_id": "R_kgDOPv3U1w",
          "name": "niri",
          "full_name": "skoove/niri",
          "private": false,
          "owner": {
            "login": "skoove",
            "id": 53106860,
            "node_id": "MDQ6VXNlcjUzMTA2ODYw",
            "avatar_url": "https://avatars.githubusercontent.com/u/53106860?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/skoove",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/skoove/niri",
          "created_at": "2025-09-14T21:44:55Z",
          "updated_at": "2026-02-08T06:54:59Z",
          "pushed_at": "2025-11-28T05:17:27Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6103,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "0652342df8fffa93abcc5e567be1afb3eab002f6",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2910"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2910"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2910"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2910/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2910/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2910/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/cfee9ffdae23ac9f9e3f5425d547d74e500080eb"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2906",
      "id": 3052370880,
      "node_id": "PR_kwDOKFkxdc6173vA",
      "number": 2906,
      "state": "open",
      "locked": false,
      "title": "screenshot_ui: add ctrl+a command to select entire output",
      "user": {
        "login": "lineargraph",
        "id": 20768569,
        "node_id": "MDQ6VXNlcjIwNzY4NTY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/20768569?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/lineargraph",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "<details>\r\n<summary>images</summary>\r\n\r\n<img width=\"1389\" height=\"1678\" alt=\"image\" src=\"https://github.com/user-attachments/assets/e47e0a99-18e7-4c38-ac4a-9ddae40a2128\" />\r\n<img width=\"1408\" height=\"1703\" alt=\"image\" src=\"https://github.com/user-attachments/assets/afd1b7cc-408b-4dba-9098-b0ceea69f859\" />\r\n\r\n</details>\r\n\r\nadds a simple <kbd>ctrl+a</kbd> keybind to the screenshot ui to select the entire output",
      "created_at": "2025-11-27T20:51:41Z",
      "updated_at": "2025-12-01T20:44:01Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "be783aaec4ace854c5b7cfbec03faf3f62877363",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "lineargraph:feat/screenshotselectall",
        "ref": "feat/screenshotselectall",
        "sha": "7471cd5ddd794d904dd66562ca1446d42c7fc6a5",
        "user": {
          "login": "lineargraph",
          "id": 20768569,
          "node_id": "MDQ6VXNlcjIwNzY4NTY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/20768569?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/lineargraph",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1105578746,
          "node_id": "R_kgDOQeXK-g",
          "name": "niri",
          "full_name": "lineargraph/niri",
          "private": false,
          "owner": {
            "login": "lineargraph",
            "id": 20768569,
            "node_id": "MDQ6VXNlcjIwNzY4NTY5",
            "avatar_url": "https://avatars.githubusercontent.com/u/20768569?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/lineargraph",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/lineargraph/niri",
          "created_at": "2025-11-27T20:43:43Z",
          "updated_at": "2026-02-08T06:55:11Z",
          "pushed_at": "2025-12-01T20:43:12Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5905,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "311ca6b5da19f5acd7d3e481620de57240ce8f7c",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2906"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2906"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2906"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2906/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2906/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2906/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/7471cd5ddd794d904dd66562ca1446d42c7fc6a5"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2904",
      "id": 3050153442,
      "node_id": "PR_kwDOKFkxdc61zaXi",
      "number": 2904,
      "state": "open",
      "locked": false,
      "title": "dbus: emit when window config changed",
      "user": {
        "login": "HigherOrderLogic",
        "id": 73709188,
        "node_id": "MDQ6VXNlcjczNzA5MTg4",
        "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/HigherOrderLogic",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Emit the signal through Gnome Introspect DBus channel when windows config changed.",
      "created_at": "2025-11-27T08:51:36Z",
      "updated_at": "2025-11-27T15:54:58Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "db4995f9945ba77b1d197927dc5414fe69e67cb0",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "HigherOrderLogic:fix/introspect-dbus-event",
        "ref": "fix/introspect-dbus-event",
        "sha": "d4e2c68fbe12a055e431278c88bd02dfd235b4c7",
        "user": {
          "login": "HigherOrderLogic",
          "id": 73709188,
          "node_id": "MDQ6VXNlcjczNzA5MTg4",
          "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/HigherOrderLogic",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 977357099,
          "node_id": "R_kgDOOkFJKw",
          "name": "niri-wm",
          "full_name": "HigherOrderLogic/niri-wm",
          "private": false,
          "owner": {
            "login": "HigherOrderLogic",
            "id": 73709188,
            "node_id": "MDQ6VXNlcjczNzA5MTg4",
            "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/HigherOrderLogic",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/HigherOrderLogic/niri-wm",
          "created_at": "2025-05-04T02:35:01Z",
          "updated_at": "2026-02-08T06:54:43Z",
          "pushed_at": "2026-02-13T13:42:41Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6938,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "e863f52feaaef9c4149211045013b1f515ac5a8e",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2904"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2904"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2904"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2904/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2904/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2904/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/d4e2c68fbe12a055e431278c88bd02dfd235b4c7"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2900",
      "id": 3048973146,
      "node_id": "PR_kwDOKFkxdc61u6Na",
      "number": 2900,
      "state": "open",
      "locked": false,
      "title": "Fix MRU tracking when overview is open",
      "user": {
        "login": "LoayGhreeb",
        "id": 52158423,
        "node_id": "MDQ6VXNlcjUyMTU4NDIz",
        "avatar_url": "https://avatars.githubusercontent.com/u/52158423?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/LoayGhreeb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR fixes MRU focus window tracking when the overview is open. The issue was that Alt+Tab would work once, but subsequent presses wouldn't switch back to the previous window.\r\n\r\nThe root cause is that MRU timestamps were updated based on keyboard focus changes, but when the overview is open, keyboard focus stays on the overview even though layout focus changes (via arrow keys, MRU advances, or opening new windows).\r\n\r\nThe fix adds a `previous_layout_focus_id` field to track layout focus separately from keyboard focus. On each refresh cycle, if the layout focus changed, the MRU timestamp is updated for the newly focused window.\r\n\r\nFixes: #2834\r\nFixes: #2839",
      "created_at": "2025-11-26T21:32:13Z",
      "updated_at": "2025-12-29T15:32:47Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "da5847a77550c8d3db5e109822d9fad0fd7f7b94",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "LoayGhreeb:fix-mru",
        "ref": "fix-mru",
        "sha": "c57c41d9281f331ba67c5dd18c9993998357139e",
        "user": {
          "login": "LoayGhreeb",
          "id": 52158423,
          "node_id": "MDQ6VXNlcjUyMTU4NDIz",
          "avatar_url": "https://avatars.githubusercontent.com/u/52158423?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/LoayGhreeb",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1099907484,
          "node_id": "R_kgDOQY9BnA",
          "name": "niri",
          "full_name": "LoayGhreeb/niri",
          "private": false,
          "owner": {
            "login": "LoayGhreeb",
            "id": 52158423,
            "node_id": "MDQ6VXNlcjUyMTU4NDIz",
            "avatar_url": "https://avatars.githubusercontent.com/u/52158423?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/LoayGhreeb",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/LoayGhreeb/niri",
          "created_at": "2025-11-19T15:40:17Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2025-11-30T05:45:18Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5917,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "b35bcae35b3f9665043c335e55ed5828af77db85",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2900"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2900"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2900"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2900/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2900/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2900/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/c57c41d9281f331ba67c5dd18c9993998357139e"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2860",
      "id": 3032879768,
      "node_id": "PR_kwDOKFkxdc60xhKY",
      "number": 2860,
      "state": "open",
      "locked": false,
      "title": "chore(deps): update various",
      "user": {
        "login": "Boosted-Bonobo",
        "id": 243080157,
        "node_id": "U_kgDODn0b3Q",
        "avatar_url": "https://avatars.githubusercontent.com/u/243080157?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Boosted-Bonobo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Why wasn't this used instead? @Ind-E https://github.com/YaLTeR/niri/pull/2821\r\nhttps://wimpysworld.com/posts/nothing-but-nix-github-actions\r\nthe space reclaimer which is used in nixpkgs through [nixpkgs-review-gha](https://github.com/Defelo/nixpkgs-review-gha/blob/main/.github/actions/setup-nix/action.yml#L19)",
      "created_at": "2025-11-21T08:16:39Z",
      "updated_at": "2025-12-03T07:39:46Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Boosted-Bonobo:GA",
        "ref": "GA",
        "sha": "d1830126a24105a0c3f5f98ba0c52aea0e5ddc7a",
        "user": {
          "login": "Boosted-Bonobo",
          "id": 243080157,
          "node_id": "U_kgDODn0b3Q",
          "avatar_url": "https://avatars.githubusercontent.com/u/243080157?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Boosted-Bonobo",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1101084024,
          "node_id": "R_kgDOQaE1eA",
          "name": "niri",
          "full_name": "Boosted-Bonobo/niri",
          "private": false,
          "owner": {
            "login": "Boosted-Bonobo",
            "id": 243080157,
            "node_id": "U_kgDODn0b3Q",
            "avatar_url": "https://avatars.githubusercontent.com/u/243080157?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Boosted-Bonobo",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Boosted-Bonobo/niri",
          "created_at": "2025-11-21T07:04:45Z",
          "updated_at": "2026-02-08T06:55:10Z",
          "pushed_at": "2025-12-03T07:39:45Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 9737,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "012700dd549a79c501bcab92839e5dcc46c372b5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2860"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2860"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2860"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2860/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2860/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2860/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/d1830126a24105a0c3f5f98ba0c52aea0e5ddc7a"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2857",
      "id": 3031834448,
      "node_id": "PR_kwDOKFkxdc60th9Q",
      "number": 2857,
      "state": "open",
      "locked": false,
      "title": "Remove window comparison",
      "user": {
        "login": "whiskeyPeak",
        "id": 73116038,
        "node_id": "MDQ6VXNlcjczMTE2MDM4",
        "avatar_url": "https://avatars.githubusercontent.com/u/73116038?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/whiskeyPeak",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "The issue lies with if !self.layout.is_overview_open() && current_focus.window.as_ref() != Some(window) in niri.rs 6283. We queried the current PointContents with self.contents_under which ends up being the same as the new_focus var.\r\nFollowing video shows the fix.\r\n\r\nhttps://github.com/user-attachments/assets/69c58daf-9b8c-4756-bd27-212e9bf0b782\r\n\r\nFixes #2856 \r\n\r\n\r\n",
      "created_at": "2025-11-20T23:00:32Z",
      "updated_at": "2025-11-21T04:19:31Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "21cb27824bf1adecaea054126723f4fce343d2cb",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "whiskeyPeak:fix-focus-after-overview",
        "ref": "fix-focus-after-overview",
        "sha": "48b6951fdeeb12e361d61f497c3579068a35f6ca",
        "user": {
          "login": "whiskeyPeak",
          "id": 73116038,
          "node_id": "MDQ6VXNlcjczMTE2MDM4",
          "avatar_url": "https://avatars.githubusercontent.com/u/73116038?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/whiskeyPeak",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1098258124,
          "node_id": "R_kgDOQXYWzA",
          "name": "niri",
          "full_name": "whiskeyPeak/niri",
          "private": false,
          "owner": {
            "login": "whiskeyPeak",
            "id": 73116038,
            "node_id": "MDQ6VXNlcjczMTE2MDM4",
            "avatar_url": "https://avatars.githubusercontent.com/u/73116038?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/whiskeyPeak",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/whiskeyPeak/niri",
          "created_at": "2025-11-17T13:13:15Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2025-12-11T20:43:04Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5925,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "6fcdb9242e65ed5825e7fda2a7935b412588b63a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2857"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2857"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2857"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2857/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2857/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2857/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/48b6951fdeeb12e361d61f497c3579068a35f6ca"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2,
        2856
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2852",
      "id": 3029574605,
      "node_id": "PR_kwDOKFkxdc60k6PN",
      "number": 2852,
      "state": "open",
      "locked": false,
      "title": "Refer workspace by id",
      "user": {
        "login": "oisanjaya",
        "id": 26103050,
        "node_id": "MDQ6VXNlcjI2MTAzMDUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/26103050?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/oisanjaya",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR enable workspace reference by ID for operations on `niri msg action`.\r\n\r\nMy idea was using `id:` prefix to refer workspace by its id instead of index, this is done in niri-ipc/src/lib.rs from_str trait implementation, that is checks user arguments; if it is integer number then assume user refer to index (to maintain backward compatibility of current operations); if it is prefixed by `id:` then assume user refering workspace's id; else assume name reference.\r\n\r\nThis PR also change `niri msg workspaces` command output to include workspace's id.",
      "created_at": "2025-11-20T11:54:41Z",
      "updated_at": "2026-02-16T04:41:08Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "540bdb5159e556e27eba5f8097cae85526e5d674",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "oisanjaya:refer_workspace_by_id",
        "ref": "refer_workspace_by_id",
        "sha": "0bb4e2b86788de084933e02d60168e04d69de62f",
        "user": {
          "login": "oisanjaya",
          "id": 26103050,
          "node_id": "MDQ6VXNlcjI2MTAzMDUw",
          "avatar_url": "https://avatars.githubusercontent.com/u/26103050?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/oisanjaya",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1100516635,
          "node_id": "R_kgDOQZiNGw",
          "name": "niri",
          "full_name": "oisanjaya/niri",
          "private": false,
          "owner": {
            "login": "oisanjaya",
            "id": 26103050,
            "node_id": "MDQ6VXNlcjI2MTAzMDUw",
            "avatar_url": "https://avatars.githubusercontent.com/u/26103050?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/oisanjaya",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/oisanjaya/niri",
          "created_at": "2025-11-20T11:40:04Z",
          "updated_at": "2026-02-16T04:40:53Z",
          "pushed_at": "2026-02-16T04:41:07Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6899,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "1fa0338a172a69b05a1a35d55b291693ff1bc29f",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2852"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2852"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2852"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2852/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2852/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2852/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/0bb4e2b86788de084933e02d60168e04d69de62f"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2844",
      "id": 3026743834,
      "node_id": "PR_kwDOKFkxdc60aHIa",
      "number": 2844,
      "state": "open",
      "locked": false,
      "title": "Scroll factor configuration for `scroll-method: \"on-button-down\"`",
      "user": {
        "login": "ProfLander",
        "id": 1253239,
        "node_id": "MDQ6VXNlcjEyNTMyMzk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1253239?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ProfLander",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Implements `input.button-scroll-factor` using the existing `ScrollFactor` type, and applies it to events of type `AxisSource::Continuous`.\r\n\r\nI've followed the hyprland pattern of having the `input` -level setting govern button-style scroll speed so as to avoid per-device clutter or collision with existing `scroll-factor` settings, and added a clarifying `button-` prefix to ensure users don't look at it and assume a global modifier, rather than an event-specific one.\r\n\r\nCloses #2841, #2393 ",
      "created_at": "2025-11-19T17:29:29Z",
      "updated_at": "2025-11-19T19:40:48Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "3c7ffaccc48df7854044169d12e24461a881b957",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "ProfLander:main",
        "ref": "main",
        "sha": "4c3c2891db3884237fd37e102fe1c83544cf675d",
        "user": {
          "login": "ProfLander",
          "id": 1253239,
          "node_id": "MDQ6VXNlcjEyNTMyMzk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1253239?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ProfLander",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1099876752,
          "node_id": "R_kgDOQY7JkA",
          "name": "niri",
          "full_name": "ProfLander/niri",
          "private": false,
          "owner": {
            "login": "ProfLander",
            "id": 1253239,
            "node_id": "MDQ6VXNlcjEyNTMyMzk=",
            "avatar_url": "https://avatars.githubusercontent.com/u/1253239?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ProfLander",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/ProfLander/niri",
          "created_at": "2025-11-19T14:57:07Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2025-11-19T17:32:09Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6103,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "c722634c269ae97a5ea185691bcd0b8c73a600e5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2844"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2844"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2844"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2844/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2844/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2844/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/4c3c2891db3884237fd37e102fe1c83544cf675d"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2,
        2841
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2843",
      "id": 3026471897,
      "node_id": "PR_kwDOKFkxdc60ZEvZ",
      "number": 2843,
      "state": "open",
      "locked": false,
      "title": "Maintain a single empty workspace at the edges",
      "user": {
        "login": "LoayGhreeb",
        "id": 52158423,
        "node_id": "MDQ6VXNlcjUyMTU4NDIz",
        "avatar_url": "https://avatars.githubusercontent.com/u/52158423?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/LoayGhreeb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR ensures that workspaces maintain only one empty unnamed workspace at the end (or at both edges if `empty_workspace_above_first` is enabled).\r\n\r\nA simple scenario: if there is only one workspace and a window is opened (which creates a new workspace at the end), then after closing that window, the last workspace should be removed. This makes the workspace state consistent: before opening a window and after closing it, the number of workspaces remains the same.\r\n\r\nSimilarly, when `empty_workspace_above_first` is enabled, the same behavior applies to the first workspace. So, if there is only one workspace, opening a window will create leading and trailing workspaces. After closing the window, it should return to having just one workspace, instead of three.",
      "created_at": "2025-11-19T16:07:18Z",
      "updated_at": "2025-11-22T01:36:44Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "5422d5bcd5071b0193844860eab718e9be6a3997",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "LoayGhreeb:patch",
        "ref": "patch",
        "sha": "07dfe91415d39e5b04b1f42f936790d88e19a720",
        "user": {
          "login": "LoayGhreeb",
          "id": 52158423,
          "node_id": "MDQ6VXNlcjUyMTU4NDIz",
          "avatar_url": "https://avatars.githubusercontent.com/u/52158423?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/LoayGhreeb",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1099907484,
          "node_id": "R_kgDOQY9BnA",
          "name": "niri",
          "full_name": "LoayGhreeb/niri",
          "private": false,
          "owner": {
            "login": "LoayGhreeb",
            "id": 52158423,
            "node_id": "MDQ6VXNlcjUyMTU4NDIz",
            "avatar_url": "https://avatars.githubusercontent.com/u/52158423?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/LoayGhreeb",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/LoayGhreeb/niri",
          "created_at": "2025-11-19T15:40:17Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2025-11-30T05:45:18Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5917,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "c722634c269ae97a5ea185691bcd0b8c73a600e5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2843"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2843"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2843"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2843/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2843/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2843/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/07dfe91415d39e5b04b1f42f936790d88e19a720"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2836",
      "id": 3022975907,
      "node_id": "PR_kwDOKFkxdc60LvOj",
      "number": 2836,
      "state": "open",
      "locked": false,
      "title": "Add windows' fullscreen states to ipc",
      "user": {
        "login": "Sem1Rose",
        "id": 79442162,
        "node_id": "MDQ6VXNlcjc5NDQyMTYy",
        "avatar_url": "https://avatars.githubusercontent.com/u/79442162?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Sem1Rose",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Solves [#discussion:1843](https://github.com/YaLTeR/niri/discussions/1843).\r\n\r\nAdds a `fullscreen_state` to the Window struct, and a `WindowFullscreenStateChanged` event.",
      "created_at": "2025-11-18T18:33:45Z",
      "updated_at": "2026-02-11T04:41:02Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "0d17f258b0d2187511e390e85a50b36e9ef514a4",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Sem1Rose:main",
        "ref": "main",
        "sha": "f84833a7e470b3ca7762bd64719cb41576d03bcf",
        "user": {
          "login": "Sem1Rose",
          "id": 79442162,
          "node_id": "MDQ6VXNlcjc5NDQyMTYy",
          "avatar_url": "https://avatars.githubusercontent.com/u/79442162?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Sem1Rose",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1099221723,
          "node_id": "R_kgDOQYTK2w",
          "name": "niri",
          "full_name": "Sem1Rose/niri",
          "private": false,
          "owner": {
            "login": "Sem1Rose",
            "id": 79442162,
            "node_id": "MDQ6VXNlcjc5NDQyMTYy",
            "avatar_url": "https://avatars.githubusercontent.com/u/79442162?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Sem1Rose",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Sem1Rose/niri",
          "created_at": "2025-11-18T18:13:53Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2025-11-22T17:57:57Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6125,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "cfc01b895c0c7cbb9692852488675cc46693bd2a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2836"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2836"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2836"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2836/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2836/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2836/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/f84833a7e470b3ca7762bd64719cb41576d03bcf"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2826",
      "id": 3018287005,
      "node_id": "PR_kwDOKFkxdc6z52ed",
      "number": 2826,
      "state": "open",
      "locked": false,
      "title": "Delay block-out release until content settles",
      "user": {
        "login": "Acters",
        "id": 6981852,
        "node_id": "MDQ6VXNlcjY5ODE4NTI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6981852?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Acters",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "In an attempt to reduce chances of leaked private details, the block-out-from has been hardened to intentionally delay the unblocking until subsurface draws reported by wayland compositor stops, or a hard cap timer is reached.\r\n\r\n- Track block-out-from transition to unblock per window via the BlockOutHoldAction, so we know when a hold starts or clears.\r\n - Add per-window silence and force timers (30 ms debounce + 200 ms failsafe) to keep screencasts blocked until\r\n subsurface commits settle, resetting timers on each commit and cancelling them on unmap.\r\n - Extend the layout/Niri plumbing to locate windows by MappedId, manage timer lifecycles, and finish holds when\r\n timers fire.\r\n - Update compositor/xdg-shell handlers to hook into the new timer APIs and avoid borrowing conflicts while\r\n recomputing window rules.\r\n\r\nUnfortunately, I am new to rust and had the help of AI to make these changes. \r\nOverall, it does correctly delay the unblocking of the window to allow the window to finish committing all the rendering changes.\r\n\r\nfixes #1348",
      "created_at": "2025-11-17T17:09:29Z",
      "updated_at": "2025-11-19T06:47:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Acters:main",
        "ref": "main",
        "sha": "86e644e010f0412506a8f221546ba15d1a7c0192",
        "user": {
          "login": "Acters",
          "id": 6981852,
          "node_id": "MDQ6VXNlcjY5ODE4NTI=",
          "avatar_url": "https://avatars.githubusercontent.com/u/6981852?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Acters",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1098005580,
          "node_id": "R_kgDOQXI8TA",
          "name": "niri",
          "full_name": "Acters/niri",
          "private": false,
          "owner": {
            "login": "Acters",
            "id": 6981852,
            "node_id": "MDQ6VXNlcjY5ODE4NTI=",
            "avatar_url": "https://avatars.githubusercontent.com/u/6981852?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Acters",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Acters/niri",
          "created_at": "2025-11-17T06:10:40Z",
          "updated_at": "2026-02-08T06:55:09Z",
          "pushed_at": "2025-12-26T08:55:05Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6022,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "c722634c269ae97a5ea185691bcd0b8c73a600e5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2826"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2826"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2826"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2826/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2826/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2826/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/86e644e010f0412506a8f221546ba15d1a7c0192"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1,
        1348
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2823",
      "id": 3016319555,
      "node_id": "PR_kwDOKFkxdc6zyWJD",
      "number": 2823,
      "state": "open",
      "locked": false,
      "title": "feat: add xwayland matcher for window rule",
      "user": {
        "login": "HigherOrderLogic",
        "id": 73709188,
        "node_id": "MDQ6VXNlcjczNzA5MTg4",
        "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/HigherOrderLogic",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Add xwayland matcher for window rules.\r\n\r\nThis requires user to use the built-in Xwayland-satellite integration.\r\n\r\n~~TODO: add docs~~",
      "created_at": "2025-11-17T06:49:52Z",
      "updated_at": "2025-11-23T11:36:45Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "01277fbd7a2300e051f2d6b2a1abad68294baba7",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "HigherOrderLogic:feat/xwl-window-rule",
        "ref": "feat/xwl-window-rule",
        "sha": "efae079f0484a89c5bb93bbe53ae5999ccccaf26",
        "user": {
          "login": "HigherOrderLogic",
          "id": 73709188,
          "node_id": "MDQ6VXNlcjczNzA5MTg4",
          "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/HigherOrderLogic",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 977357099,
          "node_id": "R_kgDOOkFJKw",
          "name": "niri-wm",
          "full_name": "HigherOrderLogic/niri-wm",
          "private": false,
          "owner": {
            "login": "HigherOrderLogic",
            "id": 73709188,
            "node_id": "MDQ6VXNlcjczNzA5MTg4",
            "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/HigherOrderLogic",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/HigherOrderLogic/niri-wm",
          "created_at": "2025-05-04T02:35:01Z",
          "updated_at": "2026-02-08T06:54:43Z",
          "pushed_at": "2026-02-13T13:42:41Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6938,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "efbe29f3faa69282aad110b7da74f3c41f8971cf",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2823"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2823"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2823"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2823/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2823/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2823/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/efae079f0484a89c5bb93bbe53ae5999ccccaf26"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2797",
      "id": 3012108766,
      "node_id": "PR_kwDOKFkxdc6ziSHe",
      "number": 2797,
      "state": "open",
      "locked": false,
      "title": "shake-to-locate feature: enlarge the cursor when shaking",
      "user": {
        "login": "SergioRibera",
        "id": 56278796,
        "node_id": "MDQ6VXNlcjU2Mjc4Nzk2",
        "avatar_url": "https://avatars.githubusercontent.com/u/56278796?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SergioRibera",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Adds an integrated implementation of the `shake-to-locate` functionality (enlarge the cursor when the user shakes it) and exposes it as a grouped setting under `cursor.shake`.\r\n\r\nThe details I implemented for the feature are:\r\n- Detects rapid shaking using movement history and a threshold based on the distance-traveled/diagonal ratio of the area traveled (method inspired by the KDE solution).\r\n- Smoothly animates the expansion and contraction of the cursor and allows the feature to be enabled/disabled.\r\n\r\nPersonally, I think it adds a little touch of “personality” and visual polish to Niri, improving the user experience without being intrusive. It also clearly improves accessibility because it helps locate the pointer on large screens or when using multiple monitors. In another particular case, combined with the zoom adjustment (https://github.com/YaLTeR/niri/issues/1024), it is very useful in presentations and courses (for example, when giving talks or Rust classes) because it allows you to draw the audience's attention visually and subtly.\r\n\r\nThis algorithm is based on the KDE implementation, so here are the references and sources of inspiration:\r\n- KDE KWin: https://invent.kde.org/plasma/kwin/-/blob/96bc84d33d2a5913bfec17b96686b5f4bb4e41c8/src/plugins/shakecursor/shakedetector.cpp\r\n- Hyprland plugin: https://github.com/VirtCode/hypr-dynamic-cursors/blob/9a5b0af83dd1e9de614db56ff26fd6e62e915fd5/src/other/Shake.cpp\r\n\r\nhttps://github.com/user-attachments/assets/a319e709-6cc5-4831-aded-368c8a8052e5\r\n",
      "created_at": "2025-11-14T20:42:58Z",
      "updated_at": "2026-02-19T21:29:08Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "772f7b85de7d8111d1dd7a1d01123a169f33a8a2",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "SergioRibera:cursor-magnify",
        "ref": "cursor-magnify",
        "sha": "57abcbdd8e14910fd650d673fda54ddf290765e2",
        "user": {
          "login": "SergioRibera",
          "id": 56278796,
          "node_id": "MDQ6VXNlcjU2Mjc4Nzk2",
          "avatar_url": "https://avatars.githubusercontent.com/u/56278796?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/SergioRibera",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 943938184,
          "node_id": "R_kgDOOENaiA",
          "name": "niri",
          "full_name": "SergioRibera/niri",
          "private": false,
          "owner": {
            "login": "SergioRibera",
            "id": 56278796,
            "node_id": "MDQ6VXNlcjU2Mjc4Nzk2",
            "avatar_url": "https://avatars.githubusercontent.com/u/56278796?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/SergioRibera",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "[Contributing] A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/SergioRibera/niri",
          "created_at": "2025-03-06T14:13:54Z",
          "updated_at": "2026-02-08T06:54:38Z",
          "pushed_at": "2026-02-19T21:29:07Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6917,
          "stargazers_count": 1,
          "watchers_count": 1,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 1,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2a52911757cb3b497db9407592f9b4c439571ea",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2797"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2797"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2797"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2797/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2797/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2797/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/57abcbdd8e14910fd650d673fda54ddf290765e2"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2794",
      "id": 3010322348,
      "node_id": "PR_kwDOKFkxdc6zbd-s",
      "number": 2794,
      "state": "open",
      "locked": false,
      "title": "implement kde appmenu protocol",
      "user": {
        "login": "ilsubyeega",
        "id": 37479424,
        "node_id": "MDQ6VXNlcjM3NDc5NDI0",
        "avatar_url": "https://avatars.githubusercontent.com/u/37479424?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ilsubyeega",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "- [x] Implement smithay and handler.\r\n- [ ] Refactor smithay implementation; i believe this is not ideal implementation and could be more cleaner. (hope yalter can fix this)\r\n- [x] Figure out where to save the state of client\r\n- [ ] FIXME: make this protocol OPT-IN since most of client will hide the menu when this protocol exists in the session\r\n\r\nNotes:\r\n- used just raw xml protocol specifications but wayland-protocol-plasma exists by `smithay`, but not reexported\r\n- compositor only need to save the 2 data(service_name and object_path) and then export somewhere, maybe realtime, if i understood correctly.\r\n- for dbusmenu implementation just wip stuffs are here: https://github.com/ilsubyeega/appmenu\r\n\r\nThe appmenu works with (ignoring xwayland support):\r\n- wayland compositor with `appmenu  protocol support`\r\n- client that supports kde appmenu wayland protocol; when they do, they register new d-bus bus which contains `/MenuBar/...`, and then sends `org_kde_kwin_appmenu#send_address(service_name, object_path)` to compositor\r\n- the application(shell) to listen the active/focused window and its `service_name/object_path`. probably niri ipc could do that\r\n\r\n<img width=\"1972\" height=\"523\" alt=\"image\" src=\"https://github.com/user-attachments/assets/11431f36-9c3d-4741-9358-a38a47e7b920\" />\r\n\r\n\r\nDO NOT MERGE YET: `todo!()` will panic your environment",
      "created_at": "2025-11-14T10:55:30Z",
      "updated_at": "2025-11-29T03:44:11Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "ilsubyeega:kde-appmenu-2",
        "ref": "kde-appmenu-2",
        "sha": "be6401a4dbf93d76522f3f6f203d83b33c4306a6",
        "user": {
          "login": "ilsubyeega",
          "id": 37479424,
          "node_id": "MDQ6VXNlcjM3NDc5NDI0",
          "avatar_url": "https://avatars.githubusercontent.com/u/37479424?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ilsubyeega",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1046016018,
          "node_id": "R_kgDOPljwEg",
          "name": "niri",
          "full_name": "ilsubyeega/niri",
          "private": false,
          "owner": {
            "login": "ilsubyeega",
            "id": 37479424,
            "node_id": "MDQ6VXNlcjM3NDc5NDI0",
            "avatar_url": "https://avatars.githubusercontent.com/u/37479424?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ilsubyeega",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/ilsubyeega/niri",
          "created_at": "2025-08-28T04:13:09Z",
          "updated_at": "2026-02-08T06:54:57Z",
          "pushed_at": "2026-01-10T04:52:50Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 10483,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "6fcdb9242e65ed5825e7fda2a7935b412588b63a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2794"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2794"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2794"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2794/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2794/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2794/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/be6401a4dbf93d76522f3f6f203d83b33c4306a6"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2757",
      "id": 2983611567,
      "node_id": "PR_kwDOKFkxdc6x1kyv",
      "number": 2757,
      "state": "open",
      "locked": false,
      "title": "screenshot: Add configurable compression, format, and resize options",
      "user": {
        "login": "szabolcsf",
        "id": 3169157,
        "node_id": "MDQ6VXNlcjMxNjkxNTc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3169157?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/szabolcsf",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This commit adds new configuration options to reduce screenshot file sizes, particularly beneficial for high DPI monitors where screenshots can exceed 15MB.\r\n\r\nNew config options under the `screenshot` block:\r\n- clipboard-compression: PNG compression level (fast/default/best)\r\n- clipboard-resize-width/height: Resize before copying to clipboard\r\n- file-format: Choose PNG or JPEG for disk files\r\n- file-quality: JPEG quality setting (1-100)\r\n- resize-width/height: Resize before saving to disk\r\n\r\nThe implementation:\r\n- Clipboard always uses PNG for compatibility (e.g., Firefox on Wayland)\r\n- Resizing maintains aspect ratio when only one dimension is specified\r\n- Only downscales, never upscales\r\n- JPEG encoding automatically strips alpha channel\r\n- All encoding happens in background threads\r\n\r\nExample file size reductions on 4K displays:\r\n- Clipboard PNG with resize + best compression: 15MB → 2-3MB\r\n- Disk JPEG with resize: 15MB → 400KB\r\n\r\nAdds jpeg-encoder 0.6.0 dependency.",
      "created_at": "2025-11-06T08:09:13Z",
      "updated_at": "2025-11-17T08:55:13Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "szabolcsf:main",
        "ref": "main",
        "sha": "540162723b0ab1d02ecc8258611f7ed3b8f655c9",
        "user": {
          "login": "szabolcsf",
          "id": 3169157,
          "node_id": "MDQ6VXNlcjMxNjkxNTc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/3169157?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/szabolcsf",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1090844718,
          "node_id": "R_kgDOQQT4Lg",
          "name": "niri",
          "full_name": "szabolcsf/niri",
          "private": false,
          "owner": {
            "login": "szabolcsf",
            "id": 3169157,
            "node_id": "MDQ6VXNlcjMxNjkxNTc=",
            "avatar_url": "https://avatars.githubusercontent.com/u/3169157?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/szabolcsf",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/szabolcsf/niri",
          "created_at": "2025-11-06T08:03:40Z",
          "updated_at": "2026-02-08T06:55:07Z",
          "pushed_at": "2025-11-06T08:07:13Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6016,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2ca2b3c866bc781b12c334a9f949b3db6d7c943",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2757"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2757"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2757"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2757/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2757/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2757/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/540162723b0ab1d02ecc8258611f7ed3b8f655c9"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2751",
      "id": 2978859626,
      "node_id": "PR_kwDOKFkxdc6xjcpq",
      "number": 2751,
      "state": "open",
      "locked": false,
      "title": "docs: add move-column-to-workspace focus parameter example",
      "user": {
        "login": "martinetd",
        "id": 1729331,
        "node_id": "MDQ6VXNlcjE3MjkzMzE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1729331?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/martinetd",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "I was just opening a discussion when I found about it when looking at how hard it'd be to implement, and noticed it was already done recently but no doc was added in #1332 !\r\n\r\nNot sure this is the best place to add this, but it's better than nothing -- happy to let you add it somewhere else and close it instead, will likely be faster than iterating on details.\r\n\r\n-----------------\r\n\r\nThis feature was added a while ago but nothing in the doc mentions it anywhere. Add a basic usage example.\r\n\r\nFixes: #1332",
      "created_at": "2025-11-05T04:16:22Z",
      "updated_at": "2025-11-05T04:17:46Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "149b1db512c69fca98da2089ff6a696f819ff3e7",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "martinetd:focus-doc",
        "ref": "focus-doc",
        "sha": "27d5300665e5c1e65199e43bc7ed216f37291f76",
        "user": {
          "login": "martinetd",
          "id": 1729331,
          "node_id": "MDQ6VXNlcjE3MjkzMzE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1729331?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/martinetd",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1089977514,
          "node_id": "R_kgDOQPe8qg",
          "name": "niri",
          "full_name": "martinetd/niri",
          "private": false,
          "owner": {
            "login": "martinetd",
            "id": 1729331,
            "node_id": "MDQ6VXNlcjE3MjkzMzE=",
            "avatar_url": "https://avatars.githubusercontent.com/u/1729331?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/martinetd",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/martinetd/niri",
          "created_at": "2025-11-05T04:13:50Z",
          "updated_at": "2026-02-08T06:55:07Z",
          "pushed_at": "2025-11-05T04:14:44Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6010,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2ca2b3c866bc781b12c334a9f949b3db6d7c943",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2751"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2751"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2751"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2751/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2751/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2751/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/27d5300665e5c1e65199e43bc7ed216f37291f76"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2746",
      "id": 2976951727,
      "node_id": "PR_kwDOKFkxdc6xcK2v",
      "number": 2746,
      "state": "open",
      "locked": false,
      "title": "feat: add new input-passthrough window rule",
      "user": {
        "login": "zitongcharliedeng",
        "id": 108423881,
        "node_id": "U_kgDOBnZqyQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/108423881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zitongcharliedeng",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Adds a new window rule that makes windows transparent to input events, allowing clicks to pass through to windows below.\r\n\r\nUse cases: Gaming overlays, custom HUDs, desktop-wide status displays, or watching content on top without stealing input from applications underneath (Discord/OBS/video players over games or coding tools). Especially useful when coupled with floating and opacity rules to create custom overlays with ease. No other window manager has this feature surprisingly afaik.\r\n\r\n## Implementation\r\n\r\n- Added `input_passthrough` config property to window rules.\r\n- Modified `Tile::hit()` to return None for passthrough windows.\r\n\r\nCore logic is a simple check in `tile.rs`:\r\n```rust\r\nif self.window.rules().input_passthrough == Some(tr>\r\n    return None; // Pass through all input\r\n}\r\n```\r\n\r\n## Example usage:\r\n```kdl\r\nwindow-rule {\r\n    match app-id=r#\"^discord$\"#\r\n    opacity 0.5  \r\n    //^ Optional - just to see content under if target window is 100% alpha\r\n    input-passthrough true\r\n}\r\n```",
      "created_at": "2025-11-04T14:57:50Z",
      "updated_at": "2025-11-10T21:32:26Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "zitongcharliedeng:input-passthrough",
        "ref": "input-passthrough",
        "sha": "7dc68c73a65ae630315fad2955bdd6ca65b787ae",
        "user": {
          "login": "zitongcharliedeng",
          "id": 108423881,
          "node_id": "U_kgDOBnZqyQ",
          "avatar_url": "https://avatars.githubusercontent.com/u/108423881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/zitongcharliedeng",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1089567906,
          "node_id": "R_kgDOQPF8og",
          "name": "niri",
          "full_name": "zitongcharliedeng/niri",
          "private": false,
          "owner": {
            "login": "zitongcharliedeng",
            "id": 108423881,
            "node_id": "U_kgDOBnZqyQ",
            "avatar_url": "https://avatars.githubusercontent.com/u/108423881?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/zitongcharliedeng",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/zitongcharliedeng/niri",
          "created_at": "2025-11-04T14:16:08Z",
          "updated_at": "2026-02-08T06:55:07Z",
          "pushed_at": "2025-11-04T14:57:03Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6010,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2ca2b3c866bc781b12c334a9f949b3db6d7c943",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2746"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2746"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2746"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2746/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2746/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2746/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/7dc68c73a65ae630315fad2955bdd6ca65b787ae"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2712",
      "id": 2964618120,
      "node_id": "PR_kwDOKFkxdc6wtHuI",
      "number": 2712,
      "state": "open",
      "locked": false,
      "title": "Add option to prevent cursor warping when switching outputs",
      "user": {
        "login": "DerEchteJoghurt",
        "id": 69429360,
        "node_id": "MDQ6VXNlcjY5NDI5MzYw",
        "avatar_url": "https://avatars.githubusercontent.com/u/69429360?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DerEchteJoghurt",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR adds a `disable-mouse-warp-to-focused-output` option which prevents warping the cursor to another monitor. See https://github.com/YaLTeR/niri/discussions/2704.",
      "created_at": "2025-10-30T20:42:12Z",
      "updated_at": "2026-01-06T12:48:30Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "d6e8db1beb293a7074cafd0cfc54e3909a6fcbd5",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "DerEchteJoghurt:feature/disable-mouse-warps",
        "ref": "feature/disable-mouse-warps",
        "sha": "c33a8bedef939e13c3a437815e5793730f0288ef",
        "user": {
          "login": "DerEchteJoghurt",
          "id": 69429360,
          "node_id": "MDQ6VXNlcjY5NDI5MzYw",
          "avatar_url": "https://avatars.githubusercontent.com/u/69429360?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/DerEchteJoghurt",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1086732591,
          "node_id": "R_kgDOQMY5Lw",
          "name": "niri",
          "full_name": "DerEchteJoghurt/niri",
          "private": false,
          "owner": {
            "login": "DerEchteJoghurt",
            "id": 69429360,
            "node_id": "MDQ6VXNlcjY5NDI5MzYw",
            "avatar_url": "https://avatars.githubusercontent.com/u/69429360?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/DerEchteJoghurt",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/DerEchteJoghurt/niri",
          "created_at": "2025-10-30T20:31:46Z",
          "updated_at": "2026-02-08T06:55:06Z",
          "pushed_at": "2025-11-01T12:42:12Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 9940,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "e2576879216a39e5c45b9d2906531bc2065e724c",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2712"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2712"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2712"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2712/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2712/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2712/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/c33a8bedef939e13c3a437815e5793730f0288ef"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2659",
      "id": 2937859242,
      "node_id": "PR_kwDOKFkxdc6vHCyq",
      "number": 2659,
      "state": "open",
      "locked": false,
      "title": "feat: make shadow sizing more customizable",
      "user": {
        "login": "soqb",
        "id": 67161944,
        "node_id": "MDQ6VXNlcjY3MTYxOTQ0",
        "avatar_url": "https://avatars.githubusercontent.com/u/67161944?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/soqb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## `shadow { struts {} }`\r\nthis PR adds support for struts in shadows:\r\n```kdl\r\nlayout {\r\n\tshadow {\r\n\t\tstruts {\r\n\t\t\ttop 20\r\n\t\t\tbottom 20\r\n\t\t}\r\n\t}\r\n}\r\n\r\noverview {\r\n\tworkspace-shadow {\r\n\t\tstruts {\r\n\t\t\ttop 20\r\n\t\t\tbottom 20\r\n\t\t\tleft -20\r\n\t\t\tright -20\r\n\t\t}\r\n\t}\r\n}\r\n```\r\n\r\n## `layout { background-in-working-area-only }`\r\n\r\nalso introduced, is a new `background-in-working-area-only` flag which will change how background & workspace shadows are calculated. here is a comparison of overview with the flag on and off:\r\n\r\n<table>\r\n<td><img width=\"552\" alt=\"Screenshot from 2025-10-22 17-53-04\" src=\"https://github.com/user-attachments/assets/76d7f5c2-6f66-4c9a-964d-a5facbe7b743\" /></td>\r\n<td><img width=\"552\" alt=\"Screenshot from 2025-10-22 17-56-01\" src=\"https://github.com/user-attachments/assets/fe646e67-64f6-4fa6-b4ca-9fd8191a15af\" /></td></table>\r\n",
      "created_at": "2025-10-22T17:05:18Z",
      "updated_at": "2025-10-22T17:25:28Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "soqb:feat/shadow-sizing",
        "ref": "feat/shadow-sizing",
        "sha": "1f72ac98b0d0761bd855e2239a81c935c8d183ab",
        "user": {
          "login": "soqb",
          "id": 67161944,
          "node_id": "MDQ6VXNlcjY3MTYxOTQ0",
          "avatar_url": "https://avatars.githubusercontent.com/u/67161944?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/soqb",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1081327456,
          "node_id": "R_kgDOQHO_YA",
          "name": "niri",
          "full_name": "soqb/niri",
          "private": false,
          "owner": {
            "login": "soqb",
            "id": 67161944,
            "node_id": "MDQ6VXNlcjY3MTYxOTQ0",
            "avatar_url": "https://avatars.githubusercontent.com/u/67161944?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/soqb",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/soqb/niri",
          "created_at": "2025-10-22T16:15:24Z",
          "updated_at": "2026-02-08T06:55:05Z",
          "pushed_at": "2025-10-22T17:02:43Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5947,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "b3245b81a6ed8edfaf5388a74d2e0a23c24941e5",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2659"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2659"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2659"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2659/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2659/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2659/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/1f72ac98b0d0761bd855e2239a81c935c8d183ab"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2609",
      "id": 2920597124,
      "node_id": "PR_kwDOKFkxdc6uFMaE",
      "number": 2609,
      "state": "open",
      "locked": false,
      "title": "feat: force render",
      "user": {
        "login": "busyoGG",
        "id": 52122634,
        "node_id": "MDQ6VXNlcjUyMTIyNjM0",
        "avatar_url": "https://avatars.githubusercontent.com/u/52122634?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/busyoGG",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Allows the user to force a window to render even when it is offscreen or being captured by a screencast.\r\n\r\nThis behavior is controlled by the following window rule:\r\n\r\n```\r\nwindow-rule {\r\n    // match rule\r\n    force-render true    // not needed if the window is being cast\r\n    force-render-fps 60 // if you need fps limit\r\n}\r\n```\r\n\r\nhttps://github.com/user-attachments/assets/a9ed1da3-ed8c-4ef1-9e5c-a73ad2656a6b\r\n\r\n\r\n",
      "created_at": "2025-10-16T12:56:59Z",
      "updated_at": "2026-02-27T15:50:14Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "busyoGG:force_render",
        "ref": "force_render",
        "sha": "36c4cc0aab659116104f59749cde3c04818afcb8",
        "user": {
          "login": "busyoGG",
          "id": 52122634,
          "node_id": "MDQ6VXNlcjUyMTIyNjM0",
          "avatar_url": "https://avatars.githubusercontent.com/u/52122634?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/busyoGG",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1077198713,
          "node_id": "R_kgDOQDS_eQ",
          "name": "niri",
          "full_name": "busyoGG/niri",
          "private": false,
          "owner": {
            "login": "busyoGG",
            "id": 52122634,
            "node_id": "MDQ6VXNlcjUyMTIyNjM0",
            "avatar_url": "https://avatars.githubusercontent.com/u/52122634?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/busyoGG",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/busyoGG/niri",
          "created_at": "2025-10-15T23:24:54Z",
          "updated_at": "2026-02-28T00:17:48Z",
          "pushed_at": "2026-02-20T10:09:58Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 10883,
          "stargazers_count": 1,
          "watchers_count": 1,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 1,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "2a9d0e495a011a124b37532dfcfb3c780fd2eb89",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2609"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2609"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2609"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2609/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2609/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2609/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/36c4cc0aab659116104f59749cde3c04818afcb8"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2572",
      "id": 2906248399,
      "node_id": "PR_kwDOKFkxdc6tOdTP",
      "number": 2572,
      "state": "open",
      "locked": false,
      "title": "Add ToggleForceShortcutsInhibit action",
      "user": {
        "login": "TheNeikos",
        "id": 1631166,
        "node_id": "MDQ6VXNlcjE2MzExNjY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1631166?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/TheNeikos",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "I use `Alt` as my Mod key, and some applications force you to use `Alt` for actions. With this feature, I can now disable global shortcuts and use them normally. \r\n\r\nThis is mainly intended for long-running usage, eg. games or editing software.\r\n\r\n\r\nI tried to follow the conventions in the repo and mainly reflected the 'toggle-inhibitors' action here. I'm open ofc to any change requests etc",
      "created_at": "2025-10-11T08:33:56Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "TheNeikos:feature/add_toggle_inhibit",
        "ref": "feature/add_toggle_inhibit",
        "sha": "a24e7cad8b3d34077c252602835b7d06ae31c5a4",
        "user": {
          "login": "TheNeikos",
          "id": 1631166,
          "node_id": "MDQ6VXNlcjE2MzExNjY=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1631166?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/TheNeikos",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1074128309,
          "node_id": "R_kgDOQAXltQ",
          "name": "niri",
          "full_name": "TheNeikos/niri",
          "private": false,
          "owner": {
            "login": "TheNeikos",
            "id": 1631166,
            "node_id": "MDQ6VXNlcjE2MzExNjY=",
            "avatar_url": "https://avatars.githubusercontent.com/u/1631166?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/TheNeikos",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/TheNeikos/niri",
          "created_at": "2025-10-11T07:39:55Z",
          "updated_at": "2026-02-08T06:55:03Z",
          "pushed_at": "2025-10-11T14:10:04Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6063,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2572"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2572"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2572"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2572/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2572/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2572/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/a24e7cad8b3d34077c252602835b7d06ae31c5a4"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2564",
      "id": 2904365876,
      "node_id": "PR_kwDOKFkxdc6tHRs0",
      "number": 2564,
      "state": "open",
      "locked": false,
      "title": "feat: allow specifying `custom-shader` by path",
      "user": {
        "login": "HigherOrderLogic",
        "id": 73709188,
        "node_id": "MDQ6VXNlcjczNzA5MTg4",
        "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/HigherOrderLogic",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Allow user to specifying custom shader by path. The path is also tracked for hot reloading.\r\n\r\n~~TODO: add docs.~~",
      "created_at": "2025-10-10T15:03:44Z",
      "updated_at": "2025-11-19T03:58:52Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "1895b801e9dd6e6eed04d8853c58a49b016ac4df",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "HigherOrderLogic:feat/custom-shader-path",
        "ref": "feat/custom-shader-path",
        "sha": "8a46c1752538835654e5ed4983793b3b1f320020",
        "user": {
          "login": "HigherOrderLogic",
          "id": 73709188,
          "node_id": "MDQ6VXNlcjczNzA5MTg4",
          "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/HigherOrderLogic",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 977357099,
          "node_id": "R_kgDOOkFJKw",
          "name": "niri-wm",
          "full_name": "HigherOrderLogic/niri-wm",
          "private": false,
          "owner": {
            "login": "HigherOrderLogic",
            "id": 73709188,
            "node_id": "MDQ6VXNlcjczNzA5MTg4",
            "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/HigherOrderLogic",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/HigherOrderLogic/niri-wm",
          "created_at": "2025-05-04T02:35:01Z",
          "updated_at": "2026-02-08T06:54:43Z",
          "pushed_at": "2026-02-13T13:42:41Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6938,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "6ca21e7bfdd559263dbb54fb2bef51c97ba791fc",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2564"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2564"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2564"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2564/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2564/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2564/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/8a46c1752538835654e5ed4983793b3b1f320020"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2562",
      "id": 2902616293,
      "node_id": "PR_kwDOKFkxdc6tAmjl",
      "number": 2562,
      "state": "open",
      "locked": false,
      "title": "Add BMP clipboard format for screenshots (with aliases)",
      "user": {
        "login": "remme123",
        "id": 10069392,
        "node_id": "MDQ6VXNlcjEwMDY5Mzky",
        "avatar_url": "https://avatars.githubusercontent.com/u/10069392?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/remme123",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "- freerdp clipboard only accepts BMP; add BMP improves compatibility\r\n- Align with apps like eog that publish many image MIME types\r\n\r\nImplementation:\r\n- Encode PNG and BMP (32bpp BGRX, bottom-up) for screenshots\r\n- Advertise: image/png, image/bmp, image/x-bmp, image/x-MS-bmp, image/x-ms-bmp, image/x-win-bitmap\r\n- Send bytes by requested MIME\r\n- Keep on-disk save as PNG (unchanged)\r\n\r\nCompatibility:\r\n- Fix negative height by using bottom-up BMP\r\n- Use BGRX to improve support in older clients (e.g., FreeRDP)\r\n\r\nMime types set by niri now:\r\n```bash\r\n[hello@fc ~]$ wl-paste -l\r\nimage/png\r\nimage/bmp\r\nimage/x-bmp\r\nimage/x-MS-bmp\r\nimage/x-ms-bmp\r\nimage/x-win-bitmap\r\n```\r\n\r\nMime types set by eog:\r\n```bash\r\n[hello@fc ~]3$ wl-paste --list-types\r\nimage/png\r\nimage/jpeg\r\nimage/avif\r\nimage/bmp\r\nimage/x-bmp\r\nimage/x-MS-bmp\r\nimage/x-icon\r\nimage/x-ico\r\nimage/x-win-bitmap\r\nimage/vnd.microsoft.icon\r\napplication/ico\r\nimage/ico\r\nimage/icon\r\ntext/ico\r\nimage/jxl\r\nimage/tiff\r\nimage/webp\r\naudio/x-riff\r\ntext/plain;charset=utf-8\r\nUTF8_STRING\r\nCOMPOUND_TEXT\r\nTEXT\r\ntext/plain\r\nSTRING\r\ntext/plain;charset=utf-8\r\ntext/plain\r\ntext/uri-list\r\napplication/vnd.portal.filetransfer\r\napplication/vnd.portal.files\r\n```\r\n\r\nThe code was written by Cursor. I’ve reviewed all the changes and didn’t find any issues.\r\n\r\nI’ve already compiled, run, and tested it — now I can successfully paste Niri screenshots in FreeRDP.",
      "created_at": "2025-10-10T04:43:20Z",
      "updated_at": "2025-12-18T05:18:50Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "remme123:cursor/add-bmp-format-to-clipboard-screenshot-e656",
        "ref": "cursor/add-bmp-format-to-clipboard-screenshot-e656",
        "sha": "e491b8aca8d721230333c25cc98ca0c01734f578",
        "user": {
          "login": "remme123",
          "id": 10069392,
          "node_id": "MDQ6VXNlcjEwMDY5Mzky",
          "avatar_url": "https://avatars.githubusercontent.com/u/10069392?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/remme123",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1072962701,
          "node_id": "R_kgDOP_QcjQ",
          "name": "niri",
          "full_name": "remme123/niri",
          "private": false,
          "owner": {
            "login": "remme123",
            "id": 10069392,
            "node_id": "MDQ6VXNlcjEwMDY5Mzky",
            "avatar_url": "https://avatars.githubusercontent.com/u/10069392?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/remme123",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/remme123/niri",
          "created_at": "2025-10-09T12:56:32Z",
          "updated_at": "2026-02-08T06:55:02Z",
          "pushed_at": "2025-10-10T03:50:26Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 9500,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 1,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 1,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2562"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2562"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2562"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2562/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2562/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2562/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/e491b8aca8d721230333c25cc98ca0c01734f578"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2536",
      "id": 2892242955,
      "node_id": "PR_kwDOKFkxdc6sZCAL",
      "number": 2536,
      "state": "open",
      "locked": false,
      "title": "feat: expose TabletPadButton as a trigger for using commands",
      "user": {
        "login": "coleleavitt",
        "id": 75138914,
        "node_id": "MDQ6VXNlcjc1MTM4OTE0",
        "avatar_url": "https://avatars.githubusercontent.com/u/75138914?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/coleleavitt",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": null,
      "created_at": "2025-10-06T23:54:24Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "39c9eff2edac9007910614bc16405e15bea1f1f3",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "coleleavitt:feat/INPUT-TabletPadButton",
        "ref": "feat/INPUT-TabletPadButton",
        "sha": "3282613bf03d7a31787867627d0f3326c52ed293",
        "user": {
          "login": "coleleavitt",
          "id": 75138914,
          "node_id": "MDQ6VXNlcjc1MTM4OTE0",
          "avatar_url": "https://avatars.githubusercontent.com/u/75138914?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/coleleavitt",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 945242252,
          "node_id": "R_kgDOOFdAjA",
          "name": "niri",
          "full_name": "coleleavitt/niri",
          "private": false,
          "owner": {
            "login": "coleleavitt",
            "id": 75138914,
            "node_id": "MDQ6VXNlcjc1MTM4OTE0",
            "avatar_url": "https://avatars.githubusercontent.com/u/75138914?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/coleleavitt",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/coleleavitt/niri",
          "created_at": "2025-03-09T01:15:32Z",
          "updated_at": "2026-02-22T17:49:24Z",
          "pushed_at": "2026-02-22T17:55:20Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 10970,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 1,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 1,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2536"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2536"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2536"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2536/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2536/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2536/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/3282613bf03d7a31787867627d0f3326c52ed293"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2499",
      "id": 2879435358,
      "node_id": "PR_kwDOKFkxdc6roLJe",
      "number": 2499,
      "state": "open",
      "locked": false,
      "title": "Add option for mouse movement toggling DPMS",
      "user": {
        "login": "wu4",
        "id": 10952527,
        "node_id": "MDQ6VXNlcjEwOTUyNTI3",
        "avatar_url": "https://avatars.githubusercontent.com/u/10952527?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/wu4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "I've got a very sensitive mouse, and I typically come back to find my monitor awake up any time anything happens in the house. I've been using a temporary solution of just flipping the mouse.  I thought to myself, surely other people would like to have it as an option, so I decided to draft a PR - `input.mouse.wake-monitor-on-movement` is required to be set in order for mouse movement to wake the monitor. I have it marked as a draft for these reasons:\r\n\r\n- I'm not sure if `input.mouse` is the proper home for this option\r\n- I haven't added anything to the docs yet because of the aforementioned\r\n- I moved `should_activate_monitors` into `State` in order to be able to read the config\r\n- I also added a small snippet to capture inputs that wake the monitor. I found it a bit annoying that a space press would pass through to whatever the currently-focused window was. Maybe this could be an option too?",
      "created_at": "2025-10-01T19:42:04Z",
      "updated_at": "2026-02-16T06:01:16Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "04d5b6ab3a55e2590ebd2721cdc9309265d99d8c",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "wu4:no_pointer_dpms",
        "ref": "no_pointer_dpms",
        "sha": "c97b1784d03b100b8ffdb13380d3e63a56ee8745",
        "user": {
          "login": "wu4",
          "id": 10952527,
          "node_id": "MDQ6VXNlcjEwOTUyNTI3",
          "avatar_url": "https://avatars.githubusercontent.com/u/10952527?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/wu4",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1067890780,
          "node_id": "R_kgDOP6a4XA",
          "name": "niri",
          "full_name": "wu4/niri",
          "private": false,
          "owner": {
            "login": "wu4",
            "id": 10952527,
            "node_id": "MDQ6VXNlcjEwOTUyNTI3",
            "avatar_url": "https://avatars.githubusercontent.com/u/10952527?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/wu4",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/wu4/niri",
          "created_at": "2025-10-01T14:35:27Z",
          "updated_at": "2026-02-08T06:55:01Z",
          "pushed_at": "2025-10-01T19:38:22Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5266,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2499"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2499"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2499"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2499/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2499/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2499/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/c97b1784d03b100b8ffdb13380d3e63a56ee8745"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2456",
      "id": 2865640846,
      "node_id": "PR_kwDOKFkxdc6qzjWO",
      "number": 2456,
      "state": "open",
      "locked": false,
      "title": "Implement release keybinds and modifier-only binds",
      "user": {
        "login": "flowerysong",
        "id": 512266,
        "node_id": "MDQ6VXNlcjUxMjI2Ng==",
        "avatar_url": "https://avatars.githubusercontent.com/u/512266?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/flowerysong",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This builds on the work @Glitch752 did in #1923, but takes it in a slightly different direction.\r\n\r\nInstead of tying bind validity to (notional, because `Mod` was never actually suppressed) key suppression status and whether any bind has already triggered, we track the most recently pressed key, make it the only one that can trigger a bind on release, and invalidate it when any key is released or any key or mouse button is pressed. This should prevent these binds from unexpectedly triggering when a user is trying to input something else, while allowing intentional binding of the same key to actions on press and release (e.g. for push to talk.)\r\n\r\nI also made the implementation of modifier-only binds more generic. Non-`Mod` modifier binds are still configured with keysyms for the trigger (so `Ctrl release=true { toggle-overview; }` won't work but `Control_L release=true { toggle-overview; }` will.)\r\n\r\nIt seems to function as intended.\r\n\r\nCloses #1923, fixes #1813, closes #1148, closes #605.",
      "created_at": "2025-09-26T22:16:44Z",
      "updated_at": "2026-02-22T06:27:43Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "a6bf8ca85f6bae2465ea4df48d52e784d79b1982",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "flowerysong:release-keybinds",
        "ref": "release-keybinds",
        "sha": "a5591c69fa81b69d6315f07609acde97eae31c93",
        "user": {
          "login": "flowerysong",
          "id": 512266,
          "node_id": "MDQ6VXNlcjUxMjI2Ng==",
          "avatar_url": "https://avatars.githubusercontent.com/u/512266?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/flowerysong",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1060428629,
          "node_id": "R_kgDOPzTbVQ",
          "name": "niri",
          "full_name": "flowerysong/niri",
          "private": false,
          "owner": {
            "login": "flowerysong",
            "id": 512266,
            "node_id": "MDQ6VXNlcjUxMjI2Ng==",
            "avatar_url": "https://avatars.githubusercontent.com/u/512266?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/flowerysong",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/flowerysong/niri",
          "created_at": "2025-09-19T22:40:00Z",
          "updated_at": "2026-02-14T20:13:20Z",
          "pushed_at": "2026-01-26T00:30:11Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 6942,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 1,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": false,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 1,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "5ddcf195dd6cb24cf67c24d4622ef0a4dca9ed12",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2456"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2456"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2456"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2456/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2456/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2456/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/a5591c69fa81b69d6315f07609acde97eae31c93"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1,
        6,
        1923,
        1813,
        1148,
        605
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2436",
      "id": 2855191716,
      "node_id": "PR_kwDOKFkxdc6qLsSk",
      "number": 2436,
      "state": "open",
      "locked": false,
      "title": "layout/scrolling: window size limit fix in set_column_width",
      "user": {
        "login": "shettysach",
        "id": 132273464,
        "node_id": "U_kgDOB-JVOA",
        "avatar_url": "https://avatars.githubusercontent.com/u/132273464?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/shettysach",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Solves #2410 \r\n\r\nThis change clamps width between min_width and max_width in `set_column_width` (src/layout/scrolling.rs). \r\nThe implementation is similar to the one in `update_tile_sizes_with_transaction` (src/layout/scrolling.rs).",
      "created_at": "2025-09-24T03:11:52Z",
      "updated_at": "2025-11-24T04:38:19Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "a6588ae28a910b3df27a346ab90e95370b69981a",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "shettysach:main",
        "ref": "main",
        "sha": "cbf3d6f6a7907a3c102b5e4ecbf04489ab50448f",
        "user": {
          "login": "shettysach",
          "id": 132273464,
          "node_id": "U_kgDOB-JVOA",
          "avatar_url": "https://avatars.githubusercontent.com/u/132273464?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/shettysach",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1062904576,
          "node_id": "R_kgDOP1qjAA",
          "name": "niri",
          "full_name": "shettysach/niri",
          "private": false,
          "owner": {
            "login": "shettysach",
            "id": 132273464,
            "node_id": "U_kgDOB-JVOA",
            "avatar_url": "https://avatars.githubusercontent.com/u/132273464?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/shettysach",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/shettysach/niri",
          "created_at": "2025-09-23T22:35:59Z",
          "updated_at": "2026-02-08T06:55:00Z",
          "pushed_at": "2025-11-24T04:25:19Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5526,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2436"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2436"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2436"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2436/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2436/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2436/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/cbf3d6f6a7907a3c102b5e4ecbf04489ab50448f"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2403",
      "id": 2835084743,
      "node_id": "PR_kwDOKFkxdc6o-_XH",
      "number": 2403,
      "state": "open",
      "locked": false,
      "title": "feat: expose keybinds through IPC",
      "user": {
        "login": "HigherOrderLogic",
        "id": 73709188,
        "node_id": "MDQ6VXNlcjczNzA5MTg4",
        "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/HigherOrderLogic",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Expose key binds list through the IPC, which maybe useful for shells to create a custom cheatsheet.\r\n\r\nThis PR builds but I havent test it yet, since I want to get some feedback on a few implementation details.",
      "created_at": "2025-09-17T03:59:01Z",
      "updated_at": "2025-11-11T08:38:02Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "HigherOrderLogic:main",
        "ref": "main",
        "sha": "64474004fb6295146e32b263499e792174730cb8",
        "user": {
          "login": "HigherOrderLogic",
          "id": 73709188,
          "node_id": "MDQ6VXNlcjczNzA5MTg4",
          "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/HigherOrderLogic",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 977357099,
          "node_id": "R_kgDOOkFJKw",
          "name": "niri-wm",
          "full_name": "HigherOrderLogic/niri-wm",
          "private": false,
          "owner": {
            "login": "HigherOrderLogic",
            "id": 73709188,
            "node_id": "MDQ6VXNlcjczNzA5MTg4",
            "avatar_url": "https://avatars.githubusercontent.com/u/73709188?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/HigherOrderLogic",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/HigherOrderLogic/niri-wm",
          "created_at": "2025-05-04T02:35:01Z",
          "updated_at": "2026-02-08T06:54:43Z",
          "pushed_at": "2026-02-13T13:42:41Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6938,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "5c965d6ad679e5687a1579ee43ee6b122e302368",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2403"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2403"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2403"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2403/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2403/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2403/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/64474004fb6295146e32b263499e792174730cb8"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2379",
      "id": 2825498059,
      "node_id": "PR_kwDOKFkxdc6oaa3L",
      "number": 2379,
      "state": "open",
      "locked": false,
      "title": "feat(layout): trigger open animation when moving column or window between outputs",
      "user": {
        "login": "objz",
        "id": 118930716,
        "node_id": "U_kgDOBxa9HA",
        "avatar_url": "https://avatars.githubusercontent.com/u/118930716?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/objz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "When moving a window or a whole column to another output, the open animation now plays on the destination. This makes it easier to see what actually moved, especially if there are multiple similar windows (e.g. terminals) on the target output. It just reuses `start_open_animation_for_window(..)` so it respects whatever animation config the user already set.\r\n\r\n**Details**\r\n\r\n* Single window moves => trigger open animation for that window.\r\n* Column moves => trigger open animation for every window in the column.\r\n* Same-output moves are unchanged.\r\n* Floating handling unchanged.\r\n\r\n**Why**\r\nBefore, windows/columns just appeared on the other output, which can be hard to spot in busy layouts. The animation makes the move obvious without adding any new config or custom effect.\r\n\r\n---\r\n\r\n**Before:**\r\n\r\nhttps://github.com/user-attachments/assets/064390c2-7269-4ce3-afc7-5508867e1b09\r\n\r\n\r\n**After:**\r\n\r\nhttps://github.com/user-attachments/assets/80a456c4-b8c0-49ef-899f-0e793c672cd0\r\n\r\n\r\n\r\n",
      "created_at": "2025-09-13T14:46:42Z",
      "updated_at": "2025-11-30T11:59:22Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "2253ea008508fd8ad275187e10124deab13687ef",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "objz:main",
        "ref": "main",
        "sha": "ae0dcb4eabaa67833a15e7075ab68c99e12f0668",
        "user": {
          "login": "objz",
          "id": 118930716,
          "node_id": "U_kgDOBxa9HA",
          "avatar_url": "https://avatars.githubusercontent.com/u/118930716?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/objz",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1056072970,
          "node_id": "R_kgDOPvJlCg",
          "name": "niri",
          "full_name": "objz/niri",
          "private": false,
          "owner": {
            "login": "objz",
            "id": 118930716,
            "node_id": "U_kgDOBxa9HA",
            "avatar_url": "https://avatars.githubusercontent.com/u/118930716?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/objz",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/objz/niri",
          "created_at": "2025-09-13T10:31:29Z",
          "updated_at": "2026-02-08T06:54:59Z",
          "pushed_at": "2025-11-30T11:59:21Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5924,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "311ca6b5da19f5acd7d3e481620de57240ce8f7c",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2379"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2379"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2379"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2379/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2379/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2379/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/ae0dcb4eabaa67833a15e7075ab68c99e12f0668"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2373",
      "id": 2821435283,
      "node_id": "PR_kwDOKFkxdc6oK6-T",
      "number": 2373,
      "state": "open",
      "locked": false,
      "title": "Add ability to inhibit idle on windows",
      "user": {
        "login": "griccardos",
        "id": 30464685,
        "node_id": "MDQ6VXNlcjMwNDY0Njg1",
        "avatar_url": "https://avatars.githubusercontent.com/u/30464685?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/griccardos",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This adds the ability to inhibit idle on a window if configured.\r\n\r\nThere are a few discussions about the topic\r\n#742 \r\n#1855 \r\n\r\nThere are 3 options:\r\n- `inhibit_idle \"always\"` - whenever this window is present. \r\n- `inhibit_idle \"fullscreen\"` - whenever this window is fullscreen\r\n- `inhibit_idle  \"never\"` - don't inhibit on this window\r\n\r\nOption 1 is useful, for example converting a video file that may take a couple of hours, but the window itself is not necessarily fullscreen\r\n```kdl\r\nwindow-rule {\r\n    match title=\"HandBrake\"\r\n    inhibit-idle \"always\"\r\n}\r\n```\r\nOption 2 is useful, for example when you are watching video, playing games with a controller and the window is fullscreen\r\n```kdl\r\nwindow-rule {\r\n    match app-id=\"librewolf\"\r\n    inhibit-idle \"fullscreen\"\r\n}\r\n```\r\nOption 3 is to disable inhibit on this window for example if you have enabled inhibit fullscreen on all windows, but you want this window as the exception not to inhibit when fullscreen\r\n```kdl\r\nwindow-rule {\r\n    inhibit-idle \"fullscreen\"\r\n}\r\nwindow-rule {\r\n    match app-id=\"Alacritty\"\r\n    inhibit-idle \"never\"\r\n}\r\n```\r\n",
      "created_at": "2025-09-12T06:29:46Z",
      "updated_at": "2026-02-09T05:44:23Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "11a80e20601243d608dfa4be80409166c3943996",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "griccardos:inhibit_idle",
        "ref": "inhibit_idle",
        "sha": "fbd363d9cc6aa9cda58babcd6f9fb7e251914e2e",
        "user": {
          "login": "griccardos",
          "id": 30464685,
          "node_id": "MDQ6VXNlcjMwNDY0Njg1",
          "avatar_url": "https://avatars.githubusercontent.com/u/30464685?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/griccardos",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1055121213,
          "node_id": "R_kgDOPuPfPQ",
          "name": "niri",
          "full_name": "griccardos/niri",
          "private": false,
          "owner": {
            "login": "griccardos",
            "id": 30464685,
            "node_id": "MDQ6VXNlcjMwNDY0Njg1",
            "avatar_url": "https://avatars.githubusercontent.com/u/30464685?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/griccardos",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/griccardos/niri",
          "created_at": "2025-09-11T19:53:41Z",
          "updated_at": "2026-02-08T06:54:58Z",
          "pushed_at": "2025-12-02T06:46:32Z",
          "homepage": "https://yalter.github.io/niri/",
          "size": 5919,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "311ca6b5da19f5acd7d3e481620de57240ce8f7c",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2373"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2373"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2373"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2373/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2373/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2373/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/fbd363d9cc6aa9cda58babcd6f9fb7e251914e2e"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        7,
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2323",
      "id": 2787943661,
      "node_id": "PR_kwDOKFkxdc6mLKTt",
      "number": 2323,
      "state": "open",
      "locked": false,
      "title": "CI: automatically update flake.lock",
      "user": {
        "login": "ninelore",
        "id": 21343557,
        "node_id": "MDQ6VXNlcjIxMzQzNTU3",
        "avatar_url": "https://avatars.githubusercontent.com/u/21343557?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ninelore",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Update Nix flake.lock weekly via GitHub Actions. This requires GitHub actions to have write access and to be allowed to create pull requests in the repository settings.\r\n\r\nI've set the cron to every tuesday midnight GMT. This can be changed as desired.",
      "created_at": "2025-08-31T17:42:13Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "b203848ac6097b5960576d0ab4e7d5aecbf0587b",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "ninelore:flake-updates",
        "ref": "flake-updates",
        "sha": "b1a9b4b848ba2d3b068867b7d22587b76eb84188",
        "user": {
          "login": "ninelore",
          "id": 21343557,
          "node_id": "MDQ6VXNlcjIxMzQzNTU3",
          "avatar_url": "https://avatars.githubusercontent.com/u/21343557?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ninelore",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1047995649,
          "node_id": "R_kgDOPnclAQ",
          "name": "niri",
          "full_name": "ninelore/niri",
          "private": false,
          "owner": {
            "login": "ninelore",
            "id": 21343557,
            "node_id": "MDQ6VXNlcjIxMzQzNTU3",
            "avatar_url": "https://avatars.githubusercontent.com/u/21343557?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ninelore",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/ninelore/niri",
          "created_at": "2025-08-31T17:30:16Z",
          "updated_at": "2026-02-08T06:54:58Z",
          "pushed_at": "2025-08-31T17:36:25Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5187,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2323"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2323"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2323"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2323/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2323/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2323/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/b1a9b4b848ba2d3b068867b7d22587b76eb84188"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2319",
      "id": 2787069365,
      "node_id": "PR_kwDOKFkxdc6mH021",
      "number": 2319,
      "state": "open",
      "locked": false,
      "title": "Feature: Add auto-confirm option to screenshot ui",
      "user": {
        "login": "gonengazit",
        "id": 32018445,
        "node_id": "MDQ6VXNlcjMyMDE4NDQ1",
        "avatar_url": "https://avatars.githubusercontent.com/u/32018445?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gonengazit",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "add an option to auto-confirm screenshots using the screenshot ui - i.e. - immediately take a screenshot once the user makes a selection without waiting for the user to confirm/press Enter",
      "created_at": "2025-08-30T20:09:06Z",
      "updated_at": "2025-11-29T22:42:16Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "gonengazit:main",
        "ref": "main",
        "sha": "fdc1185e16d5f8c941935921a617143706021bd6",
        "user": {
          "login": "gonengazit",
          "id": 32018445,
          "node_id": "MDQ6VXNlcjMyMDE4NDQ1",
          "avatar_url": "https://avatars.githubusercontent.com/u/32018445?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/gonengazit",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1047611794,
          "node_id": "R_kgDOPnFJkg",
          "name": "niri",
          "full_name": "gonengazit/niri",
          "private": false,
          "owner": {
            "login": "gonengazit",
            "id": 32018445,
            "node_id": "MDQ6VXNlcjMyMDE4NDQ1",
            "avatar_url": "https://avatars.githubusercontent.com/u/32018445?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/gonengazit",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/gonengazit/niri",
          "created_at": "2025-08-30T20:06:37Z",
          "updated_at": "2026-02-08T06:54:57Z",
          "pushed_at": "2025-08-30T20:07:26Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5187,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2319"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2319"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2319"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2319/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2319/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2319/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/fdc1185e16d5f8c941935921a617143706021bd6"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2284",
      "id": 2769643797,
      "node_id": "PR_kwDOKFkxdc6lFWkV",
      "number": 2284,
      "state": "open",
      "locked": false,
      "title": "Support miette 7.4.0 without patching knuffel",
      "user": {
        "login": "FedericoCeratto",
        "id": 91576,
        "node_id": "MDQ6VXNlcjkxNTc2",
        "avatar_url": "https://avatars.githubusercontent.com/u/91576?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/FedericoCeratto",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Knuffel seems to be unmaintained and depends on an older version of miette but niri-config is able to build against miette 7.4.0 with a small code tweak.",
      "created_at": "2025-08-24T07:28:21Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "FedericoCeratto:newer-miette",
        "ref": "newer-miette",
        "sha": "b49549a693b9e2f452b6659324e38e71fc81edbe",
        "user": {
          "login": "FedericoCeratto",
          "id": 91576,
          "node_id": "MDQ6VXNlcjkxNTc2",
          "avatar_url": "https://avatars.githubusercontent.com/u/91576?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/FedericoCeratto",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 948912026,
          "node_id": "R_kgDOOI8_mg",
          "name": "niri",
          "full_name": "FedericoCeratto/niri",
          "private": false,
          "owner": {
            "login": "FedericoCeratto",
            "id": 91576,
            "node_id": "MDQ6VXNlcjkxNTc2",
            "avatar_url": "https://avatars.githubusercontent.com/u/91576?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/FedericoCeratto",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/FedericoCeratto/niri",
          "created_at": "2025-03-15T08:37:30Z",
          "updated_at": "2026-02-08T06:54:39Z",
          "pushed_at": "2025-08-24T13:17:22Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5039,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2284"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2284"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2284"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2284/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2284/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2284/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/b49549a693b9e2f452b6659324e38e71fc81edbe"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2240",
      "id": 2748140493,
      "node_id": "PR_kwDOKFkxdc6jzUvN",
      "number": 2240,
      "state": "open",
      "locked": false,
      "title": "feat: `open-maximized-if-alone` window rule",
      "user": {
        "login": "equals03",
        "id": 18582672,
        "node_id": "MDQ6VXNlcjE4NTgyNjcy",
        "avatar_url": "https://avatars.githubusercontent.com/u/18582672?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/equals03",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR adds a new `open-maximized-if-alone` window rule. \r\n\r\nAs you can imagine It makes a window open maximized only if it's the only one on the workspace.\r\nThis was a feature I missed when I made the move from Hyprland and the only real mention I could find was here https://github.com/YaLTeR/niri/discussions/859, so I gave it a stab.\r\n\r\nSet `open-maximized-if-alone = true`, and the window maximizes only if it's alone on the workspace. If other windows are around, it follows other rules or defaults as usual.\r\n\r\n```kdl\r\nwindow-rule {\r\n    match app-id=\"zen$\"\r\n    match app-id=\"firefox$\"\r\n    \r\n    open-maximized-if-alone true\r\n}\r\n```\r\n",
      "created_at": "2025-08-15T06:28:27Z",
      "updated_at": "2026-02-25T15:49:08Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "equals03:main",
        "ref": "main",
        "sha": "3443526e51ab483e17831065ad9fe3f4902ec74f",
        "user": {
          "login": "equals03",
          "id": 18582672,
          "node_id": "MDQ6VXNlcjE4NTgyNjcy",
          "avatar_url": "https://avatars.githubusercontent.com/u/18582672?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/equals03",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1037928610,
          "node_id": "R_kgDOPd2Iog",
          "name": "niri",
          "full_name": "equals03/niri",
          "private": false,
          "owner": {
            "login": "equals03",
            "id": 18582672,
            "node_id": "MDQ6VXNlcjE4NTgyNjcy",
            "avatar_url": "https://avatars.githubusercontent.com/u/18582672?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/equals03",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/equals03/niri",
          "created_at": "2025-08-14T10:43:37Z",
          "updated_at": "2026-02-08T06:54:56Z",
          "pushed_at": "2025-09-18T22:12:51Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5358,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2240"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2240"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2240"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2240/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2240/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2240/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/3443526e51ab483e17831065ad9fe3f4902ec74f"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2207",
      "id": 2732548781,
      "node_id": "PR_kwDOKFkxdc6i32Kt",
      "number": 2207,
      "state": "open",
      "locked": false,
      "title": "WIP: allow passing skip-animation for focus actions in config and IPC",
      "user": {
        "login": "maxbol",
        "id": 1177725,
        "node_id": "MDQ6VXNlcjExNzc3MjU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1177725?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/maxbol",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "> Nb: This is more of a conversation starter than a full-fledged, ready commit.\r\n\r\nI want animations in niri, especially when navigating with my touchpad or mouse. I think turning off animations for focus actions when doing gestures based navigation looks and feels weird, because the snapping becomes to hard.\r\n\r\nBUT\r\n\r\nI find myself often having a few full-sized text editors open when working on code, and want to be able to switch between them super quickly, without loosing mental bandwidth to watching an animation.\r\n\r\nThis change makes it possible to provide an argument to *some* focus actions called `skip-animation`, that allows you to accomplish both of these things. I can configure my keyboard shortcuts to allow for instantaneous jumps between columns and workspaces, while at the same time preserving the smooth gestures based navigation that I want to have. I'm dogfooding it right now and it works perfectly based on my needs. The change is backwards compatible in that both config and IPC still accepts a parameter-less call to the actions in question. \r\n\r\nIf you like this direction, I can pull together a full PR with this applied to every action where it makes sense. \r\n\r\nBefore doing that, maybe some discussion?\r\n* Is this something anyone else wants? Can you see the use for it?\r\n* Is there some other, more non-intrusive way to do it? (Maybe being able to set a global config option that turns off all animations that would have been triggered by keyboard hotkeys?)\r\n* Should the approach be more generalized? (Ie the possibility of passing a full animation config to the action instead of simply a `skip_animation` boolean?)\r\n* I have never written a line of Rust in my life before this, so let me know if I messed something up!",
      "created_at": "2025-08-09T10:33:13Z",
      "updated_at": "2025-12-08T20:33:19Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "maxbol:feature/allow-overriding-animation-for-actions",
        "ref": "feature/allow-overriding-animation-for-actions",
        "sha": "8a6b01b8feb87fc0e91ac66211d9aea59700bbd4",
        "user": {
          "login": "maxbol",
          "id": 1177725,
          "node_id": "MDQ6VXNlcjExNzc3MjU=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1177725?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/maxbol",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1034335374,
          "node_id": "R_kgDOPaa0jg",
          "name": "niri",
          "full_name": "maxbol/niri",
          "private": false,
          "owner": {
            "login": "maxbol",
            "id": 1177725,
            "node_id": "MDQ6VXNlcjExNzc3MjU=",
            "avatar_url": "https://avatars.githubusercontent.com/u/1177725?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/maxbol",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/maxbol/niri",
          "created_at": "2025-08-08T08:19:39Z",
          "updated_at": "2026-02-08T06:54:55Z",
          "pushed_at": "2025-12-06T20:46:44Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6052,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2207"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2207"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2207"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2207/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2207/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2207/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/8a6b01b8feb87fc0e91ac66211d9aea59700bbd4"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2115",
      "id": 2690063844,
      "node_id": "PR_kwDOKFkxdc6gVx3k",
      "number": 2115,
      "state": "open",
      "locked": false,
      "title": "feat: flexibility in spawn column location ",
      "user": {
        "login": "saeedark",
        "id": 30046662,
        "node_id": "MDQ6VXNlcjMwMDQ2NjYy",
        "avatar_url": "https://avatars.githubusercontent.com/u/30046662?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/saeedark",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Hello,\r\nThank you for developing the Niri.\r\n\r\nApparently , a new window always spawn after the current active column; This PR intend to allow for the customization to spawn it before the active column. (and two more options)\r\n\r\n(I'm new to niri and rust)",
      "created_at": "2025-07-23T21:06:16Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "saeedark:main",
        "ref": "main",
        "sha": "749e05523882d2b0adbc38469408bdcfb6420084",
        "user": {
          "login": "saeedark",
          "id": 30046662,
          "node_id": "MDQ6VXNlcjMwMDQ2NjYy",
          "avatar_url": "https://avatars.githubusercontent.com/u/30046662?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/saeedark",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1024891324,
          "node_id": "R_kgDOPRaZvA",
          "name": "niri",
          "full_name": "saeedark/niri",
          "private": false,
          "owner": {
            "login": "saeedark",
            "id": 30046662,
            "node_id": "MDQ6VXNlcjMwMDQ2NjYy",
            "avatar_url": "https://avatars.githubusercontent.com/u/30046662?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/saeedark",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/saeedark/niri",
          "created_at": "2025-07-23T12:02:02Z",
          "updated_at": "2026-02-08T06:54:54Z",
          "pushed_at": "2025-09-23T23:29:55Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5330,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2115"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2115"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2115"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2115/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2115/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2115/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/749e05523882d2b0adbc38469408bdcfb6420084"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2070",
      "id": 2673448564,
      "node_id": "PR_kwDOKFkxdc6fWZZ0",
      "number": 2070,
      "state": "open",
      "locked": false,
      "title": "fix: retain relative position inside column when switching",
      "user": {
        "login": "mageOfstructs",
        "id": 111154365,
        "node_id": "U_kgDOBqAUvQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/111154365?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mageOfstructs",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "The current behavior when switching to a column is to just focus its first tile. This PR changes this behavior to try to retain the index of the focused window in the previous column. Draft because I realize this is something that should probably be configurable, though I am unsure which section should receive the field.\r\n\r\nFirst PR here so please let me know if there's anything I can change.",
      "created_at": "2025-07-17T10:19:36Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "d017c4b89742ba0a9ea919e8982932e894f2659e",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "mageOfstructs:retain_tile_pos_while_switching",
        "ref": "retain_tile_pos_while_switching",
        "sha": "5f817902f4b18e3f2dacd7895f7e6dac05b96788",
        "user": {
          "login": "mageOfstructs",
          "id": 111154365,
          "node_id": "U_kgDOBqAUvQ",
          "avatar_url": "https://avatars.githubusercontent.com/u/111154365?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mageOfstructs",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1021370726,
          "node_id": "R_kgDOPODhZg",
          "name": "niri",
          "full_name": "mageOfstructs/niri",
          "private": false,
          "owner": {
            "login": "mageOfstructs",
            "id": 111154365,
            "node_id": "U_kgDOBqAUvQ",
            "avatar_url": "https://avatars.githubusercontent.com/u/111154365?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/mageOfstructs",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/mageOfstructs/niri",
          "created_at": "2025-07-17T09:46:23Z",
          "updated_at": "2026-02-08T06:54:53Z",
          "pushed_at": "2025-07-17T10:18:26Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5191,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2070"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2070"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2070"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2070/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2070/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2070/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/5f817902f4b18e3f2dacd7895f7e6dac05b96788"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2044",
      "id": 2664802316,
      "node_id": "PR_kwDOKFkxdc6e1agM",
      "number": 2044,
      "state": "open",
      "locked": false,
      "title": "implement ext-foreign-toplevel-list-v1 by augmenting our existing implementation of foreign toplevels",
      "user": {
        "login": "sodiboo",
        "id": 37938646,
        "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
        "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sodiboo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "- https://github.com/sodiboo/niri/commit/d2d51bcf0ceb6d47fe5b8985268cf0902a2e921d but brought back from the archives.\r\n- duplicate of #1450 but taking a different approach\r\n\r\ni originally didn't submit this as a PR, because i didn't realize there were any client apps that depended on *just toplevel list*: i thought this protocol was useless on its own. but apparently cosmic needs it?\r\n\r\nBesides technical reasons why one approach is better than the other, this implementation has one clear concrete difference over #1450: the `identifier` of a foreign toplevel is stable and can be used to manipulate a toplevel with `niri msg`, they are the same identifier. It's not actually clear that this is a *desirable* trait: do we want to allow clients to parse this identifier? In #1450, the foreign toplevel identifier is random bytes.",
      "created_at": "2025-07-14T16:40:31Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "sodiboo:ext-foreign-toplevel-v1-but-in-2025",
        "ref": "ext-foreign-toplevel-v1-but-in-2025",
        "sha": "db10f901495a04b683a3682e7cf9b974abcb9083",
        "user": {
          "login": "sodiboo",
          "id": 37938646,
          "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
          "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/sodiboo",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 746410718,
          "node_id": "R_kgDOLH1S3g",
          "name": "niri",
          "full_name": "sodiboo/niri",
          "private": false,
          "owner": {
            "login": "sodiboo",
            "id": 37938646,
            "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
            "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/sodiboo",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/sodiboo/niri",
          "created_at": "2024-01-21T23:23:45Z",
          "updated_at": "2026-02-08T06:54:24Z",
          "pushed_at": "2025-08-05T13:17:04Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5467,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2044"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2044"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2044"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2044/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2044/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2044/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/db10f901495a04b683a3682e7cf9b974abcb9083"
        }
      },
      "author_association": "MEMBER",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2033",
      "id": 2662680575,
      "node_id": "PR_kwDOKFkxdc6etUf_",
      "number": 2033,
      "state": "open",
      "locked": false,
      "title": "feat: add WASD and HJKL hardcoded_overview_bind",
      "user": {
        "login": "sharunkumar",
        "id": 715417,
        "node_id": "MDQ6VXNlcjcxNTQxNw==",
        "avatar_url": "https://avatars.githubusercontent.com/u/715417?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharunkumar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Ideally, there should be a way to configure these, but this should be a good stop-gap for having these as default in overview mode, until it can be implemented ",
      "created_at": "2025-07-13T23:56:48Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "dfa155d6c315ad8e6d30bc9e93b97135430a3c75",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "sharunkumar:bind-wasd-hjkl-overview",
        "ref": "bind-wasd-hjkl-overview",
        "sha": "b2693101ee6b39d633265e9f1361dd6605aedaa3",
        "user": {
          "login": "sharunkumar",
          "id": 715417,
          "node_id": "MDQ6VXNlcjcxNTQxNw==",
          "avatar_url": "https://avatars.githubusercontent.com/u/715417?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/sharunkumar",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1019162239,
          "node_id": "R_kgDOPL8ufw",
          "name": "niri",
          "full_name": "sharunkumar/niri",
          "private": false,
          "owner": {
            "login": "sharunkumar",
            "id": 715417,
            "node_id": "MDQ6VXNlcjcxNTQxNw==",
            "avatar_url": "https://avatars.githubusercontent.com/u/715417?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/sharunkumar",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/sharunkumar/niri",
          "created_at": "2025-07-13T21:54:57Z",
          "updated_at": "2026-02-08T06:54:53Z",
          "pushed_at": "2025-07-21T08:21:58Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5150,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2033"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2033"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2033"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2033/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2033/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2033/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/b2693101ee6b39d633265e9f1361dd6605aedaa3"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/2031",
      "id": 2662512504,
      "node_id": "PR_kwDOKFkxdc6esrd4",
      "number": 2031,
      "state": "open",
      "locked": false,
      "title": "WIP: feat: add support for changing input configuration temporarily",
      "user": {
        "login": "lajp",
        "id": 31856315,
        "node_id": "MDQ6VXNlcjMxODU2MzE1",
        "avatar_url": "https://avatars.githubusercontent.com/u/31856315?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/lajp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Related to https://github.com/YaLTeR/niri/discussions/791",
      "created_at": "2025-07-13T20:01:46Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "lajp:transient-input-config",
        "ref": "transient-input-config",
        "sha": "b0d47fa8465c294906569150040b370c73b9833f",
        "user": {
          "login": "lajp",
          "id": 31856315,
          "node_id": "MDQ6VXNlcjMxODU2MzE1",
          "avatar_url": "https://avatars.githubusercontent.com/u/31856315?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/lajp",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1019128778,
          "node_id": "R_kgDOPL6ryg",
          "name": "niri",
          "full_name": "lajp/niri",
          "private": false,
          "owner": {
            "login": "lajp",
            "id": 31856315,
            "node_id": "MDQ6VXNlcjMxODU2MzE1",
            "avatar_url": "https://avatars.githubusercontent.com/u/31856315?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/lajp",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/lajp/niri",
          "created_at": "2025-07-13T19:54:33Z",
          "updated_at": "2026-02-08T06:54:52Z",
          "pushed_at": "2025-07-13T19:58:47Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5122,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2031"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/2031"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2031"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/2031/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2031/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/2031/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/b0d47fa8465c294906569150040b370c73b9833f"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1968",
      "id": 2644503592,
      "node_id": "PR_kwDOKFkxdc6dn-wo",
      "number": 1968,
      "state": "open",
      "locked": false,
      "title": "Exact fullscreen state",
      "user": {
        "login": "Dlurak",
        "id": 84224239,
        "node_id": "MDQ6VXNlcjg0MjI0MjM5",
        "avatar_url": "https://avatars.githubusercontent.com/u/84224239?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Dlurak",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "As already proposed in #337 and #338 I've implemented an way to control the fullscreen mode more precisely.\r\nThere are now 3 actions: `fullscreen`, `normal` and `toggle`. Because `toggle` is the default it is fully downwards compatible.\r\n\r\n## IPC-Controll\r\n\r\n```bash\r\nniri msg action fullscreen-window --action fullscreen\r\nniri msg action fullscreen-window --action normal\r\nniri msg action fullscreen-window --action toggle\r\nniri msg action fullscreen-window # Equal to toggle\r\n````\r\n\r\n## Config\r\n\r\n```kdl\r\n// - \"toggle\", default behavior, toggling between fullscreen and normal\r\n// - \"normal\", setting a window into its normal size independent of its current state\r\n// - \"fullscreen\", setting a window into fullscreen independent of its current state\r\n Mod+Shift+F { fullscreen-window \"toggle\"; }\r\n```",
      "created_at": "2025-07-06T10:57:08Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Dlurak:exact-fullscreen-state",
        "ref": "exact-fullscreen-state",
        "sha": "d5a32972165cccc558dc0f575740f4cdb6258455",
        "user": {
          "login": "Dlurak",
          "id": 84224239,
          "node_id": "MDQ6VXNlcjg0MjI0MjM5",
          "avatar_url": "https://avatars.githubusercontent.com/u/84224239?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Dlurak",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1014752518,
          "node_id": "R_kgDOPHvlBg",
          "name": "niri-fork",
          "full_name": "Dlurak/niri-fork",
          "private": false,
          "owner": {
            "login": "Dlurak",
            "id": 84224239,
            "node_id": "MDQ6VXNlcjg0MjI0MjM5",
            "avatar_url": "https://avatars.githubusercontent.com/u/84224239?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Dlurak",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Dlurak/niri-fork",
          "created_at": "2025-07-06T10:51:26Z",
          "updated_at": "2026-02-08T06:54:51Z",
          "pushed_at": "2025-07-06T10:52:01Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5093,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1968"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1968"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1968"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1968/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1968/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1968/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/d5a32972165cccc558dc0f575740f4cdb6258455"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        3
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1966",
      "id": 2643764835,
      "node_id": "PR_kwDOKFkxdc6dlKZj",
      "number": 1966,
      "state": "open",
      "locked": false,
      "title": "feat: add remote desktop and input capture portals",
      "user": {
        "login": "axelkar",
        "id": 120189068,
        "node_id": "U_kgDOBynwjA",
        "avatar_url": "https://avatars.githubusercontent.com/u/120189068?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/axelkar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Implemented by implementing Mutter<->xdg-desktop-portal-gnome protocol, requires xdg-desktop-portal-gnome.\r\n\r\nOh forgot to write this in the commit: Closes https://github.com/YaLTeR/niri/issues/390",
      "created_at": "2025-07-05T19:52:05Z",
      "updated_at": "2026-02-10T22:25:41Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "axelkar:remote-desktop",
        "ref": "remote-desktop",
        "sha": "dcfa8a0a1928160fb55a9e336695e02d5a54ee5f",
        "user": {
          "login": "axelkar",
          "id": 120189068,
          "node_id": "U_kgDOBynwjA",
          "avatar_url": "https://avatars.githubusercontent.com/u/120189068?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/axelkar",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1014474062,
          "node_id": "R_kgDOPHelTg",
          "name": "niri",
          "full_name": "axelkar/niri",
          "private": false,
          "owner": {
            "login": "axelkar",
            "id": 120189068,
            "node_id": "U_kgDOBynwjA",
            "avatar_url": "https://avatars.githubusercontent.com/u/120189068?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/axelkar",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/axelkar/niri",
          "created_at": "2025-07-05T19:51:03Z",
          "updated_at": "2026-02-08T06:54:51Z",
          "pushed_at": "2026-01-26T00:23:18Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6919,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 1,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 1,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "5ddcf195dd6cb24cf67c24d4622ef0a4dca9ed12",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1966"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1966"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1966"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1966/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1966/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1966/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/dcfa8a0a1928160fb55a9e336695e02d5a54ee5f"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1965",
      "id": 2643729298,
      "node_id": "PR_kwDOKFkxdc6dlBuS",
      "number": 1965,
      "state": "open",
      "locked": false,
      "title": "Implement a four-finger swipe gesture to do an interactive move",
      "user": {
        "login": "StratusFearMe21",
        "id": 57533634,
        "node_id": "MDQ6VXNlcjU3NTMzNjM0",
        "avatar_url": "https://avatars.githubusercontent.com/u/57533634?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/StratusFearMe21",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "\r\nhttps://github.com/user-attachments/assets/485eb9de-71ee-44bd-95f8-1118c8b763e1\r\n\r\nThis PR implements a 4-finger swipe gesture which allows you to move the focused window with just your touchpad (no mod key). I've taken the same logic which decides the swipe direction for 3 finger swipes, and applied it to 4 finger swipes, this way the overview gesture can still be kept.\r\n\r\nPlease forgive me if the way I've implemented this isn't standard, I have very little experience with Smithay and Wayland Compositor design in general. That being said, there's couple of question marks in this PR.\r\n\r\n- Is it possible for a focused window to be out of view? If so, my usage of `active_tile_visual_rectangle` in the `on_gesture_swipe_update` function is probably incorrect\r\n- I *am* clamping the position of the window in the swipe gesture to the `global_bounding_rectangle`, but it's unclear why I need to shrink it by 1 logical pixel to avoid the window snapping to a weird position when it's all the way at the edge.\r\n\r\nI've had so much fun using this window this window manager! Thanks for such an awesome project!\r\n",
      "created_at": "2025-07-05T19:17:02Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "StratusFearMe21:four_finger_interactive_move",
        "ref": "four_finger_interactive_move",
        "sha": "decf2252e33c9f10de1b91c5a57d7147bb0147db",
        "user": {
          "login": "StratusFearMe21",
          "id": 57533634,
          "node_id": "MDQ6VXNlcjU3NTMzNjM0",
          "avatar_url": "https://avatars.githubusercontent.com/u/57533634?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/StratusFearMe21",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1014415363,
          "node_id": "R_kgDOPHbAAw",
          "name": "niri",
          "full_name": "StratusFearMe21/niri",
          "private": false,
          "owner": {
            "login": "StratusFearMe21",
            "id": 57533634,
            "node_id": "MDQ6VXNlcjU3NTMzNjM0",
            "avatar_url": "https://avatars.githubusercontent.com/u/57533634?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/StratusFearMe21",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/StratusFearMe21/niri",
          "created_at": "2025-07-05T17:19:15Z",
          "updated_at": "2026-02-08T06:54:51Z",
          "pushed_at": "2025-07-05T22:46:49Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5096,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1965"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1965"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1965"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1965/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1965/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1965/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/decf2252e33c9f10de1b91c5a57d7147bb0147db"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1929",
      "id": 2626943407,
      "node_id": "PR_kwDOKFkxdc6ck_mv",
      "number": 1929,
      "state": "open",
      "locked": false,
      "title": "feat: add window alignment actions",
      "user": {
        "login": "b0o",
        "id": 21299126,
        "node_id": "MDQ6VXNlcjIxMjk5MTI2",
        "avatar_url": "https://avatars.githubusercontent.com/u/21299126?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/b0o",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "I use two relatively large monitors side-by-side, and I sit near the middle of them. I often want my primary working windows to be on the right side of the left monitor, or the left side of the right monitor. \r\n\r\nThere was no easy way to do this previously, other than moving focus back-and-forth between adjacent windows to nudge the view into the desired position, or using the mouse+middle-click-dragging to move the view. And, if I wanted the first window to be on the right side of the screen, or the last window to be on the left side, there was no way to do that.\r\n\r\nThis PR adds actions for aligning windows to the left, center, and right edge of the screen:\r\n\r\n- `AlignWindowLeft`: Aligns the focused window so it's at the left edge of the screen\r\n- `AlignWindowCenter`: Aligns the focused window to the center of the screen (same as `CenterWindow`)\r\n- `AlignWindowRight`: Aligns focused window to the right side of the screen\r\n\r\nAs mentioned, `AlignWindowCenter` does the exact same thing as the existing `CenterWindow`. I'm not sure how to handle this. Either:\r\n\r\n1. Keep both for backward compatibility\r\n2. Deprecate `CenterWindow` in favor of `AlignWindowCenter` \r\n3. Something else?\r\n\r\nAlso adds variants to do this by ID, but not sure how useful that really is. Happy to remove and just operate on the focused window. \r\n\r\nFinal question, not sure if these should really be `AlignColumn{Left,Right,Center}`? Functionally, I think they would behave the same, whether it's operating on windows or columns.\r\n\r\n<details>\r\n  <summary>Demo Video</summary>\r\n\r\n  https://github.com/user-attachments/assets/8607c704-f5a8-4a3b-b63f-11b36d4f0e78\r\n\r\n</details>",
      "created_at": "2025-06-29T12:57:47Z",
      "updated_at": "2026-01-25T23:41:49Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "b0o:feat-scroll-view",
        "ref": "feat-scroll-view",
        "sha": "5ea546273697172b01da47c4f3211e1984ec3f8e",
        "user": {
          "login": "b0o",
          "id": 21299126,
          "node_id": "MDQ6VXNlcjIxMjk5MTI2",
          "avatar_url": "https://avatars.githubusercontent.com/u/21299126?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/b0o",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1010598627,
          "node_id": "R_kgDOPDyC4w",
          "name": "niri",
          "full_name": "b0o/niri",
          "private": false,
          "owner": {
            "login": "b0o",
            "id": 21299126,
            "node_id": "MDQ6VXNlcjIxMjk5MTI2",
            "avatar_url": "https://avatars.githubusercontent.com/u/21299126?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/b0o",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/b0o/niri",
          "created_at": "2025-06-29T12:19:47Z",
          "updated_at": "2026-02-08T06:54:50Z",
          "pushed_at": "2025-06-29T12:50:15Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6173,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1929"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1929"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1929"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1929/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1929/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1929/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/5ea546273697172b01da47c4f3211e1984ec3f8e"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1922",
      "id": 2625673183,
      "node_id": "PR_kwDOKFkxdc6cgJff",
      "number": 1922,
      "state": "open",
      "locked": false,
      "title": "Added IPC command to change layer opacity dynamically",
      "user": {
        "login": "Tordarus",
        "id": 1444581,
        "node_id": "MDQ6VXNlcjE0NDQ1ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1444581?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Tordarus",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "layer opacity can be changed using the following syntax:\r\n`niri msg layer <namespace> opacity <opacity>`\r\n\r\nThe dynamic configuration gets overriden with a live-reload of the configuration file.\r\n\r\n---\r\n\r\nI don't know anything about the niri codebase or Rust in general, but I was desperate enough to implement this feature anyway. It might be of low quality or buggy because of my non-existent experience in Rust.\r\n\r\nIt will also be incomplete because I couldn't find a way to return `LayerConfigChanged::LayerNotFound` to the client without the compiler yelling at me.\r\n\r\nBut maybe this works as inspiration or a starting point for a new feature with far more options than just opacity.",
      "created_at": "2025-06-28T00:39:24Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Tordarus:dynamic-layer-opacity",
        "ref": "dynamic-layer-opacity",
        "sha": "2badd59e820f83655568cad45ab04a179babe08e",
        "user": {
          "login": "Tordarus",
          "id": 1444581,
          "node_id": "MDQ6VXNlcjE0NDQ1ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1444581?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Tordarus",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1009912261,
          "node_id": "R_kgDOPDIJxQ",
          "name": "niri",
          "full_name": "Tordarus/niri",
          "private": false,
          "owner": {
            "login": "Tordarus",
            "id": 1444581,
            "node_id": "MDQ6VXNlcjE0NDQ1ODE=",
            "avatar_url": "https://avatars.githubusercontent.com/u/1444581?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Tordarus",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Tordarus/niri",
          "created_at": "2025-06-28T00:17:46Z",
          "updated_at": "2026-02-08T06:54:50Z",
          "pushed_at": "2025-06-28T00:29:49Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4491,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1922"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1922"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1922"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1922/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1922/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1922/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/2badd59e820f83655568cad45ab04a179babe08e"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1920",
      "id": 2624743674,
      "node_id": "PR_kwDOKFkxdc6ccmj6",
      "number": 1920,
      "state": "open",
      "locked": false,
      "title": "Allow resolving key codes with a fixed layout.",
      "user": {
        "login": "sbroglie",
        "id": 218117192,
        "node_id": "U_kgDODQA0SA",
        "avatar_url": "https://avatars.githubusercontent.com/u/218117192?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sbroglie",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This is a draft for resolving a key press with respect to a fixed layout. See  https://github.com/YaLTeR/niri/discussions/1919 for the issue background.\r\n\r\nThe implementation is straight forward: the `raw_latin_sym_or_raw_current_sym()` call is replaced with a check if a fixed layout should be used.\r\nIn this case they layouts are not traversed like in [raw_latin_sym_or_raw_current_sym](https://smithay.github.io/smithay/smithay/input/keyboard/struct.KeysymHandle.html#method.raw_latin_sym_or_raw_current_sym) but the layout at the configured index is used directly, which becomes a three-liner. If the user does not configure such an index, then the previous resolution behaviour is used.\r\n\r\nI briefly considered, whether it would be possible to specify a complete separate xkb-keyboard configuration for resolving keybindings of Niri (e.g. `us`) and another (e.g. `fr`) for everything else.  In particular keyboad layout switching would not be done as both are configs with a *single* layout.\r\nHowever, this approach seems to be complicated as there is a global xkb keyboard state.  Hence the user has to configure multiple layouts in a single config (e.g. `us,fr`) and an index.\r\n\r\n### Things to consider:\r\n\r\n * Sway allows to bind keycodes (roughly the \"physical key\" without symbolic meaning of a layout, see `bindcode` command in *sway(5)*).  This might be an alternative method to fixing the layout, which I have not investigated.\r\n * The config name `resolve_keycode_with_layout` is up to debate\r\n * The config option type is currently `Option<LayoutIndex>`.  There might be a more suitable type, e.g. `Layout`. Note that `LayoutIndex` is defined as `u32` (https://docs.rs/xkbcommon/latest/xkbcommon/xkb/type.LayoutIndex.html).\r\n * We currently do not check if the user-configured layout index is between 0 and n-1.  However, the function [key_get_syms_by_level](https://docs.rs/xkbcommon/latest/xkbcommon/xkb/struct.Keymap.html#method.key_get_syms_by_level) used under the hood, does the clipping for us.  In my tests it was a reduction module n.\r\n   We could add an explicit (Niri side) range check for that, if required.\r\n * Instead of having the \"fallback to latin keybindings\" (which is a misnomer as it falls back to ASCII-bindings!) we could always resolve with respect to the current layout.  If ASCII fallback is wanted, setting the resolving layout index should provide that behaviour.\r\n   \r\n### What is missing:\r\n\r\nIf this seems like a sensible solution to the problem, I would\r\n * provide documentation about the new config knob\r\n * add an action to change the resolving layout index to Niri's IPC",
      "created_at": "2025-06-27T15:30:54Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "sbroglie:binding-resolution-wrt-keyboard-layout",
        "ref": "binding-resolution-wrt-keyboard-layout",
        "sha": "607b86f6471fc1f5c61c8c61ff7f91fd19fc5af9",
        "user": {
          "login": "sbroglie",
          "id": 218117192,
          "node_id": "U_kgDODQA0SA",
          "avatar_url": "https://avatars.githubusercontent.com/u/218117192?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/sbroglie",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1009674558,
          "node_id": "R_kgDOPC5pPg",
          "name": "niri",
          "full_name": "sbroglie/niri",
          "private": false,
          "owner": {
            "login": "sbroglie",
            "id": 218117192,
            "node_id": "U_kgDODQA0SA",
            "avatar_url": "https://avatars.githubusercontent.com/u/218117192?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/sbroglie",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/sbroglie/niri",
          "created_at": "2025-06-27T14:17:26Z",
          "updated_at": "2026-02-08T06:54:50Z",
          "pushed_at": "2025-06-27T14:46:28Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4491,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1920"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1920"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1920"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1920/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1920/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1920/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/607b86f6471fc1f5c61c8c61ff7f91fd19fc5af9"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1877",
      "id": 2609850975,
      "node_id": "PR_kwDOKFkxdc6bjypf",
      "number": 1877,
      "state": "open",
      "locked": false,
      "title": "Implement a view lock",
      "user": {
        "login": "Olekoop",
        "id": 154007291,
        "node_id": "U_kgDOCS32-w",
        "avatar_url": "https://avatars.githubusercontent.com/u/154007291?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Olekoop",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR implements a view lock. It allows the user to lock a view in place and nothing can move it unless the user tries to center a window, a column or visible columns. In that case the view moves but the lock is still active. It also disables automatic focus for a new window.\r\n\r\nThere are at least two scenarios that greatly benefit from this feature.\r\nOne of those is when debugging a GUI application. The user can have a full-size IDE window open and debug the program without the worry about niri moving the view to the application's window.\r\nA different one is when trying to copy something from one window to another. The view lock allows to copy from every window that can be seen no matter how much visible it is. It is possible to create a script that auto-locks the view every time that the user tries to move the view using key bindings.\r\n\r\nI have tested this feature with mouse and keyboard bindings but I didn't do it with touchpad and touch movements (my PC doesn't have any of those things). I would be grateful if someone tests this with touchpad or touch.",
      "created_at": "2025-06-22T17:07:14Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Olekoop:viewport-lock",
        "ref": "viewport-lock",
        "sha": "2b67abd5133a9424cf4fa75639892a653cd0cc2b",
        "user": {
          "login": "Olekoop",
          "id": 154007291,
          "node_id": "U_kgDOCS32-w",
          "avatar_url": "https://avatars.githubusercontent.com/u/154007291?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Olekoop",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1005726071,
          "node_id": "R_kgDOO_Ipdw",
          "name": "niri",
          "full_name": "Olekoop/niri",
          "private": false,
          "owner": {
            "login": "Olekoop",
            "id": 154007291,
            "node_id": "U_kgDOCS32-w",
            "avatar_url": "https://avatars.githubusercontent.com/u/154007291?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Olekoop",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Olekoop/niri",
          "created_at": "2025-06-20T17:50:11Z",
          "updated_at": "2026-02-08T06:54:49Z",
          "pushed_at": "2025-09-01T06:48:33Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5202,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1877"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1877"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1877"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1877/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1877/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1877/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/2b67abd5133a9424cf4fa75639892a653cd0cc2b"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1856",
      "id": 2605607529,
      "node_id": "PR_kwDOKFkxdc6bTmpp",
      "number": 1856,
      "state": "open",
      "locked": false,
      "title": "Per-device touch and tablet config",
      "user": {
        "login": "stefanboca",
        "id": 45266795,
        "node_id": "MDQ6VXNlcjQ1MjY2Nzk1",
        "avatar_url": "https://avatars.githubusercontent.com/u/45266795?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/stefanboca",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Allows configuring `touch` and `tablet` by device name, which can be found with  `libinput list-devices` or `libinput debug-events`:\r\n\r\n```kdl\r\ninput {\r\n    tablet { map-to-output \"eDP-1\"; }\r\n    tablet \"ELAN9009:00 04F3:2F2A Stylus\" { map-to-output \"DP-1\"; }\r\n    touch { map-to-output \"eDP-1\"; }\r\n    touch \"ELAN9009:00 04F3:2F2A\" { map-to-output \"DP-1\"; }\r\n}\r\n```\r\n\r\nMy Asus Zenbook Duo has dual touchscreens which are also tables, so I have locally tested this change.\r\n\r\nRelated to #371, Closes #1231",
      "created_at": "2025-06-19T19:48:44Z",
      "updated_at": "2026-02-20T18:06:22Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "fc5b49434c40fb16f7029bfe01ae725d6d5cdb20",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "stefanboca:sb/push-nrusnuxtqozk",
        "ref": "sb/push-nrusnuxtqozk",
        "sha": "aff76fc4e8482d40ede84040e824b368dbe80fee",
        "user": {
          "login": "stefanboca",
          "id": 45266795,
          "node_id": "MDQ6VXNlcjQ1MjY2Nzk1",
          "avatar_url": "https://avatars.githubusercontent.com/u/45266795?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/stefanboca",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1005171935,
          "node_id": "R_kgDOO-m03w",
          "name": "niri",
          "full_name": "stefanboca/niri",
          "private": false,
          "owner": {
            "login": "stefanboca",
            "id": 45266795,
            "node_id": "MDQ6VXNlcjQ1MjY2Nzk1",
            "avatar_url": "https://avatars.githubusercontent.com/u/45266795?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/stefanboca",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/stefanboca/niri",
          "created_at": "2025-06-19T19:40:33Z",
          "updated_at": "2026-02-17T23:19:35Z",
          "pushed_at": "2026-02-17T23:19:29Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6904,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 1,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 1,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "cf0b4bc0ca93ab5c18b562ada1d8609b67b3c4e3",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1856"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1856"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1856"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1856/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1856/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1856/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/aff76fc4e8482d40ede84040e824b368dbe80fee"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        3,
        1,
        1231
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1797",
      "id": 2592197273,
      "node_id": "PR_kwDOKFkxdc6agcqZ",
      "number": 1797,
      "state": "open",
      "locked": false,
      "title": "window: allow to set per-window view offset",
      "user": {
        "login": "ein-shved",
        "id": 3513222,
        "node_id": "MDQ6VXNlcjM1MTMyMjI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3513222?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ein-shved",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This allows to set view_offset for window, which makes workspace to shift it view while window is focused.\r\n\r\n## Rationale\r\n\r\nWhile vim still does not fully supports external windows, I'm working on workaround, which allows me to create windows with no limit. Niri implements ideal concept of no-limit tape of windows for this workaround. So, in theory I can create os-window of no limit width and place there no limit number of vim-windows of fixed width side-by-side.\r\n\r\nFor this Niri lucks of single one functionality: the dynamic focus on special offset of os-window which is wider then screen. \r\n\r\nHere is video which demonstrates work of my current setup with vim, my [integration utility](https://github.com/ein-shved/niri-integration) and Niri, patched with this PR.\r\n\r\nhttps://github.com/user-attachments/assets/f57ac773-f4c7-4818-93b7-0e79dda080c5\r\n\r\n",
      "created_at": "2025-06-14T08:00:58Z",
      "updated_at": "2025-12-07T15:47:13Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "ein-shved:view_offset",
        "ref": "view_offset",
        "sha": "82b4b13d047570d833052422eb6e6101d1bf3130",
        "user": {
          "login": "ein-shved",
          "id": 3513222,
          "node_id": "MDQ6VXNlcjM1MTMyMjI=",
          "avatar_url": "https://avatars.githubusercontent.com/u/3513222?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ein-shved",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 932355876,
          "node_id": "R_kgDON5KfJA",
          "name": "niri",
          "full_name": "ein-shved/niri",
          "private": false,
          "owner": {
            "login": "ein-shved",
            "id": 3513222,
            "node_id": "MDQ6VXNlcjM1MTMyMjI=",
            "avatar_url": "https://avatars.githubusercontent.com/u/3513222?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ein-shved",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/ein-shved/niri",
          "created_at": "2025-02-13T19:26:56Z",
          "updated_at": "2026-02-08T06:54:36Z",
          "pushed_at": "2025-12-07T15:47:12Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5915,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ba29735fbbd8cf8319c71ccb55b54a0580007c80",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1797"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1797"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1797"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1797/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1797/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1797/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/82b4b13d047570d833052422eb6e6101d1bf3130"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1795",
      "id": 2591408454,
      "node_id": "PR_kwDOKFkxdc6adcFG",
      "number": 1795,
      "state": "open",
      "locked": false,
      "title": "Optional screenshot notification",
      "user": {
        "login": "ferrreo",
        "id": 482133,
        "node_id": "MDQ6VXNlcjQ4MjEzMw==",
        "avatar_url": "https://avatars.githubusercontent.com/u/482133?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ferrreo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "We don't always want notifications triggered when screenshoting things, this is an easy way to disable. \r\n\r\nLet me know if I need to change anything or reformat anything as I didn't see a contributors guide anywhere etc.",
      "created_at": "2025-06-13T21:35:19Z",
      "updated_at": "2025-11-29T11:09:39Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "5e77cee97c98eb0c454a65460862470482a5601f",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "ferrreo:optional-screenshot-notification",
        "ref": "optional-screenshot-notification",
        "sha": "5f6a806434bfdb9d9b21e90172a140369381ccbc",
        "user": {
          "login": "ferrreo",
          "id": 482133,
          "node_id": "MDQ6VXNlcjQ4MjEzMw==",
          "avatar_url": "https://avatars.githubusercontent.com/u/482133?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ferrreo",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1001694509,
          "node_id": "R_kgDOO7SlLQ",
          "name": "niri",
          "full_name": "ferrreo/niri",
          "private": false,
          "owner": {
            "login": "ferrreo",
            "id": 482133,
            "node_id": "MDQ6VXNlcjQ4MjEzMw==",
            "avatar_url": "https://avatars.githubusercontent.com/u/482133?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ferrreo",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/ferrreo/niri",
          "created_at": "2025-06-13T20:45:17Z",
          "updated_at": "2026-02-08T06:54:46Z",
          "pushed_at": "2025-11-29T11:09:38Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5916,
          "stargazers_count": 1,
          "watchers_count": 1,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 1,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "b35bcae35b3f9665043c335e55ed5828af77db85",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1795"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1795"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1795"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1795/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1795/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1795/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/5f6a806434bfdb9d9b21e90172a140369381ccbc"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1791",
      "id": 2590827690,
      "node_id": "PR_kwDOKFkxdc6abOSq",
      "number": 1791,
      "state": "open",
      "locked": false,
      "title": "Support shm sharing",
      "user": {
        "login": "wrvsrx",
        "id": 42770726,
        "node_id": "MDQ6VXNlcjQyNzcwNzI2",
        "avatar_url": "https://avatars.githubusercontent.com/u/42770726?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/wrvsrx",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Fix #455 ",
      "created_at": "2025-06-13T17:08:42Z",
      "updated_at": "2026-02-18T23:40:42Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "f25027476f662876687d4b77a2ffe153fabc4bf0",
      "assignees": {},
      "requested_reviewers": {
        "0": {
          "login": "YaLTeR",
          "id": 1794388,
          "node_id": "MDQ6VXNlcjE3OTQzODg=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/YaLTeR",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "1": {
          "login": "ToxicMushroom",
          "id": 32853531,
          "node_id": "MDQ6VXNlcjMyODUzNTMx",
          "avatar_url": "https://avatars.githubusercontent.com/u/32853531?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ToxicMushroom",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "wrvsrx:support-shm-sharing",
        "ref": "support-shm-sharing",
        "sha": "151e6ea1b4811d5cbc063aa01aee072fc424e7db",
        "user": {
          "login": "wrvsrx",
          "id": 42770726,
          "node_id": "MDQ6VXNlcjQyNzcwNzI2",
          "avatar_url": "https://avatars.githubusercontent.com/u/42770726?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/wrvsrx",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 994603081,
          "node_id": "R_kgDOO0hwSQ",
          "name": "niri",
          "full_name": "wrvsrx/niri",
          "private": false,
          "owner": {
            "login": "wrvsrx",
            "id": 42770726,
            "node_id": "MDQ6VXNlcjQyNzcwNzI2",
            "avatar_url": "https://avatars.githubusercontent.com/u/42770726?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/wrvsrx",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/wrvsrx/niri",
          "created_at": "2025-06-02T07:37:17Z",
          "updated_at": "2026-02-08T06:54:45Z",
          "pushed_at": "2026-02-17T21:22:49Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6985,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "a2a52911757cb3b497db9407592f9b4c439571ea",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1791"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1791"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1791"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1791/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1791/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1791/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/151e6ea1b4811d5cbc063aa01aee072fc424e7db"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        4
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1717",
      "id": 2559854187,
      "node_id": "PR_kwDOKFkxdc6YlEZr",
      "number": 1717,
      "state": "open",
      "locked": false,
      "title": "Bump MSRV to 1.83",
      "user": {
        "login": "rustn00b",
        "id": 83183600,
        "node_id": "MDQ6VXNlcjgzMTgzNjAw",
        "avatar_url": "https://avatars.githubusercontent.com/u/83183600?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rustn00b",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "- Adds support for ControlFlow::Break/Continue (used in #1704)\r\n- Requires applying a few new clippy lints\r\n\r\nThis PR was initially just blended into #1704, but is rather independent so submitted separately at @YaLTeR's request.",
      "created_at": "2025-06-02T09:04:24Z",
      "updated_at": "2025-10-15T10:07:04Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "rustn00b:msrv-1.83",
        "ref": "msrv-1.83",
        "sha": "7b108d05156e5831694b046503e309b3e38630f6",
        "user": {
          "login": "rustn00b",
          "id": 83183600,
          "node_id": "MDQ6VXNlcjgzMTgzNjAw",
          "avatar_url": "https://avatars.githubusercontent.com/u/83183600?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/rustn00b",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 909048266,
          "node_id": "R_kgDONi75yg",
          "name": "niri",
          "full_name": "rustn00b/niri",
          "private": false,
          "owner": {
            "login": "rustn00b",
            "id": 83183600,
            "node_id": "MDQ6VXNlcjgzMTgzNjAw",
            "avatar_url": "https://avatars.githubusercontent.com/u/83183600?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/rustn00b",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/rustn00b/niri",
          "created_at": "2024-12-27T16:13:24Z",
          "updated_at": "2026-02-08T06:54:33Z",
          "pushed_at": "2025-11-16T13:30:38Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6222,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 1,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 1,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1717"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1717"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1717"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1717/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1717/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1717/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/7b108d05156e5831694b046503e309b3e38630f6"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1699",
      "id": 2555335607,
      "node_id": "PR_kwDOKFkxdc6YT1O3",
      "number": 1699,
      "state": "open",
      "locked": false,
      "title": "Fix wayland event loop overflow after only a few hundred millisecond",
      "user": {
        "login": "KosmX",
        "id": 15692868,
        "node_id": "MDQ6VXNlcjE1NjkyODY4",
        "avatar_url": "https://avatars.githubusercontent.com/u/15692868?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KosmX",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This is needed on higher-end systems, because if I use a high polling rate mice (1kHz), and the app stops receiving events for 200 ms, that is enough to overflow the event buffer, and crashes the app.\r\n\r\nWith this patch, the buffer can be increased, and these apps can have more time handling inputs\r\n\r\nthe default buffer size is 4096 bytes, which is pretty small.  \r\nThe buffer can be set with the global `max-buffer-size` config.  \r\nIf the config is not specified, the value won't be overwritten.  \r\n\r\nI'll set ready-to-merge on this PR when https://github.com/Smithay/wayland-rs/pull/815 is merged and released.",
      "created_at": "2025-05-30T17:59:06Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "KosmX:main",
        "ref": "main",
        "sha": "2f7bf10309caff2a3b6918dfe79aaafa09ac8d1a",
        "user": {
          "login": "KosmX",
          "id": 15692868,
          "node_id": "MDQ6VXNlcjE1NjkyODY4",
          "avatar_url": "https://avatars.githubusercontent.com/u/15692868?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/KosmX",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 993388755,
          "node_id": "R_kgDOOzXo0w",
          "name": "niri",
          "full_name": "KosmX/niri",
          "private": false,
          "owner": {
            "login": "KosmX",
            "id": 15692868,
            "node_id": "MDQ6VXNlcjE1NjkyODY4",
            "avatar_url": "https://avatars.githubusercontent.com/u/15692868?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/KosmX",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/KosmX/niri",
          "created_at": "2025-05-30T17:50:07Z",
          "updated_at": "2026-02-17T19:41:09Z",
          "pushed_at": "2026-02-17T19:41:00Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6532,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "buffer-patch"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1699"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1699"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1699"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1699/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1699/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1699/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/2f7bf10309caff2a3b6918dfe79aaafa09ac8d1a"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1690",
      "id": 2547764083,
      "node_id": "PR_kwDOKFkxdc6X28tz",
      "number": 1690,
      "state": "open",
      "locked": false,
      "title": "Introduce WorkspaceDimensions struct",
      "user": {
        "login": "spacedentist",
        "id": 1536420,
        "node_id": "MDQ6VXNlcjE1MzY0MjA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1536420?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/spacedentist",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This commit introduces WorkspaceDimensions to replace the triplet of view_size/workspace_area/scale that is passed from Workspace to ScrollingSpace and FloatingSpace.\r\n\r\nThis will also make it easier to support horizontal columns for portrait monitors, as we can add the notion of column axis to WorkspaceDimensions and also add member functions to access the various flavours of dimensions (like workspace size along the primary and secondary axis).",
      "created_at": "2025-05-27T22:01:08Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "spacedentist:workspace-dimensions",
        "ref": "workspace-dimensions",
        "sha": "b3fb163e3d8926622a1a9374d2a94fbe67dcbee2",
        "user": {
          "login": "spacedentist",
          "id": 1536420,
          "node_id": "MDQ6VXNlcjE1MzY0MjA=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1536420?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/spacedentist",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 990788314,
          "node_id": "R_kgDOOw462g",
          "name": "niri",
          "full_name": "spacedentist/niri",
          "private": false,
          "owner": {
            "login": "spacedentist",
            "id": 1536420,
            "node_id": "MDQ6VXNlcjE1MzY0MjA=",
            "avatar_url": "https://avatars.githubusercontent.com/u/1536420?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/spacedentist",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/spacedentist/niri",
          "created_at": "2025-05-26T16:27:51Z",
          "updated_at": "2026-02-08T06:54:44Z",
          "pushed_at": "2025-05-27T22:26:46Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4916,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1690"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1690"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1690"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1690/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1690/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1690/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/b3fb163e3d8926622a1a9374d2a94fbe67dcbee2"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1685",
      "id": 2546017457,
      "node_id": "PR_kwDOKFkxdc6XwSSx",
      "number": 1685,
      "state": "open",
      "locked": false,
      "title": "feat: add dynamic overview zoom functionality",
      "user": {
        "login": "trbjo",
        "id": 26080212,
        "node_id": "MDQ6VXNlcjI2MDgwMjEy",
        "avatar_url": "https://avatars.githubusercontent.com/u/26080212?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/trbjo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Regarding https://github.com/YaLTeR/niri/discussions/1673, here is what i meant. \r\n\r\nIt uses a very simple algorithm to decide zoom. It maintains backwards compatibility so that users who prefer the current static zoom level will not be affected.\r\n\r\nI did not change any logic pertaining to the centered workspace.\r\n\r\n",
      "created_at": "2025-05-27T10:14:15Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "trbjo:dynamic-overview-zoom",
        "ref": "dynamic-overview-zoom",
        "sha": "95e458a9ce5ae27a2aa904f6d8ca1a4fdad24fe3",
        "user": {
          "login": "trbjo",
          "id": 26080212,
          "node_id": "MDQ6VXNlcjI2MDgwMjEy",
          "avatar_url": "https://avatars.githubusercontent.com/u/26080212?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/trbjo",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 991224226,
          "node_id": "R_kgDOOxThog",
          "name": "niri",
          "full_name": "trbjo/niri",
          "private": false,
          "owner": {
            "login": "trbjo",
            "id": 26080212,
            "node_id": "MDQ6VXNlcjI2MDgwMjEy",
            "avatar_url": "https://avatars.githubusercontent.com/u/26080212?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/trbjo",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/trbjo/niri",
          "created_at": "2025-05-27T10:03:05Z",
          "updated_at": "2026-02-08T06:54:44Z",
          "pushed_at": "2025-05-27T10:11:42Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4859,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1685"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1685"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1685"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1685/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1685/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1685/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/95e458a9ce5ae27a2aa904f6d8ca1a4fdad24fe3"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1679",
      "id": 2544768112,
      "node_id": "PR_kwDOKFkxdc6XrhRw",
      "number": 1679,
      "state": "open",
      "locked": false,
      "title": "Assume Mod key as held in Overview to replace hardcoded bindings",
      "user": {
        "login": "iostapyshyn",
        "id": 18750600,
        "node_id": "MDQ6VXNlcjE4NzUwNjAw",
        "avatar_url": "https://avatars.githubusercontent.com/u/18750600?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/iostapyshyn",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "The simplified navigation in Overview mode relies on [hardcoded keybindings](https://github.com/YaLTeR/niri/blob/8ba57fcf25d2fc9565131684a839d58703f1dae7/src/input/mod.rs#L4113), which currently include the arrow keys and the [scroll wheel](https://github.com/YaLTeR/niri/blob/8ba57fcf25d2fc9565131684a839d58703f1dae7/src/input/mod.rs#L2685). This is somewhat limiting for users who prefer custom navigation methods (like HJKL) or have defined further navigation keybindings. These custom bindings still work, but require holding down Mod, which feels inconsistent since arrow keys don’t.\r\n\r\nThis PR makes Overview mode treat the Mod key as held while open, both for keyboard and mouse.  All user-defined navigation keybindings (including arrow keys and scroll wheel in the default config) continue working as expected. Additionally, actions such as closing windows, moving/focusing windows, jumping to first/last windows, switching monitors, navigating workspaces with PageUp/PageDown get easier out of the box while in Overview.\r\n\r\nFor now, I removed `FocusColumn{Left,Right}UnderMouse` as they are not accessible from the config. I am not completely sure what is the use case for changing a focus on an inactive workspace and whether its worth complicating regular `FocusColumn{Left,Right}` to keep this functionality.\r\n\r\nAlso previously suggested by @Quackdoc in #1440",
      "created_at": "2025-05-26T20:06:01Z",
      "updated_at": "2025-12-18T13:14:01Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "iostapyshyn:assume-mod",
        "ref": "assume-mod",
        "sha": "36491f04f7054bd0044dca3035a50072c637098c",
        "user": {
          "login": "iostapyshyn",
          "id": 18750600,
          "node_id": "MDQ6VXNlcjE4NzUwNjAw",
          "avatar_url": "https://avatars.githubusercontent.com/u/18750600?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/iostapyshyn",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 988011751,
          "node_id": "R_kgDOOuPc5w",
          "name": "niri",
          "full_name": "iostapyshyn/niri",
          "private": false,
          "owner": {
            "login": "iostapyshyn",
            "id": 18750600,
            "node_id": "MDQ6VXNlcjE4NzUwNjAw",
            "avatar_url": "https://avatars.githubusercontent.com/u/18750600?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/iostapyshyn",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/iostapyshyn/niri",
          "created_at": "2025-05-21T23:33:59Z",
          "updated_at": "2026-02-08T06:54:44Z",
          "pushed_at": "2025-06-11T06:17:34Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4482,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1679"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1679"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1679"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1679/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1679/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1679/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/36491f04f7054bd0044dca3035a50072c637098c"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1677",
      "id": 2544489871,
      "node_id": "PR_kwDOKFkxdc6XqdWP",
      "number": 1677,
      "state": "open",
      "locked": false,
      "title": "Portrait mode",
      "user": {
        "login": "spacedentist",
        "id": 1536420,
        "node_id": "MDQ6VXNlcjE1MzY0MjA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1536420?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/spacedentist",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": null,
      "created_at": "2025-05-26T16:36:50Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "spacedentist:portrait-mode",
        "ref": "portrait-mode",
        "sha": "e54375dcfa9470c25d1980bff4f2e96cfb33f13c",
        "user": {
          "login": "spacedentist",
          "id": 1536420,
          "node_id": "MDQ6VXNlcjE1MzY0MjA=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1536420?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/spacedentist",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 990788314,
          "node_id": "R_kgDOOw462g",
          "name": "niri",
          "full_name": "spacedentist/niri",
          "private": false,
          "owner": {
            "login": "spacedentist",
            "id": 1536420,
            "node_id": "MDQ6VXNlcjE1MzY0MjA=",
            "avatar_url": "https://avatars.githubusercontent.com/u/1536420?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/spacedentist",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/spacedentist/niri",
          "created_at": "2025-05-26T16:27:51Z",
          "updated_at": "2026-02-08T06:54:44Z",
          "pushed_at": "2025-05-27T22:26:46Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4916,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1677"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1677"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1677"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1677/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1677/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1677/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/e54375dcfa9470c25d1980bff4f2e96cfb33f13c"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1671",
      "id": 2542560776,
      "node_id": "PR_kwDOKFkxdc6XjGYI",
      "number": 1671,
      "state": "open",
      "locked": false,
      "title": "feat: not focus follow mouse when column is fullwidth",
      "user": {
        "login": "The-Lost-Light",
        "id": 8400760,
        "node_id": "MDQ6VXNlcjg0MDA3NjA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/8400760?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/The-Lost-Light",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR add an property `not-scroll-on-maximized` for `focus-follows-mouse`\r\nWhen set `focus-follows-mouse not-scroll-on-maximized=true`, If current Column is at full width, the focus will not follow the mouse.\r\n\r\nFor 2 reasons:\r\n- not sure a bug(since triggering instability), even if I maximize the window, the edge of the screen may still trigger the focus to shift to the out-of-view window.\r\n- In the following settings, you can display adjacent objects on the edge without triggering focus when the mouse moves over them.\r\n```kdl\r\nlayout{\r\n  struts {\r\n    left 16\r\n    right 16\r\n  }\r\n}\r\n```",
      "created_at": "2025-05-25T17:56:26Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "The-Lost-Light:feat/not-focus-mouse-when-fullwidth",
        "ref": "feat/not-focus-mouse-when-fullwidth",
        "sha": "22d14200d13d83dfc66ea6cb96a75570abbbfb4b",
        "user": {
          "login": "The-Lost-Light",
          "id": 8400760,
          "node_id": "MDQ6VXNlcjg0MDA3NjA=",
          "avatar_url": "https://avatars.githubusercontent.com/u/8400760?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/The-Lost-Light",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 987787717,
          "node_id": "R_kgDOOuBxxQ",
          "name": "niri",
          "full_name": "The-Lost-Light/niri",
          "private": false,
          "owner": {
            "login": "The-Lost-Light",
            "id": 8400760,
            "node_id": "MDQ6VXNlcjg0MDA3NjA=",
            "avatar_url": "https://avatars.githubusercontent.com/u/8400760?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/The-Lost-Light",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/The-Lost-Light/niri",
          "created_at": "2025-05-21T15:28:31Z",
          "updated_at": "2026-02-08T06:54:44Z",
          "pushed_at": "2025-05-29T16:15:16Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4888,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1671"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1671"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1671"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1671/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1671/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1671/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/22d14200d13d83dfc66ea6cb96a75570abbbfb4b"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1503",
      "id": 2493567051,
      "node_id": "PR_kwDOKFkxdc6UoNBL",
      "number": 1503,
      "state": "open",
      "locked": false,
      "title": "`center-focused-column \"enclosed\"`",
      "user": {
        "login": "ET-arded",
        "id": 200986201,
        "node_id": "U_kgDOC_rOWQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/200986201?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ET-arded",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "`center-focused-column \"enclosed\"`\r\nFocused column will be centered if it is not the outermost column",
      "created_at": "2025-05-01T10:39:41Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "ET-arded:enclosed_mode",
        "ref": "enclosed_mode",
        "sha": "057d539d31c8bb77ee470145064109e4fd4b64ea",
        "user": {
          "login": "ET-arded",
          "id": 200986201,
          "node_id": "U_kgDOC_rOWQ",
          "avatar_url": "https://avatars.githubusercontent.com/u/200986201?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ET-arded",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 975598437,
          "node_id": "R_kgDOOiZzZQ",
          "name": "niri",
          "full_name": "ET-arded/niri",
          "private": false,
          "owner": {
            "login": "ET-arded",
            "id": 200986201,
            "node_id": "U_kgDOC_rOWQ",
            "avatar_url": "https://avatars.githubusercontent.com/u/200986201?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ET-arded",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/ET-arded/niri",
          "created_at": "2025-04-30T15:20:40Z",
          "updated_at": "2026-02-08T06:54:42Z",
          "pushed_at": "2025-05-01T10:40:11Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4684,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1503"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1503"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1503"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1503/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1503/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1503/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/057d539d31c8bb77ee470145064109e4fd4b64ea"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1502",
      "id": 2493519765,
      "node_id": "PR_kwDOKFkxdc6UoBeV",
      "number": 1502,
      "state": "open",
      "locked": false,
      "title": "wiki: Add keyring info to electron in Application-Issues.md",
      "user": {
        "login": "marcinjahn",
        "id": 10273406,
        "node_id": "MDQ6VXNlcjEwMjczNDA2",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/marcinjahn",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "I had issues running Mongo Compass, and the solution I applied is worth sharing I think.",
      "created_at": "2025-05-01T09:57:20Z",
      "updated_at": "2025-12-18T22:03:26Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "marcinjahn:main",
        "ref": "main",
        "sha": "7461ecdc700d55ee13a628fa75c593001f22942c",
        "user": {
          "login": "marcinjahn",
          "id": 10273406,
          "node_id": "MDQ6VXNlcjEwMjczNDA2",
          "avatar_url": "https://avatars.githubusercontent.com/u/10273406?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/marcinjahn",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 975985057,
          "node_id": "R_kgDOOixZoQ",
          "name": "niri",
          "full_name": "marcinjahn/niri",
          "private": false,
          "owner": {
            "login": "marcinjahn",
            "id": 10273406,
            "node_id": "MDQ6VXNlcjEwMjczNDA2",
            "avatar_url": "https://avatars.githubusercontent.com/u/10273406?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/marcinjahn",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/marcinjahn/niri",
          "created_at": "2025-05-01T09:08:56Z",
          "updated_at": "2026-02-08T06:54:43Z",
          "pushed_at": "2025-05-01T18:46:47Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4695,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1502"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1502"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1502"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1502/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1502/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1502/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/7461ecdc700d55ee13a628fa75c593001f22942c"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1463",
      "id": 2477995905,
      "node_id": "PR_kwDOKFkxdc6TszeB",
      "number": 1463,
      "state": "open",
      "locked": false,
      "title": "Implement `wp_single_pixel_buffer_manager_v1` in render helpers",
      "user": {
        "login": "Eliasin",
        "id": 16994698,
        "node_id": "MDQ6VXNlcjE2OTk0Njk4",
        "avatar_url": "https://avatars.githubusercontent.com/u/16994698?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Eliasin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "I wanted to take a crack at #619 but don't have much prior experience with GPU programming or wayland dev, so I'm putting up my first bits of progress to make sure I'm doing the right thing.\r\n\r\nI'm not sure exactly how to test whether the results of `render_snapshot_from_surface_tree` are correct, at first glance it's used in parts of the logic for when surfaces are \"animated\" by resizing, becoming floating, closing, etc. So far I've just made sure that the code path I'm writing is being taken during float and that the texture buffer is created in a way that seems to make sense.\r\n\r\nThanks in advance for any review :smile:",
      "created_at": "2025-04-24T04:56:12Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Eliasin:wp_single_pixel_buffer",
        "ref": "wp_single_pixel_buffer",
        "sha": "aeb98b75cb6f39ec2d12d441a6b543e6a6b410a1",
        "user": {
          "login": "Eliasin",
          "id": 16994698,
          "node_id": "MDQ6VXNlcjE2OTk0Njk4",
          "avatar_url": "https://avatars.githubusercontent.com/u/16994698?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Eliasin",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 971771643,
          "node_id": "R_kgDOOewO-w",
          "name": "niri",
          "full_name": "Eliasin/niri",
          "private": false,
          "owner": {
            "login": "Eliasin",
            "id": 16994698,
            "node_id": "MDQ6VXNlcjE2OTk0Njk4",
            "avatar_url": "https://avatars.githubusercontent.com/u/16994698?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Eliasin",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Eliasin/niri",
          "created_at": "2025-04-24T03:19:43Z",
          "updated_at": "2026-02-08T06:54:42Z",
          "pushed_at": "2025-07-21T01:22:16Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5149,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1463"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1463"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1463"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1463/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1463/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1463/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/aeb98b75cb6f39ec2d12d441a6b543e6a6b410a1"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        6
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1451",
      "id": 2471319615,
      "node_id": "PR_kwDOKFkxdc6TTVg_",
      "number": 1451,
      "state": "open",
      "locked": false,
      "title": "Add instructions to the ui on how to copy a screenshot without saving it",
      "user": {
        "login": "NeYurii",
        "id": 194432214,
        "node_id": "U_kgDOC5bM1g",
        "avatar_url": "https://avatars.githubusercontent.com/u/194432214?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/NeYurii",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": null,
      "created_at": "2025-04-21T14:01:27Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "6290fb9420b55dcf92d123bf4a0f043eb0ea63d0",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "NeYurii:main",
        "ref": "main",
        "sha": "1952c97e04d063e81b44e7a36ba6797163b4b9d1",
        "user": {
          "login": "NeYurii",
          "id": 194432214,
          "node_id": "U_kgDOC5bM1g",
          "avatar_url": "https://avatars.githubusercontent.com/u/194432214?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/NeYurii",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 970062052,
          "node_id": "R_kgDOOdH45A",
          "name": "niri",
          "full_name": "NeYurii/niri",
          "private": false,
          "owner": {
            "login": "NeYurii",
            "id": 194432214,
            "node_id": "U_kgDOC5bM1g",
            "avatar_url": "https://avatars.githubusercontent.com/u/194432214?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/NeYurii",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/NeYurii/niri",
          "created_at": "2025-04-21T12:01:28Z",
          "updated_at": "2026-02-08T06:54:42Z",
          "pushed_at": "2025-04-21T13:59:45Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4640,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1451"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1451"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1451"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1451/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1451/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1451/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/1952c97e04d063e81b44e7a36ba6797163b4b9d1"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1450",
      "id": 2471022605,
      "node_id": "PR_kwDOKFkxdc6TSNAN",
      "number": 1450,
      "state": "open",
      "locked": false,
      "title": "Implement `ext-foreign-toplevel-list`",
      "user": {
        "login": "bbb651",
        "id": 53972231,
        "node_id": "MDQ6VXNlcjUzOTcyMjMx",
        "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/bbb651",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Tested with: https://git.sr.ht/~leon_plickat/lswt",
      "created_at": "2025-04-21T10:48:10Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "bbb651:ext-foreign-toplevel-handle",
        "ref": "ext-foreign-toplevel-handle",
        "sha": "b9c08ab00c517965c2d073917f4962f82201f9ed",
        "user": {
          "login": "bbb651",
          "id": 53972231,
          "node_id": "MDQ6VXNlcjUzOTcyMjMx",
          "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/bbb651",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 901356344,
          "node_id": "R_kgDONbmbOA",
          "name": "niri",
          "full_name": "bbb651/niri",
          "private": false,
          "owner": {
            "login": "bbb651",
            "id": 53972231,
            "node_id": "MDQ6VXNlcjUzOTcyMjMx",
            "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/bbb651",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/bbb651/niri",
          "created_at": "2024-12-10T14:05:24Z",
          "updated_at": "2026-02-08T06:54:33Z",
          "pushed_at": "2025-06-10T15:09:24Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4564,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1450"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1450"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1450"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1450/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1450/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1450/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/b9c08ab00c517965c2d073917f4962f82201f9ed"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1449",
      "id": 2470208994,
      "node_id": "PR_kwDOKFkxdc6TPGXi",
      "number": 1449,
      "state": "open",
      "locked": false,
      "title": "delayed blocker + syncobj + fifo + commit timing",
      "user": {
        "login": "cmeissl",
        "id": 4582663,
        "node_id": "MDQ6VXNlcjQ1ODI2NjM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4582663?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cmeissl",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "At this point just a poc, which obviously needs a major cleanup, showcasing and tracking https://github.com/Smithay/smithay/pull/1720",
      "created_at": "2025-04-20T20:20:07Z",
      "updated_at": "2025-11-10T22:03:35Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "cmeissl:feature/delayed_blocker",
        "ref": "feature/delayed_blocker",
        "sha": "d4e9abb52b407ca0abf572eff9c0d8a199af63c7",
        "user": {
          "login": "cmeissl",
          "id": 4582663,
          "node_id": "MDQ6VXNlcjQ1ODI2NjM=",
          "avatar_url": "https://avatars.githubusercontent.com/u/4582663?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/cmeissl",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 712993594,
          "node_id": "R_kgDOKn9rOg",
          "name": "niri",
          "full_name": "cmeissl/niri",
          "private": false,
          "owner": {
            "login": "cmeissl",
            "id": 4582663,
            "node_id": "MDQ6VXNlcjQ1ODI2NjM=",
            "avatar_url": "https://avatars.githubusercontent.com/u/4582663?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/cmeissl",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/cmeissl/niri",
          "created_at": "2023-11-01T16:13:24Z",
          "updated_at": "2026-02-08T06:54:23Z",
          "pushed_at": "2026-03-01T00:50:29Z",
          "homepage": "",
          "size": 8617,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 1,
          "archived": false,
          "disabled": false,
          "open_issues_count": 1,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 1,
          "open_issues": 1,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1449"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1449"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1449"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1449/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1449/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1449/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/d4e9abb52b407ca0abf572eff9c0d8a199af63c7"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1437",
      "id": 2466788456,
      "node_id": "PR_kwDOKFkxdc6TCDRo",
      "number": 1437,
      "state": "open",
      "locked": false,
      "title": "Addded a FAQ question for adding custom iconsets in niri",
      "user": {
        "login": "Livesi5e",
        "id": 109060918,
        "node_id": "U_kgDOBoAjNg",
        "avatar_url": "https://avatars.githubusercontent.com/u/109060918?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Livesi5e",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Title says it all",
      "created_at": "2025-04-17T19:25:15Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Livesi5e:main",
        "ref": "main",
        "sha": "b9ce54be781e7d28334a7ac6cf02e469fb4b11e6",
        "user": {
          "login": "Livesi5e",
          "id": 109060918,
          "node_id": "U_kgDOBoAjNg",
          "avatar_url": "https://avatars.githubusercontent.com/u/109060918?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Livesi5e",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 968260236,
          "node_id": "R_kgDOObZ6jA",
          "name": "niri",
          "full_name": "Livesi5e/niri",
          "private": false,
          "owner": {
            "login": "Livesi5e",
            "id": 109060918,
            "node_id": "U_kgDOBoAjNg",
            "avatar_url": "https://avatars.githubusercontent.com/u/109060918?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Livesi5e",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Livesi5e/niri",
          "created_at": "2025-04-17T19:18:12Z",
          "updated_at": "2026-02-08T06:54:42Z",
          "pushed_at": "2025-04-18T09:34:19Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4642,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1437"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1437"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1437"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1437/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1437/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1437/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/b9ce54be781e7d28334a7ac6cf02e469fb4b11e6"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1416",
      "id": 2452464165,
      "node_id": "PR_kwDOKFkxdc6SLaIl",
      "number": 1416,
      "state": "open",
      "locked": false,
      "title": "Allow a user to disable all Input",
      "user": {
        "login": "dmarkham",
        "id": 1155019,
        "node_id": "MDQ6VXNlcjExNTUwMTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1155019?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dmarkham",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This is not expected to get merged or used, Just wanted to share something I found useful.  I'm building a niri2vnc client  to work like my old x2vnc and I needed to disable all Input via the IPC. I'm no Rust Dev,  It's all vibe coded. Works perfectly for me.",
      "created_at": "2025-04-10T22:58:58Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "dmarkham:dmarkham/ignore-input-events",
        "ref": "dmarkham/ignore-input-events",
        "sha": "82d88713395335ab3db6e5ee9b61442baa2fe159",
        "user": {
          "login": "dmarkham",
          "id": 1155019,
          "node_id": "MDQ6VXNlcjExNTUwMTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1155019?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dmarkham",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 964241742,
          "node_id": "R_kgDOOXkpTg",
          "name": "niri",
          "full_name": "dmarkham/niri",
          "private": false,
          "owner": {
            "login": "dmarkham",
            "id": 1155019,
            "node_id": "MDQ6VXNlcjExNTUwMTk=",
            "avatar_url": "https://avatars.githubusercontent.com/u/1155019?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/dmarkham",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/dmarkham/niri",
          "created_at": "2025-04-10T22:57:03Z",
          "updated_at": "2026-02-08T06:54:41Z",
          "pushed_at": "2025-05-08T17:59:39Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4701,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1416"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1416"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1416"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1416/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1416/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1416/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/82d88713395335ab3db6e5ee9b61442baa2fe159"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1367",
      "id": 2428013823,
      "node_id": "PR_kwDOKFkxdc6QuIz_",
      "number": 1367,
      "state": "open",
      "locked": false,
      "title": "Reverse `switch-preset-column-width`",
      "user": {
        "login": "mattkang",
        "id": 2027430,
        "node_id": "MDQ6VXNlcjIwMjc0MzA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2027430?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mattkang",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Support `switch-preset-column-width` in reverse order as well as switching presets without wraparound. Implements #1000",
      "created_at": "2025-03-31T04:16:42Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "mattkang:reverse-switch-preset-column-width",
        "ref": "reverse-switch-preset-column-width",
        "sha": "897d09d36919f91e011bce5d3451a8a2bf8ada51",
        "user": {
          "login": "mattkang",
          "id": 2027430,
          "node_id": "MDQ6VXNlcjIwMjc0MzA=",
          "avatar_url": "https://avatars.githubusercontent.com/u/2027430?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mattkang",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 957752992,
          "node_id": "R_kgDOORYmoA",
          "name": "niri",
          "full_name": "mattkang/niri",
          "private": false,
          "owner": {
            "login": "mattkang",
            "id": 2027430,
            "node_id": "MDQ6VXNlcjIwMjc0MzA=",
            "avatar_url": "https://avatars.githubusercontent.com/u/2027430?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/mattkang",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/mattkang/niri",
          "created_at": "2025-03-31T04:15:07Z",
          "updated_at": "2026-02-08T06:54:41Z",
          "pushed_at": "2025-03-31T04:15:23Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4792,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1367"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1367"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1367"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1367/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1367/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1367/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/897d09d36919f91e011bce5d3451a8a2bf8ada51"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        1
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1262",
      "id": 2391983955,
      "node_id": "PR_kwDOKFkxdc6OksdT",
      "number": 1262,
      "state": "open",
      "locked": false,
      "title": "Clarified how to make it run in Nixos",
      "user": {
        "login": "maikelthedev",
        "id": 29461493,
        "node_id": "MDQ6VXNlcjI5NDYxNDkz",
        "avatar_url": "https://avatars.githubusercontent.com/u/29461493?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/maikelthedev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "There seems to be an excess of information on how to run a flake but not on how to basically get it up and running in configuration.nix on Nixos when it is mostly programs.niri.enable = true; and that's it. \r\n\r\nSo I modified a page in Getting Started to make this clearer. Including how to fix the Electron problem. ",
      "created_at": "2025-03-13T20:29:00Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "maikelthedev:nixos_starter",
        "ref": "nixos_starter",
        "sha": "729607b4dfe0165674a1766eca51c694aa147e89",
        "user": {
          "login": "maikelthedev",
          "id": 29461493,
          "node_id": "MDQ6VXNlcjI5NDYxNDkz",
          "avatar_url": "https://avatars.githubusercontent.com/u/29461493?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/maikelthedev",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 948126201,
          "node_id": "R_kgDOOINB-Q",
          "name": "niri",
          "full_name": "maikelthedev/niri",
          "private": false,
          "owner": {
            "login": "maikelthedev",
            "id": 29461493,
            "node_id": "MDQ6VXNlcjI5NDYxNDkz",
            "avatar_url": "https://avatars.githubusercontent.com/u/29461493?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/maikelthedev",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/maikelthedev/niri",
          "created_at": "2025-03-13T19:45:18Z",
          "updated_at": "2026-02-08T06:54:39Z",
          "pushed_at": "2025-03-13T20:27:03Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5924,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1262"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1262"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1262"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1262/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1262/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1262/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/729607b4dfe0165674a1766eca51c694aa147e89"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1244",
      "id": 2386797818,
      "node_id": "PR_kwDOKFkxdc6OQ6T6",
      "number": 1244,
      "state": "open",
      "locked": false,
      "title": "feat(cli): add `niri validate --json` to print report as json",
      "user": {
        "login": "titaniumtraveler",
        "id": 106187091,
        "node_id": "U_kgDOBlRJUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/106187091?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/titaniumtraveler",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This can be used to more or less trivially integrate the errors that `niri\r\nvalidate` returns into your editor.\r\n\r\nFor example I wrote script that converts the json output into neovim\r\ndiagnostics on-save. (I haven't committed + pushed it yet, but when I do I will make\r\nsure to add the link here)\r\n\r\n![image](https://github.com/user-attachments/assets/7bae2180-2f19-48e9-9b57-d67d8a8d068c)\r\n\r\nOne thing to note is that this PR also moves the `tracing` output from `stdout`\r\nto `stderr`, (I **really** don't understand why that's not the default of `tracing_subscriber::fmt()`?!),\r\nwhich *technically* might be a breaking change if there are any tools out there\r\ntrying to parse those logs.\r\n\r\nBut I think doing so is **definitely** the right thing to do *regardless* of\r\nthis PR, considering that `niri msg --json` prints its output to `stdout` as\r\nwell, which would cause the logging and the json output to interleave if both\r\nare present. (AFAIK there is no instance of that *currently* happening that I\r\nknow of, but I could imagine some code adding a log statement somewhere and\r\nwith that causing the logging to the json output to interleave.\r\n",
      "created_at": "2025-03-12T02:33:36Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "titaniumtraveler:pr/validate-to-json",
        "ref": "pr/validate-to-json",
        "sha": "62085e5c852981dda7d207702ac3200d40adf1e3",
        "user": {
          "login": "titaniumtraveler",
          "id": 106187091,
          "node_id": "U_kgDOBlRJUw",
          "avatar_url": "https://avatars.githubusercontent.com/u/106187091?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/titaniumtraveler",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 935709844,
          "node_id": "R_kgDON8XMlA",
          "name": "niri",
          "full_name": "titaniumtraveler/niri",
          "private": false,
          "owner": {
            "login": "titaniumtraveler",
            "id": 106187091,
            "node_id": "U_kgDOBlRJUw",
            "avatar_url": "https://avatars.githubusercontent.com/u/106187091?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/titaniumtraveler",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/titaniumtraveler/niri",
          "created_at": "2025-02-19T22:20:36Z",
          "updated_at": "2026-02-08T06:54:37Z",
          "pushed_at": "2026-02-27T16:01:05Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 7443,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "fork/main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1244"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1244"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1244"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1244/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1244/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1244/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/62085e5c852981dda7d207702ac3200d40adf1e3"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1237",
      "id": 2380733424,
      "node_id": "PR_kwDOKFkxdc6N5xvw",
      "number": 1237,
      "state": "open",
      "locked": false,
      "title": "POC: implementation of submaps",
      "user": {
        "login": "titaniumtraveler",
        "id": 106187091,
        "node_id": "U_kgDOBlRJUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/106187091?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/titaniumtraveler",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Basic POC of submap as described in <https://github.com/YaLTeR/niri/issues/846#issuecomment-2676775254>\r\n",
      "created_at": "2025-03-09T15:34:18Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "titaniumtraveler:pr/submaps",
        "ref": "pr/submaps",
        "sha": "564c8d75bf671ae16a8e15d385d11bcd781b419f",
        "user": {
          "login": "titaniumtraveler",
          "id": 106187091,
          "node_id": "U_kgDOBlRJUw",
          "avatar_url": "https://avatars.githubusercontent.com/u/106187091?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/titaniumtraveler",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 935709844,
          "node_id": "R_kgDON8XMlA",
          "name": "niri",
          "full_name": "titaniumtraveler/niri",
          "private": false,
          "owner": {
            "login": "titaniumtraveler",
            "id": 106187091,
            "node_id": "U_kgDOBlRJUw",
            "avatar_url": "https://avatars.githubusercontent.com/u/106187091?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/titaniumtraveler",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/titaniumtraveler/niri",
          "created_at": "2025-02-19T22:20:36Z",
          "updated_at": "2026-02-08T06:54:37Z",
          "pushed_at": "2026-02-27T16:01:05Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 7443,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "fork/main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1237"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1237"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1237"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1237/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1237/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1237/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/564c8d75bf671ae16a8e15d385d11bcd781b419f"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1165",
      "id": 2352432344,
      "node_id": "PR_kwDOKFkxdc6MN0TY",
      "number": 1165,
      "state": "open",
      "locked": false,
      "title": "WIP: Implement `hyprland-global-shortcuts-v1`",
      "user": {
        "login": "bbb651",
        "id": 53972231,
        "node_id": "MDQ6VXNlcjUzOTcyMjMx",
        "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/bbb651",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "I made a simple client for testing: https://github.com/bbb651/global-shortcuts-test (and tested that it works correctly in hyprland)\r\n\r\nI haven't tested it yet but it should work with the `GlobalShortcuts` portals with `~/.config/xdg-desktop-portal/portals.conf`:\r\n```ini\r\n[preferred]\r\ndefault=gnome\r\norg.freedesktop.impl.portal.GlobalShortcuts=hyprland\r\n```\r\n\r\nUnresolved questions:\r\n- What happens with there are other implementations of the `GlobalShortcuts` portal? Wlroots stopped adding protocols, ext seems likely to happen at some point, I think they'll be pretty similar (they'll both be following the portal pretty closely) so don't think it'll be hard to support both of them (and maybe remove the hyprland one at some point if clients aren't using it?). Gnome seems more problematic assuming it'll be DBus based, I think there's still value in having supporting a wayland protocol even if we support the Gnome one for layer-shell use cases so I don't think this should be a blocker.\r\n- How does it interact with binds? I'm currently made a `Action::TriggerGlobalShortcut` action that immediately presses and releases the shortcut, but this doesn't match the capabilities of the protocol (and the `GlobalShortcuts` portal). Once we have release binds we could have separate `Action::PressGlobalShortcut` & `Action::ReleaseGlobalShortcut` actions, which is the most flexible but is a bit verbose. I like the idea of \"hold actions\" that are continuous instead of discrete and are bound to both an entire bind press and release, this works for other continuous actions like resizing and translating the view, but I'm not sure about a design that plays nice with both multiple actions per bind and release binds.\r\n- Representing the shortcuts as `HashMap<(String, String), HyprlandGlobalShortcut>` is a bit awkward in some places, the key reference becomes `&(String, String)` and in `niri msg global-shortcuts` I think it makes more sense to print them by app id. Hyprland seems to join them with `:` and store and accepts them like that, this doesn't work correctly for app ids containing `:` but they are technically invalid. Either way I still prefer separate arguments in the config and cli.   \r\n\r\nAlso currently ipc doesn't quite work (and I've just realized I've broken handling of duplicate shortcuts by creating the `HyprlandGlobalShortcutV1` object even when it errors later to try to workaround lifetimes..), the protocol implementation is a bit messy and clone strings a lot and [CI fails](https://github.com/bbb651/niri/actions/runs/13488048470/job/37681792570) (something is really wrong with my rust/cargo today, rust-analyzer repeatedly failed to run, it seemed to constantly be doing full rebuilds and it apparently didn't recompile ipc client...).",
      "created_at": "2025-02-24T00:27:55Z",
      "updated_at": "2026-01-16T20:23:07Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "bbb651:global-shortcuts",
        "ref": "global-shortcuts",
        "sha": "cf6dbabe5e507ac007f89d66dc4dfad51e147a8f",
        "user": {
          "login": "bbb651",
          "id": 53972231,
          "node_id": "MDQ6VXNlcjUzOTcyMjMx",
          "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/bbb651",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 901356344,
          "node_id": "R_kgDONbmbOA",
          "name": "niri",
          "full_name": "bbb651/niri",
          "private": false,
          "owner": {
            "login": "bbb651",
            "id": 53972231,
            "node_id": "MDQ6VXNlcjUzOTcyMjMx",
            "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/bbb651",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/bbb651/niri",
          "created_at": "2024-12-10T14:05:24Z",
          "updated_at": "2026-02-08T06:54:33Z",
          "pushed_at": "2025-06-10T15:09:24Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4564,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1165"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1165"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1165"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1165/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1165/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1165/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/cf6dbabe5e507ac007f89d66dc4dfad51e147a8f"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1139",
      "id": 2340651954,
      "node_id": "PR_kwDOKFkxdc6Lg4Oy",
      "number": 1139,
      "state": "open",
      "locked": false,
      "title": "add kdl v2 support",
      "user": {
        "login": "zkat",
        "id": 17535,
        "node_id": "MDQ6VXNlcjE3NTM1",
        "avatar_url": "https://avatars.githubusercontent.com/u/17535?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zkat",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This adds v2 support with fallback to v1 for legacy configs. It might be a bit bumpy at first but I'm hoping it works ok. Probably worth treating as experimental for now.",
      "created_at": "2025-02-17T21:51:59Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "zkat:main",
        "ref": "main",
        "sha": "743784bfe8f3143d614dee7c753045a3c892a07b",
        "user": {
          "login": "zkat",
          "id": 17535,
          "node_id": "MDQ6VXNlcjE3NTM1",
          "avatar_url": "https://avatars.githubusercontent.com/u/17535?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/zkat",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 934453201,
          "node_id": "R_kgDON7Kf0Q",
          "name": "niri",
          "full_name": "zkat/niri",
          "private": false,
          "owner": {
            "login": "zkat",
            "id": 17535,
            "node_id": "MDQ6VXNlcjE3NTM1",
            "avatar_url": "https://avatars.githubusercontent.com/u/17535?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/zkat",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/zkat/niri",
          "created_at": "2025-02-17T21:28:39Z",
          "updated_at": "2026-02-08T06:54:37Z",
          "pushed_at": "2025-02-18T00:24:32Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4620,
          "stargazers_count": 1,
          "watchers_count": 1,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 1,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1139"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1139"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1139"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1139/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1139/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1139/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/743784bfe8f3143d614dee7c753045a3c892a07b"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1109",
      "id": 2324884877,
      "node_id": "PR_kwDOKFkxdc6Kku2N",
      "number": 1109,
      "state": "open",
      "locked": false,
      "title": "Add `keep-focus-when-hidden` option",
      "user": {
        "login": "rehanzo",
        "id": 60243794,
        "node_id": "MDQ6VXNlcjYwMjQzNzk0",
        "avatar_url": "https://avatars.githubusercontent.com/u/60243794?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rehanzo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This option helps with situations where you want to do something like read a tooltip and have the inactive timer set. It can hide while you're reading, so you have to keep it moving.\r\n\r\nFrom the comments, I understand this behaviour is expected so that tooltips and whatnot get removed when using touch input. So, I've created this option.",
      "created_at": "2025-02-10T01:29:17Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "rehanzo:rehan/keep-focus-when-hidden",
        "ref": "rehan/keep-focus-when-hidden",
        "sha": "008a569d355167b3f3a6578065b18ed98405f231",
        "user": {
          "login": "rehanzo",
          "id": 60243794,
          "node_id": "MDQ6VXNlcjYwMjQzNzk0",
          "avatar_url": "https://avatars.githubusercontent.com/u/60243794?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/rehanzo",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 929593614,
          "node_id": "R_kgDON2h5Dg",
          "name": "niri",
          "full_name": "rehanzo/niri",
          "private": false,
          "owner": {
            "login": "rehanzo",
            "id": 60243794,
            "node_id": "MDQ6VXNlcjYwMjQzNzk0",
            "avatar_url": "https://avatars.githubusercontent.com/u/60243794?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/rehanzo",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/rehanzo/niri",
          "created_at": "2025-02-08T22:49:49Z",
          "updated_at": "2026-02-08T06:54:36Z",
          "pushed_at": "2025-02-10T01:41:19Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 3784,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1109"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1109"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1109"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1109/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1109/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1109/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/008a569d355167b3f3a6578065b18ed98405f231"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1017",
      "id": 2286362557,
      "node_id": "PR_kwDOKFkxdc6IRx-9",
      "number": 1017,
      "state": "open",
      "locked": false,
      "title": "IPC: Accept multiple actions from stdin",
      "user": {
        "login": "bbb651",
        "id": 53972231,
        "node_id": "MDQ6VXNlcjUzOTcyMjMx",
        "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/bbb651",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This needs some testing, `io::stdin().lines()` behaves a little weird with EOF, notably pressing <kbd>Ctrl</kbd> + <kbd>D</kbd> twice (apparently that's a unix thing, you need to hit it twice when not at the start of a line), you still need to hit it an additional time for some reason.. with `echo -e \"one\\ntwo\" | niri msg action` it works as expected (by the way, it seems like `NIRI_SOCKET` isn't replaced correctly in the winit backend).\r\n\r\nI made the serialization prefer keeping 1-length vectors as single values to maximize compatibility. The amount of tests for `one_or_many` is a bit excessive (I thought a visitor was needed at first, and then got the order of the enum variants wrong, so they were helpful), should I only keep the derive ones?\r\n\r\nAlso I'm not sure what should happen if you pass no actions, currently the cli prints a warning and does nothing but it's allowed in the ipc, should niri respond with an error instead?\n\nAlso, this currently splits on spaces, meaning it handles quoting and multiple spaces incorrectly, should this use e.g. `shlex` instead?",
      "created_at": "2025-01-19T20:34:43Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "bbb651:multiaction",
        "ref": "multiaction",
        "sha": "0f5d3083d1ff8a5bf261b479881c71dfdd237e43",
        "user": {
          "login": "bbb651",
          "id": 53972231,
          "node_id": "MDQ6VXNlcjUzOTcyMjMx",
          "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/bbb651",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 901356344,
          "node_id": "R_kgDONbmbOA",
          "name": "niri",
          "full_name": "bbb651/niri",
          "private": false,
          "owner": {
            "login": "bbb651",
            "id": 53972231,
            "node_id": "MDQ6VXNlcjUzOTcyMjMx",
            "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/bbb651",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/bbb651/niri",
          "created_at": "2024-12-10T14:05:24Z",
          "updated_at": "2026-02-08T06:54:33Z",
          "pushed_at": "2025-06-10T15:09:24Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4564,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1017"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1017"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1017"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1017/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1017/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1017/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/0f5d3083d1ff8a5bf261b479881c71dfdd237e43"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/1014",
      "id": 2286213399,
      "node_id": "PR_kwDOKFkxdc6IRNkX",
      "number": 1014,
      "state": "open",
      "locked": false,
      "title": "Fix animations for swap-window actions",
      "user": {
        "login": "rustn00b",
        "id": 83183600,
        "node_id": "MDQ6VXNlcjgzMTgzNjAw",
        "avatar_url": "https://avatars.githubusercontent.com/u/83183600?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rustn00b",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Avoid calling add_tile/remove_tile that can trigger unwanted animations in neighboring tiles/columns. When the swapped tiles have a different size, tiles following the ones swapped in their respective columns will move slightly. Ideally they should stay put, but the general behavior is still improved.\r\n\r\nThis PR is should address #955. ",
      "created_at": "2025-01-19T13:41:58Z",
      "updated_at": "2025-11-07T15:02:10Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {
        "0": {
          "login": "YaLTeR",
          "id": 1794388,
          "node_id": "MDQ6VXNlcjE3OTQzODg=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1794388?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/YaLTeR",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "rustn00b:swap-animation",
        "ref": "swap-animation",
        "sha": "14fbd5d66998b3d0b361c843e9548ca3cc5825a4",
        "user": {
          "login": "rustn00b",
          "id": 83183600,
          "node_id": "MDQ6VXNlcjgzMTgzNjAw",
          "avatar_url": "https://avatars.githubusercontent.com/u/83183600?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/rustn00b",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 909048266,
          "node_id": "R_kgDONi75yg",
          "name": "niri",
          "full_name": "rustn00b/niri",
          "private": false,
          "owner": {
            "login": "rustn00b",
            "id": 83183600,
            "node_id": "MDQ6VXNlcjgzMTgzNjAw",
            "avatar_url": "https://avatars.githubusercontent.com/u/83183600?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/rustn00b",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/rustn00b/niri",
          "created_at": "2024-12-27T16:13:24Z",
          "updated_at": "2026-02-08T06:54:33Z",
          "pushed_at": "2025-11-16T13:30:38Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 6222,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 1,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 1,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1014"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/1014"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1014"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/1014/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1014/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/1014/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/14fbd5d66998b3d0b361c843e9548ca3cc5825a4"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        9
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/973",
      "id": 2275166132,
      "node_id": "PR_kwDOKFkxdc6HnEe0",
      "number": 973,
      "state": "open",
      "locked": false,
      "title": "WIP: per-output default column width",
      "user": {
        "login": "balsoft",
        "id": 18467667,
        "node_id": "MDQ6VXNlcjE4NDY3NjY3",
        "avatar_url": "https://avatars.githubusercontent.com/u/18467667?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/balsoft",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Add a way to set the default column width per-output.\r\n\r\nThis is useful when there are multiple outputs with wildly different\r\naspect ratios, such as one vertical and one horizontal; with this change,\r\none can set the default width to 1.0 on a vertical one and 0.5 on the\r\nhorizontal one, making niri much more usable.\r\n\r\nI'm making this draft just to see if a change like this would be accepted;\r\n\r\nIf there's a chance, I'll add some tests, documentation, and maybe think about\r\nthe priorities of various defaults a bit more.\r\n",
      "created_at": "2025-01-13T21:04:50Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "balsoft:add-per-output-default-width",
        "ref": "add-per-output-default-width",
        "sha": "3ed2bf9e017e38a96ec9670e8fc6efcdf2fb509c",
        "user": {
          "login": "balsoft",
          "id": 18467667,
          "node_id": "MDQ6VXNlcjE4NDY3NjY3",
          "avatar_url": "https://avatars.githubusercontent.com/u/18467667?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/balsoft",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 916307130,
          "node_id": "R_kgDONp28ug",
          "name": "niri",
          "full_name": "balsoft/niri",
          "private": false,
          "owner": {
            "login": "balsoft",
            "id": 18467667,
            "node_id": "MDQ6VXNlcjE4NDY3NjY3",
            "avatar_url": "https://avatars.githubusercontent.com/u/18467667?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/balsoft",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/balsoft/niri",
          "created_at": "2025-01-13T21:02:33Z",
          "updated_at": "2026-02-08T06:54:34Z",
          "pushed_at": "2025-01-13T21:03:09Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 4887,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/973"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/973"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/973"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/973/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/973/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/973/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/3ed2bf9e017e38a96ec9670e8fc6efcdf2fb509c"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/795",
      "id": 2171525768,
      "node_id": "PR_kwDOKFkxdc6BbtqI",
      "number": 795,
      "state": "open",
      "locked": false,
      "title": "systemd: move toplevel to separate scopes",
      "user": {
        "login": "cmeissl",
        "id": 4582663,
        "node_id": "MDQ6VXNlcjQ1ODI2NjM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4582663?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cmeissl",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Currently `niri` creates a separate scope per spawn action matching the name of the executable.\r\nSo for example launching the non flatpak version of `firefox` through `fuzzel` will result in this firefox instance\r\nto run under a scope name `app-niri-fuzzel-<PID>.scope`.\r\nThis can be problematic in combination with `xdg-portal`, which will use the scope name as a fallback for the\r\nnon accessible app id.\r\n\r\nTo solve this, this PR tries to mimic what `systemd-sway` does, moving toplevels to systemd scopes matching their app id.\r\nIn addition to moving the process it also add slices like `systemd-sway` offers. This allows to override resource\r\nlimits per app id slice.\r\n\r\nThe code is more a PoC and needs a major cleanup. The worst part is finding out all child pids that should also be moved to the new scope.",
      "created_at": "2024-11-10T16:43:49Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "cmeissl:feature/toplevel_scopes",
        "ref": "feature/toplevel_scopes",
        "sha": "99449572c7e63c2b4fbab91de5b7e310c42626d9",
        "user": {
          "login": "cmeissl",
          "id": 4582663,
          "node_id": "MDQ6VXNlcjQ1ODI2NjM=",
          "avatar_url": "https://avatars.githubusercontent.com/u/4582663?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/cmeissl",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 712993594,
          "node_id": "R_kgDOKn9rOg",
          "name": "niri",
          "full_name": "cmeissl/niri",
          "private": false,
          "owner": {
            "login": "cmeissl",
            "id": 4582663,
            "node_id": "MDQ6VXNlcjQ1ODI2NjM=",
            "avatar_url": "https://avatars.githubusercontent.com/u/4582663?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/cmeissl",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/cmeissl/niri",
          "created_at": "2023-11-01T16:13:24Z",
          "updated_at": "2026-02-08T06:54:23Z",
          "pushed_at": "2026-03-01T00:50:29Z",
          "homepage": "",
          "size": 8617,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 1,
          "archived": false,
          "disabled": false,
          "open_issues_count": 1,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 1,
          "open_issues": 1,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/795"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/795"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/795"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/795/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/795/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/795/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/99449572c7e63c2b4fbab91de5b7e310c42626d9"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/642",
      "id": 2047700201,
      "node_id": "PR_kwDOKFkxdc56DWzp",
      "number": 642,
      "state": "open",
      "locked": false,
      "title": "send frame callbacks for active screencast windows",
      "user": {
        "login": "sodiboo",
        "id": 37938646,
        "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
        "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sodiboo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Fixes #539. cc @yuu-fur who originally brought this issue to my attention, he might find this interesting.\r\n\r\nI don't really know what i'm doing here. Frame callbacks are confusing. But this looks entirely reasonable to my eyes, and i've tested it on my own system and it seems to work.",
      "created_at": "2024-08-31T13:02:31Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "aebf702c3123701326754e3452f5ad7eb9b5ef61",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "sodiboo:fix-1hz-screencast",
        "ref": "fix-1hz-screencast",
        "sha": "2c56c0719efc2112d7a166b2b0088898d5324872",
        "user": {
          "login": "sodiboo",
          "id": 37938646,
          "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
          "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/sodiboo",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 746410718,
          "node_id": "R_kgDOLH1S3g",
          "name": "niri",
          "full_name": "sodiboo/niri",
          "private": false,
          "owner": {
            "login": "sodiboo",
            "id": 37938646,
            "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
            "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/sodiboo",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/sodiboo/niri",
          "created_at": "2024-01-21T23:23:45Z",
          "updated_at": "2026-02-08T06:54:24Z",
          "pushed_at": "2025-08-05T13:17:04Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5467,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/642"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/642"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/642"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/642/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/642/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/642/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/2c56c0719efc2112d7a166b2b0088898d5324872"
        }
      },
      "author_association": "MEMBER",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        5,
        539
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/315",
      "id": 1844312110,
      "node_id": "PR_kwDOKFkxdc5t7fgu",
      "number": 315,
      "state": "open",
      "locked": false,
      "title": "Add support for using a different amount of fingers for swiping.",
      "user": {
        "login": "MagneFire",
        "id": 7857908,
        "node_id": "MDQ6VXNlcjc4NTc5MDg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7857908?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MagneFire",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This removes the hardcoded prerequisite of using three fingers to use the swipe gesture. Instead one can configure it by setting `gesture-swipe-fingers` in the `input` section.\r\n\r\nA working example is:\r\n```\r\ninput {\r\n    gesture-swipe-fingers 4\r\n}\r\n```",
      "created_at": "2024-04-28T09:35:35Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "MagneFire:f/gesture-swipe-finger",
        "ref": "f/gesture-swipe-finger",
        "sha": "7aa0ca741468438ff0c841338c71ec112ebde816",
        "user": {
          "login": "MagneFire",
          "id": 7857908,
          "node_id": "MDQ6VXNlcjc4NTc5MDg=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7857908?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MagneFire",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 792752067,
          "node_id": "R_kgDOL0Bvww",
          "name": "niri",
          "full_name": "MagneFire/niri",
          "private": false,
          "owner": {
            "login": "MagneFire",
            "id": 7857908,
            "node_id": "MDQ6VXNlcjc4NTc5MDg=",
            "avatar_url": "https://avatars.githubusercontent.com/u/7857908?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/MagneFire",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/MagneFire/niri",
          "created_at": "2024-04-27T13:29:20Z",
          "updated_at": "2026-02-08T06:54:26Z",
          "pushed_at": "2024-04-28T09:34:48Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 1533,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/315"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/315"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/315"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/315/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/315/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/315/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/7aa0ca741468438ff0c841338c71ec112ebde816"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/294",
      "id": 1828309319,
      "node_id": "PR_kwDOKFkxdc5s-clH",
      "number": 294,
      "state": "open",
      "locked": false,
      "title": "Refactor IPC to better facilitate scripting(?) use-cases of the niri-ipc crate",
      "user": {
        "login": "sodiboo",
        "id": 37938646,
        "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
        "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sodiboo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Based on work in #278.\r\n\r\nThis basically reimplements the way niri-ipc currently works, in a way that is not *necessarily* objectively better. I've marked this as a draft for now, given that i still need to figure out a couple things.\r\n\r\nSome of the current issues that should be ironed out:\r\n\r\n1. Naming. One of the hard problems in computer science. What the heck are the names of `HandleRequest` and `MsgRequest` meant to be (in `src/ipc/server.rs`, `src/ipc/client.rs`, respectively)? Does the `Request` suffix for all request types make sense? Should it be a namespace?\r\n\r\n2. In the interest of not outright requiring all potential consumers of niri ipc to rewrite their logic, i've tried to keep an `AnyRequest` enum still functioning. This, complicates things, given that the response type is of course dependent on the request type, so i have an associated function `decoder()` whose sole purpose is capturing the state necessary to determine what kind of response we're going to read (and for the actual request types, that is a ZST). I would love to remove this, but i didn't yet because i'm not sure if we *do* want to support such a use case anyways (if a client wants, they could make their own request enum, after all)\r\n\r\n3. Make `RequestMessage` private? The `RequestType` tag is kind of an implementation detail. It's only necessary for serialization. Currently, it's exposed, though. A side effect of separating the types of each request and response is that you can no longer enumerate all requests on the client side, which i don't think is actually problematic. The motivation for doing this is to make a somewhat simpler IPC protocol, where we aren't relying on a representation of Rust sum types (because, the representation differs by whether it's a unit variant or similar). I'm not sure this is actually the best way to do it.\r\n\r\n4. Heavy reliance on `serde_json::Value`. Is this problematic? it feels dirty, but i'm also not exactly serializing them as real json strings, so it could be worse.\r\n\r\n5. Re-implement long-lived sockets (i.e. handle many requests per socket)\r\n\r\n---\r\n\r\nWith these changes, i've taken care not to alter the behaviour of the `niri msg` utility. The actual logic behind it has only two changes:\r\n\r\n1. An out of bounds `current_mode` will result in `Current mode: (invalid index)` instead of exiting the entire operation and printing no useful information about outputs\r\n2. `OutputRequest` now returns a `BTreeMap` instead of a `HashMap`. This is because `niri msg` only ever sorted it before iterating, so it might as well come pre-sorted to save some overhead at that point.\r\n\r\nError handling may or may not be identical, but i did try to keep the behaviour as similar to before as possible.\r\n\r\nAnd one great functionality of the code as is: All I/O logic happens in a distinct phase before any printing. In between them, i disable `SIGPIPE`, which is similar to what niri-ipc did before i ever touched it",
      "created_at": "2024-04-17T21:09:00Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "sodiboo:ipc-refactor",
        "ref": "ipc-refactor",
        "sha": "3636dc8ff46bf76b31ad16cf6b2c1e21d29c8a23",
        "user": {
          "login": "sodiboo",
          "id": 37938646,
          "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
          "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/sodiboo",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 746410718,
          "node_id": "R_kgDOLH1S3g",
          "name": "niri",
          "full_name": "sodiboo/niri",
          "private": false,
          "owner": {
            "login": "sodiboo",
            "id": 37938646,
            "node_id": "MDQ6VXNlcjM3OTM4NjQ2",
            "avatar_url": "https://avatars.githubusercontent.com/u/37938646?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/sodiboo",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/sodiboo/niri",
          "created_at": "2024-01-21T23:23:45Z",
          "updated_at": "2026-02-08T06:54:24Z",
          "pushed_at": "2025-08-05T13:17:04Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 5467,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Rust",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/294"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/294"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/294"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/294/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/294/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/294/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/3636dc8ff46bf76b31ad16cf6b2c1e21d29c8a23"
        }
      },
      "author_association": "MEMBER",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/264",
      "id": 1788381023,
      "node_id": "PR_kwDOKFkxdc5qmIdf",
      "number": 264,
      "state": "open",
      "locked": false,
      "title": "input: Add \"AltGr\" alias for ISO level3 shift modifier",
      "user": {
        "login": "Trundle",
        "id": 332418,
        "node_id": "MDQ6VXNlcjMzMjQxOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/332418?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Trundle",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "It's what's written on keyboards, so perhaps a bit more accessible to users.",
      "created_at": "2024-03-24T22:20:10Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Trundle:altgr-alias",
        "ref": "altgr-alias",
        "sha": "0c7686230d655ede116ddd85ca0556a960cdf60e",
        "user": {
          "login": "Trundle",
          "id": 332418,
          "node_id": "MDQ6VXNlcjMzMjQxOA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/332418?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Trundle",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 726281651,
          "node_id": "R_kgDOK0otsw",
          "name": "niri",
          "full_name": "Trundle/niri",
          "private": false,
          "owner": {
            "login": "Trundle",
            "id": 332418,
            "node_id": "MDQ6VXNlcjMzMjQxOA==",
            "avatar_url": "https://avatars.githubusercontent.com/u/332418?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Trundle",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/Trundle/niri",
          "created_at": "2023-12-01T23:52:05Z",
          "updated_at": "2026-02-08T06:54:24Z",
          "pushed_at": "2026-02-10T08:13:55Z",
          "homepage": "",
          "size": 6869,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/264"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/264"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/264"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/264/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/264/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/264/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/0c7686230d655ede116ddd85ca0556a960cdf60e"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/255",
      "id": 1767566276,
      "node_id": "PR_kwDOKFkxdc5pWuvE",
      "number": 255,
      "state": "open",
      "locked": false,
      "title": "fix(niri-session)!: no longer import all environment variables into dbus/systemd",
      "user": {
        "login": "jokeyrhyme",
        "id": 479816,
        "node_id": "MDQ6VXNlcjQ3OTgxNg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/479816?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jokeyrhyme",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "fixes #254\r\n\r\nI did some testing and can confirm that the contents of my environment variables and those in my user service manager were as expected on my machine\r\n\r\nBut note that I'm not yet using niri as my primary desktop, so it's possible/probable that my testing doesn't cover something someone else would notice and miss dearly",
      "created_at": "2024-03-12T10:03:01Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "jokeyrhyme:254-no-more-deprecated-use-of-systemctl-import-environment",
        "ref": "254-no-more-deprecated-use-of-systemctl-import-environment",
        "sha": "6692d1e384c7f37452dfb52e3d512130bb7498f7",
        "user": {
          "login": "jokeyrhyme",
          "id": 479816,
          "node_id": "MDQ6VXNlcjQ3OTgxNg==",
          "avatar_url": "https://avatars.githubusercontent.com/u/479816?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/jokeyrhyme",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 770845970,
          "node_id": "R_kgDOLfItEg",
          "name": "niri",
          "full_name": "jokeyrhyme/niri",
          "private": false,
          "owner": {
            "login": "jokeyrhyme",
            "id": 479816,
            "node_id": "MDQ6VXNlcjQ3OTgxNg==",
            "avatar_url": "https://avatars.githubusercontent.com/u/479816?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/jokeyrhyme",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/jokeyrhyme/niri",
          "created_at": "2024-03-12T09:10:01Z",
          "updated_at": "2026-02-08T06:54:26Z",
          "pushed_at": "2024-03-12T09:14:53Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 1108,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/255"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/255"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/255"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/255/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/255/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/255/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/6692d1e384c7f37452dfb52e3d512130bb7498f7"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        2,
        254
      ]
    },
    {
      "url": "https://api.github.com/repos/niri-wm/niri/pulls/238",
      "id": 1753350688,
      "node_id": "PR_kwDOKFkxdc5oggIg",
      "number": 238,
      "state": "open",
      "locked": false,
      "title": "implement tablet mode (disabling keyboard and mouse/touch pad)",
      "user": {
        "login": "exoticorn",
        "id": 254811,
        "node_id": "MDQ6VXNlcjI1NDgxMQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/254811?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/exoticorn",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Can be triggered by a dedicated hardware switch, or by a toggle action.\r\n\r\nOpen question: Can we reliably distinguish internal from external devices? If yes, we might only want to disable internal devices.",
      "created_at": "2024-03-03T10:20:03Z",
      "updated_at": "2025-10-15T10:07:05Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "exoticorn:tablet-mode",
        "ref": "tablet-mode",
        "sha": "9f543afffeed8fe53359ce0595f2bcd4651c5091",
        "user": {
          "login": "exoticorn",
          "id": 254811,
          "node_id": "MDQ6VXNlcjI1NDgxMQ==",
          "avatar_url": "https://avatars.githubusercontent.com/u/254811?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/exoticorn",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 752385890,
          "node_id": "R_kgDOLNh_Yg",
          "name": "niri",
          "full_name": "exoticorn/niri",
          "private": false,
          "owner": {
            "login": "exoticorn",
            "id": 254811,
            "node_id": "MDQ6VXNlcjI1NDgxMQ==",
            "avatar_url": "https://avatars.githubusercontent.com/u/254811?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/exoticorn",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": true,
          "url": "https://api.github.com/repos/exoticorn/niri",
          "created_at": "2024-02-03T19:22:29Z",
          "updated_at": "2026-02-08T06:54:24Z",
          "pushed_at": "2024-03-13T07:26:31Z",
          "homepage": "https://matrix.to/#/#niri:matrix.org",
          "size": 1265,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "niri-wm:main",
        "ref": "main",
        "sha": "ff09f7a558e405e2de672f586aeb28fd9ad97c1a",
        "user": {
          "login": "niri-wm",
          "id": 259576467,
          "node_id": "O_kgDOD3jSkw",
          "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/niri-wm",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 676934005,
          "node_id": "R_kgDOKFkxdQ",
          "name": "niri",
          "full_name": "niri-wm/niri",
          "private": false,
          "owner": {
            "login": "niri-wm",
            "id": 259576467,
            "node_id": "O_kgDOD3jSkw",
            "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/niri-wm",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "A scrollable-tiling Wayland compositor.",
          "fork": false,
          "url": "https://api.github.com/repos/niri-wm/niri",
          "created_at": "2023-08-10T10:53:14Z",
          "updated_at": "2026-03-02T01:24:14Z",
          "pushed_at": "2026-02-27T15:56:51Z",
          "homepage": "https://niri-wm.github.io/niri/",
          "size": 10931,
          "stargazers_count": 20571,
          "watchers_count": 20571,
          "language": "Rust",
          "has_issues": true,
          "has_projects": false,
          "has_downloads": true,
          "has_wiki": true,
          "has_pages": true,
          "has_discussions": true,
          "forks_count": 719,
          "archived": false,
          "disabled": false,
          "open_issues_count": 411,
          "license": {
            "key": "gpl-3.0",
            "name": "GNU General Public License v3.0",
            "spdx_id": "GPL-3.0",
            "url": "https://api.github.com/licenses/gpl-3.0",
            "node_id": "MDc6TGljZW5zZTk="
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "rust",
            "1": "smithay",
            "2": "tiling-window-manager",
            "3": "wayland",
            "4": "wayland-compositor"
          },
          "visibility": "public",
          "forks": 719,
          "open_issues": 411,
          "watchers": 20571,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/238"
        },
        "html": {
          "href": "https://github.com/niri-wm/niri/pull/238"
        },
        "issue": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/238"
        },
        "comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/issues/238/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/238/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/niri-wm/niri/pulls/238/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/niri-wm/niri/statuses/9f543afffeed8fe53359ce0595f2bcd4651c5091"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    }
  ],
  "discussions": [
    {
      "id": "D_kwDOKFkxdc4AkazZ",
      "number": 3535,
      "title": "(i dont need help making the script) bash script to listen to IPC event and echo workspace name on workspace change",
      "body": "why did all of the obvious attempts fail?  i would have NOT figured this out myself\r\n[get-niri-workspace.sh](https://github.com/user-attachments/files/25612210/get-niri-workspace.sh)\r\n",
      "created_at": "2026-02-27T19:06:16Z",
      "updated_at": "2026-03-02T01:39:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A85qs",
        "body": "Nothing to do with niri, you just need help making the script.\r\n\r\n`jq` operates in buffered mode by default, you need to pass `--unbuffered` to make sure that it flushes the output after printing an ID.\r\n\r\n`jq` variables passed as arguments are always strings, you need to convert the ID to a number before you try to compare it to a number.\r\n\r\n```bash\r\nniri msg --json event-stream \\\r\n| jq --unbuffered -r 'select(.WorkspaceActivated) | .WorkspaceActivated.id' \\\r\n| while read -r ID; do\r\n    niri msg --json workspaces \\\r\n    | jq -r --arg id \"$ID\" '.[] | select(.id == ($id | tonumber)) | .name'\r\ndone\r\n```"
      },
      "user": {
        "login": "silvia552",
        "avatar_url": "https://avatars.githubusercontent.com/u/253626959?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJEN",
      "number": 2450,
      "title": "Probably duplicate: tearing/async flip support?",
      "body": "I play Geometry Dash, osu! and other precision-based games. I can set their window rules in other compositors like KWin or Hyprland to make them tear in fullscreen mode, but not in niri.\r\n\r\nI understand the part of the problem is that Smithay's devs don't wanna merge async flip support, though, I think it can be worked around. I remember when Hyprland dropped wlroots in favor of their own Aquamarine lib, because there were a lot of problems when Hyprland team wanted to make a new feature ahead of wlr. \r\n\r\nI'm not saying that you should do that, but... is there really no workaround to implement this?.. I'm really in love with niri from the moment I launched it on my machine, that was a very smooth experience, and I'd love to see how it improves the gaming on non-VRR monitors.\r\n\r\nAny ideas?",
      "created_at": "2025-09-26T16:56:13Z",
      "updated_at": "2026-03-01T22:27:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "relativemodder",
        "avatar_url": "https://avatars.githubusercontent.com/u/61388196?u=ed87dbe5178b319336eae7fb87660e1179b99f6b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajuhb",
      "number": 3285,
      "title": "Continuation of discussion for zoom/magnifier interface and impl in #3246",
      "body": "Summary:\r\n\r\nThe PR in the title (#3246) is an implementation of zoom/magnification for Niri.\r\n\r\nIt uses the same pipeline as the overview pan out. Basically, I pass all the render elements through a zoom transform, and added new variants to niri_render_elements! macro to generate Into<OutputRenderElements> impls for the appropriate variants on that type.\r\n\r\nThe PR got a lot of traction, discussion and feedback. It's over 100 comments now! So I brought the discussion over here now.\r\n\r\n---\r\n\r\nAs of commit `5f3b8f67c908ac77617e48230d1891cc7231c547`\r\n\r\nLatest interface:\r\n```kdl\r\nzoom {\r\n   movement-mode \"cursor-follow\" // \"on-edge\" or \"centered\"\r\n   increment-type \"linear\" // \"exponential\"\r\n   max-zoom 10.0\r\n   pinch-sensitivity 1.0\r\n}\r\n\r\n// Will trim this down, since I was experimenting\r\nanimations {\r\n  zoom-focal-pan      { spring damping-ratio=1.0 stiffness=1200 epsilon=0.0001; }\r\n  zoom-level-change   { spring damping-ratio=1.0 stiffness=800 epsilon=0.0001; }\r\n}\r\n\r\ncursor {\r\n   // scale-with-zoom\r\n}\r\n\r\nbinds {\r\n    Mod+Alt+Equal { set-zoom-level \"+0.1\"; }\r\n    Mod+Alt+Minus { set-zoom-level \"-0.1\"; }\r\n    Mod+Alt+WheelScrollUp   { set-zoom-level \"+0.1\"; }\r\n    Mod+Alt+WheelScrollDown { set-zoom-level \"-0.1\"; }\r\n    Mod+Z { set-zoom-level \"1.0\"; }\r\n    Mod+Shift+Z { toggle-zoom-lock; } // locks focal center, will also make it lock level\r\n }\r\n```\r\n\r\n```sh\r\nniri msg action set-zoom-level (+1.0|-1.0|1.0) \"output_name\"\r\nniri msg action toggle-zoom-lock \"output_name\"\r\nniri msg zoom-state\r\n```\r\n\r\nBugs to iron out:\r\n- Jitter while zooming. Somewhat mitigated by animations but still needs to be better.\r\n- Viewport centering when zooming in with gestures and keybinds with on-edge movement-mode.",
      "created_at": "2026-01-20T06:30:51Z",
      "updated_at": "2026-03-01T19:15:43Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Atan-D-RP4",
        "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Akccv",
      "number": 3540,
      "title": "Overview: improve use of screen real estate, and reduce scrolling",
      "body": "Hey,\r\n\r\nwhen opening overview from 1st workspace, the 1st workspace is centered.\r\n\r\n<img width=\"1896\" height=\"1033\" alt=\"image\" src=\"https://github.com/user-attachments/assets/3c7257b3-c939-47c0-8073-e27d6ac32925\" />\r\n\r\nThat \"wasted\" space in the top could be used to reduce scrolling: If 1st WS is at top, one would not have to scroll down so far for the other WS. (Analogously for last WS, which should be opened at bottom.)\r\n\r\nOf course,\r\n- 1st/last should not be scrolled \"away from top/bottom border\" when coming into view by scrolling\r\n- if too few WS to fill screen, just vertically center the list on the screen.\r\n\r\nCheers, and ofc thx for niri!!!",
      "created_at": "2026-03-01T09:50:03Z",
      "updated_at": "2026-03-01T15:53:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bertbesser",
        "avatar_url": "https://avatars.githubusercontent.com/u/4770807?u=ba3679ec8ea7884697b40e0dfcef14bbaa9142fb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abxih",
      "number": 716,
      "title": "Rebind the power key",
      "body": "Hi, I'm aware of the option to disable the power button handling in Niri, but it would be great if we could rebind it - create a keybind with it just like with the function keys.\r\nFor example I would like to bind it to [wlogout](https://github.com/ArtsyMacaw/wlogout).",
      "created_at": "2024-10-05T23:43:49Z",
      "updated_at": "2026-03-01T13:53:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "stepanzak",
        "avatar_url": "https://avatars.githubusercontent.com/u/99094176?u=c9ea00404bfaceff78e7a2246db193b6c06f3300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZKjd",
      "number": 325,
      "title": "Setup Showcase",
      "body": "Showcase your custom niri setups!\r\n\r\n**Rules:**[^1]\r\n* Upload your screenshot or video directly to GitHub. This way we won't lose them if the hosting is temporary or disappears.\r\n* You can post multiple times.\r\n* Linking your config is very welcome. Use direct commit links if possible to preserve the point in history (press <kbd>y</kbd> when looking at a file or folder on GitHub to convert the URL).\r\n\r\n[^1]: Shamelessly stolen from [the Awesome WM discussion](https://github.com/awesomeWM/awesome/discussions/3813).",
      "created_at": "2024-05-02T15:26:36Z",
      "updated_at": "2026-03-01T07:24:34Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbwGb",
      "number": 711,
      "title": "Add support for tablet relative mode",
      "body": "It looks like there was some support for this before but it was removed in https://github.com/YaLTeR/niri/issues/85 \r\n\r\nRelative mode is pretty much a requirement for using drawing tablets for shooter games and some other genres and for me it makes digital sculpting much easier. When drawing or sculpting, it lets you use much more of the tablet's surface in a single stroke.",
      "created_at": "2024-10-04T04:31:35Z",
      "updated_at": "2026-03-01T06:43:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "CheesecakeCG",
        "avatar_url": "https://avatars.githubusercontent.com/u/32441086?u=5399d2975348793965bdd1188ce6248a4a7f5298&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkcGw",
      "number": 3539,
      "title": "how do i disable this shadow effect on the border?",
      "body": "at first i thought that the border colors were not true color but after making the window border super big i see that its a shadow effect on the border\r\n\r\nive already had it disabled here:\r\n```\r\nlayout {\r\n    shadow {\r\n        off\r\n    }\r\n}\r\n```\r\nso i disabled it here too:\r\n```\r\nwindow-rule {\r\n    shadow {\r\n        off\r\n    }\r\n}\r\n```\r\nbut it still persists\r\n<img width=\"93\" height=\"85\" alt=\"Screenshot from 2026-02-28 19-35-33\" src=\"https://github.com/user-attachments/assets/2f0c1dcc-23d8-44bf-9104-7c167c72719a\" />\r\nthe colors for the window and the border in the pic above are both `#ffff00`",
      "created_at": "2026-03-01T00:40:24Z",
      "updated_at": "2026-03-01T01:10:16Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A84Eo",
        "body": "im so sorry for wasting ur time, i had it uncommented but i guess i didnt actually save the file....\r\n\r\n`prefer-no-csd` fixes it"
      },
      "user": {
        "login": "silvia552",
        "avatar_url": "https://avatars.githubusercontent.com/u/253626959?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgdMR",
      "number": 1925,
      "title": "Niri is looking good, but one big stumbling block for me, Steam won't start. [SOLVED]",
      "body": "First of all, I love how Niri works so far, my only problem is that Steam won't launch in Niri. Runs in KDE, and Hyprland.\r\n\r\nI'm running Niri 25.05.1 on Bazzite 42.\r\n\r\nMy system is an HP Elitebook 850 G3 with 24GB RAM and an Intel i5 6500. Nothing special, no \"real\" GPU.\r\n\r\nBelow is the output when running Steam in the terminal. I had just logged out of my KDE session with Steam running and switched to Niri and ran in the Terminal to get this info.\r\n\r\n`ian@bazzite:~$ steam\r\nsteam.sh[100161]: Running Steam on bazzite 42 64-bit\r\nsteam.sh[100161]: STEAM_RUNTIME is enabled automatically\r\nsetup.sh[100213]: Steam runtime environment up-to-date!\r\nsteam.sh[100161]: Log already open\r\nsteam.sh[100161]: Using supervisor /var/home/ian/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/usr/bin/steam-runtime-supervisor\r\nsteam.sh[100161]: Steam client's requirements are satisfied\r\nCProcessEnvironmentManager is ready, 6 preallocated environment variables.\r\n[2025-06-28 12:49:34] Startup - updater built May 19 2025 19:50:58\r\n[2025-06-28 12:49:34] Startup - Steam Client launched with: '/var/home/ian/.local/share/Steam/ubuntu12_32/steam' '-srt-logger-opened'\r\nLooks like steam didn't shutdown cleanly, scheduling immediate update check\r\nCProcessEnvironmentManager is ready, 6 preallocated environment variables.\r\n[2025-06-28 12:49:34] Process started with command-line: '/var/home/ian/.local/share/Steam/ubuntu12_32/steam' '-child-update-ui' '-child-update-ui-socket' '8' '-srt-logger-opened'\r\n06/28 12:49:34 minidumps folder is set to /tmp/dumps\r\n[2025-06-28 12:49:34] Using update UI: console\r\n06/28 12:49:34 Init: Installing breakpad exception handler for appid(steam)/version(0)/tid(100262)\r\n[2025-06-28 12:49:34] Create window\r\n[2025-06-28 12:49:34] Loading cached metrics from disk (/var/home/ian/.local/share/Steam/package/steam_client_metrics.bin)\r\n[2025-06-28 12:49:34] Using the following download hosts for Public, Realm steamglobal\r\n[2025-06-28 12:49:34] 1. https://client-update.fastly.steamstatic.com, /, Realm 'steamglobal', weight was 900, source = 'update_hosts_cached.vdf'\r\n[2025-06-28 12:49:34] 2. https://client-update.akamai.steamstatic.com, /, Realm 'steamglobal', weight was 100, source = 'update_hosts_cached.vdf'\r\n[2025-06-28 12:49:34] 3. https://client-update.steamstatic.com, /, Realm 'steamglobal', weight was 1, source = 'baked in'\r\n06/28 12:49:34 minidumps folder is set to /tmp/dumps\r\n[2025-06-28 12:49:34] Checking for update on startup\r\n[2025-06-28 12:49:34] Checking for available updates...\r\n[2025-06-28 12:49:34] Downloading manifest: https://client-update.fastly.steamstatic.com/steam_client_ubuntu12\r\n[2025-06-28 12:49:34] Manifest download: send request\r\n[2025-06-28 12:49:34] Set percent complete: 0\r\n[2025-06-28 12:49:34] Set status message: Checking for available updates...\r\n[  0%] Checking for available updates...\r\n[2025-06-28 12:49:34] Set percent complete: -1\r\n[2025-06-28 12:49:34] Manifest download: waiting for download to finish\r\n[2025-06-28 12:49:34] Manifest download: finished\r\n[2025-06-28 12:49:34] Download skipped: /steam_client_ubuntu12 version 1747701111, installed version 1747701111, existing pending version 0\r\n[2025-06-28 12:49:34] Nothing to do\r\n[2025-06-28 12:49:34] Verifying installation...\r\n[2025-06-28 12:49:34] Verifying all executable checksums\r\n[2025-06-28 12:49:34] Set percent complete: -1\r\n[2025-06-28 12:49:34] Set status message: Verifying installation...\r\n[----] Verifying installation...\r\n[2025-06-28 12:49:35] Verification complete\r\nUpdateUI: skip show logo\r\n[2025-06-28 12:49:35] Destroy window\r\n\r\nSteam logging initialized: directory: /var/home/ian/.local/share/Steam/logs\r\n\r\n[2025-06-28 12:49:36] ProcessNextMessage: socket disconnected\r\n[2025-06-28 12:49:36] No more messages are expected - exiting\r\nUnable to open display\r\nUnable to open displaysrc/steamUI/spewmanager.cpp (192) : Assertion Failed: Error: Unable to open display\r\nsrc/steamUI/spewmanager.cpp (192) : Assertion Failed: Error: Unable to open display\r\n06/28 12:49:36 Init: Installing breakpad exception handler for appid(steam)/version(1747701111)/tid(100261)\r\nassert_20250628124936_6.dmp[100270]: Uploading dump (out-of-process)\r\n/tmp/dumps/assert_20250628124936_6.dmp\r\n/var/home/ian/.local/share/Steam/steam.sh: line 960: 100261 Segmentation fault      (core dumped) \"$STEAMROOT/$STEAMEXEPATH\" \"$@\"\r\nassert_20250628124936_6.dmp[100270]: Finished uploading minidump (out-of-process): success = yes\r\nassert_20250628124936_6.dmp[100270]: response: CrashID=bp-3ac0b369-8d2e-4822-95f8-479dc2250628\r\nassert_20250628124936_6.dmp[100270]: file ''/tmp/dumps/assert_20250628124936_6.dmp'', upload yes: ''CrashID=bp-3ac0b369-8d2e-4822-95f8-479dc2250628''\r\n`",
      "created_at": "2025-06-28T17:00:35Z",
      "updated_at": "2026-02-28T21:49:00Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "TheMisterChristie",
        "avatar_url": "https://avatars.githubusercontent.com/u/171644252?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkZTS",
      "number": 3526,
      "title": "Isolated outputs/screens for projection",
      "body": "Would it be possible to mark a display (output) as a projection or static view screen so that it would be isolated from\r\n\r\n- Alt tab\r\n- overview\r\n- notifitcations\r\n- other on-screen overlays\r\n- dimming\r\n\r\netc.\r\n\r\nThis would be really nice with for example OBS or a machine that is doing lyric projection or sign displays along side a desktop for control.\r\n\r\nI've tried to find a way to do it... but I'm very new to Niri.",
      "created_at": "2026-02-26T18:38:36Z",
      "updated_at": "2026-02-28T19:47:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "phedders",
        "avatar_url": "https://avatars.githubusercontent.com/u/5877?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfnNw",
      "number": 1534,
      "title": "Additional Features for Overview",
      "body": "This is a great feature and I use it all the time. While using it I thought about a couple of quality-of-life features that I think would work pretty well.\r\n**Additional features for overview:**\r\n- `click-to-close`: Assign mouse button or mod key combo to close windows from overview mode. Intuitively I would assume middle-clicking.\r\n  - There is a huge convenience in doing this when you want to clean up your work area. Just putting everything into overview and clicking all the windows that I want closed is an effective way of cleaning up the workspace. I think Windows does something similar.\r\n- Workspace/Window labels\r\n  - This is honestly kind of just eye candy and I like having things labeled so that I can identify which workspace I'm on and what windows I have on that workspace. Nice for when I'm dragging organizing.",
      "created_at": "2025-05-06T21:25:30Z",
      "updated_at": "2026-02-28T15:11:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "deadbody13",
        "avatar_url": "https://avatars.githubusercontent.com/u/57448148?u=24378a66eb085665f17964aba26e46f962d4b3e0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkbhC",
      "number": 3537,
      "title": "Some AppImages won't launch without manual DISPLAY and xwayland-satellite config",
      "body": "Dear community,\r\n\r\nI'm using Niri `v25.11` and xwayland-satellite `0.8.1`.\r\n\r\nSome AppImages (e.g. Audacity) just won't start without the following in `config.kdl`:\r\n\r\n```\r\nenvironment {\r\n    DISPLAY \":0\"\r\n}\r\n\r\nspawn-sh-at-startup \"xwayland-satellite\"\r\n```\r\n\r\nThat's totally ok, But I thought Niri wouldn't need this configuration anymore since version `v25.08`.\r\n\r\nAnything I'm missing here?\r\n\r\nI've been a Niri user since day one -- so to speak. I love it. Thank you!",
      "created_at": "2026-02-28T11:39:08Z",
      "updated_at": "2026-02-28T11:39:08Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Brixy",
        "avatar_url": "https://avatars.githubusercontent.com/u/1643010?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhBzT",
      "number": 2150,
      "title": "How do I make Kwallet start?",
      "body": "Hi there,\r\n\r\nI'm installing Niri on a CachyOS install that already runs KDE/Plasma. I can't access my \"Vivaldi key store\" because, as far as I can tell, that's all locked away behind Kwallet. I've tried several things, but I can't seem to get pam_kwallet_init to play nice. Any thoughts?\r\n\r\nI'm a little lost with all this. kwalletd6 seems to start up when run manually, but then... well:\r\n\r\n```bash\r\nkwalletd6\r\ncd /usr/lib\r\n./pam_kwallet_init\r\n2025/07/30 19:43:47 socat[73510] W address is opened in read-write mode but only supports read-only\r\n2025/07/30 19:43:47 socat[73510] E connect(, AF=1 \"/run/user/1000/kwallet5.socket\", 32): Connection refused\r\n```\r\n\r\nI've been trying to run the services manually to figure out what to put in my config file, but yeah. Not having much luck.",
      "created_at": "2025-07-31T01:47:37Z",
      "updated_at": "2026-02-28T01:42:56Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nerdictranslator",
        "avatar_url": "https://avatars.githubusercontent.com/u/208233699?u=615c7aa481108c03b5053d90b89aa0ad2dc4439c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkG3X",
      "number": 3436,
      "title": "Browsers behave differently when moving mouse to the edge of monitor",
      "body": "The title is probably wrong but I can’t really sum up the question properly in such a constrained space.\r\n\r\nBasically I use focus-follows-mouse and struts for horizontal movement between windows. Sometimes it’s just simpler and quicker to flick my mouse to the edge of the screen and have it automagically move to the next adjacent window. I have it set up to where I can just barely see the line of the adjacent windows on either side (about 1-2px) when a window is fullscreen.\r\n\r\nHowever, this doesn’t seem to work for web browsers specifically. Both Brave and Zen Browser behave the same. Even though the struts etc. are identical for all apps, the browser isn’t maximised and the borders etc are clearly visible, it will just not scroll over to the next window. Meanwhile every other fullscreen app does this just fine, including Electron apps like Heroic, etc.\r\n\r\nThis kinda spoils the convenience of the setup since I frequently use the browser and want to move to the window I opened next to it using the mouse. Am I missing some window rule for launching browsers, or do I need to modify some hidden setting inside the browsers themselves to make them behave consistently like all other apps?",
      "created_at": "2026-02-12T11:19:13Z",
      "updated_at": "2026-02-27T18:47:46Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Alanon202",
        "avatar_url": "https://avatars.githubusercontent.com/u/25981252?u=8023ea739925bc14afc1fe7dfc9fadc8d02a761a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkZUR",
      "number": 3528,
      "title": "Keybinds \"Organization\"",
      "body": "I was curious if having a certain type of \"organization\" in the binds config would be useful for people. That way its easier to \"organize\" binds that go together. For example if the following was possible:\r\n\r\n```kdl\r\nMod {\r\n  D { spawn-sh \"fuzzel\"; }\r\n  Space { toggle-window-floating; }\r\n}\r\n\r\nMod {\r\n  1 { focus-workspace 1; }\r\n  ...\r\n  9 { focus-workspace 9; }  \r\n\r\n  Shift {\r\n    1 { move-column-to-workspace 1; }\r\n    ...\r\n    9 { move-column-to-workspace 9; }\r\n  }\r\n}\r\n```\r\n\r\nEdit: Just as a side note, this doesn't mean replacing the current binds config syntax, more to extend it so that the above is also possible!",
      "created_at": "2026-02-26T18:55:01Z",
      "updated_at": "2026-02-27T16:47:14Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "spiros132",
        "avatar_url": "https://avatars.githubusercontent.com/u/98518357?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AflIc",
      "number": 1525,
      "title": "Optional “background rendering” switch to keep frame-callbacks for hidden workspaces",
      "body": "### Motivation\r\n\r\nCurrently, when surfaces (windows) are completely hidden or on inactive workspaces, niri stops sending `wl_surface.frame` callbacks. This behavior saves power, but negatively affects apps like games, video playback (YouTube), and real-time monitoring tools. They respond by significantly lowering FPS, reducing streaming quality, or pausing updates altogether.\r\n\r\n### Proposal\r\n\r\nIntroduce an optional configuration to keep sending frame callbacks even if a surface isn't visible. Example configuration:\r\n\r\n```\r\nwindow-rule {\r\n  match app-id=r#\"firefox$\"#\r\n  background_rendering \"always\"\r\n}\r\n```\r\n\r\nPossible modes:\r\n\r\n* `auto` (current behavior)\r\n* `always` (always send callbacks)\r\n* `minimal` (limited callbacks, e.g., 1 per second)\r\n\r\n### Benefits\r\n\r\n* Prevents video quality drops in background tabs (YouTube, Twitch).\r\n* Allows games to maintain FPS for streaming (Steam Remote Play, OBS).\r\n* Supports continuous real-time dashboard updates.\r\n\r\n### Potential drawbacks\r\n\r\n* Higher resource usage (mitigated by being opt-in).\r\n\r\n### Examples in other compositors\r\n\r\n* **Hyprland:** always sends frame callbacks regardless of visibility.\r\n* **GNOME/KDE:** allow workarounds or optional toggles via extensions/settings.\r\n\r\n### Conclusion\r\n\r\nThis optional feature would enhance usability for power users and gamers without negatively impacting default performance.\r\n",
      "created_at": "2025-05-04T14:07:17Z",
      "updated_at": "2026-02-27T15:42:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ergolyam",
        "avatar_url": "https://avatars.githubusercontent.com/u/94765905?u=5dc1d74b1e99cb2a424acf6189a29489ce481da9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkXtx",
      "number": 3510,
      "title": "update from 25.08 to 25.11",
      "body": "i can't upgrade in nixos . i want to try new  niri looks , but niri validation won't pass. ",
      "created_at": "2026-02-25T16:36:37Z",
      "updated_at": "2026-02-28T16:03:35Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "saidjons",
        "avatar_url": "https://avatars.githubusercontent.com/u/20231579?u=e27c16f9791843a5bd6f8f025eb00d5958fe475c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZNTx",
      "number": 329,
      "title": "Scratchpads for quick access to often used windows",
      "body": "Niri looks awesome, great work!\r\n\r\nI'm considering switching but my workflow is making heavy use of scratchpads for easy terminals and note taking across multiple monitors. \r\nFrom reading the wiki it doesn't look like such a feature is natively available in niri (nor wayland in general).\r\nHas anyone set something similar up for themselves?",
      "created_at": "2024-05-05T05:38:45Z",
      "updated_at": "2026-02-27T08:03:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dantefromhell",
        "avatar_url": "https://avatars.githubusercontent.com/u/90508808?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkZ5K",
      "number": 3532,
      "title": "Implement per-keyboard binds",
      "body": "Allow setting per-keyboard binds (either include or exclude), will likely need a bind flag.\r\n\r\nsee: https://github.com/hyprwm/Hyprland/pull/13073#issuecomment-3962746663",
      "created_at": "2026-02-27T06:05:24Z",
      "updated_at": "2026-02-27T06:05:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Kommynct",
        "avatar_url": "https://avatars.githubusercontent.com/u/13646790?u=edc7f0552b4bc5bf5fa1a4031f43197dbfdee974&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiM1k",
      "number": 2484,
      "title": "Ability to start an app on specific workspace",
      "body": "Niri is built around the idea of dynamic workspaces but nevertheless offers the concept of \"permanent\" named workspaces.\r\n\r\nI've tried to use the named workspaces as \"places where I do specific tasks\" - coding, general browsing, taking notes, ... For that to be frictionless, the apps for those tasks should autostart when I login and they should wait for me on their designated workspace.\r\n\r\nAt the same time, I don't want to have a window-rule to e.g. always start a browser on a certain workspace because I want to be able to open-up ad-hoc browser windows on ad-hoc workspaces, when e.g. researching a topic and wanting to have a browser and IDE side-by-side.\r\n\r\nIn Sway, one is able to do `swaymsg \"workspace 1; exec wezterm start nvim\"` which would start a new terminal on workspace 1 regardless of the currently active workspace.\r\n\r\nI was not able to replicate this reliably in Niri. \r\n\r\nFirst, there is no ability to \"chain\" commands like that in `niri msg action`.\r\n\r\nMy next attempt was to just put the following in a script that I would autostart using `spawn-at-startup`:\r\n\r\n```\r\nniri msg action focus-workspace browse;\r\nniri msg action spawn-sh -- \"firefox\"\r\nniri msg action focus-workspace code;\r\nniri msg action spawn-sh -- \"wezterm start nvim\"\r\n```\r\n\r\nBut that can run into a \"race condition\". If firefox takes a little bit of time to start up, it will appear on the \"code\" workspace because that's what's active once its window appears. In the end, I \"solved\" it by just sleeping in between the invocations, but that feels like an ugly hack and makes me wait and look at flickering screens for a good number of time after login :)\r\n\r\nIs there a way of starting an app on specific workspace? If not, is it something other people would be interested in, too?\r\n\r\nThanks for an awesome piece of software 🙏🏼 As a long time i3/sway user I was hooked immediately and don't want to go back :)",
      "created_at": "2025-09-30T08:51:33Z",
      "updated_at": "2026-02-27T04:07:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "metlos",
        "avatar_url": "https://avatars.githubusercontent.com/u/19999?u=f842ec605bf81a65e65ba1f9b66deb58d001b29e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkYSQ",
      "number": 3519,
      "title": "Workspace scrolling on mouse click instead of release",
      "body": "I'm not sure if this would be considered a bug, a feature request, or something else, so I'm making it a discussion. I also tried searching, so apologies if this was brought up elsewhere.\r\n\r\nCurrently (at least in release 25.11), when clicking on a window that is partially off-screen, the scrolling animation immediately plays, moving the window **while** the mouse button is still down. While this is fine in most cases, I notice that it with some windows it has undesired side-effects.\r\n\r\nE.g. I have a text document partially off-screen. Clicking on the text, it can cause a large chunk of text to get highlighted as the window moves while the mouse is clicked.\r\n\r\nSimilarly, if this were in a drawing app, it can cause lines to get drawn from clicking alone.\r\n\r\nMy suggestion would be to change the trigger to mouse button release instead of mouse button down.\r\n\r\nI do not know however whether this is intended.\r\n\r\nIf needed I could try to get a screen recording of this.",
      "created_at": "2026-02-26T03:09:02Z",
      "updated_at": "2026-02-27T03:53:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "CubeTheThird",
        "avatar_url": "https://avatars.githubusercontent.com/u/6157553?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkZr9",
      "number": 3530,
      "title": "Is there a way to bind a key to a single Mod key? Similar to how pressing the Mod key in GNOME displays the Overview",
      "body": "```\r\nMod repeat=false { toggle-overview; }\r\n```\r\nThis will cause Niri to report a syntax error.",
      "created_at": "2026-02-27T02:03:04Z",
      "updated_at": "2026-02-27T06:53:53Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A8z5k",
        "body": "Not currently, but there is a PR here for it\r\nhttps://github.com/niri-wm/niri/pull/2456"
      },
      "user": {
        "login": "weijarz",
        "avatar_url": "https://avatars.githubusercontent.com/u/8944061?u=19ed17ae68ed86db5c0359c0f9ffe6037c71fa92&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkZeA",
      "number": 3529,
      "title": "how do i get the active window to stop changing the background color of my terminal?",
      "body": "i want my active window to have solid white border but it changes my terminals background color to whitened version of what i have configed for my terminal, if my border is pink it makes the terminal background pinkish.  i dont want it to change the background at all",
      "created_at": "2026-02-26T21:22:35Z",
      "updated_at": "2026-02-26T21:30:10Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A8zbl",
        "body": "https://niri-wm.github.io/niri/Configuration%3A-Window-Rules.html#draw-border-with-background"
      },
      "user": {
        "login": "silvia552",
        "avatar_url": "https://avatars.githubusercontent.com/u/253626959?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkYGb",
      "number": 3515,
      "title": "Drag from the border to resize",
      "body": "It would be nice to be able to resize windows with just the mouse. This would simply be done bt dragging from the border like most window managers. Some apps like discord do that already because of the built-in CSDs, but it should just be consistent.",
      "created_at": "2026-02-25T22:56:24Z",
      "updated_at": "2026-02-26T09:32:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "RaiHormo",
        "avatar_url": "https://avatars.githubusercontent.com/u/78657554?u=9b354b9c71ff87c384079d53099fcb744675e920&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkDNL",
      "number": 3418,
      "title": "Always center focused column toggle",
      "body": "I sometimes like to toggle between always having my columns centered and side-by-side. It sucks having to go into my niri config and changing center-focused-column between \"always\" and \"never\". It would be nice to have a toggle such as\r\n\r\nMOD+C { center-focused-column-toggle; }",
      "created_at": "2026-02-09T15:12:55Z",
      "updated_at": "2026-02-26T09:29:55Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ericpko",
        "avatar_url": "https://avatars.githubusercontent.com/u/40477404?u=3dfe72b8022759b05ece2d9297d05ae196131e23&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkYRh",
      "number": 3518,
      "title": "[Feature Request]: Mouse follows monitor/workspace",
      "body": "Similar to the existing focus-follows-mouse option.\r\n\r\nInstead of focusing on a given window, I am looking for a way so that the workspace focus changes when mousing to a different display, but _without_ changing the focused window of that workspace.\r\n\r\nExample of what this would look like:\r\n\r\nI have a document open on Display 1, as well as a video player window.\r\nI have a chatroom open on Display 2, as well as my browser.\r\n\r\n1. My focus is on the workspace of Display 1, and I am typing in the document.\r\n2. I move my mouse to Display 2, and begin typing. With the chatroom being last focused there, that is where my input goes.\r\n3. Moving back to Display 1, typing again goes into the document, not accidentally typing into the video player window.\r\n\r\nIf my explanation is not clear enough, let me know.",
      "created_at": "2026-02-26T02:57:04Z",
      "updated_at": "2026-02-26T02:57:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "CubeTheThird",
        "avatar_url": "https://avatars.githubusercontent.com/u/6157553?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkWIg",
      "number": 3499,
      "title": "Mouse movement affects Alt-Tab (MRU) windows switching",
      "body": "Right now, during Alt-Tab-ing with any mouse movement niri [focuses a thumbnail](https://github.com/niri-wm/niri/blob/549148d27779d024255a84535b42b947f1c2a113/src/input/mod.rs#L2564) under the pointer. \r\n\r\nIMO, it breaks the whole logic of alt-tabbing, because it uses keyboard to go through windows and only intentional mouse clicks should \"confirm\" a thumbnail choice.\r\n\r\nIt would be nice to have an option to disable this behavior (or to make it default and leave an option to enable it for those who wants it)",
      "created_at": "2026-02-24T14:49:25Z",
      "updated_at": "2026-02-26T02:38:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bea231",
        "avatar_url": "https://avatars.githubusercontent.com/u/3084386?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai4-A",
      "number": 2815,
      "title": "automatically utilize entire screen / auto-scroll on closing rightmost window",
      "body": "say this is the current layout windows, two windows on my screen with another one to left ( now hidden)\r\n<img width=\"1746\" height=\"1125\" alt=\"image\" src=\"https://github.com/user-attachments/assets/55e48cd9-cd85-46dc-a28c-115891aeb275\" />\r\n\r\nif i close the rightmost window, the screen show the left window with the right half empty\r\n<img width=\"1920\" height=\"1199\" alt=\"image\" src=\"https://github.com/user-attachments/assets/5eb30704-41b8-4ac4-bbcc-b21e2d9b94ed\" />\r\n\r\nshouldn't the workspace scroll right to make use of the newly made empty space? it seems more natural and intuitive.",
      "created_at": "2025-11-16T15:51:15Z",
      "updated_at": "2026-02-26T02:29:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Anandhu-X8",
        "avatar_url": "https://avatars.githubusercontent.com/u/109350330?u=f59fc981e41b8298acdf7c81f59c4545d164e834&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkX0e",
      "number": 3513,
      "title": "Workaround for DaVinci Resolve false GPU OOM + black preview on niri (Wayland + NVIDIA)",
      "body": "I found a workaround for DaVinci Resolve on Arch + niri + NVIDIA when Resolve shows:\r\n\r\n- false \"GPU memory is full\"\r\n- black preview viewer\r\n\r\nIn my case `nvidia-smi` still showed low VRAM usage, while Resolve logs showed repeated CUDA/OpenGL interop failures (`cudaErrorUnknown`).\r\n\r\nWorkaround that fixed it here:\r\n\r\n```bash\r\nenv \\\r\n  QT_QPA_PLATFORM=xcb \\\r\n  QT_XCB_GL_INTEGRATION=glx \\\r\n  __GLX_VENDOR_LIBRARY_NAME=nvidia \\\r\n  __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/10_nvidia.json \\\r\n  __NV_PRIME_RENDER_OFFLOAD=1 \\\r\n  __VK_LAYER_NV_optimus=NVIDIA_only \\\r\n  DRI_PRIME=1 \\\r\n  /opt/resolve/bin/resolve\r\n```\r\n\r\nI also opened an issue with full logs/details:\r\nhttps://github.com/niri-wm/niri/issues/3511\r\n\r\nIf anyone has a compositor-side setting that avoids this launcher workaround, I’d like to test it.",
      "created_at": "2026-02-25T18:24:57Z",
      "updated_at": "2026-02-25T18:24:57Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "gustavolendimuth",
        "avatar_url": "https://avatars.githubusercontent.com/u/37625398?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa5rv",
      "number": 597,
      "title": "Theming problem with Niri alongside KDE",
      "body": "I hope I chose the right section, I need help because I can't get through it...\r\nI have Niri alongside KDE and I'm having same problem with theming. In KDE settings I have the dark theme selected (breeze-dark) but in Niri every KDE app (Dolphin and kCalc, for example) loads with wrong colors, I'm attaching a clarifying screenshot.\r\nWith the light theme is all ok.\r\n\r\nThanks a ton!\r\n\r\n![image](https://github.com/user-attachments/assets/e714436c-a67b-43df-88f5-f1f4036f5a8b)\r\n",
      "created_at": "2024-08-14T10:03:25Z",
      "updated_at": "2026-02-25T16:49:27Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "vncnz",
        "avatar_url": "https://avatars.githubusercontent.com/u/5114389?u=797d25caf596b59370fd0d54b0b6dca583d75a1b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkT0t",
      "number": 3490,
      "title": "Fake focus between two windows with java applications (intellij)",
      "body": "I'm seeing a focus inconsistency: the active window border and mouse position update correctly, but the keyboard focus remains on the previous window until I perform a mouse click.\r\n\r\nWhen I move focus from the first window to the second, the border color updates and my cursor centers on the new window, but my typing still goes to the first window. I have to manually click the second window to type in it.\r\n\r\nThis behavior only occurs when switching between two Java-based applications.\r\n\r\nhttps://github.com/user-attachments/assets/70793730-6f31-4678-8dfa-5cb2bec468de",
      "created_at": "2026-02-22T17:59:22Z",
      "updated_at": "2026-02-25T16:14:43Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "krushev",
        "avatar_url": "https://avatars.githubusercontent.com/u/5734794?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZwY9",
      "number": 410,
      "title": "Window rule to auto-consume child windows into the same column",
      "body": "I've noticed several applications that open separate windows, such as a save confirmation dialog or a tool window of some sort. Currently, all of these windows appear next to the main window in their own column, sometimes pushing the main window partly off-screen.\r\n\r\nIt might be useful to have a window rule that could be applied to certain applications, such that all windows get added to the current column rather than starting a new column. Essentially performing an automatic `consume-window-into-column` when the child window is opened.",
      "created_at": "2024-05-30T13:41:33Z",
      "updated_at": "2026-02-25T14:55:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Nairou",
        "avatar_url": "https://avatars.githubusercontent.com/u/942190?u=fce8347b1eb6c8a9d1dee0459164949d026bf5dd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeWdx",
      "number": 1125,
      "title": "Automatic tab grouping",
      "body": "Something like that\r\n\r\nNumbers for comments\r\n\r\n```sway\r\ngroup_tab match app_id=\"alacritty.*\" title=... { // match, focused window\r\n  // Check app id is the same\r\n  is-same-app-id\r\n  // Check if the pid is the same as the focused window.\r\n  is-same-pid\r\n  // Check title the same.\r\n  is-same-title\r\n}\r\n\r\ngroup_tab exclude app_id=\"firefox|alacritty\" { // alacritty tab matching has its own rule\r\n  is-in-tabbed // Check if the focused window is in the tab already.\r\n  match/exclude // like in for_window\r\n}\r\n```\r\n\r\nWhether to group or not is `or` of all `group_tab`. The syntax to match on the `group_tab` line is the one for the currently focused window, the one inside the block is for the window being opened, when the tab is focused or tabbing enabled.\r\n\r\nThe rules inside the `group_tab` are all `AND`, thus `is-same-pid` and `is-same-title` implies both. Rules only applied at the time of opening.\r\n\r\nThis should be similar to `for_window` rules, to some extent. Not sure if the said syntax is really possible for `KDL`, but what I've specified basically lists all things that might be needed.\r\n\r\n--\r\n\r\nOne could do the grouping via IPC, however there should be cases to make IPC updates atomic and not deal with viewport, but at this point, IPC would basically allow to do window management on behalf of niri.\r\n\r\n",
      "created_at": "2025-02-12T16:20:32Z",
      "updated_at": "2026-02-25T14:55:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kchibisov",
        "avatar_url": "https://avatars.githubusercontent.com/u/27620401?u=e171ccf7497d1f3d23451abe7eb2a8463effb6b6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbGxz",
      "number": 633,
      "title": "Consider adopting `uwsm` for streamlined session management",
      "body": "`niri` could benefit by either prioritizing [`uwsm`](https://github.com/Vladimir-csp/uwsm) for session management or fully delegating this responsibility to it.\r\n\r\n`uwsm` effectively addresses many issues related to systemd integration in a clean and universal way.\r\n\r\nThe specifics of different compositors are handled via [plugins](https://github.com/Vladimir-csp/uwsm/tree/master/uwsm-plugins), in the form of small, easy-to-maintain shell scripts.",
      "created_at": "2024-08-28T16:33:40Z",
      "updated_at": "2026-02-25T12:43:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "e-tho",
        "avatar_url": "https://avatars.githubusercontent.com/u/128100160?u=a236fae00d4b8912c2b0ca3c35078e5e5dab79e5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkGl5",
      "number": 3431,
      "title": "consume-or-expel-window-* should probably move floating windows",
      "body": "My keybinds look like this:\n```kdl\nbinds {\n  Mod+Shift+H { consume-or-expel-window-left; }\n  Mod+Shift+J { move-window-down-or-to-workspace-down; }\n  Mod+Shift+K { move-window-up-or-to-workspace-up; }\n  Mod+Shift+L { consume-or-expel-window-right; }\n}\n```\n\nI use these for moving my windows around. But this breaks down when I am focused on a floating window.\nI'd expect the \"consume-or-expel-window-\\*\" actions to move floating windows like they do for tiling ones since most of the variants of \"move-window-\\*\" and \"move-column-\\*\" actually do this. For example, the \"move-window-\\*-or-to-workspace-\\*\" actions do actually move floating windows as well as tiled ones.\n\nI don't think this would be a breaking change since that action currently doesn't do anything when the focus is on a floating window. Also, there's is no concept of a \"floating column\", so the \"consume-or-expel\" part couldn't be applicable.\n\n### System Information\n* niri version: niri 25.11 (Nixpkgs)\n* Distro: NixOS-25.11\n",
      "created_at": "2025-12-05T01:57:34Z",
      "updated_at": "2026-02-25T11:01:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kalmenn",
        "avatar_url": "https://avatars.githubusercontent.com/u/61845593?u=1114314538da3f3658747690bd255c08e9aa52c2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj7vd",
      "number": 3374,
      "title": "A couple of Hotkey Overlay qol features",
      "body": "I'd love to be able to change the title of the Hotkey Overlay rather than it being hardcoded into source. \r\nI'd also love to be able to manually order the entries in the menu. The current system is not very easy to understand and getting things to go into the right place is a nightmare, which has left the whole menu very cluttered.\r\nUnfortunately I don't know enough Rust to confidently code these up myself!",
      "created_at": "2026-02-02T17:32:30Z",
      "updated_at": "2026-02-25T09:08:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "snjoramn",
        "avatar_url": "https://avatars.githubusercontent.com/u/52076512?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkVPS",
      "number": 3496,
      "title": "Maximize Single Column",
      "body": "I think it would be a nice feature to have a hypothetical variable called `maximize-single-column` that does the following:\r\n\r\n1.  Sets the first/last/only column in a workspace to occupy 100% (or any other percentage) of the available width. \r\n2. Gets overridden, setting the column back to `default-column-width` once an additional column is opened in the workspace.\r\n\r\nAltogether this would serve to reintroduce the familiar tiling UX of the first window being big, while maintaining the rest of the scrolling behavior once a screen is fully utilized.  In my case, I use a default width of 0.5, so this type of resizing would feel quite natural.\r\n\r\nI know this is against Niri's philosophy of never resizing windows, but am wondering if it would be practical to implement nonetheless.",
      "created_at": "2026-02-23T22:50:15Z",
      "updated_at": "2026-02-25T05:12:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "djs42012",
        "avatar_url": "https://avatars.githubusercontent.com/u/93899859?u=a4a5bd1d2aebe814e45f2c0ef75e7b938c8d49f3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZA9U",
      "number": 309,
      "title": "obs cannot capture screen",
      "body": "hey, i love this compositor, i am using it daily, but obs capture screen not working, already install all the requirements xdg-desktop-portal-gnome, pipewire, set env etc. but option to capture screen pipewire is missing. what did i miss?",
      "created_at": "2024-04-25T05:45:46Z",
      "updated_at": "2026-02-25T03:54:48Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AjQ5L",
        "body": "finally it worked! without gnome-shell, what i do is install xdg-desktop-wlr then start niri from tty with niri-session not niri --session, finally this compositor is complete for me, i use it as a daily driver, ditching hyprland for the scrolling tiles!! "
      },
      "user": {
        "login": "tomysurya",
        "avatar_url": "https://avatars.githubusercontent.com/u/152084609?u=b0064234995357f7fced4a8e3f5be98d80e1b436&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkV_1",
      "number": 3498,
      "title": "Alt-Tab (MRU) icons for previews",
      "body": "It would be nice to have icons near window preview titles in Alt-Tab mode, because now with similar color-schemes for most windows it's hard to differentiate an editor from a terminal for example only by window preview.",
      "created_at": "2026-02-24T12:53:36Z",
      "updated_at": "2026-02-24T12:53:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bea231",
        "avatar_url": "https://avatars.githubusercontent.com/u/3084386?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkU53",
      "number": 3494,
      "title": "Configurable minimum refresh / frame callback rate",
      "body": "Some applications are not well behaved with low refresh (1 Hz) when not visible. I'd appreciate a option (e.g. window match) to let some applications run at higher rates (e.g. 30 Hz), if this is even possible.\r\n\r\nMy specific issue: Valheim (Steam) goes completely nuts when running at 1 Hz callbacks, to the point of DoSing the server and causing severe player warping (e.g. on ships).",
      "created_at": "2026-02-23T16:37:19Z",
      "updated_at": "2026-02-23T19:53:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "larsch",
        "avatar_url": "https://avatars.githubusercontent.com/u/15712?u=aa2ed3f0df04984a402cebdaf1c9b0488f53f0a9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiteX",
      "number": 2733,
      "title": "Add configuration option to ignore xdg-desktop-autostart",
      "body": "The implementation of both spawn-at-startup and xdg-desktop-autostart may create redundancy for some users (like myself) who prefer to rely solely on their window manager's startup program implementation.  I would greatly appreciate an opt-in configuration option to completely ignore xdg-desktop-autostart.  \r\n  \r\nAdditionally, I absolutely love Niri and have switched to it as my daily driver.  Thank you so much for all the effort you (and other maintainers) put into this project.",
      "created_at": "2025-11-03T02:36:15Z",
      "updated_at": "2026-02-23T19:50:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "xzcollapse",
        "avatar_url": "https://avatars.githubusercontent.com/u/69776090?u=efec3ce266b1fcd0ed153955679aad3ac5755e66&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjJK3",
      "number": 2984,
      "title": "Feature request: Add runtime toggle for input devices (e.g. disable/enable touchpad)",
      "body": "Hi! I’d like to request a feature to dynamically enable/disable input devices at runtime, such as the touchpad, without restarting niri.\r\n\r\nWhen typing, the touchpad is often triggered accidentally. It would be great to assign a shortcut (e.g. Mod+Shift+T) to temporarily disable it, then re-enable when needed — without losing open windows or restarting the session.\r\n\r\nFor example, like this(suggestion):\r\n\r\nbind \"Mod+Shift+t\" { toggle_input_device type: \"touchpad\" }\r\n\r\nHow it could work:  \r\n\r\n    niri keeps track of input devices (via libinput)\r\n    When toggled off, niri simply ignores events from matching devices\r\n    No need to close/reopen device files — just skip event handling\r\n\r\nThis is a common feature in other compositors (e.g. Sway’s input <identifier> events disabled).\r\n\r\nThanks for considering!\r\n\r\n",
      "created_at": "2025-12-05T16:22:02Z",
      "updated_at": "2026-02-23T19:48:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "viweei",
        "avatar_url": "https://avatars.githubusercontent.com/u/1762036?u=bd463f012ff94d0904f33c0c2d6bde4155cbcd40&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae9nU",
      "number": 1322,
      "title": "Include other config files",
      "body": "It would be amazing to have a way to include other files into the config. My primary use case is sharing a 'main' configuration file between machines and having additional machine-specific configuration.\r\n\r\nThe syntax could be something like:\r\n```\r\ninclude --optional \"~/.config/niri/local.kdl\"\r\n```\r\nThis would cover my use case by including `config.kdl` in source control but not `local.kdl`, and avoids more complicated implementations like glob expansion, environment substitution or subshells. It would also be good to have a flag to make the inclusion optional, so your configuration doesn't become invalid when the file does not exist.\r\n\r\nTo treat included config as first-class configuration, it should probably have a file watcher and hot reload on included config files, but that's not that important to me.\r\n\r\nThis feature is well-supported in similar window managers like i3 and sway.\r\n\r\nExcellent software, by the way!",
      "created_at": "2025-03-22T10:02:15Z",
      "updated_at": "2026-02-23T17:29:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ewy1",
        "avatar_url": "https://avatars.githubusercontent.com/u/82234691?u=1ba6387666d1d13eed2b8080e3ff9bf6bebfa27f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj3KT",
      "number": 3331,
      "title": "Keybinding to move a window to a new workspace",
      "body": "Sometimes I just find myself going to the overview and dragging the window in focus, in between the current workspace and neighbouring workspace.\r\n\r\nGraphically, this creates a new workspace in between them and moves the current window to that.\r\n\r\nIt would great to simply have a keybinding that can do this.\r\n\r\nTo the best of my knowledge the keybindings I found move window to neighbouring workspaces or move workspaces around. Am I missing this exact feature somewhere deep in the docs?",
      "created_at": "2026-01-28T18:38:45Z",
      "updated_at": "2026-02-23T15:04:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Indithem",
        "avatar_url": "https://avatars.githubusercontent.com/u/128889127?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkT-Q",
      "number": 3492,
      "title": "Resizing windows with mouse in overview",
      "body": "Is this possible already? If not, it would be a nice feature to have, possibly on middle click drag.\r\n\r\nSometimes I open the overview with hot corners and it would be convenient to be able to resize windows in addition to moving them.",
      "created_at": "2026-02-22T21:58:23Z",
      "updated_at": "2026-02-22T21:58:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ArijanJ",
        "avatar_url": "https://avatars.githubusercontent.com/u/56356662?u=b7a509e82168655da71247fec7d124e8d65969d3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AitDr",
      "number": 2729,
      "title": "`loginctl terminate-session $XDG_SESSION_ID` leaves niri running (but detaches the screen)",
      "body": "I'd like to have a generic way of terminating my session (as I\"m using multiple WM, one of them niri). I think, the generic command for that would be `loginctl terminate-session $XDG_SESSION_ID` (assuming systemd-logind is used). That works in so far, as in that it detaches the session and throws me back to the display manager. However, upon next attempt to start a niri session, I instead get a warning that a niri session is already runnig.\r\n\r\nAnd indeed, `systemctl --user status niri` reveals that the session was never ended, but it seemingly lost access to the screen. I think, it would be sensible if the `loginctl` command above had the same effect as running `niri msg action quit --skip-confirmation`.\r\n\r\nWhat likely plays into this behavior: for my user I have lingering systemd user instances enabled.",
      "created_at": "2025-11-02T09:55:49Z",
      "updated_at": "2026-02-22T16:34:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "wucke13",
        "avatar_url": "https://avatars.githubusercontent.com/u/20400405?u=075e959e77a07eaca03dd4c0dd78eb43333b3525&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkStF",
      "number": 3486,
      "title": "Alpha threshhold for screencast blackouts",
      "body": "With swaync notifications, the layer extends from the top of the screen to the bottom of the screen, but this takes up a large amount of screen space during screencasts despite the majority of the blacked out area being transparent\r\ncould we have a windowrule/layerrule which ignores areas under a certain alpha?\r\nits especially bad with the control panel, where the layer extends across the entire screen\r\n<img width=\"1920\" height=\"1080\" alt=\"image\" src=\"https://github.com/user-attachments/assets/63ea3c8f-b303-461f-94b1-df8aca385fef\" />\r\n<img width=\"1920\" height=\"1080\" alt=\"image\" src=\"https://github.com/user-attachments/assets/2cc64151-f40e-4991-bc21-c6ec86c8c193\" />",
      "created_at": "2026-02-21T12:40:53Z",
      "updated_at": "2026-02-21T14:21:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nishiiko",
        "avatar_url": "https://avatars.githubusercontent.com/u/142626254?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajfkr",
      "number": 3186,
      "title": "How to get Thonny IDE working on Niri?",
      "body": "I've tried searching Issues for a similar problem but found nothing.\r\nProblem is that all Thonny's (which is using Tk toolkit AFAIK) menu and context dialogs get open in a tiled window, they use they own appid \"Menu\" instead of \"Thonny\" and even if I set \"Menu\" to open-floating, they just open in the middle of the screen and behaves weirdly and are unusable.\r\n\r\n[This is my Niri setup](https://codeberg.org/Uli/nixsauce/src/commit/33bbe0fd98d8b0771fd596247ff4589a37a5aa09/home-modules/deskenv/default.nix) where can be seen that I spawn xwayland-satellite on startup. All other non-wayland and wayland apps I've ever used behaves normally.\r\n\r\nIs this some known problem for Tk/Tkinter apps?",
      "created_at": "2026-01-03T16:05:14Z",
      "updated_at": "2026-02-20T11:21:32Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "WizardUli",
        "avatar_url": "https://avatars.githubusercontent.com/u/3875278?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkNWn",
      "number": 3469,
      "title": "gnome file manager ALWAYS floating",
      "body": "I also can't resize the tiling windows.\r\n(I have removed personal information from the image.)\r\n<img width=\"2560\" height=\"1440\" alt=\"Névtelen2\" src=\"https://github.com/user-attachments/assets/f2889840-a747-47bd-b99c-a22b1c0aa905\" />\r\n",
      "created_at": "2026-02-17T11:26:44Z",
      "updated_at": "2026-02-20T09:21:25Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A8ghZ",
        "body": "This is likely due to DankMaterialShell.\r\nYou need to edit the \"config.kdl\" file in \".config/niri\" and comment out the following line:\r\n```kdl\r\nwindow-rule {\r\n    match app-id=r#“^gnome-calculator$”#\r\n    match app-id=r#“^galculator$”#\r\n    match app-id=r#“^blueman-manager$”#\r\n    // match app-id=r#“^org\\.gnome\\.Nautilus$”#\r\n    match app-id=r#“^steam$”#\r\n    match app-id=r#“^xdg-desktop-portal$”#\r\n    open-floating true\r\n}\r\n```"
      },
      "user": {
        "login": "ksz00",
        "avatar_url": "https://avatars.githubusercontent.com/u/118668407?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afg0G",
      "number": 1494,
      "title": "All four corners as hot corner to trigger arbitrary commands",
      "body": "Now that we have the overview and the top-left hot corner, it would be amazing to be able to configure all four corners as potentially hot corners, and assign any command to them (i.e. lock, turn off displays, etc).\r\n\r\nthanks!",
      "created_at": "2025-04-29T14:51:52Z",
      "updated_at": "2026-02-20T01:19:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "emenel",
        "avatar_url": "https://avatars.githubusercontent.com/u/13215?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkP-m",
      "number": 3479,
      "title": "Where should I report an issue with a specific application that occurs specifically on Niri?",
      "body": "I'm trying to play a game I found on itch.io (Liminal Gallery). Running it through Bottles (and attempting all sorts of settings combinations) the game starts, but does not allow me to press anything. It seems like it's not detecting the mouse cursor at all, as the buttons don't transition to the hovered state at all.\r\nThis issue does not occur on Cinnamon nor Hyprland, nor does it appear using any other program as far as I'm aware.\r\n\r\nEdit: A workaround is available by running the game under gamescope, should this be reported at all?",
      "created_at": "2026-02-19T09:58:33Z",
      "updated_at": "2026-02-19T16:10:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "InkstainTheBat",
        "avatar_url": "https://avatars.githubusercontent.com/u/76812933?u=a681b04bde463d25bb8a83366fe0633c11aab248&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4ActlB",
      "number": 821,
      "title": "Input capture?",
      "body": "Hi all; I'm using niri on nixos, and trying to use deskflow to share my keyboard/mouse with another device. When I try to run the deskflow server it fails with the error 'failed to initialize input capture session' and my googling indicates this might be because an input capture portal isn't available.\r\n\r\nMy niri-portals.conf file contains the following:\r\n\r\n```\r\n[preferred]\r\ndefault=gnome;gtk;\r\norg.freedesktop.impl.portal.Access=gtk;\r\norg.freedesktop.impl.portal.Secret=gnome-keyring;\r\n```\r\n\r\nI'm guessing this means it'll fall back to using the gnome portal for protocols not listed (and I think the gnome portal supports input capture) but I'm not sure.\r\n\r\nWould you expect input capture to work with niri? If so, any advice on getting it working?",
      "created_at": "2024-11-21T12:54:14Z",
      "updated_at": "2026-02-19T06:57:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zoenetic",
        "avatar_url": "https://avatars.githubusercontent.com/u/56755170?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkPqc",
      "number": 3477,
      "title": "Niri Graceful Shutdown",
      "body": "I've made a script to gracefully shut down the session.\r\n\r\nIt gracefully terminates all non-essential applications for the session, whilst leaving things like `niri` and `wireplumber` untouched.\r\n\r\nRequirements (those marked with 🔹 means you likely already have it installed):\r\n- bash🔹\r\n- grep🔹\r\n- coreutils🔹 (`timeout` and `tail`)\r\n- pgrep\r\n- parallel\r\n\r\nUsage:\r\n```\r\n# Quit session\r\nniri-graceful-shutdown niri msg action quit -s\r\n\r\n# Power off\r\nniri-graceful-shutdown loginctl poweroff\r\n\r\n# Reboot\r\nniri-graceful-shutdown loginctl reboot\r\n\r\n# Just gracefully kill all non-essential processes\r\nniri-graceful-shutdown true\r\n```\r\n\r\nThe script: https://gist.github.com/alexmozaidze/ca2363ec5080dfd1b48c64647a4a55d4\r\n\r\nIf you experience issues, @ me and I will fix the issues right away.",
      "created_at": "2026-02-19T03:11:57Z",
      "updated_at": "2026-02-19T05:34:40Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "alexmozaidze",
        "avatar_url": "https://avatars.githubusercontent.com/u/51371527?u=f82a81c5ed83217936070c24aa09b27342812540&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkNf0",
      "number": 3471,
      "title": "Resize neighboring windows on column width change",
      "body": "When you resize a column, for example using `switch-preset-column-width`, nearby columns are moved to accomodate the resized column.\r\n\r\nInstead of moving the neighbours, I'd also like to have the option to resize them instead. This would allow resizing windows while keeping the other windows fully in view.\r\n\r\nCurrent behaviour:\r\n```\r\n Before resize         After resize\r\n+--------------+    +--------------+    \r\n|..............|    |..............|......\r\n|. W1  .  W2  .|    |.    W1    .  |W2   .\r\n|..............|    |..............|......\r\n+--------------+    +--------------+\r\n```\r\n\r\nSuggested behaviour:\r\n```\r\n Before resize         After resize\r\n+--------------+    +--------------+\r\n|..............|    |..............|\r\n|. W1  .  W2  .|    |.   W1    .W2.|\r\n|..............|    |..............|\r\n+--------------+    +--------------+\r\n```",
      "created_at": "2026-02-17T13:28:21Z",
      "updated_at": "2026-02-18T08:11:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "winged",
        "avatar_url": "https://avatars.githubusercontent.com/u/303759?u=22c3f4c8a8543a534f3bdc92d33f1d1846bb24f8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkOEy",
      "number": 3475,
      "title": "Launch xwayland-satellite manually",
      "body": "Is there a way to manually command niri to launch xwayland-satellite before it's needed?\r\n\r\nOn my system, steam sometimes fails to start. It seems that it will always crash on the first attempt after launching niri with some variant of this error.\r\n\r\n```\r\ndbus[1905]: arguments to dbus_message_new_method_call() were incorrect, assertion \"_dbus_check_is_valid_path (path)\" failed in file ../dbus/dbus/dbus-message.c line 1389.\r\n```\r\n\r\nRelevant system info is as follows.\r\n\r\n```\r\narchlinux\r\nniri 25.11\r\n(launched via ly 1.3.2)\r\nxwayland-satellite 0.8\r\nsteam 1.0.0.85-3 (installed from the arch repos)\r\n```\r\n\r\nThe problem is the same regardless of how I launch steam: niri's spawn methods, xdg-autostart, a custom systemd unit, or just invoking `steam` via a terminal. I'm running xwayland-satellite 0.8, so I don't believe my issue is the same as #2463. Steam CLI arguments I've dug up from other reported issues, like `-system-composer` in #1925, don't seem to help.\r\n\r\nDiffing `systemctl --user status` before and after steam fails to launch shows the only difference as niri having spawned xwayland-satellite. And sure enough, if I run `xwayland-satellite` via a terminal beforehand then steam will launch on the first attempt.\r\n\r\nHowever I note that when niri runs xwayland-satellite it sets some dynamic `-listenfd` arguments, and so it seems like it would be preferable if I could ask niri to launch it with the correct arguments rather than running it myself.\r\n\r\nThere doesn't seem to be any evidence that this is a problem with the behaviour of either niri or xwayland-satellite. Other programs which rely on xwayland don't seem to have this same problem as steam. I've tried at least heroic and obsidian, and both of those launch immediately in a fresh session without issue. In fact, since they cause niri to launch xwayland-satellite, running one of these first allows steam to launch on its first attempt. That would be a solid workaround except that I don't need either of them (or any other xwayland-dependent program) to run at the start of a session.\r\n\r\nCurrently I just have steam in a systemd unit that restarts it on-failure so that it automatically tries a second time, but it would be nice to have a cleaner solution that doesn't require me launching xeyes or something.\r\n\r\nThanks, and apologies if this has come up before. I couldn't find anything but I could swear that the quality of Github's search has degraded massively over the last couple of months.",
      "created_at": "2026-02-17T23:57:59Z",
      "updated_at": "2026-02-18T07:22:55Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A8cC-",
        "body": "> Is there a way to manually command niri to launch xwayland-satellite before it's needed?\r\n\r\nRunning any X11 client will do it.\r\n\r\n> However I note that when niri runs xwayland-satellite it sets some dynamic `-listenfd` arguments, and so it seems like it would be preferable if I could ask niri to launch it with the correct arguments rather than running it myself.\r\n\r\nThis is only needed for niri's on-demand X11 DISPLAY. You can run by hand, then you just need to pass DISPLAY manually to apps."
      },
      "user": {
        "login": "cosmopetrich",
        "avatar_url": "https://avatars.githubusercontent.com/u/1663114?u=e22c3088e7544aa58a118adae601252ce7ff0e55&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkNz_",
      "number": 3472,
      "title": "[Feature request] Add `is_maximized_to_edge` field to focused-window JSON output",
      "body": "Currently, there is no equivalent indicator for windows maximized using `maximize-window-to-edge`.\r\n\r\nThis makes it impossible to programmatically detect whether a window is in the \"maximized-to-edge\" state — for example, in scripts or status bar integrations that need to toggle or reflect the current window state.\r\n\r\n**Proposed change:**\r\nAdd an `is_maximized_to_edge` boolean field (or similar) to the `focused-window` (and ideally `windows`) JSON output, indicating whether `maximize-window-to-edge` is currently active on the window.\r\n\r\n**Why this matters:**\r\n`maximize-window-to-edge` is preferable over standard maximize for users who want a borderless/frameless look, since it skips drawing the window border. Because of this, some users rely on it exclusively — but without a status flag, scripting around it (e.g. toggling, conditional behavior) is not possible.\r\n\r\n**Example use case:**\r\nDetecting the window state in a script to conditionally apply layout changes, or reflecting the state in a Waybar/status bar widget.",
      "created_at": "2026-02-17T18:29:44Z",
      "updated_at": "2026-02-17T18:29:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "og900aero",
        "avatar_url": "https://avatars.githubusercontent.com/u/49487376?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaIVe",
      "number": 463,
      "title": "Touchscreen gestures",
      "body": "I've recently purchased a minisforum v3 tablet, and I'm very happy with how niri runs on it, but it is rather unusable in tablet mode, since I have no way to switch windows or workspaces.\r\n\r\nI'd love to be able to bind support for gestures on the touchscreen, in a similar way to the trackpad. As a starting point I think the same gestures that the trackpad supports would be sufficient, but being able to do others like swiping from a screen edge, would be very useful as well.\r\n\r\nI hope to dig into the source and try to see if I can make this work, but I am not sure where to start.",
      "created_at": "2024-06-22T17:47:14Z",
      "updated_at": "2026-02-17T18:21:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "minego",
        "avatar_url": "https://avatars.githubusercontent.com/u/469128?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aefjp",
      "number": 1152,
      "title": "Mirror a monitor to another",
      "body": "Hi!  \r\nI really love niri, that's my main wm that I use daily. Sadly, I can't fully move away from gnome, because right now mirroring the \"primary\" display to my \"secondary\" is not possible in niri.\r\n\r\nI've tried to use [wl-mirror](https://github.com/Ferdi265/wl-mirror) to put it on the other display, but when that window loses focus, it stops updating.\r\n\r\nI think it would be really cool, if there were an option to mirror a display to another, or an action to do this, without relying on an external tool.",
      "created_at": "2025-02-20T10:03:24Z",
      "updated_at": "2026-02-17T17:49:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Balint66",
        "avatar_url": "https://avatars.githubusercontent.com/u/44706571?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkMPH",
      "number": 3461,
      "title": "Mirroring in niri",
      "body": "I am using niri on arch linux and i recently connected my TV with HDMI cable as additional monitor but i can only use it as seperate monitor (seperate workspace for external and internal monitor)  i am not able to mirror my laptop screen to the TV . I tried chaging the position of the monitors  in the config.kdl file but it is not working maybe i am doing it wrong or maybe its due to the tilling nature of  niri . If there is any other way to mirror your desktop to external monitor over HDMI please tell me ",
      "created_at": "2026-02-16T14:32:32Z",
      "updated_at": "2026-02-17T17:42:13Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A8Xxo",
        "body": "You can use wl-mirror for screen mirroring\r\n\r\nThere is also a section in the wiki\r\nhttps://niri-wm.github.io/niri/Screencasting.html#screen-mirroring"
      },
      "user": {
        "login": "Tobi-maru",
        "avatar_url": "https://avatars.githubusercontent.com/u/98447782?u=06ea676a2c1dd59f1b565af60fcba5946077ef8a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkNaY",
      "number": 3470,
      "title": "Support single modifier key-binds",
      "body": "I am coming from Gnome and while I really enjoy Niri, I am also very used to opening the App-Search by just pressing the `SUPER` key.\r\n\r\nIn niri this is not allowed, instead many people opt to using `SUPER+SPACE` instead.\r\nI personally would prefer to be able to still only press `SUPER` to execute an action, so that I don't need the unnecessary `SPACE` click.\r\n\r\n(I know it is not a big task to press 2 instead of one buttons, but I have trained my muscle memory for many many years and somewhat also personally have the opinion, that 1 click is better than 2 for such a basic thing, which is why I am not so convinced on the idea to retrain my muscle memory :D)",
      "created_at": "2026-02-17T12:14:06Z",
      "updated_at": "2026-02-17T12:15:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "LasseRosenow",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547444?u=f3d5b5fd734ab0c2659cbd1ee08194d67cdd337f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkNV2",
      "number": 3468,
      "title": "Only show focus ring, while changing the focus",
      "body": "I really like the focus ring, when switching between windows using \"SUPER+LEFT\" and others.\r\n\r\n### The Problem\r\n\r\nBut I usually don't need the focus ring anymore, when I have arrived at the window, that I want to focus.\r\nAnd I don't need it to remind me, that the window, that I am inside is focused. I am aware of that :)\r\nI personally find the focus ring quite distracting in that case.\r\n\r\n### The Solution\r\n\r\nI think it would be nice to have the option to normally not show the focus ring (make it transparent) and only show it when a navigation occurs. In my case that would be a keyboard triggered navigation using `SUPER+LEFT` or `SUPER+RIGHT`.\r\nI then would like that the ring disappears after a configurable  amount of time, for example a second or two.\r\n\r\nThis way I am not distracted while working in that window. But still have the help of the focus ring, when I actually need it.\r\n\r\n(I think it is not needed to show it when using the mouse to focus a window, because it is quite obvious, what window is focused, when clicking on it ;))",
      "created_at": "2026-02-17T11:14:47Z",
      "updated_at": "2026-02-17T11:14:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "LasseRosenow",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547444?u=f3d5b5fd734ab0c2659cbd1ee08194d67cdd337f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai6BG",
      "number": 2828,
      "title": "Using alternate desktop portal backends other than gnome",
      "body": "In the past I tried changing my desktop portal to kde's because that is imho much better implemented than gnome's. Initially I had the file taken from [https://github.com/YaLTeR/niri/blob/main/resources/niri-portals.conf](https://github.com/YaLTeR/niri/blob/main/resources/niri-portals.conf) at `/usr/share/xdg-desktop-portal/`.\r\n\r\nHowever nothing I tried seemed to work. Is there some documentation which I can refer to in order to do so?\r\n\r\nI totally respect niri's decision to go with gnome however I was looking for an alternative as most of the apps I use are from kde/qt.\r\n\r\nAny guide/help on this is appreciated.",
      "created_at": "2025-11-17T21:32:57Z",
      "updated_at": "2026-02-17T11:00:15Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "prirai",
        "avatar_url": "https://avatars.githubusercontent.com/u/58476539?u=d3a689fdc3fd674a1f4f8f9ae4e1f30c665de289&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkNA5",
      "number": 3467,
      "title": "Disable input region outside window",
      "body": "Sorry if this is more of a feature request than a bug, but I do think it's slightly unintuitive behavior. \n\nIn [this](https://github.com/YaLTeR/niri/issues/1834#issuecomment-2982750408) comment I read that the input region \"extends outside the window for things like CSD resize handles\". I'd like to disable this, since I don't use CSD and sometimes scroll outside of windows. \n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.08 (01be0e6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: -\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: -\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: -\n",
      "created_at": "2025-10-15T14:04:53Z",
      "updated_at": "2026-02-17T05:22:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "emiham",
        "avatar_url": "https://avatars.githubusercontent.com/u/65129819?u=586870a4cca84e4ac0581f2d24c96348d17cddf7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjeB6",
      "number": 3159,
      "title": "Multiple pointer / multi-seat support",
      "body": "Back on X, there was multi-pointer support support, MPX, that allowed multiple people pointing devices & their associate other input devices (multi seat) to work on a desktop. I could share a large monitor with a friend or have a second screen for them.\r\nhttps://en.wikipedia.org/wiki/Multi-Pointer_X\r\n\r\nThis sounds super daunting to add and it's not common to how folks users computers today, but I am opening this ticket to at least raise the possibility. Many thanks for the excellent Wayland server.",
      "created_at": "2025-12-31T21:01:21Z",
      "updated_at": "2026-02-16T18:58:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rektide",
        "avatar_url": "https://avatars.githubusercontent.com/u/53243?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkMSL",
      "number": 3462,
      "title": "Auto centre visible columns",
      "body": "I really like how [karousel](https://github.com/peterfajdiga/karousel) does the scrolling layout, where it always tries to keep windows centred. Niri has an action to do this, but can't do it automatically.\r\n\r\nSo I wrote this script:\r\n```bash\r\n#!/usr/bin/env bash\r\n\r\nwhile true; do\r\n    ACTIVE_WORKSPACE=$(niri msg --json workspaces | jq -r '.[] | select(.is_active == true)')\r\n    WORKSPACE_ID=$(echo \"$ACTIVE_WORKSPACE\" | jq -r '.id')\r\n    OUTPUT_NAME=$(echo \"$ACTIVE_WORKSPACE\" | jq -r '.output')\r\n    \r\n    MONITOR_WIDTH=$(niri msg --json outputs | jq -r \".\\\"$OUTPUT_NAME\\\".logical.width\")\r\n    \r\n    SUMMED_TILE_WIDTH=$(niri msg --json windows | jq --argjson wid \"$WORKSPACE_ID\" -r '\r\n        [.[] | select(.workspace_id == $wid) | {col: .layout.pos_in_scrolling_layout[0], width: .layout.tile_size[0]}]\r\n        | group_by(.col) | map(first.width) | add\r\n    ')\r\n\r\n    if awk \"BEGIN {exit !($SUMMED_TILE_WIDTH < $MONITOR_WIDTH)}\"; then\r\n        niri msg action center-visible-columns\r\n    fi\r\n\r\n    sleep 0.1\r\ndone\r\n```\r\n\r\nI also tried building this solution [into niri itself](https://github.com/niri-wm/niri/pull/2644), but it was too difficult for me. The script above is way simpler, and just works.",
      "created_at": "2026-02-16T15:11:10Z",
      "updated_at": "2026-02-16T15:11:10Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "baduhai",
        "avatar_url": "https://avatars.githubusercontent.com/u/31864305?u=2ac42ad83211a707d92f4aa0171ac2cd3560c3c8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkLAp",
      "number": 3454,
      "title": "Custom binds for the overview",
      "body": "For context, I use the following custom layout for my keyboard, which niri ignores:\r\n\r\n```\r\npartial alphanumeric_keys modifier_keys\r\nxkb_symbols \"pomy\" {\r\n\tinclude \"latam\"\r\n\tinclude \"level5(caps_switch)\"\r\n\tname[Group1] = \"Spanish (Pomy style)\";\r\n\r\n    key <AC06> {\r\n        type[Group1] = \"EIGHT_LEVEL\",\r\n        symbols[Group1] = [ h, H, hstroke, Hstroke, Left, Left, hstroke, NoSymbol ]\r\n    };\r\n    key <AB05> {\r\n        type[Group1]= \"EIGHT_LEVEL\",\r\n        symbols[Group1]= [ b, B, leftdoublequotemark, leftsinglequotemark, BackSpace, BackSpace, leftdoublequotemark, NoSymbol]\r\n    };\t\r\n    key <AC07> {\r\n        type[Group1] = \"EIGHT_LEVEL\",\r\n        symbols[Group1] = [ j, J, dead_hook, dead_horn, Down, Down, dead_hook, NoSymbol ]\r\n    };\r\n    key <AC08> {\r\n        type[Group1] = \"EIGHT_LEVEL\",\r\n        symbols[Group1] = [ k, K, kra, ampersand, Up, Up, kra, NoSymbol ]\r\n    };\r\n    key <AC09> {\r\n        type[Group1] = \"EIGHT_LEVEL\",\r\n        symbols[Group1] = [ l, L, lstroke, Lstroke, Right, Right, lstroke, NoSymbol ]\r\n    };\r\n    key <AB06> {\r\n        type[Group1] = \"EIGHT_LEVEL\",\r\n        symbols[Group1] = [ n, N, rightdoublequotemark, rightsinglequotemark, Return, Return, rightdoublequotemark, NoSymbol ]\r\n    };\r\n\r\n\tkey <AD07> {\r\n\t\ttype[Group1] = \"EIGHT_LEVEL\",\r\n\t\tsymbols[Group1] = [ u, U, downarrow, uparrow, space, space, downarrow, NoSymbol]\r\n\t};\r\n\tkey <AD08> {\r\n\t\ttype[Group1] = \"EIGHT_LEVEL\",\r\n\t\tsymbols[Group1] = [ i, I, leftarrow, idotless, BackSpace, BackSpace, leftarrow, NoSymbol]\r\n\t};\r\n};\r\n```\r\n\r\n... for which as a workaround, I've set the following binds to focus across windows:\r\n\r\n```\r\n    Mod+ISO_Level5_Shift+H  { focus-column-left; }\r\n    Mod+ISO_Level5_Shift+J  { focus-window-down; }\r\n    Mod+ISO_Level5_Shift+K    { focus-window-up; }\r\n    Mod+ISO_Level5_Shift+L { focus-column-right; }\r\n    Mod+Shift+ISO_Level5_Shift+H  { move-column-left; }\r\n    Mod+Shift+ISO_Level5_Shift+J  { move-window-down; }\r\n    Mod+Shift+ISO_Level5_Shift+K    { move-window-up; }\r\n    Mod+Shift+ISO_Level5_Shift+L { move-column-right; }\r\n    Mod+Home { focus-column-first; }\r\n    Mod+End  { focus-column-last; }\r\n    Mod+Ctrl+Home { move-column-to-first; }\r\n    Mod+Ctrl+End  { move-column-to-last; }\r\n    Mod+Ctrl+ISO_Level5_Shift+H  { focus-monitor-left; }\r\n    Mod+Ctrl+ISO_Level5_Shift+J  { focus-monitor-down; }\r\n    Mod+Ctrl+ISO_Level5_Shift+K    { focus-monitor-up; }\r\n    Mod+Ctrl+ISO_Level5_Shift+L { focus-monitor-right; }\r\n    Mod+Shift+Ctrl+ISO_Level5_Shift+H  { move-column-to-monitor-left; }\r\n    Mod+Shift+Ctrl+ISO_Level5_Shift+J  { move-column-to-monitor-down; }\r\n    Mod+Shift+Ctrl+ISO_Level5_Shift+K    { move-column-to-monitor-up; }\r\n    Mod+Shift+Ctrl+ISO_Level5_Shift+L { move-column-to-monitor-right; }\r\n```\r\n \r\n... but operating the overview is still to be done via the arrow keys, as niri ignores the xkb layout, and documentation does not include a way to modify it's binds.\r\n\r\nAdditionally, my primary pointer is a Wacom tablet, which does not operate on the overview, other than tapping a workspace to select it. Scrolling and drag and drop in unusable, as is Mod + drag for moving/resizing windows. The hot corner doesn't work either with the tablet.\r\n",
      "created_at": "2026-02-15T20:09:10Z",
      "updated_at": "2026-02-16T03:16:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "shyperson0",
        "avatar_url": "https://avatars.githubusercontent.com/u/91394210?u=c0720c5ab1a941c519b8d1d81cf0b3743179add5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkKgZ",
      "number": 3451,
      "title": "The area of operation of the mouse is incorrect when starting the game",
      "body": "After starting the game, the mouse movements are only recognized in a small area that appears at the start of the game. This is the initial window that appears after the game has started.\r\n\r\nLet me show you with the example of the game Kingdom Come: Deliverance.\r\n\r\n\r\nhttps://github.com/user-attachments/assets/e2e848df-bf3a-4b40-ae45-2c8e47cb6605\r\n\r\n\r\nThere are no settings in the `niri/config.kdl` file for this game while I demonstrate it on the video.\r\nMangoHud did not affect the final result. I have tried using it and not using it. I only needed it to limit the FPS for FreeSync to work properly.\r\n\r\nI tried adding `open-floating false` however, the problem remained unresolved.\r\n```\r\nwindow-rule {\r\n    match app-id=\"^steam_app_379430$\"\r\n    open-floating false\r\n}\r\n```",
      "created_at": "2026-02-15T09:54:52Z",
      "updated_at": "2026-02-15T19:59:10Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A8U1L",
        "body": "This is a normal issue, you can try launching your game with gamescope to mitigate it "
      },
      "user": {
        "login": "n00zJS6tl0",
        "avatar_url": "https://avatars.githubusercontent.com/u/227255738?u=d71ab9ef07ffebd6e548a9a738c7322f251c04fe&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaQ1J",
      "number": 491,
      "title": "Unwanted focus-follows-mouse column movement design",
      "body": "Let's collect the focus-follows-mouse unwanted column movement scenarios and possible solutions to figure out what to do with it.\r\n\r\n1. User has two outputs. Moving mouse between them will switch focus and scroll the columns on the source output. [#490](https://github.com/YaLTeR/niri/discussions/490) [#378](https://github.com/YaLTeR/niri/discussions/378)\r\n    1. The column that gets focused is visible by a very thin margin on the side, sometimes 1 px. In this case, it's clearly unwanted to switch focus.\r\n    2. The column that gets focused is visible by a large margin on the side (i.e. it's already half visible). In this case, the focus switch is probably not a big issue.\r\n2. User has one output with a maximized column and gaps or fractional scale. Moving mouse against an edge of the output (e.g. while trying to use a scroll bar) focuses the next column to the side, which is unwanted. [#408](https://github.com/YaLTeR/niri/discussions/408) [#484](https://github.com/YaLTeR/niri/discussions/484)\r\n    1. With gaps, this can easily happen if the maximized column is SSD whereas the column to the side has CSD shadows sticking out. Then, hovering over the gap is already sufficient to switch focus, because it is in the next window's input region, while there's no current window input region there, since it's using SSD.\r\n    2. This can also happen when all windows use SSD because the next window might be visible by ~1 px.\r\n3. User has one output with several well visible columns, one of which is only partially visible. However, the user is fine with that and doesn't want it to move on mouse over (or even in general). [#490](https://github.com/YaLTeR/niri/discussions/490) [#378](https://github.com/YaLTeR/niri/discussions/378)\r\n\r\nPossible solutions:\r\n\r\n* focus-follows-mouse but only for outputs. Solves all of these, but only if you don't need window focus-follows-mouse. I guess it could be added regardless.\r\n* Focus freeze key. I.e. while holding Alt, focus-follows-mouse is paused. Would solve 1, 2 but not 3. Requires manual action which is annoying.\r\n* View freeze key. I.e. while holding Alt, focus still changes, but the view is frozen. Would solve 3 and sort of 2. Requires manual action which is annoying.\r\n* Visibility threshold for focus-follows-mouse. I.e. the window must be more than `min(10%, 16 px)` visible for focus-follows-mouse to work. Solves 1i and 2 but not 3. Potentially breaks a workflow when people intentionally use struts to switch between maximized columns, but maybe the threshold can be tuned so that this is not a problem.\r\n* focus-follows-mouse only ever automatically focuses windows which are fully visible. More or less the same as visibility threshold 100%. Solves 1, 2 and partially 3.\r\n* Remove CSD shadows from focus-follows-mouse. Solves 2i but not really much else. Potentially breaks focus-follows-mouse on popups sticking out of geometry; not sure if it's entirely possible to separate the two cases.\r\n* Tentative focus: instead of switching the focus right away, focus-follows-mouse makes the window tentatively focused, and the real focus is only switched on some input event that requires it. Solves 1, 2, somewhat but not fully 3. Might be difficult to implement code-wise. Might require extra design (do is-focused window rules use tentative or real focus? etc.)\r\n\r\n\"Just don't scroll on focus change\"—this cannot really work, scrolling the focused window into view is baked into lots of layout operations. It has to be some specific persistent state. For example, interactive resizing can freeze the scrolling because it is a specific state \"is interactively resizing\". A view freeze key can exist because it is a specific state \"the view freeze key is currently pressed\". If you want to suggest not scrolling on focus change, suggest what persistent state could be used to temporarily freeze the scrolling.\r\n\r\nWe don't have to solve everything at once, if a solution works for several of the cases and doesn't break any other behavior, we can still do it, and it will be an improvement.",
      "created_at": "2024-07-01T07:58:32Z",
      "updated_at": "2026-02-15T14:33:34Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajzo6",
      "number": 3311,
      "title": "Feature request: minimum refresh rate for VRR",
      "body": "## Problem\r\n\r\nWith `variable-refresh-rate` enabled, my monitors drop to 48Hz when idle. At this low refresh rate, both of my monitors show intermittent brightness flickering in bright areas of the screen. Moving the mouse or triggering any animation immediately stops the flickering since the refresh rate goes back up.\r\n\r\nThis happens on two different monitors, both with a 48Hz as their lowest rate. The flickering is subtle and doesn't happen 100% of the time, but it's noticeable enough to be annoying. From what I've read, this is a common panel-level issue at very low refresh rates.\r\n\r\n## Why on-demand VRR doesn't work for me\r\n\r\nI know I can use `variable-refresh-rate on-demand=true` and add window rules for games, but I also want VRR for browsers so videos display with correct frame timing. If I add a rule for Firefox/Chrome, then I get the low refresh rate flickering whenever I'm reading a webpage with no video playing.\r\n\r\n## Proposed solution\r\n\r\nA `min-rate` option that prevents the refresh rate from dropping below a threshold:\r\n\r\n```kdl\r\noutput \"DP-1\" {\r\n    variable-refresh-rate min-rate=60\r\n}\r\n```\r\n\r\nNiri would force redraws at the minimum rate when nothing else is updating the screen.\r\n\r\nThis seems doable since the redraw loop already uses timers for frame pacing, and the `skip-cursor-only-updates-during-vrr` flag shows that conditional redraw logic based on VRR state already exists.\r\n\r\n## Related\r\n\r\n- Discussion #2487 is about the same underlying problem with a different approach\r\n- Discussions #1725, #2407\r\n- KDE has a similar minimum refresh rate setting\r\n\r\n## Setup\r\n\r\n- NVIDIA GPU on Wayland\r\n- niri from CachyOS repos\r\n- Dell S2721D (DP-2) and Gigabyte M32U (DP-1)",
      "created_at": "2026-01-25T13:38:23Z",
      "updated_at": "2026-02-15T11:54:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mgabor3141",
        "avatar_url": "https://avatars.githubusercontent.com/u/9047995?u=eecc5170892174e95aa8401d8623253abb8e08ef&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af69s",
      "number": 1657,
      "title": "Add support for runtime input device toggling",
      "body": "It would be helpful to support enabling or disabling input devices at runtime using a command like:\r\n```\r\nniri msg input <device> <enable|disable>\r\n\r\n```\r\nWhile Niri doesn't require a restart to apply configuration changes, updating the configuration is still relatively cumbersome for users managing their setup declaratively, for example via Nix.\r\n\r\nA typical use case is on laptops, where the touchpad can interfere with typing. Users often want to temporarily disable it without completely disabling it in the configuration.\r\n\r\nHaving a runtime toggle for input devices would make workflows much smoother on such setups.",
      "created_at": "2025-05-24T12:19:45Z",
      "updated_at": "2026-02-15T11:34:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "frdiener",
        "avatar_url": "https://avatars.githubusercontent.com/u/51481761?u=5cf2e4103b73539117a20e4ac00beabd9ea25e10&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkKTC",
      "number": 3449,
      "title": "Key Debounce",
      "body": "Ever since I've switched to Niri, I've been missing a key de-bounce feature.\r\nSometimes mechanical keyboards tend to develop \"key chatter\", which is when you press one key, it sometimes registers the press multiple times.\r\nPlasma, and even Windows via an app called KeyboardChatterBlocker lets you set a key de-bounce, so when it detects multiple presses of a key, within a specific time-frame (e.g 25ms) it drops the input.\r\nThis would make programming (and even just typing in general) a lot less annoying, since i don't have to delete whatever I'm typing due to key chatter.",
      "created_at": "2026-02-15T03:45:04Z",
      "updated_at": "2026-02-15T04:30:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "xenon-pl",
        "avatar_url": "https://avatars.githubusercontent.com/u/200838252?u=7854e60378c39cebddc1af255ae30c12e73a4566&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkKC0",
      "number": 3448,
      "title": "Any experience with window dancing on niri?",
      "body": "This is a more \"far off\" question and definitely related to something that niri most likely doesn't and probably will never support. But I figured I may as well ask if the community has poked around and figured out something anyways.\r\n\r\nHas anyone gotten \"window dancing\" based applications working within niri natively? Of course, with me asking this, I'm referencing [Rhythm Doctor](https://store.steampowered.com/app/774181/Rhythm_Doctor/) (and [this mod](https://github.com/chocolateimage/rd-multiwindow-linux) that makes it work). I already have the feeling the answer is going to be \"no, and probably never will\", but again, may as well ask the community who seems to be lively in making things work.",
      "created_at": "2026-02-14T20:32:28Z",
      "updated_at": "2026-02-14T20:32:28Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "SnenxyTengoku",
        "avatar_url": "https://avatars.githubusercontent.com/u/60184397?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkGej",
      "number": 3430,
      "title": "Allow going below/above bar/shell with `default-floating-position`",
      "body": "Hi! I noticed that when using `default-floating-position` with a `relative-to` value, it will always be placed to fit within the shell/bar boundaries and won't allow the application to go above/below it *by default* unless it gets manually moved by the user. I understand this is a rather \"niche\" feature, at least in the niri sphere for how windows are managed here, but I can see some possible benefits to allowing it.\r\n\r\nI was wondering if anyone figured out a workaround for this or if it would be possible to see if this could be an added option in the future?\r\n\r\n---\r\n\r\nMy usecase for this is, uhhh... rather \"Unique\". Really, I would just like to see this work so that specific \"windowed fullscreen\" types of games ([Windowkill](https://store.steampowered.com/app/2726450/Windowkill/), in this case <sub>(great game btw)</sub>, of which runs perfectly fine but adds a blind spot on the bottom due to the game running in 1080p, but getting knocked below due to my bar) could work and integrate a lot better with niri, but I could see other possible use cases for this type of thing (like perhaps [gpu-screen-recorder's UI](https://git.dec05eba.com/gpu-screen-recorder-ui/about/) allowing to be rendered \"properly\" instead of the fullscreen black background it gets by default *and* going over the whole display properly) if it were to be possible.",
      "created_at": "2026-02-12T05:44:19Z",
      "updated_at": "2026-02-14T20:26:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SnenxyTengoku",
        "avatar_url": "https://avatars.githubusercontent.com/u/60184397?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkGnQ",
      "number": 3434,
      "title": "Support for chord (sequential) keybindings: workspace, resize/layout, quick launch mode",
      "body": "## Feature Request: Chord (Sequential) Keybinding Support\n\n**Summary**\nIntroduce support for multi-step (chord) keybindings, allowing users to perform advanced and grouped actions with sequential key presses. This provides a more efficient and mnemonic-friendly workflow for users who want to organize related commands under meaningful prefixes.\n\n### Example Use Cases\n#### 1. Workspace Management Mode (Mod+W as prefix)\n- `Mod+W, 1-9` — Switch to workspace 1-9\n- `Mod+W, Shift+1-9` — Move window to workspace 1-9\n- `Mod+W, N` — Create new workspace\n- `Mod+W, D` — Delete current workspace\n- `Mod+W, R` — Rename workspace\n\n#### 2. Resize/Layout Mode (Mod+R as prefix)\n- `Mod+R, H/J/K/L` — Resize window (left/down/up/right)\n- `Mod+R, =` — Reset to default size\n- `Mod+R, F` — Toggle fullscreen\n- `Mod+R, Escape` — Exit resize mode\n\n#### 3. Quick Launch Mode (Mod+A as prefix)\n- `Mod+A, T` — Launch terminal\n- `Mod+A, B` — Launch browser\n- `Mod+A, E` — Launch editor\n- `Mod+A, F` — Launch file manager\n\n### Motivation\n- Allows grouping related actions under a common prefix, reducing shortcut conflicts and making sets of actions easy to memorize.\n- Greatly streamlines complex window management tasks or application launching workflows.\n- Reduces the number of awkward, multi-modifier key combinations needed for power user actions.\n\n### Background/Comparison\nMany modern editors and IDEs support chord bindings (e.g., Visual Studio, JetBrains products, Vim/Emacs via plugins). Integrating these in niri window management could offer similar productivity boosts for keyboard-driven users.\n\n### Proposed Behavior\n- Allow definition of a prefix key combo that activates a \"mode\" for subsequent short key sequences.\n- Configurable timeouts to reset the prefix if the sequence is not completed quickly.\n- Optionally show feedback (OSD/notification) when in a chord mode.",
      "created_at": "2026-02-12T07:22:00Z",
      "updated_at": "2026-02-14T20:02:56Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "HerrLiljegren",
        "avatar_url": "https://avatars.githubusercontent.com/u/973500?u=06cdd59123f8fb68d25ff9af1d1eea4126fd8ac5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkJzM",
      "number": 3445,
      "title": "Switching between keyboar layout variants i.e. 'us' and 'us-intl'",
      "body": "Hey there,\r\ni'm using a us keyboar and i sometimes need to type german special characters.\r\nFor this i usually setup `us` and `us-intl` as keyboard layouts. this works fine on gnome and windows.\r\n\r\nWhen i try to set it up in niri like this\r\n```\r\ninput {\r\n    keyboard {\r\n        xkb {\r\n            layout \"us,us-intl\"\r\n  //          variant \"none,intl\"\r\n            options \"grp:win_space_toggle,ctrl:nocaps\"\r\n        }\r\n        track-layout \"window\"\r\n        numlock\r\n    }\r\n}\r\n```\r\nit doesn't work. it only recognizes one us layout.\r\nniri msg reports\r\n> Keyboard layouts:\r\n>  * 0 English (US)\r\n\r\ni've also tried to ding via variants, which you can see in the commented out line which also didn't work (i didn't really expected that but it was worth a shot)\r\n\r\nto validate that i don't have a general problem i also tried `us,de-qwerty`, which worked as expected.\r\n\r\nDid i stumble upon a bug or what would be the correct config for my desired scenario?",
      "created_at": "2026-02-14T14:28:10Z",
      "updated_at": "2026-02-14T17:31:25Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A8S_B",
        "body": "ok, this setup works like desired. you are apperently building a layout to varient matrix here.\r\nso this config delivers one us layout without variant and one us layout with intl variant\r\n```\r\ninput {\r\n    keyboard {\r\n        xkb {\r\n            layout \"us,us\"\r\n            variant \",intl\"\r\n            options \"grp:win_space_toggle,ctrl:nocaps\"\r\n        }\r\n    }\r\n}\r\n```\r\n\r\nniri msg keyboard-layouts output is like expected and desired:\r\nKeyboard layouts:\r\n * 0 English (US)\r\n   1 English (US, intl., with dead keys)"
      },
      "user": {
        "login": "rbbl-dev",
        "avatar_url": "https://avatars.githubusercontent.com/u/78143613?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj8Oh",
      "number": 3379,
      "title": "Per-device keybindings and mouse button bindings",
      "body": "### Problem\r\n\r\nCurrently, all keybindings and mouse button bindings apply globally to all input devices. There's\r\nno way to differentiate between inputs from different devices.\r\n\r\n**My use case:** I want to disable middle-click on my touchpad (to prevent accidental paste) while\r\nkeeping it functional on my trackpoint and external mouse. The touchpad generates middle-clicks via\r\n libinput's click-method, which I frequently trigger accidentally.\r\n\r\n`clipboard { disable-primary }` is too blunt—it affects all devices globally.\r\n\r\n### Proposed solution\r\n\r\nAdd optional device qualifiers to binding triggers using a `:device` suffix:\r\n\r\n```kdl\r\nbinds {\r\n    // Current syntax (all devices) - unchanged\r\n    Mod+MouseMiddle { some-action; }\r\n\r\n    // Device type qualifier\r\n    MouseMiddle:touchpad { none; }\r\n    MouseRight:trackpoint { toggle-overview; }\r\n\r\n    // Specific device identifier\r\n    MouseMiddle:\"ELAN0676:00 04F3:3195\" { none; }\r\n\r\n    // Cross-device combinations\r\n    Mod:\"AT Translated Set 2 keyboard\"+MouseMiddle:touchpad { none; }\r\n}\r\n```\r\n\r\n**Device types:** `keyboard`, `touchpad`, `mouse`, `trackpoint`, `tablet` (same as `input {}`\r\n  section)\r\n**Special action:** none (or consume) - swallow the event without forwarding\r\n\r\n### Use cases\r\n\r\n- Disable accidental middle-click paste on touchpads only\r\n- Different behavior for trackpoint vs touchpad buttons\r\n- Bind side buttons on gaming mouse without affecting other mice\r\n- Per-keyboard modifier behavior (e.g., external keyboard has different layout)\r\n\r\n### Relation to other issues\r\n\r\n- https://github.com/YaLTeR/niri/issues/371 covers per-device input settings (acceleration, etc.)\r\n- https://github.com/YaLTeR/niri/issues/761 added mouse button bindings, but globally\r\n- This proposal extends bindings with device filtering\r\n",
      "created_at": "2026-02-03T07:15:53Z",
      "updated_at": "2026-02-14T17:22:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ggyorfi",
        "avatar_url": "https://avatars.githubusercontent.com/u/2327392?u=07455fefb4e24021b1094d14ed500ffb7b82a0b6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkJTF",
      "number": 3442,
      "title": "Support for customizing touchpad gestures",
      "body": "Is it possible to customize touchpad gestures? The reason I'm asking is I'd love to switch between open apps using three finger gesture (including the floating one's), essentially emulate the behavior of `Alt+Tab`  key combo. With the default three finger gesture, you can to do it many times to reach desired app with emulating `Alt+Tab` it becomes easier to move to any open app/window. Windows has this same behavior for three finger swipes.",
      "created_at": "2026-02-14T03:16:54Z",
      "updated_at": "2026-02-14T07:28:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nebula-it",
        "avatar_url": "https://avatars.githubusercontent.com/u/40148908?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aiq0f",
      "number": 2708,
      "title": "`open-windowed-fullscreen`?",
      "body": "Is it possible to open a window in windowed fullscreen mode? `open-windowed-fullscreen` doesn't work, so maybe there's other options? Right now I use `Mod+F` to fire off `toggle-windowed-fullscreen`, but that's a compromise.\r\n\r\nAny plans to implement `open-windowed-fullscreen` perhaps?",
      "created_at": "2025-10-30T09:58:38Z",
      "updated_at": "2026-02-14T03:58:33Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "superDuperCyberTechno",
        "avatar_url": "https://avatars.githubusercontent.com/u/6486383?u=2daf01547a5d1bb9b9b6ce02ccf127650aa7f4bd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkIqx",
      "number": 3440,
      "title": "Keybind key-up/key-down events separately",
      "body": "Apologies if this is a duplicate, I wasn't able to find a similar looking issue/discussion.\r\n\r\nI use [Handy](https://handy.computer) to transcribe my voice to type. It allows you to send `USR2` to the process to begin and end the transcription. Currently, I have this bound to a key, but I have to press it twice (once to begin recording, once to finish). I'd like to be able to make it a momentary switch (i.e. it begins recording when I press the button, and stops recording when I release the button).\r\n\r\nIdeally, I'd be able to write something like:\r\n```kdl\r\nbinds {\r\n  Mod+Space event=down {\r\n    spawn \"pkill\" \"-USR2\" \"-n\" \"handy\"\r\n  }\r\n\r\n  Mod+Space event=up {\r\n    spawn \"pkill\" \"-USR2\" \"-n\" \"handy\"\r\n  }\r\n}\r\n```\r\nDoes this seem possible/sensible? If so, I'd be happy to try implementing it.\r\n\r\nThanks :grin: ",
      "created_at": "2026-02-13T16:48:37Z",
      "updated_at": "2026-02-13T16:53:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cameron1024",
        "avatar_url": "https://avatars.githubusercontent.com/u/29902409?u=cfe223123c1a84ebcba70231963e36036ce220ca&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjdNf",
      "number": 3146,
      "title": "Is there a way to get niri to release some of its GPU memory with NVIDIA cards? I did read the wiki",
      "body": "**Edit: This affects AMD GPUs too, not just NVIDIA, see https://github.com/YaLTeR/niri/discussions/3146#discussioncomment-15486016.**\r\n\r\nI have a GeForce 750 Ti which only has 2 GB of memory and I noticed a lot of instability opening Firefox and Ghostty, especially when recording videos with OBS. Windows would lock up and become unresponsive in semi-random ways. All of those things use the GPU.\r\n\r\n`nvidia-smi` was showing niri using 1 GB of GPU memory on a fresh boot and then I found https://github.com/YaLTeR/niri/wiki/Nvidia. This helped a lot. On a fresh boot niri now uses around 75 MB. A huge difference for the better.\r\n\r\nBut now after opening and closing a few windows, recording a few videos with OBS, etc.. the GPU usage of niri is at 310 MB and it seems to be climbing even if nothing is open except 1 Firefox window (which uses its own GPU memory). I'm basically in a fresh boot scenario except I have opened and closed stuff during this session so it feels like something isn't getting cleared at the niri level. The wiki mentions niri shouldn't use much more than 100 MB.\r\n\r\nIf I spam open a few windows that don't use the GPU like Thunar, niri's GPU allocation goes up. This makes sense since they are occupying resources. Opening 8 or so Thunar windows raises the memory by about 100 MB total. However after I close them, this memory goes back down, however it won't drop below about ~300 MB since \"something\" raised the baseline. For reference I have 2 displays both at scale 1.0 but when recording videos I do change the scale to 2.0 for only the display being recorded.\r\n\r\n**Edit: I don't have hard evidence but I just rebooted and if I resize windows (height and / or width) then niri will continue to use more and more GPU memory. Even if you close the window / process that was resized, the memory does not get reclaimed. Is there a leak somewhere?**\r\n\r\nIs there anything that I can do to clear this memory in a safe way without disrupting niri / open applications without logging out or rebooting?\r\n\r\nI launch niri through uwsm in my zprofile like this `if uwsm check may-start; then exec uwsm start -F -- niri-session -l; fi`.\r\n\r\nBefore I understood what the problem was, I defined these 3 env vars in uwsm's env file. Figured I'd include this in any case they have an impact:\r\n\r\n```sh\r\n# Attempt to stabilize NVIDIA drivers on Wayland.\r\nexport GBM_BACKEND=nvidia-drm           # Force GBM to use NVIDIA DRM for buffer allocations\r\nexport __GLX_VENDOR_LIBRARY_NAME=nvidia # Ensures OpenGL / EGL apps use NVIDIA driver\r\nexport WLR_NO_HARDWARE_CURSORS=1        # Disables wlroots hardware cursor (compositor only)\r\n```\r\n\r\nI really don't know what they are doing or if they have a positive or negative outcome. It was just rummaging through many pages of Google results and Chat GPT to identify why my system was not stable. Should I even be setting these?\r\n\r\nEdit:\r\n\r\nHere's the `nvidia-smi` output:\r\n\r\n```sh\r\n$ nvidia-smi\r\nTue Dec 30 09:36:58 2025\r\n+-----------------------------------------------------------------------------------------+\r\n| NVIDIA-SMI 580.119.02             Driver Version: 580.119.02     CUDA Version: 13.0     |\r\n+-----------------------------------------+------------------------+----------------------+\r\n| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |\r\n| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |\r\n|                                         |                        |               MIG M. |\r\n|=========================================+========================+======================|\r\n|   0  NVIDIA GeForce GTX 750 Ti      Off |   00000000:01:00.0  On |                  N/A |\r\n| 42%   48C    P0              2W /   38W |    1139MiB /   2048MiB |      3%      Default |\r\n|                                         |                        |                  N/A |\r\n+-----------------------------------------+------------------------+----------------------+\r\n\r\n+-----------------------------------------------------------------------------------------+\r\n| Processes:                                                                              |\r\n|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |\r\n|        ID   ID                                                               Usage      |\r\n|=========================================================================================|\r\n|    0   N/A  N/A             869      G   niri                                    294MiB |\r\n|    0   N/A  N/A             941    C+G   walker                                  129MiB |\r\n|    0   N/A  N/A            1043    C+G   .../lib/xdg-desktop-portal-gnome          2MiB |\r\n|    0   N/A  N/A            3791      G   Xwayland                                  2MiB |\r\n|    0   N/A  N/A           36422      G   /usr/lib/firefox/firefox                414MiB |\r\n|    0   N/A  N/A           52853      G   ghostty                                 154MiB |\r\n+-----------------------------------------------------------------------------------------+\r\n```\r\n\r\nWhat's interesting is only xdg portal and Xwayland popped up after I used OBS. OBS is not included here because I closed it. Is it normal for them to continue running in the background?",
      "created_at": "2025-12-30T14:24:30Z",
      "updated_at": "2026-02-13T04:45:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A8Ot-",
        "body": "This PR https://github.com/niri-wm/niri/pull/3404 appears to have resolved this, there was a leak. At the time of this comment, it's not in the latest stable release (v25.11) but you can get it from the AUR with the `niri-git` package until the next release is available."
      },
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkHRp",
      "number": 3437,
      "title": "Is it able to config the binds of mousewheel inside overview?",
      "body": "Right now, `WheelScrollDown` is `focus-workspace-down`, `WheelScrollUp` is `focus-workspace-up`\r\n\r\nIf I need to scroll to other windows in current workspace, I need to use `Mod` + `WheelScrollDown/Up`\r\n\r\n\r\nIs it able to rebind the `WheelScrollDown/Up` to `focus-column-right/left`?\r\n",
      "created_at": "2026-02-12T17:25:27Z",
      "updated_at": "2026-02-13T02:49:40Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "c02y",
        "avatar_url": "https://avatars.githubusercontent.com/u/2135996?u=31ffff39466adaec84d735c1b962040522d20184&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgqcQ",
      "number": 1996,
      "title": "focus-follows-mouse delay",
      "body": "I quite like the focus-follows-mouse feature and thought it could be improved by added a delay option such that the focus only changes if the mouse pointer is on a non-focused window for a minimum amount of time.\r\n\r\nThe particular use case I am experiencing is while using a browser with vertical tabs, I often quickly off the active window (overshoot with the mouse) when clicking a new tab.\r\n\r\nNot sure if it's useful for anyone else, but thought I would bring it up once.\r\n\r\nMany thanks for the great WM.. I really enjoy using it!",
      "created_at": "2025-07-10T07:11:58Z",
      "updated_at": "2026-02-12T21:20:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tino376dev",
        "avatar_url": "https://avatars.githubusercontent.com/u/157116672?u=4a36fb4bf605da9dd257e346114b514619da5250&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfBy9",
      "number": 1347,
      "title": "Free scroll mode / disabling snapping",
      "body": "I'm coming to niri from using a [custom fork of PaperWM.spoon on MacOS](https://github.com/samdesota/shared-dots/tree/master/hammerspoon) which I made small improvements to over a year or so.\r\n\r\nI got tired of fighting apple so I made the leap to nix with niri recently. I've been very impressed with niri so far, but there are couple ergonomics differences that I missed so ended up forking and hacking some in on [this branch.](https://github.com/YaLTeR/niri/compare/main...samdesota:niri:sdesota/scrolling-changes?expand=1)\r\n\r\nThe main thing I did is make it possible to freely move the desktop around without any snapping. It's a little jank right now, I just commented out the snapping code to make this work, but it mostly works with a couple bugs. I use niri with a trackpad and this makes niri feel much smoother for me with three finger swiping to move around.\r\n\r\nI'm creating this issue to see if you would consider a more complete PR that adds an option to disable snapping windows to the left / center / right of the screen. I'd also like to add momentum-based scrolling to this, but one step at a time",
      "created_at": "2025-03-26T23:08:33Z",
      "updated_at": "2026-02-12T10:12:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "samdesota",
        "avatar_url": "https://avatars.githubusercontent.com/u/10083269?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj59_",
      "number": 3355,
      "title": "A windowrule that locks your mouse to a certain window",
      "body": "A window rule that doesnt let your mouse escape a window - could be useful for some games.\r\nExiting a window with that rule could happen with some specific bind, maybe just switching columns with a bind or just selecting another window/column with overview.\r\n",
      "created_at": "2026-01-31T18:29:18Z",
      "updated_at": "2026-02-12T02:15:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "d1BG",
        "avatar_url": "https://avatars.githubusercontent.com/u/144280774?u=ac0b07830b67c6e61ce798b81323409e885af657&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjeFR",
      "number": 3160,
      "title": "Splitting a display",
      "body": "I would like to be able to split a monitor such that it appears as two (or perhaps more) separate monitors. Somewhat the opposite of https://github.com/YaLTeR/niri/discussions/1285 and https://github.com/YaLTeR/niri/discussions/3103 .\r\n\r\nI have some very large displays, and it would be nice to be able to horizontally subdivide / split them top and bottom, such that I can have ambient apps like irc and chat at the top, and my main workspace below. Ideally I could subdivide further, with a vertical split to turn that final workspace into two.\r\n\r\nExample:\r\n```\r\n┌────────────────┐\r\n│ ambient/chat   │\r\n┌───────┌────────┐\r\n│ main1 │ main2  │\r\n│       │        │\r\n│       │        │\r\n└───────└────────┘\r\n```\r\n\r\nAs mentioned in #1285, [stilch](https://github.com/wegel/stilch) compositor supports this.",
      "created_at": "2025-12-31T23:51:56Z",
      "updated_at": "2026-02-11T20:56:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rektide",
        "avatar_url": "https://avatars.githubusercontent.com/u/53243?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae3ie",
      "number": 1285,
      "title": "Treating multiple monitors as one big canvas",
      "body": "I've noticed that monitors has their own isolated workspace, Is there a way to configure multiple monitors to contain one workspace and windows keep spawning next to each other and when maximised it occupied the monitor it is in.",
      "created_at": "2025-03-17T03:46:52Z",
      "updated_at": "2026-02-11T20:54:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "ravish0007",
        "avatar_url": "https://avatars.githubusercontent.com/u/32391963?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbRWt",
      "number": 658,
      "title": "Flip the column direction for RTL language",
      "body": "This may be hard to implement, and I would understand if your wouldn't implement this.\r\n\r\nUser interfaces in RTL languages should be flipped. it makes more seance if the column would scroll from right to left, meaning that new windows would spawn in the left of the current window. and all keybindings involving moving in the column, or moving windows inside the column should be flipped.\r\n\r\nit's weird for me that windows spawn in right of the current one.\r\n\r\nsee nautilus first in RTL, and second in LTR.\r\n\r\n![20240907_100841](https://github.com/user-attachments/assets/d8f39535-df3d-4414-9342-2f10381a6f90)\r\n\r\n![20240907_101014](https://github.com/user-attachments/assets/35f15d3d-bb49-4662-92c7-7d05af70dc15)\r\n",
      "created_at": "2024-09-07T09:12:31Z",
      "updated_at": "2026-02-10T15:04:33Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nakibrayane",
        "avatar_url": "https://avatars.githubusercontent.com/u/126190943?u=eda3bb4a1a17167877e6b65b2d4b069bbd1de5c5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjStw",
      "number": 3051,
      "title": "Niri window decoration with WSL",
      "body": "niri version: niri 25.11\r\n\r\nOk this might be a long shot and I admit that this might not be the perfect place to ask this, but maybe someone has some insights into this. I've been using niri within WSL2 daily for a while and I love it! \r\n\r\nBasically, I run `niri` from within the WSL2 terminal to launch it. Unfortunately, Microsoft's Weston mirror does not offer a possibility for a 'kiosk' mode or the ability for full-screen. Maximizing still keeps window borders and maximize/minimize/close buttons. If this wasn't bad enough, there's also still the windows taskbar. This has bothered me for a while now. \r\n\r\n<img width=\"1919\" height=\"1199\" alt=\"image\" src=\"https://github.com/user-attachments/assets/dd3fb030-4bda-4149-8fa3-83664fba0667\" />\r\n\r\n<img width=\"1919\" height=\"1199\" alt=\"image\" src=\"https://github.com/user-attachments/assets/50f57bbc-f5e9-4c23-80ed-de941eabec35\" />\r\n\r\nSo, I've tried to install weston and cage inside WSL itself. Cage, because it has no window decorations under WSL by default ([github issue](https://github.com/cage-kiosk/cage/issues/370)) and weston, because it offers a `--fullscreen` flag. Both solutions allowed me to spawn niri inside a full screen environment, but especially the nested weston solution had some performance loss of how snappy everything feels. \r\nTherefore, I've tried to build my own WSL system image that re-enables the keybind for fullscreen of the WSLg weston compositor and it works for applications that use CSD like ghostty and alacritty. At least that's my understanding of it.\r\n\r\nNow, the missing piece is making this possible with niri. Since niri itself is a wayland compositor and not a client, I strongly assume that the underlying rendering of niri's window is done by WSLg's weston compositor, since niri (probably) does not implement CSD and then it falls back to SSD done by weston per default? This is the part where I'm a bit lost, so excuse my lack of knowledge.\r\n\r\nThe real issue arises when I put niri into fullscreen with the re-enabled shortcut. Then the following happens:\r\n\r\n<img width=\"1919\" height=\"1199\" alt=\"image\" src=\"https://github.com/user-attachments/assets/cf1627d7-2dd0-4ef1-888d-10a69f26f529\" />\r\n\r\nThe 'old' window decorations from before stay, although they are no longer interactable. \r\nSo how my goal is to get rid of those borders. \r\nI'm 95% sure that this is something that Microsoft would need to fix, and I'll try to have a look at their weston mirror source code. But if anyone has any input or tips or if there is an option to spawn niri without any decorations, I would greatly appreciate it!\r\n\r\nThanks :)\r\n\r\n\r\n\r\n",
      "created_at": "2025-12-16T08:48:24Z",
      "updated_at": "2026-02-10T14:25:30Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6PYp",
        "body": "The decorations on the first and last screenshot are niri's CSD (comes from winit). If the compositor has xdg-decoration and supports SSD, niri won't draw them.\r\n\r\n> The 'old' window decorations from before stay, although they are no longer interactable.\r\n\r\nThis is weird and doesn't look like it can be a niri issue"
      },
      "user": {
        "login": "mle98",
        "avatar_url": "https://avatars.githubusercontent.com/u/42934778?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkDa_",
      "number": 3419,
      "title": "Close/Kill xwayland-satellite when the X11 client terminates?",
      "body": "Hi, is there an option in niri config that allows me this?\r\n\r\nThis is similar to the method used with xwayland-run, but I wonder if it could be done with xwayland-satellite:\r\n\r\n> When the X11 client terminates, xwayland-run will automatically close the dedicated Xwayland server.",
      "created_at": "2026-02-09T19:57:35Z",
      "updated_at": "2026-02-10T05:17:58Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A8Evc",
        "body": "Uh not currently, niri will just restart Xwayland-satellite when it detects it is dead"
      },
      "user": {
        "login": "Rally10",
        "avatar_url": "https://avatars.githubusercontent.com/u/51519741?u=534ad9be875aa9ace0ee026dfd86107b7f858ecb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agvtd",
      "number": 2046,
      "title": "have workspace switching animation ignore workspaces in-between",
      "body": "When switching between workspaces far apart from each other, e.g. 1 to 4, seeing all the workspaces in-between feels awkward, and can create flashes due to having different content in each.\r\n\r\nTherefore, it'd be nice if Niri had at least an option to behave like GNOME and Hyprland, which when switching from e.g. ws1 to ws4, you'll only see ws4 sliding in, not any in-between.",
      "created_at": "2025-07-14T22:09:43Z",
      "updated_at": "2026-02-09T07:31:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "marcelohdez",
        "avatar_url": "https://avatars.githubusercontent.com/u/76508651?u=3d1fa07751720e81ae0a41a6bee6b94831cdb49d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkLlA",
      "number": 3459,
      "title": "Hypridle reporting that Niri does not implement hyprland-lock-notify-v1",
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nhypridle is logging:\n```\n[WARN] Compositor is missing hyprland-lock-notify-v1!\n```\n\nThis seems to prevent hypridle from knowing when the lock command has been executed and as a result when suspending the machine it doesn't get to lock the screen before suspending.\n\nThis then means that when the machine is awoke it is briefly not locked and any sensitive information on the screen is visible for a short time period before the lock screen starts.\n\nThe documentation on this protocol can be found [here](https://wayland.app/protocols/hyprland-lock-notify-v1)\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: `niri unstable 2025-10-02 (commit ba6e5e082a79901dc89b0d49c5da1b769d652aec)`\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon 6900XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 9 7950X\n",
      "created_at": "2025-10-11T11:23:59Z",
      "updated_at": "2026-02-16T04:59:53Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "alisonjenkins",
        "avatar_url": "https://avatars.githubusercontent.com/u/1176328?u=26c622e4ba435ba36762044769e86420563b927b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj9dF",
      "number": 3392,
      "title": "The appearance of the mouse cursor does not change depending on its position and purpose.",
      "body": "Hey, everybody! Niri 08/25, the appearance of the mouse cursor does not change depending on its position and purpose (i.e. the cursor always stay the same). On Gnome all works. Any ideas? Thanks for advance. Config:\r\n```kdl\r\n// This config is in the KDL format: https://kdl.dev\r\n// \"/-\" comments out the following node.\r\n// Check the wiki for a full description of the configuration:\r\n// https://yalter.github.io/niri/Configuration:-Introduction\r\n\r\n// Input device configuration.\r\n// Find the full list of options on the wiki:\r\n// https://yalter.github.io/niri/Configuration:-Input\r\n\r\ncursor {\r\n    xcursor-theme \"Adwaita\"\r\n    xcursor-size 24\r\n}\r\n\r\ninput {\r\n\r\n\r\n// input {\r\n    // cursor {\r\n    //     theme \"Adwaita\"\r\n    //     size 24\r\n    // }\r\n// }\r\n    \r\n    keyboard {\r\n        xkb {\r\n            // You can set rules, model, layout, variant and options.\r\n            // For more information, see xkeyboard-config(7).\r\n\r\n            // For example:\r\n            layout \"us,ru\"\r\n            options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\r\n\r\n            // If this section is empty, niri will fetch xkb settings\r\n            // from org.freedesktop.locale1. You can control these using\r\n            // localectl set-x11-keymap.\r\n        }\r\n\r\n        // Enable numlock on startup, omitting this setting disables it.\r\n        numlock\r\n    }\r\n\r\n    // Next sections include libinput settings.\r\n    // Omitting settings disables them, or leaves them at their default values.\r\n    // All commented-out settings here are examples, not defaults.\r\n    touchpad {\r\n        // off\r\n        tap\r\n        // dwt\r\n        // dwtp\r\n        // drag false\r\n        // drag-lock\r\n        natural-scroll\r\n        // accel-speed 0.2\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"two-finger\"\r\n        // disabled-on-external-mouse\r\n    }\r\n\r\n    mouse {\r\n        // off\r\n        // natural-scroll\r\n        // accel-speed 0.2\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"no-scroll\"\r\n    }\r\n\r\n\r\n    trackpoint {\r\n        // off\r\n        // natural-scroll\r\n        // accel-speed 0.2\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"on-button-down\"\r\n        // scroll-button 273\r\n        // scroll-button-lock\r\n        // middle-emulation\r\n    }\r\n\r\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\r\n    // warp-mouse-to-focus\r\n\r\n    // Focus windows and outputs automatically when moving the mouse into them.\r\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\r\n    // focus-follows-mouse max-scroll-amount=\"0%\"\r\n}\r\n\r\n// You can configure outputs by their name, which you can find\r\n// by running `niri msg outputs` while inside a niri instance.\r\n// The built-in laptop monitor is usually called \"eDP-1\".\r\n// Find more information on the wiki:\r\n// https://yalter.github.io/niri/Configuration:-Outputs\r\n// Remember to uncomment the node by removing \"/-\"!\r\n\r\n\r\n\r\n//-output \"eDP-1\" {\r\n    // Uncomment this line to disable this output.\r\n    // off\r\n\r\n    // Resolution and, optionally, refresh rate of the output.\r\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\r\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\r\n    // for the resolution.\r\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\r\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\r\n //   mode \"1920x1080@120.030\"\r\n\r\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\r\n// scale 2\r\n\r\n    // Transform allows to rotate the output counter-clockwise, valid values are:\r\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\r\n    // transform \"normal\"\r\n\r\n    // Position of the output in the global coordinate space.\r\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\r\n    // The cursor can only move between directly adjacent outputs.\r\n    // Output scale and rotation has to be taken into account for positioning:\r\n    // outputs are sized in logical, or scaled, pixels.\r\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\r\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\r\n    // If the position is unset or results in an overlap, the output is instead placed\r\n    // automatically.\r\n// position x=1280 y=0\r\n// }\r\n\r\n//my home monitors\r\n// output \"DP-1\" {\r\n//     mode \"3840x2160@59.997\"\r\n//     scale 1.25\r\n//     transform \"normal\"\r\n// }\r\n// output \"HDMI-A-2\" {\r\n//     mode \"3840x2160@60.000\"\r\n//     scale 1\r\n//     transform \"normal\"\r\n// }\r\n\r\n// Settings that influence how windows are positioned and sized.\r\n// Find more information on the wiki:\r\n// https://yalter.github.io/niri/Configuration:-Layout\r\nlayout {\r\n    // Set gaps around windows in logical pixels.\r\n    gaps 0\r\n\r\n    // When to center a column when changing focus, options are:\r\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\r\n    //   or right edge of the screen.\r\n    // - \"always\", the focused column will always be centered.\r\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\r\n    //   together with the previously focused column.\r\n    center-focused-column \"never\"\r\n\r\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\r\n    preset-column-widths {\r\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\r\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\r\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\r\n        proportion 0.33333\r\n        proportion 0.5\r\n        proportion 0.66667\r\n\r\n        // Fixed sets the width in logical pixels exactly.\r\n        // fixed 1920\r\n    }\r\n\r\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\r\n    // preset-window-heights { }\r\n\r\n    // You can change the default width of the new windows.\r\n    default-column-width { proportion 0.5; }\r\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\r\n    // default-column-width {}\r\n\r\n    // By default focus ring and border are rendered as a solid background rectangle\r\n    // behind windows. That is, they will show up through semitransparent windows.\r\n    // This is because windows using client-side decorations can have an arbitrary shape.\r\n    //\r\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\r\n    // Niri will draw focus ring and border *around* windows that agree to omit their\r\n    // client-side decorations.\r\n    //\r\n    // Alternatively, you can override it with a window rule called\r\n    // `draw-border-with-background`.\r\n\r\n    // You can change how the focus ring looks.\r\n    focus-ring {\r\n        // Uncomment this line to disable the focus ring.\r\n        // off\r\n\r\n        // How many logical pixels the ring extends out from the windows.\r\n        width 0\r\n\r\n        // Colors can be set in a variety of ways:\r\n        // - CSS named colors: \"red\"\r\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\r\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\r\n\r\n        // Color of the ring on the active monitor.\r\n        // active-color \"#7fc8ff\"\r\n        active-color \"#000000\"\r\n\r\n        // Color of the ring on inactive monitors.\r\n        //\r\n        // The focus ring only draws around the active window, so the only place\r\n        // where you can see its inactive-color is on other monitors.\r\n        inactive-color \"#000000\"\r\n\r\n        // You can also use gradients. They take precedence over solid colors.\r\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\r\n        // The angle is the same as in linear-gradient, and is optional,\r\n        // defaulting to 180 (top-to-bottom gradient).\r\n        // You can use any CSS linear-gradient tool on the web to set these up.\r\n        // Changing the color space is also supported, check the wiki for more info.\r\n        //\r\n        // active-gradient from=\"#80c8ff\" to=\"#c7ff7f\" angle=45\r\n\r\n        // You can also color the gradient relative to the entire view\r\n        // of the workspace, rather than relative to just the window itself.\r\n        // To do that, set relative-to=\"workspace-view\".\r\n        //\r\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\r\n    }\r\n\r\n    // You can also add a border. It's similar to the focus ring, but always visible.\r\n    border {\r\n        // The settings are the same as for the focus ring.\r\n        // If you enable the border, you probably want to disable the focus ring.\r\n        off\r\n\r\n        width 4\r\n        active-color \"#ffc87f\"\r\n        inactive-color \"#505050\"\r\n\r\n        // Color of the border around windows that request your attention.\r\n        urgent-color \"#9b0000\"\r\n\r\n        // Gradients can use a few different interpolation color spaces.\r\n        // For example, this is a pastel rainbow gradient via in=\"oklch longer hue\".\r\n        //\r\n        // active-gradient from=\"#e5989b\" to=\"#ffb4a2\" angle=45 relative-to=\"workspace-view\" in=\"oklch longer hue\"\r\n\r\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\r\n    }\r\n\r\n    // You can enable drop shadows for windows.\r\n    shadow {\r\n        // Uncomment the next line to enable shadows.\r\n        // on\r\n\r\n        // By default, the shadow draws only around its window, and not behind it.\r\n        // Uncomment this setting to make the shadow draw behind its window.\r\n        //\r\n        // Note that niri has no way of knowing about the CSD window corner\r\n        // radius. It has to assume that windows have square corners, leading to\r\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\r\n        // those artifacts.\r\n        //\r\n        // However, instead you may want to set prefer-no-csd and/or\r\n        // geometry-corner-radius. Then, niri will know the corner radius and\r\n        // draw the shadow correctly, without having to draw it behind the\r\n        // window. These will also remove client-side shadows if the window\r\n        // draws any.\r\n        //\r\n        // draw-behind-window true\r\n\r\n        // You can change how shadows look. The values below are in logical\r\n        // pixels and match the CSS box-shadow properties.\r\n\r\n        // Softness controls the shadow blur radius.\r\n        softness 30\r\n\r\n        // Spread expands the shadow.\r\n        spread 5\r\n\r\n        // Offset moves the shadow relative to the window.\r\n        offset x=0 y=5\r\n\r\n        // You can also change the shadow color and opacity.\r\n        color \"#0007\"\r\n    }\r\n\r\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\r\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\r\n    // Left and right struts will cause the next window to the side to always be visible.\r\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\r\n    // layer-shell panels and regular gaps.\r\n    struts {\r\n        // left 64\r\n        // right 64\r\n        // top 64\r\n        // bottom 64\r\n    }\r\n}\r\n\r\n// Add lines like this to spawn processes at startup.\r\n// Note that running niri as a session supports xdg-desktop-autostart,\r\n// which may be more convenient to use.\r\n// See the binds section below for more spawn examples.\r\n\r\n// This line starts waybar, a commonly used bar for Wayland compositors.\r\n// spawn-at-startup \"waybar\"\r\n// spawn-at-startup \"ironbar\"\r\nspawn-sh-at-startup \"swaybg -c '#000000' -m solid_color\"\r\n// spawn-sh-at-startup \"/home/m/.local/bin/toggle-ironbar\"\r\n// spawn-sh-at-startup \"~/.local/bin/toggle-ironbar\"\r\n\r\n// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:\r\n// spawn-sh-at-startup \"qs -c ~/source/qs/MyAwesomeShell\"\r\n\r\nhotkey-overlay {\r\n    // Uncomment this line to disable the \"Important Hotkeys\" pop-up at startup.\r\n    skip-at-startup\r\n}\r\n\r\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\r\n// If the client will specifically ask for CSD, the request will be honored.\r\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\r\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\r\n// After enabling or disabling this, you need to restart the apps for this to take effect.\r\n// prefer-no-csd\r\n\r\n// You can change the path where screenshots are saved.\r\n// A ~ at the front will be expanded to the home directory.\r\n// The path is formatted with strftime(3) to give you the screenshot date and time.\r\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\r\n\r\n// You can also set this to null to disable saving screenshots to disk.\r\n// screenshot-path null\r\n\r\n// Animation settings.\r\n// The wiki explains how to configure individual animations:\r\n// https://yalter.github.io/niri/Configuration:-Animations\r\nanimations {\r\n    // Uncomment to turn off all animations.\r\n    // off\r\n\r\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\r\n    // slowdown 3.0\r\n}\r\n\r\n// Window rules let you adjust behavior for individual windows.\r\n// Find more information on the wiki:\r\n// https://yalter.github.io/niri/Configuration:-Window-Rules\r\n\r\n// Work around WezTerm's initial configure bug\r\n// by setting an empty default-column-width.\r\nwindow-rule {\r\n    // This regular expression is intentionally made as specific as possible,\r\n    // since this is the default config, and we want no false positives.\r\n    // You can get away with just app-id=\"wezterm\" if you want.\r\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\r\n    default-column-width {}\r\n}\r\n\r\n// Open the Firefox picture-in-picture player as floating by default.\r\nwindow-rule {\r\n    // This app-id regular expression will work for both:\r\n    // - host Firefox (app-id is \"firefox\")\r\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\r\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\r\n    open-floating true\r\n}\r\n\r\n// Example: block out two password managers from screen capture.\r\n// (This example rule is commented out with a \"/-\" in front.)\r\n/-window-rule {\r\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\r\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\r\n\r\n    block-out-from \"screen-capture\"\r\n\r\n    // Use this instead if you want them visible on third-party screenshot tools.\r\n    // block-out-from \"screencast\"\r\n}\r\n\r\n// Example: enable rounded corners for all windows.\r\n// (This example rule is commented out with a \"/-\" in front.)\r\n/-window-rule {\r\n    // geometry-corner-radius 12\r\n    geometry-corner-radius 0\r\n    clip-to-geometry true\r\n}\r\n\r\nbinds {\r\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\r\n    // in the end. To find an XKB name for a particular key, you may use a program\r\n    // like wev.\r\n    //\r\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\r\n    // when running as a winit window.\r\n    //\r\n    // Most actions that you can bind here can also be invoked programmatically with\r\n    // `niri msg action do-something`.\r\n\r\n Mod+Shift+B { spawn-sh \"~/.local/bin/toggle-ironbar\"; }\r\n\r\n    // Mod-Shift-/, which is usually the same as Mod-?,\r\n    // shows a list of important hotkeys.\r\n    Mod+Shift+Slash { show-hotkey-overlay; }\r\n\r\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\r\n    Mod+T hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"alacritty\"; }\r\n    // Mod+D hotkey-overlay-title=\"Run an Application: fuzzel\" { spawn \"fuzzel\"; }\r\n    Mod+D hotkey-overlay-title=\"Run an Application: anyrun\" { spawn \"anyrun\"; }\r\n    // Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\r\n    Super+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn-sh \"swaylock -u -c 000000\"; }\r\n\r\n    // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.\r\n    // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.\r\n    // For example, this is a standard bind to toggle the screen reader (orca).\r\n    Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\r\n\r\n    // Example volume keys mappings for PipeWire & WirePlumber.\r\n    // The allow-when-locked=true property makes them work even when the session is locked.\r\n    // Using spawn-sh allows to pass multiple arguments together with the command.\r\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+\"; }\r\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-\"; }\r\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\"; }\r\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\"; }\r\n\r\n    // Example brightness key mappings for brightnessctl.\r\n    // You can use regular spawn with multiple arguments too (to avoid going through \"sh\"),\r\n    // but you need to manually put each argument in separate \"\" quotes.\r\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"+10%\"; }\r\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"10%-\"; }\r\n\r\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\r\n    // You can also move the mouse into the top-left hot corner,\r\n    // or do a four-finger swipe up on a touchpad.\r\n    Mod+O repeat=false { toggle-overview; }\r\n\r\n    Mod+Q repeat=false { close-window; }\r\n\r\n    Mod+Left  { focus-column-left; }\r\n    Mod+Down  { focus-window-down; }\r\n    Mod+Up    { focus-window-up; }\r\n    Mod+Right { focus-column-right; }\r\n    Mod+H     { focus-column-left; }\r\n    Mod+J     { focus-window-down; }\r\n    Mod+K     { focus-window-up; }\r\n    Mod+L     { focus-column-right; }\r\n\r\n    Mod+Ctrl+Left  { move-column-left; }\r\n    Mod+Ctrl+Down  { move-window-down; }\r\n    Mod+Ctrl+Up    { move-window-up; }\r\n    Mod+Ctrl+Right { move-column-right; }\r\n    Mod+Ctrl+H     { move-column-left; }\r\n    Mod+Ctrl+J     { move-window-down; }\r\n    Mod+Ctrl+K     { move-window-up; }\r\n    Mod+Ctrl+L     { move-column-right; }\r\n\r\n    // Alternative commands that move across workspaces when reaching\r\n    // the first or last window in a column.\r\n    // Mod+J     { focus-window-or-workspace-down; }\r\n    // Mod+K     { focus-window-or-workspace-up; }\r\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\r\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\r\n\r\n    Mod+Home { focus-column-first; }\r\n    Mod+End  { focus-column-last; }\r\n    Mod+Ctrl+Home { move-column-to-first; }\r\n    Mod+Ctrl+End  { move-column-to-last; }\r\n\r\n    Mod+Shift+Left  { focus-monitor-left; }\r\n    Mod+Shift+Down  { focus-monitor-down; }\r\n    Mod+Shift+Up    { focus-monitor-up; }\r\n    Mod+Shift+Right { focus-monitor-right; }\r\n    Mod+Shift+H     { focus-monitor-left; }\r\n    Mod+Shift+J     { focus-monitor-down; }\r\n    Mod+Shift+K     { focus-monitor-up; }\r\n    Mod+Shift+L     { focus-monitor-right; }\r\n\r\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\r\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\r\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\r\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\r\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\r\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\r\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\r\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\r\n\r\n    // Alternatively, there are commands to move just a single window:\r\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\r\n    // ...\r\n\r\n    // And you can also move a whole workspace to another monitor:\r\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\r\n    // ...\r\n\r\n    Mod+Page_Down      { focus-workspace-down; }\r\n    Mod+Page_Up        { focus-workspace-up; }\r\n    Mod+U              { focus-workspace-down; }\r\n    Mod+I              { focus-workspace-up; }\r\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\r\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\r\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\r\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\r\n\r\n    // Alternatively, there are commands to move just a single window:\r\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\r\n    // ...\r\n\r\n    Mod+Shift+Page_Down { move-workspace-down; }\r\n    Mod+Shift+Page_Up   { move-workspace-up; }\r\n    Mod+Shift+U         { move-workspace-down; }\r\n    Mod+Shift+I         { move-workspace-up; }\r\n\r\n    // You can bind mouse wheel scroll ticks using the following syntax.\r\n    // These binds will change direction based on the natural-scroll setting.\r\n    //\r\n    // To avoid scrolling through workspaces really fast, you can use\r\n    // the cooldown-ms property. The bind will be rate-limited to this value.\r\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\r\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\r\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\r\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\r\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\r\n\r\n    Mod+WheelScrollRight      { focus-column-right; }\r\n    Mod+WheelScrollLeft       { focus-column-left; }\r\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\r\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\r\n\r\n    // Usually scrolling up and down with Shift in applications results in\r\n    // horizontal scrolling; these binds replicate that.\r\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\r\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\r\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\r\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\r\n\r\n    // Similarly, you can bind touchpad scroll \"ticks\".\r\n    // Touchpad scrolling is continuous, so for these binds it is split into\r\n    // discrete intervals.\r\n    // These binds are also affected by touchpad's natural-scroll, so these\r\n    // example binds are \"inverted\", since we have natural-scroll enabled for\r\n    // touchpads by default.\r\n    // Mod+TouchpadScrollDown { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+\"; }\r\n    // Mod+TouchpadScrollUp   { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-\"; }\r\n\r\n    // You can refer to workspaces by index. However, keep in mind that\r\n    // niri is a dynamic workspace system, so these commands are kind of\r\n    // \"best effort\". Trying to refer to a workspace index bigger than\r\n    // the current workspace count will instead refer to the bottommost\r\n    // (empty) workspace.\r\n    //\r\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\r\n    // will all refer to the 3rd workspace.\r\n    Mod+1 { focus-workspace 1; }\r\n    Mod+2 { focus-workspace 2; }\r\n    Mod+3 { focus-workspace 3; }\r\n    Mod+4 { focus-workspace 4; }\r\n    Mod+5 { focus-workspace 5; }\r\n    Mod+6 { focus-workspace 6; }\r\n    Mod+7 { focus-workspace 7; }\r\n    Mod+8 { focus-workspace 8; }\r\n    Mod+9 { focus-workspace 9; }\r\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\r\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\r\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\r\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\r\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\r\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\r\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\r\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\r\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\r\n\r\n    // Alternatively, there are commands to move just a single window:\r\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\r\n\r\n    // Switches focus between the current and the previous workspace.\r\n    // Mod+Tab { focus-workspace-previous; }\r\n\r\n    // The following binds move the focused window in and out of a column.\r\n    // If the window is alone, they will consume it into the nearby column to the side.\r\n    // If the window is already in a column, they will expel it out.\r\n    Mod+BracketLeft  { consume-or-expel-window-left; }\r\n    Mod+BracketRight { consume-or-expel-window-right; }\r\n\r\n    // Consume one window from the right to the bottom of the focused column.\r\n    Mod+Comma  { consume-window-into-column; }\r\n    // Expel the bottom window from the focused column to the right.\r\n    Mod+Period { expel-window-from-column; }\r\n\r\n    Mod+R { switch-preset-column-width; }\r\n    // Cycling through the presets in reverse order is also possible.\r\n    // Mod+R { switch-preset-column-width-back; }\r\n    Mod+Shift+R { switch-preset-window-height; }\r\n    Mod+Ctrl+R { reset-window-height; }\r\n    Mod+F { maximize-column; }\r\n    Mod+Shift+F { fullscreen-window; }\r\n\r\n    // Expand the focused column to space not taken up by other fully visible columns.\r\n    // Makes the column \"fill the rest of the space\".\r\n    Mod+Ctrl+F { expand-column-to-available-width; }\r\n\r\n    Mod+C { center-column; }\r\n\r\n    // Center all fully visible columns on screen.\r\n    Mod+Ctrl+C { center-visible-columns; }\r\n\r\n    // Finer width adjustments.\r\n    // This command can also:\r\n    // * set width in pixels: \"1000\"\r\n    // * adjust width in pixels: \"-5\" or \"+5\"\r\n    // * set width as a percentage of screen width: \"25%\"\r\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\r\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\r\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\r\n    Mod+Minus { set-column-width \"-10%\"; }\r\n    Mod+Equal { set-column-width \"+10%\"; }\r\n\r\n    // Finer height adjustments when in column with other windows.\r\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\r\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\r\n\r\n    // Move the focused window between the floating and the tiling layout.\r\n    Mod+V       { toggle-window-floating; }\r\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\r\n\r\n    // Toggle tabbed column display mode.\r\n    // Windows in this column will appear as vertical tabs,\r\n    // rather than stacked on top of each other.\r\n    Mod+W { toggle-column-tabbed-display; }\r\n\r\n    // Actions to switch layouts.\r\n    // Note: if you uncomment these, make sure you do NOT have\r\n    // a matching layout switch hotkey configured in xkb options above.\r\n    // Having both at once on the same hotkey will break the switching,\r\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\r\n    // Mod+Space       { switch-layout \"next\"; }\r\n    // Mod+Shift+Space { switch-layout \"prev\"; }\r\n\r\n    Print { screenshot; }\r\n    Ctrl+Print { screenshot-screen; }\r\n    Alt+Print { screenshot-window; }\r\n\r\n    // Applications such as remote-desktop clients and software KVM switches may\r\n    // request that niri stops processing the keyboard shortcuts defined here\r\n    // so they may, for example, forward the key presses as-is to a remote machine.\r\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\r\n    // so a buggy application can't hold your session hostage.\r\n    //\r\n    // The allow-inhibiting=false property can be applied to other binds as well,\r\n    // which ensures niri always processes them, even when an inhibitor is active.\r\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\r\n\r\n    // The quit action will show a confirmation dialog to avoid accidental exits.\r\n    Mod+Shift+E { quit; }\r\n    Ctrl+Alt+Delete { quit; }\r\n\r\n    // Powers off the monitors. To turn them back on, do any input like\r\n    // moving the mouse or pressing any other key.\r\n    Mod+Shift+P { power-off-monitors; }\r\n}\r\n\r\n```",
      "created_at": "2026-02-04T08:07:25Z",
      "updated_at": "2026-02-08T21:42:17Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "technologicalsingularity",
        "avatar_url": "https://avatars.githubusercontent.com/u/186817624?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgN3j",
      "number": 1781,
      "title": "xdg-desktop-portal-niri",
      "body": "Hi, i am wondering if there are any plans to develop xdg-desktop-portal for niri? Currently i am using niri with xdg-desktop-portal-gtk and xdg-desktop-portal-gnome. But these 2 packages install so many dependencies to the system. Minimalist system users would be very glad if custom xdg-desktop-portal for niri that supports screensharing, file choosing etc. be developed. Thank you for this great software!",
      "created_at": "2025-06-12T09:59:15Z",
      "updated_at": "2026-02-08T12:16:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "estnml",
        "avatar_url": "https://avatars.githubusercontent.com/u/57932905?u=f5cdb76e32805a55270af3aeb39dcace4f7bcf9f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgbcY",
      "number": 1917,
      "title": "How to control mouse speed, not acceleration?",
      "body": "How does one control mouse speed in niri? I can see from [the docs](https://github.com/YaLTeR/niri/wiki/Configuration:-Input) that there are acceleration settings but I'm interested in the actual multiplier for how much a fixed motion in touchpad space is translated into distance in screen space. Does niri offer such a setting? If not, would this be considered as a feature?",
      "created_at": "2025-06-27T04:06:43Z",
      "updated_at": "2026-02-08T07:57:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "samuela",
        "avatar_url": "https://avatars.githubusercontent.com/u/226872?u=77a7e7d5d716a64aa859dd02f3d5564848f4c0dc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajdf3",
      "number": 3153,
      "title": "Animations window rule",
      "body": "Would it be possible to include an option in window rules to modify animations? For example disabling the animation for *x* window when launching it.",
      "created_at": "2025-12-30T22:17:16Z",
      "updated_at": "2026-02-08T01:13:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "vars1ty",
        "avatar_url": "https://avatars.githubusercontent.com/u/54314240?u=f57cd24fabd2512e31553f3124bd7f871ccb1bd6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkBdF",
      "number": 3413,
      "title": "Persistent sessions, all last open windows reopen automatically",
      "body": "First off, absolutely love Niri, thanks a lot to everyone making it happen.\r\n\r\nA pain point I have with Niri is that logging out and logging back in completely wipes all my open windows. When I make a configuration change (context: NixOS) and need to open a new niri session for the changes to properly apply, my workflow is immediately killed and it takes quite a while to get everything I need back up and running. I am seeking a more macOS-style seamless reopening of all windows which were open when the previous session exited. I am seeking tips on how to achieve this even outside of compositor-level integration.",
      "created_at": "2026-02-07T21:07:02Z",
      "updated_at": "2026-02-07T21:18:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "MichaelOwenDyer",
        "avatar_url": "https://avatars.githubusercontent.com/u/59163924?u=0974fc992c224485041971ac3108086915aaec0f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkBVX",
      "number": 3412,
      "title": "[TRACKER] Missing theming options",
      "body": "Just opening a discussion to check if others have more stuff to try to add but, gonna make a list of things I'm gonna try to expose to the user config to allow theming!\n\n- hotkey modal\n- screenshot overlay\n- alt tab/recent windows modal\n- exit prompt modal, error modals\n\nFeel free to message more to add to this!",
      "created_at": "2026-02-07T17:10:56Z",
      "updated_at": "2026-02-07T20:56:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ninetailedtori",
        "avatar_url": "https://avatars.githubusercontent.com/u/81305596?u=406109ed05a0a02c4b59b5968f487387a6d9e564&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfuV3",
      "number": 1567,
      "title": "spawn does not create a systemd scope in some situations",
      "body": "I've noticed that OOM killer would kill niri and it lead me to this PR https://github.com/YaLTeR/niri/pull/216\n\nWhen I spawn terminal using the following binding ` Mod+Return { spawn \"alacritty\"; }` it gets its own scope. This works as expected.\n\nBut when I spawn using tofi launcher scope is not created and all the processes are the children of niri.\nI've tried the following way of spawning\n```\nMod+D { spawn \"bash\" \"-c\" \"tofi-run | xargs -r nohup &\"; }\nMod+D { spawn \"bash\" \"-c\" \"tofi-run | xargs bash -c\"; }\n```\n\nThankfully niri has `niri msg action spawn` that works and now I use\n```\n    Mod+D { spawn \"bash\" \"-c\" \"tofi-run | xargs niri msg action spawn --\"; }\n```\n\nI have a suspicion that this might be a problem.\n\nI thought that \"bash -c\" might cause the issue but when I spawn terminal using `Mod+Return { spawn \"bash\" \"-c\" \"alacritty\"; } ` it creates a scope.\n\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.02 (unknown commit)\n\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA 3090\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen Threadripper 3970X\n",
      "created_at": "2025-04-03T07:07:39Z",
      "updated_at": "2026-02-07T01:00:28Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "dvush",
        "avatar_url": "https://avatars.githubusercontent.com/u/21145096?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj_-8",
      "number": 3402,
      "title": "Restore column layout on returning from fullscreen",
      "body": "I noticed that whenever I put a window within a column into fullscreen, and return from it, the column is broken afterwards and I have to reassemble it. Is there a way to tell niri to preserve the column layout always even if window goes fullscreen for sometime?",
      "created_at": "2026-02-06T11:43:22Z",
      "updated_at": "2026-02-06T18:02:26Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "xegim",
        "avatar_url": "https://avatars.githubusercontent.com/u/95191579?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajtnp",
      "number": 3282,
      "title": "Slow animations on igpu monitors when rendering on dgpu, and on dgpu monitors when rendering on igpu",
      "body": "On my laptop with Intel iGPU and Nvidia dGPU, I notice slow animations on the monitors connected to the gpu that is not in charge of rendering.\r\n1. Nvidia set as renderer, monitor connected to Intel are mildly laggy\r\n2. Intel set as renderer, monitor connected to Nvidia are more laggy.\r\n\r\nIn both cases, monitors connected to the gpu that is also the renderer, are buttery smooth.\r\nI cannot reproduce the issue on Windows.\r\n\r\nDoes anyone have a solution to this?\r\n\r\nNot sure if this is related (from the GNOME project); https://gitlab.gnome.org/GNOME/mutter/-/issues/3461\r\n\r\nsystem info:\r\n- intel 275hx\r\n- rtx 5090\r\n- advanced optimus\r\n- kernel 6.18.5\r\n- nvdia-open-dkms latest\r\n\r\nI force the gpus via niri config `render-drm-device`\r\nenv:\r\n```\r\nNVD_BACKEND \"direct\"\r\nLIBVA_DRIVER_NAME \"nvidia\"\r\n__GLX_VENDOR_LIBRARY_NAME \"nvidia\"\r\nGSK_RENDERER \"ngl\"\r\n```",
      "created_at": "2026-01-19T09:01:56Z",
      "updated_at": "2026-02-06T08:47:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "patroza",
        "avatar_url": "https://avatars.githubusercontent.com/u/42661?u=4b386cbd9a2978d68651d457a5e2c3fed4e99284&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjB5P",
      "number": 2901,
      "title": "New is-fullscreen match for Window Rules",
      "body": "Today I installed niri and I love it. But one thing I miss from Plasma for example, is the ability to activate VRR only when a game is being played. It doesn't need to be exactly like that, but integrating this new match would mimic this to perfection.\r\n\r\n```\r\nwindow-rule {\r\n       match is-fullscreen=true is-focused=true\r\n       variable-refresh-rate true\r\n}\r\n```",
      "created_at": "2025-11-26T21:43:51Z",
      "updated_at": "2026-02-06T07:16:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "manuhcrito",
        "avatar_url": "https://avatars.githubusercontent.com/u/179171743?u=c8f6239027f783a612606baee80278de3bd6dfaf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AivW6",
      "number": 2749,
      "title": "Niri Instability with MST hubs inside Thunderbolt Docks",
      "body": "So I have a Thunderbolt 4 capable laptop and use a Lenovo Thunderbolt 4 dock to connect my external displays, Ethernet and some USB devices.\r\n\r\nThis dock has 3 video ports: Port1 HDMI/DP (mutually exclusive), Port2 DP, Port3 TB4. The HDMI/DP and DP ports are all connected via MST hubs to the TB4 controller while the TB4 downstream port goes direct to the TB4 controller (whose upstream port connects to the laptop). If any of the ports that use the MST hubs are used, Niri and Waybar can crash or change scaling and lose the previous workspaces when putting the laptop into suspend and resuming. When looking at the `dmesg` output, there is an xe kernel driver error message about waiting 3 seconds for a connection and failing. Often times, this causes a change in the port that Niri shows the display is connected to (e.g., DP-6 changes to DP-7). Setting the Niri config to identify the display by MFG, Model, SN helps somewhat (by working around the change in port number reported by the dock) but still breaks during suspend. Interestingly, GNOME doesn't have an issue with any of this and resumes fine despite the xe kernel driver complaining (likely due to the dock FW being stupid by changing the DP port number and the display waking up too slowly).\r\n\r\nWhen using a USB-C to DP alt-mode cable with the TB4 port (thus bypassing the MST hubs), there are no xe errors logged in dmesg when resuming from suspend and Niri works perfectly.\r\n\r\nI don't think Niri is doing anything wrong here, but it could be more resilient against flaky docks and MST hubs like GNOME's mutter seems to be.\r\n\r\nP.S.\r\n\r\nUpdating the dock FW has not helped with this issue. The only way I can reliably use the dock with Niri is to only use the TB4 port. In the future I'll buy a TB5 hub/dock that only has downstream TB connectors (i.e., no DP or HDMI connectors) since I can always use a DP alt-mode cable or a DP alt-mode to HDMI active cable to connect a display. This also guarantees HDR and VRR work correctly, since most MST hubs don't work with either of those features from my testing. Thunderbolt uses DP \"tunneling\" so HDR and VRR work correctly when a DP alt-mode cable is connected to a TB port. If you use an HDMI port, there is an active DP to HDMI converter and possibly an MST hub in between the downstream TB port and display. Both of these chips need to have support for HDR and VRR to actually pass those signals. Unfortunately, most don't. And this affects DP ports that come off an MST hub. If the DP port is direct to the downstream TB port, it should work, but I don't have a dock configured like that to test with.",
      "created_at": "2025-11-05T02:32:59Z",
      "updated_at": "2026-02-06T04:47:18Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "the-burrito-triangle",
        "avatar_url": "https://avatars.githubusercontent.com/u/168497498?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj_a9",
      "number": 3399,
      "title": "scroll threshold / axis threshold support",
      "body": "my laptop has a sensitive touchpad when using two finger scroll in certain applications and i stop scrolling but keeping my fingers on the touchpad the application contents jitter / jump up and down slightly, wev registers 0.16 movement continuously.\r\n\r\n\r\n[        15:      wl_pointer] axis_relative_direction: axis: 0 (vertical), direction: 1\r\n[        15:      wl_pointer] axis: time: 1470656; axis: 0 (vertical), value: -0.164062\r\n\r\n\r\n\r\nA setting for touchpad scroll or axis threshold would be very helpful to suppress this behavior. \r\n\r\n ",
      "created_at": "2026-02-05T22:41:19Z",
      "updated_at": "2026-02-05T22:41:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "x140x1n",
        "avatar_url": "https://avatars.githubusercontent.com/u/7008093?u=05dfc6c24fec7ad0aac3d4459bd4c2e7ba511a73&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjYWs",
      "number": 3101,
      "title": "Virtual Output Use Cases and API Design",
      "body": "I’m adding virtual output support to niri, mainly for remote desktop use (testing with Sunshine/Moonlight). I have a minimal implementation working and would like feedback on the API and structure before going further.\r\n\r\n**Current state**\r\n- Virtual outputs via IPC (`niri msg action create-virtual-output`, optional name / resolution / scale)\r\n- Config support with a `virtual` keyword in the `output` section\r\n- Outputs stored in `niri.virtual_outputs` and rendered through `wlr-screencopy`\r\n- TTY backend skips DRM rendering when `TtyOutputState` is missing\r\n\r\n**Issues**\r\n- Virtual outputs only update while a screencopy client is active; otherwise nothing drives frame callbacks or rendering\r\n- `Niri::create_headless_output()` is shared between the headless test backend and virtual outputs, which feels like a layering violation\r\n\r\n**Use cases**\r\n- Remote desktop (Sunshine/Moonlight)\r\n- Remote Desktop Portal (non-screencopy path)\r\n- Dedicated virtual displays for screencasting\r\n- Headless / accessibility setups\r\n- Testing and development\r\n\r\nAnything important missing?\r\n\r\n**Questions**\r\n- Should virtual outputs have a synthetic refresh rate to drive rendering when idle?\r\n- How should the Remote Desktop Portal case integrate with this?\r\n- Is there a cleaner separation between headless backends and virtual outputs?\r\n\r\nFeedback welcome before I go further.\r\n",
      "created_at": "2025-12-23T05:55:13Z",
      "updated_at": "2026-02-05T07:37:03Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "404NotFoundJS",
        "avatar_url": "https://avatars.githubusercontent.com/u/117603557?u=1d458207daadb004bc8937bdb9607d235e8a0a74&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjeUp",
      "number": 3165,
      "title": "wl_fixes support",
      "body": "smithay's work has been merged. https://github.com/Smithay/smithay/pull/1428\r\n\r\nIt's our turn I think since it's core wayland protocols.\r\n\r\n```diff\r\ndiff --git a/src/handlers/mod.rs b/src/handlers/mod.rs\r\nindex de79778e..09f04c4f 100644\r\n--- a/src/handlers/mod.rs\r\n+++ b/src/handlers/mod.rs\r\n@@ -62,7 +62,7 @@ use smithay::wayland::xdg_activation::{\r\n };\r\n use smithay::{\r\n     delegate_cursor_shape, delegate_data_control, delegate_data_device, delegate_dmabuf,\r\n-    delegate_drm_lease, delegate_ext_data_control, delegate_fractional_scale,\r\n+    delegate_drm_lease, delegate_ext_data_control, delegate_fixes, delegate_fractional_scale,\r\n     delegate_idle_inhibit, delegate_idle_notify, delegate_input_method_manager,\r\n     delegate_keyboard_shortcuts_inhibit, delegate_output, delegate_pointer_constraints,\r\n     delegate_pointer_gestures, delegate_presentation, delegate_primary_selection,\r\n@@ -845,3 +845,5 @@ impl MutterX11InteropHandler for State {}\r\n delegate_mutter_x11_interop!(State);\r\n \r\n delegate_single_pixel_buffer!(State);\r\n+\r\n+delegate_fixes!(State);\r\ndiff --git a/src/niri.rs b/src/niri.rs\r\nindex 9c59977f..6a2299b0 100644\r\n--- a/src/niri.rs\r\n+++ b/src/niri.rs\r\n@@ -76,6 +76,7 @@ use smithay::wayland::compositor::{\r\n };\r\n use smithay::wayland::cursor_shape::CursorShapeManagerState;\r\n use smithay::wayland::dmabuf::DmabufState;\r\n+use smithay::wayland::fixes::FixesState;\r\n use smithay::wayland::fractional_scale::FractionalScaleManagerState;\r\n use smithay::wayland::idle_inhibit::IdleInhibitManagerState;\r\n use smithay::wayland::idle_notify::IdleNotifierState;\r\n@@ -306,6 +307,7 @@ pub struct Niri {\r\n     pub gamma_control_manager_state: GammaControlManagerState,\r\n     pub activation_state: XdgActivationState,\r\n     pub mutter_x11_interop_state: MutterX11InteropManagerState,\r\n+    pub fixes_state: FixesState,\r\n \r\n     // This will not work as is outside of tests, so it is gated with #[cfg(test)] for now. In\r\n     // particular, shaders will need to learn about the single pixel buffer. Also, it must be\r\n@@ -2526,6 +2528,8 @@ impl Niri {\r\n         let viewporter_state = ViewporterState::new::<State>(&display_handle);\r\n         let xdg_foreign_state = XdgForeignState::new::<State>(&display_handle);\r\n \r\n+        let fixes_state = FixesState::new::<State>(&display_handle);\r\n+\r\n         let is_tty = matches!(backend, Backend::Tty(_));\r\n         let gamma_control_manager_state =\r\n             GammaControlManagerState::new::<State, _>(&display_handle, move |client| {\r\n@@ -2748,6 +2752,7 @@ impl Niri {\r\n             gamma_control_manager_state,\r\n             activation_state,\r\n             mutter_x11_interop_state,\r\n+            fixes_state,\r\n             #[cfg(test)]\r\n             single_pixel_buffer_state,\r\n \r\n\r\n```",
      "created_at": "2026-01-01T13:47:45Z",
      "updated_at": "2026-02-05T06:15:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Bot-wxt1221",
        "avatar_url": "https://avatars.githubusercontent.com/u/74451279?u=2dc2ad5ba8917d9822c710840ca27eafccc8c8be&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj-OG",
      "number": 3396,
      "title": "Question regarding maintaining resources in unfocused windows",
      "body": "Hello,\r\n\r\nA problem I've had is with the focusing of windows, namely video games, wherein the framerate is completely dead when inactive (e.g. in a separate workspace, it has around 1-2 FPS). This causes trouble with some of the games I play, when I want to alt+tab and the game freezes up. Did a lot of searching through the documentation and issues/discussion page and couldn't find something about this, so hopefully I wasn't blind and missed something.\r\n\r\nI would like to be able to limit the framerate still, but be able to choose it at a higher number rather than practically dead. \r\n\r\nLove niri, never thought I'd use a tiling window manager but this has stole my heart. I'm not a computer expert in the slightest, so apologies if I'm unclear.\r\n\r\n",
      "created_at": "2026-02-04T22:09:44Z",
      "updated_at": "2026-02-05T01:29:32Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A74vx",
        "body": "That is being worked on here: https://github.com/YaLTeR/niri/pull/2609\r\n\r\nIt has both the features you want\r\n\r\nAnd you are perfectly clear, glad you are enjoying niri !"
      },
      "user": {
        "login": "caffeinenoodles",
        "avatar_url": "https://avatars.githubusercontent.com/u/94877461?u=b474e7b7b09c09f0f6b6356295981772064d7f71&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeqsP",
      "number": 1209,
      "title": "Feat: Disabling certain (potentially risky) protocols",
      "body": "Niri supports protocols such as `wlr-screencopy` which may be potentially risky\r\n\r\nThis isnt a problem from within sandboxed applications where the sandbox uses `security-context-v1` because Niri doesn't allow those to use this protocol\r\n\r\nHowever clients running on the host can still use this freely.\r\n\r\nWhilst it isnt a huge security consideration, as there's plenty other ways to grab this data on the host, I also see no reason to leave it enabled when it is unused and it makes for a slight attack surface reduction as that protocol could then no longer be used.\r\n\r\nSo, **the proposal is** making potentially \"risky\" protocols optional, i.e allowing the user to disable them in the config. Right now this would limit itself to `wlr-screencopy` as I do not know of other protocols which may be considered \"risky\"\r\n\r\nIn the future, maybe this could also be scoped down to certain programs having access to a protocol, but actually implementing this might be hard as there's no way I know of a client can prove e.g it's truly what it says it is.\r\n\r\n###### in essence, this github-discussion serves for discussing how/if this would be implemented and what the configuration for this would look like",
      "created_at": "2025-03-04T17:13:24Z",
      "updated_at": "2026-02-04T20:10:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cyrneko",
        "avatar_url": "https://avatars.githubusercontent.com/u/58338843?u=9ba7494e43d409a979a54c43ef0d0c1bf4a18beb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj9ew",
      "number": 3393,
      "title": "How to make niri  focus left when closing a window ?",
      "body": "When closing a window which is not the last, niri focus right instead of left (despite commit 8c46611).\r\nDid I misunderstand the patch?\r\n\r\nWhen opening a window to do a short action, and closing it, it is quite cumbersome to have to focus back left manually.\r\nIs there a way to make niri focus back left in such a scenario?",
      "created_at": "2026-02-04T08:19:00Z",
      "updated_at": "2026-02-04T15:53:37Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "matclab",
        "avatar_url": "https://avatars.githubusercontent.com/u/985910?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj8kH",
      "number": 3381,
      "title": "How to customize the config notification",
      "body": "https://yalter.github.io/niri/Configuration%3A-Miscellaneous.html is saying `Set the disable-failed flag to disable the \"Failed to parse the config file\" notification. For example, if you have a custom one.`\r\n\r\nSo how to customize it? What I need is, when the config failed to be parsed, it will automatically show me the error message in notification or open a new terminal running `niri validate` to show me the error message.\r\n\r\nHow can I do that?",
      "created_at": "2026-02-03T12:58:10Z",
      "updated_at": "2026-02-04T09:47:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "c02y",
        "avatar_url": "https://avatars.githubusercontent.com/u/2135996?u=31ffff39466adaec84d735c1b962040522d20184&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj9IZ",
      "number": 3390,
      "title": "Add hovered window command to niri IPC",
      "body": "### **Why I'm asking it**\r\n\r\nI have a mouse with extra buttons that I would like to assign one to close windows. But if you don't have input:focus-follows-mouse enabled, you need to click the window to focus first then run close-window action. but if you're launching another app at the time, the new window steals the focus and you can accidentally close the window you just launched.\r\n\r\nAnother alternative is to use `niri msg pick-window`, however this requires an extra click after calling the command and there has to be a better way. \r\n\r\n### **What I'd like to have**\r\n\r\n`niri msg hovered-window`\r\n\r\nThis would give the information of the window that pointer is currently hovering at the time this command gets called. without extra user interaction like pick-window. \r\n\r\nThis would be easy to add since it is essentially same as pick-window with fewer steps.",
      "created_at": "2026-02-04T00:42:30Z",
      "updated_at": "2026-02-04T00:42:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Apollo314",
        "avatar_url": "https://avatars.githubusercontent.com/u/29009961?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai0Yc",
      "number": 2775,
      "title": "Global Shortcuts...",
      "body": "The global shortcuts portal has been out for a while, and I'm just curious if this is going to be implemented on the niri side, it's already on xdp-gnome, but I find it to be rather incompatible with the idea of config files...\r\n\r\nRight now the portal will open when an app that makes use of it opens for the first time, but then it just says to manage externally in the compositor/de settings, same goes for actually changing them. \r\n\r\nSo I'm wondering, if this is implemented, will it just write special instructions to the config file, or instead will a cache be used for a more interactive and less declarative way of management, with perhaps even a dedicated GUI?\r\n\r\nWhile I don't make much use of it, I think it'd be a cool portal to have a niri implementation for once Discord and OBS implement it (although I don't really use obs)",
      "created_at": "2025-11-11T01:16:03Z",
      "updated_at": "2026-02-03T21:57:47Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "TWB0109",
        "avatar_url": "https://avatars.githubusercontent.com/u/53587182?u=968288ae89a11250ab42b6d9e07c9cf59cb6e052&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj6vW",
      "number": 3369,
      "title": "mouse capture",
      "body": "Hey all,\r\n\r\nI use gamescope for some games where the mouse misbehaves and leaves the edge of the screen into my other monitor. \r\n\r\nCurrently, if I want to my mouse, I move the monitor with the game down a workspace and then I can go into my other monitor quickly and then when I want to return, I go back to my main monitor and go back into the workspace with the game, it's all pretty fast.\r\n\r\nHowever, I was wondering if there was a keybind or something I can do to release my mouse instead from gamescope or fullscreen apps as needed, so I can visit my other monitor without actually moving the game's workspace.",
      "created_at": "2026-02-01T18:59:08Z",
      "updated_at": "2026-02-03T20:55:09Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Mondrethos",
        "avatar_url": "https://avatars.githubusercontent.com/u/9123069?u=1aa2e9c902e8c4550883d04605bfcb439e179a25&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjiTq",
      "number": 3213,
      "title": "Option to avoid windows wider than the current output",
      "body": "Some applications (e.g. Firefox, Chromium, etc.) create new windows using the same size as a previously opened window. When such app has a window opened in a ultra-wide output, and the user opens a new window in a non-wide output (e.g. from an external, 21:9 monitor to the laptop's 16:9 output), the user may end up with a window wider than the current output, requiring further action to resize it (e.g. `maximize-column`).\r\n\r\n<img width=\"1920\" height=\"1080\" alt=\"image\" src=\"https://github.com/user-attachments/assets/e616973b-549b-4c13-ac8b-2127108f271d\" />\r\n\r\nIt would be nice to have an option to force a new window to fit the output (equivalent to having `default-column-width { proportion 1.0; }` that would only apply when the requested geometry can not be satisfied by the current output)\r\n",
      "created_at": "2026-01-06T20:43:06Z",
      "updated_at": "2026-02-03T20:50:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kassick",
        "avatar_url": "https://avatars.githubusercontent.com/u/21071?u=233dbe240db32b4dc2cceeacb149aabfbe21ef95&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj88h",
      "number": 3388,
      "title": "Add ability to select windows to manipulate them at the same time",
      "body": "Sometimes I want to manipulate windows at the same time, it would be nice to have the ability to select windows so I can, for example:\r\n- Send them all to a new workspace/output\r\n- Make them all floating\r\n- Close them all at once\r\n...",
      "created_at": "2026-02-03T19:34:12Z",
      "updated_at": "2026-02-03T20:44:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "simonhughxyz",
        "avatar_url": "https://avatars.githubusercontent.com/u/37674867?u=336670c43a8f327ef8e831f4fa715c47d2109ff7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0mv",
      "number": 1599,
      "title": "Dynamic open-float script, for Bitwarden and other windows that set title/app-id late",
      "body": "We have several window rules like `open-float` or `open-fullscreen` that apply at window opening time. However, some windows ~~stubbornly~~ set their title/app-id after they had opened, which stops these window rules from working. Notably, the Bitwarden Firefox extension does this, but also some Godot windows.\r\n\r\nI'm not sure I want to extend niri with a whole separate set of rules and complex code to deal with this. Thankfully, you can perfectly re-create the functionality by watching the event stream for window title/app-id changes and asking niri to float the window.\r\n\r\nThis script does exactly that. Fill in the `RULES` list, conceptually similar to a list of `window-rule {}`s in your niri config, then let it run. Change `MoveWindowToFloating` to some other action if you need.\r\n\r\n```python\r\n#!/usr/bin/python3\r\n\"\"\"\r\nLike open-float, but dynamically. Floats a window when it matches the rules.\r\n\r\nSome windows don't have the right title and app-id when they open, and only set\r\nthem afterward. This script is like open-float for those windows.\r\n\r\nUsage: fill in the RULES array below, then run the script.\r\n\"\"\"\r\n\r\nfrom dataclasses import dataclass, field\r\nimport json\r\nimport os\r\nimport re\r\nfrom socket import AF_UNIX, SHUT_WR, socket\r\n\r\n\r\n@dataclass(kw_only=True)\r\nclass Match:\r\n    title: str | None = None\r\n    app_id: str | None = None\r\n\r\n    def matches(self, window):\r\n        if self.title is None and self.app_id is None:\r\n            return False\r\n\r\n        matched = True\r\n\r\n        if self.title is not None:\r\n            matched &= re.search(self.title, window[\"title\"]) is not None\r\n        if self.app_id is not None:\r\n            matched &= re.search(self.app_id, window[\"app_id\"]) is not None\r\n\r\n        return matched\r\n\r\n\r\n@dataclass\r\nclass Rule:\r\n    match: list[Match] = field(default_factory=list)\r\n    exclude: list[Match] = field(default_factory=list)\r\n\r\n    def matches(self, window):\r\n        if len(self.match) > 0 and not any(m.matches(window) for m in self.match):\r\n            return False\r\n        if any(m.matches(window) for m in self.exclude):\r\n            return False\r\n\r\n        return True\r\n\r\n\r\n# Write your rules here. One Rule() = one window-rule {}.\r\nRULES = [\r\n    # window-rule {} with one match.\r\n    # Rule([Match(title=\"Bitwarden\", app_id=\"firefox\")]),\r\n\r\n    # window-rule {} with one match and one exclude.\r\n    # Rule(\r\n    #     [Match(title=\"rs\")],\r\n    #     exclude=[Match(app_id=\"Alacritty\")],\r\n    # ),\r\n\r\n    # window-rule {} with two matches.\r\n    # Rule(\r\n    #     [\r\n    #         Match(app_id=\"^foot$\"),\r\n    #         Match(app_id=\"^mpv$\"),\r\n    #     ]\r\n    # ),\r\n]\r\n\r\n\r\nif len(RULES) == 0:\r\n    print(\"fill in the RULES list, then run the script\")\r\n    exit()\r\n\r\n\r\nniri_socket = socket(AF_UNIX)\r\nniri_socket.connect(os.environ[\"NIRI_SOCKET\"])\r\nfile = niri_socket.makefile(\"rw\")\r\n\r\n_ = file.write('\"EventStream\"')\r\nfile.flush()\r\nniri_socket.shutdown(SHUT_WR)\r\n\r\nwindows = {}\r\n\r\n\r\ndef send(request):\r\n    with socket(AF_UNIX) as niri_socket:\r\n        niri_socket.connect(os.environ[\"NIRI_SOCKET\"])\r\n        file = niri_socket.makefile(\"rw\")\r\n        _ = file.write(json.dumps(request))\r\n        file.flush()\r\n\r\n\r\ndef float(id: int):\r\n    send({\"Action\": {\"MoveWindowToFloating\": {\"id\": id}}})\r\n\r\n\r\ndef update_matched(win):\r\n    win[\"matched\"] = False\r\n    if existing := windows.get(win[\"id\"]):\r\n        win[\"matched\"] = existing[\"matched\"]\r\n\r\n    matched_before = win[\"matched\"]\r\n    win[\"matched\"] = any(r.matches(win) for r in RULES)\r\n    if win[\"matched\"] and not matched_before:\r\n        print(f\"floating title={win['title']}, app_id={win['app_id']}\")\r\n        float(win[\"id\"])\r\n\r\n\r\nfor line in file:\r\n    event = json.loads(line)\r\n\r\n    if changed := event.get(\"WindowsChanged\"):\r\n        for win in changed[\"windows\"]:\r\n            update_matched(win)\r\n        windows = {win[\"id\"]: win for win in changed[\"windows\"]}\r\n    elif changed := event.get(\"WindowOpenedOrChanged\"):\r\n        win = changed[\"window\"]\r\n        update_matched(win)\r\n        windows[win[\"id\"]] = win\r\n    elif changed := event.get(\"WindowClosed\"):\r\n        del windows[changed[\"id\"]]\r\n```",
      "created_at": "2025-05-18T12:14:41Z",
      "updated_at": "2026-02-03T20:29:10Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj8zI",
      "number": 3386,
      "title": "Feature Request: Add window rule to block xdg-activation focus stealing",
      "body": "When I click an external link in a Chrome app window (like a PWA), Niri switches my focus to an existing Chrome browser window, which might be on another workspace. This is pretty annoying since I didn't ask to leave my current workspace, I'd prefer for the link to open in the background.\r\n\r\nInterestingly, running `google-chrome-stable <url>` from the CLI doesn't do this - it opens the URL without stealing focus.\r\n\r\nI dug into the code a bit and it seems like Chrome must be requesting activation via xdg-activation.\r\n\r\nI tried setting an `open_focused false` window rule on Chrome, but it doesn't help here since that only seems to affect new windows. I also tried `debug.strict_new_window_focus_policy`, but that doesn't help, since I assume Chrome has a valid token.\r\n\r\nWould it be possible to add a window rule like `block-xdg-activation` that prevents a matching window from being activated via `xdg-activation`, even with a valid token? That way I could set it on Chrome and stay on my current workspace when clicking links.",
      "created_at": "2026-02-03T16:58:17Z",
      "updated_at": "2026-02-03T16:58:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "b0o",
        "avatar_url": "https://avatars.githubusercontent.com/u/21299126?u=2d1bbde99e3e5c845faf50f4da1ad120b88bcf4d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj8UB",
      "number": 3380,
      "title": "Securing wlr screencopy (and similar)",
      "body": "I think it would make sense to have an option to disable screencopy by default and/or put it behind a GUI prompt/notification. This should stop unprivileged programs from being able to secretly capture the entire screen, while hidden in the background or something. I do know that a frequent use case is screenshot tools, so maybe there could be a way to spawn specific processes with screencopy permission from a keybind as well.\r\n\r\nDo you think this makes any sense to do? Is there any hole in this security model?",
      "created_at": "2026-02-03T08:49:42Z",
      "updated_at": "2026-02-03T10:44:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "BBaoVanC",
        "avatar_url": "https://avatars.githubusercontent.com/u/17971474?u=a4e7c7f0a9b0d55c20b3ab26bb5ece36344a4ae7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj6TA",
      "number": 3363,
      "title": "Allow `default-window-height` inside `layout`",
      "body": "At the moment `default-window-height` is not allowed inside `layout`. It is only allowed inside `window-rule`.\r\n\r\nIt is possible to use a top-level `window-rule` which matches all windows but we can't do this for individual outputs. The only way to have default window height for a specific output is to use `default-window-height` inside  `layout { }` inside a `output { }` .\r\n\r\nSince `preset-window-heights` is allowed inside `layout`, I would suggest that `default-window-height` should also be allowed there, similar to how both `preset-column-widths` and `default-column-width` are allowed.\r\n\r\nThank you in advance!",
      "created_at": "2026-02-01T03:09:58Z",
      "updated_at": "2026-02-03T08:13:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "talal",
        "avatar_url": "https://avatars.githubusercontent.com/u/3526562?u=b53c00d770e2db6ae0d1f46f28a46c1ed74de073&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj7i7",
      "number": 3372,
      "title": "Screencasting in teams-for-linux not working",
      "body": "I use [Teams-for-Linux](https://github.com/IsmaelMartinez/teams-for-linux) to use Teams. Screencasting is not working for me in Teams-for-Linux under niri (it did work under KDE Plasma). Screencasting does work flawlessly, e.g., with a webrtc test site in the browser. Does anyone have any experience getting Teams-for-Linux working under niri?\r\n\r\nLogs when things work, i.e., with webrtc test site:\r\n```\r\nniri::dbus::mutter_screen_cast: record_window properties=RecordWindowProperties { window_id: 16, cursor_mode: Some(Hidden), _is_recording: None }\r\nniri::dbus::mutter_screen_cast: start\r\nniri::niri: StartCast session_id=1 stream_id=1\r\nniri::pw_utils: pw stream: state changed: Unconnected -> Connecting stream_id=1\r\nniri::pw_utils: pw stream: state changed: Connecting -> Paused stream_id=1\r\nniri::pw_utils: pw stream: sending signal with 132 stream_id=1\r\nniri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRA, flags: VideoFlags(0xc), modifier: 0, size: spa_rectangle { width: 924, height: 1153 }, framerate: spa_fraction { num: 0, denom: 1 }, max_framerat[…]\r\nniri::pw_utils: pw stream: fixating the modifier stream_id=1\r\nniri::pw_utils: find_preferred_modifier: size=Size<smithay::utils::geometry::Physical> { w: 924, h: 1153 }, fourcc=AR24, modifiers=[144115206334822913, 144115206334822657, 144115206334806273, 144115188080056833, 144115188080056[…]\r\nniri::pw_utils: pw stream: allocation successful (modifier=Unrecognized(144115206334822913), plane_count=2), moving to confirmation pending stream_id=1\r\nniri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRA, flags: VideoFlags(0x4), modifier: 144115206334822913, size: spa_rectangle { width: 924, height: 1153 }, framerate: spa_fraction { num: 0, denom: […]\r\nniri::pw_utils: pw stream: moving to ready state stream_id=1\r\nniri::pw_utils: pw stream: state changed: Paused -> Streaming stream_id=1\r\nothandler.c:81:PHSetProtocol() Protocol T=0 requested but unsupported by the card\r\npath= \"/home/equaeghe/.BEID_1.log\"\r\nniri::pw_utils: pw stream: state changed: Streaming -> Paused stream_id=1\r\nniri::dbus::mutter_screen_cast: stop\r\nniri::niri: StopCast session_id=1\r\nniri::pw_utils: pw stream: state changed: Paused -> Unconnected stream_id=1\r\n```\r\n\r\nLogs when it does not work (Teams-for-Linux):\r\n```\r\nteams-for-linux: [2455:0202/144805.666364:ERROR:third_party/webrtc/p2p/base/stun_port.cc:117] Binding request timed out from 100.80.244.x:37146 (eduVPN)\r\nteams-for-linux: [2455:0202/144805.666475:ERROR:third_party/webrtc/p2p/base/stun_port.cc:117] Binding request timed out from [fdfa:76e1:b4aa:x:x:x:x:x]:49430 (enp7s0f4u1u1)\r\nteams-for-linux: [2455:0202/144805.666512:ERROR:third_party/webrtc/p2p/base/stun_port.cc:117] Binding request timed out from [fdfa:76e1:b4aa:x:x:x:x:x]:46631 (wlan0)\r\nteams-for-linux: [2455:0202/144805.666537:ERROR:third_party/webrtc/p2p/base/stun_port.cc:117] Binding request timed out from [fd00:4242:4242:x:x:x:x:x]:42177 (eduVPN)\r\nteams-for-linux: [2455:0202/144805.666561:ERROR:third_party/webrtc/p2p/base/stun_port.cc:117] Binding request timed out from [2a0f:2980:100:x:x:x:x:x]:55804 (wlan0)\r\nniri[1243]: 2026-02-02T13:48:06.103757Z DEBUG niri::dbus::mutter_screen_cast: record_window properties=RecordWindowProperties { window_id: 14, cursor_mode: Some(Hidden), _is_recording: None }\r\nniri::dbus::mutter_screen_cast: start\r\nniri::niri: StartCast session_id=0 stream_id=0\r\nniri::pw_utils: pw stream: state changed: Unconnected -> Connecting stream_id=0\r\n niri::pw_utils: pw stream: state changed: Connecting -> Paused stream_id=0\r\nniri::pw_utils: pw stream: sending signal with 84 stream_id=0\r\nniri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRA, flags: VideoFlags(0xc), modifier: 0, size: spa_rectangle { width: 1864, height: 1153 }, framerate[…]\r\nniri::pw_utils: pw stream: fixating the modifier stream_id=0\r\nniri::pw_utils: find_preferred_modifier: size=Size<smithay::utils::geometry::Physical> { w: 1864, h: 1153 }, fourcc=AR24, modifiers=[144115206334822913, 144115206334822657, 144115[…]\r\nniri::pw_utils: pw stream: allocation successful (modifier=Unrecognized(144115206334822913), plane_count=2), moving to confirmation pending stream_id=0\r\nniri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRA, flags: VideoFlags(0x4), modifier: 144115206334822913, size: spa_rectangle { width: 1864, height: […]\r\nniri::pw_utils: pw stream: moving to ready state stream_id=0\r\nniri::pw_utils: pw stream: state changed: Paused -> Streaming stream_id=0\r\nteams-for-linux[2455]: [OpenH264] this = 0x0x17fc0a96e9d0, Warning:ParamValidationExt(), eSpsPpsIdStrategy setting (2) with iUsageType (1) not supported! eSpsPpsIdStrategy adjusted to CONSTANT_ID\r\nteams-for-linux: [OpenH264] this = 0x0x17fc0a96e9d0, Warning:ParamValidation(), AdaptiveQuant(1) is not supported yet for screen content, auto turned off\r\nteams-for-linux: [OpenH264] this = 0x0x17fc0a96e9d0, Warning:ParamValidation(), BackgroundDetection(1) is not supported yet for screen content, auto turned off\r\nteams-for-linux: 'loop->recurse > 0' failed at ../pipewire-1.4.9/src/pipewire/thread-loop.c:425 pw_thread_loop_wait()\r\nniri::pw_utils: pw stream: state changed: Streaming -> Paused stream_id=0\r\nniri::dbus::mutter_screen_cast: stop\r\nniri::niri: StopCast session_id=0\r\nniri::pw_utils: pw stream: state changed: Paused -> Unconnected stream_id=0\r\n```\r\n\r\nPortal config:\r\n```\r\n$ cat .config/xdg-desktop-portal/niri-portals.conf \r\n[preferred]\r\ndefault=kde\r\norg.freedesktop.impl.portal.Secret=kwallet # https://discuss.kde.org/t/how-do-i-set-the-keyring-backend-to-gnome-libsecret/21584/8\r\norg.freedesktop.impl.portal.ScreenCast=gnome\r\n```\r\n\r\n",
      "created_at": "2026-02-02T14:21:15Z",
      "updated_at": "2026-02-03T08:11:46Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A70SM",
        "body": "It turns out I was not testing correctly. Screensharing in Teams-for-Linux does work, both with my `niri-portals.conf` and the deflt one."
      },
      "user": {
        "login": "equaeghe",
        "avatar_url": "https://avatars.githubusercontent.com/u/601177?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgDAP",
      "number": 1713,
      "title": "boot directly into niri without display manager",
      "body": "I got niri running successfully under NixOS with the niri-session script.\r\n\r\nNow I'd like niri to start automatically on boot without installing a display-manager. Since I'm the only user of my laptop, I don't need one.\r\n\r\nHas anybody already done this, maybe in an elegant way without relying on bashrc?",
      "created_at": "2025-06-01T19:32:53Z",
      "updated_at": "2026-02-03T06:37:50Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "thkoch2001",
        "avatar_url": "https://avatars.githubusercontent.com/u/94641?u=da775569a720a6114db0bc16f5d9db6de229dc75&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj76n",
      "number": 3377,
      "title": "I'm getting considerable input lag",
      "body": "<img width=\"893\" height=\"59\" alt=\"Screenshot from 2026-02-02 21-22-41\" src=\"https://github.com/user-attachments/assets/810e587f-847d-481d-b476-bd60501dc92c\" />\r\nI use an Nvidia Graphics Card, and there is a lot of lag when opening stuff like the GNOME file explorer or the terminal using Mod + T, not that much admittedly in the case of the terminal, but I'm still able to feel it. Also is gnome and gtk supposed to be open at the same time or nah? And is that what's causing the input lag when opening the file explorer",
      "created_at": "2026-02-02T21:35:34Z",
      "updated_at": "2026-02-03T13:48:31Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "MikieD-op",
        "avatar_url": "https://avatars.githubusercontent.com/u/177771966?u=a95edfb7cb01e4122a23bb09a68e1698f7e32660&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj7y_",
      "number": 3375,
      "title": "Screenshot UI to return geometry of selected area",
      "body": "An option for the screenshot UI to return an output geometry/co-oridinates of the selected area would be really nice.\r\n\r\nI currently have a screen-recorder script that I adapted from HyDE-Project/HyDE, which has slurp as a dependency which I can avoid if I had this in Niri.",
      "created_at": "2026-02-02T18:48:14Z",
      "updated_at": "2026-02-02T19:34:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Atan-D-RP4",
        "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj7mR",
      "number": 3373,
      "title": "Why not recommend AShell that is also written in Rust in addition to or instead of waybar?",
      "body": "https://github.com/MalpenZibo/ashell is a compatible bar that is written in Rust that I think is worth mentioning in the main guide.\r\nBy recommending Rust tools you would enable more cooperation between the projects and ultimately a more cohesive desktop environment.",
      "created_at": "2026-02-02T15:11:51Z",
      "updated_at": "2026-02-02T19:28:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "yerlaser",
        "avatar_url": "https://avatars.githubusercontent.com/u/6624062?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjwPD",
      "number": 3294,
      "title": "Layer-shell animations and window-rule/named-workspace overrides for animations",
      "body": "What it says on the tin.\r\n\r\nSupporting animations for layer surfaces.\r\n\r\nAllowing use of the `animations {}` block in `window-rules {}`, and `workspace 'name' {}` blocks. As well as `layer-rules {}` if and when the aforementioned layer surface animations are implemented.\r\n\r\nRicers value these quite highly in Hyprland, along with blur (the PR for which might see new life now the Tracy GPU profiling has been merged!!). \r\n\r\nDo Niri users have the same demand for these features? ",
      "created_at": "2026-01-21T18:43:05Z",
      "updated_at": "2026-02-02T19:26:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Atan-D-RP4",
        "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj51v",
      "number": 3353,
      "title": "Please make the focus ring have the same color for windows in overview mode.",
      "body": "Thank you very much for this scrolling window manager. I have found it to be far more intuitive than the traditional tiling window managers I've used in the past. \r\n\r\nMy only issue is that when I go into overview mode, the focus rings change color, from the one I use on my theming to a dingy grey. For the sake of us ricers, is there a way to add a focus ring color and (possibly) a pixel width property in the overview category. \r\n\r\nThanks again for your fantastic work on this project.",
      "created_at": "2026-01-31T14:17:36Z",
      "updated_at": "2026-02-02T17:40:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "michaelkornblum",
        "avatar_url": "https://avatars.githubusercontent.com/u/7110479?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj7Qz",
      "number": 3371,
      "title": "Multiple alternative \"open-on-output\" options for named workspaces",
      "body": "## Problem description\r\nI am using my laptop with niri and an external monitor via a docking station both at work and at home. I like the named workspaces feature so my browser, terminals etc. always open on my external monitor. However, the output of my docking station is named differently at work and at home: it is called `DP-9` at work but `DP-4` at home.\r\n\r\nTherefore, I have to decide whether to use my named workspaces at work or at home. When configured for work, the named workspaces won't open on the external monitor at home, and vice versa.\r\n\r\n## Interface definition\r\nTo use named workspaces with different monitor setups, I'd love to see multiple alternatives for `open-on-output`. This could either be done by passing multiple output names to `open-on-output` or by passing `open-on-output` multiple times:\r\n```\r\nworkspace \"browser\" {\r\n    open-on-output \"DP-9\" \"DP-4\"\r\n}\r\n```\r\nor\r\n```\r\nworkspace \"browser\" {\r\n    open-on-output \"DP-9\"\r\n    open-on-output \"DP-4\"\r\n}\r\n```\r\nIt would be enough to match these in order of appearance, i.e. the workspace will be displayed on the first output that matches the `open-on-output`-rule. In this case, the `browser` workspace would open on `DP-9` if present, on `DP-4` if `DP-9` is not present, and on the default monitor if both are not present.\r\n\r\n## Implementation ideas\r\nTo support this, the config parser probably should use a `Vec<String>` instead of `Option<String>` for `open-on-output`:\r\n\r\nhttps://github.com/YaLTeR/niri/blob/f30db163b5748e8cf95c05aba77d0d3736f40543/niri-config/src/workspace.rs#L10\r\n\r\nFrom my understanding, niri re-calculates layout anyway on each output change. A possible implementation would be to adapt the logic assigning workspaces to outputs to loop through a `Vec` of output definitions instead of matching only a single output name.",
      "created_at": "2026-02-02T09:39:45Z",
      "updated_at": "2026-02-02T09:39:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "LukeLR",
        "avatar_url": "https://avatars.githubusercontent.com/u/3177243?u=aa20bae8d9ad8f1416a3bdbd452b7efa5da171f9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj60L",
      "number": 3370,
      "title": "Mod + O not working and Mod + Left and Right not aligning Fedora 43 Gnome File Manager",
      "body": "Mod + O isn't working where I'd see an overview of sorts of all my open workstations, it was working on my Bazzite image, not so much on my Fedora image, and the same could be said for the Files and DMS settings programs where they're unable to tile in with my other windows and are not able to move.",
      "created_at": "2026-02-01T21:45:17Z",
      "updated_at": "2026-02-01T23:00:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A7w9z",
        "body": "Here: \r\n```kdl\r\nMod+D repeat=false { toggle-overview; }\r\n    Mod+Tab repeat=false { toggle-overview; }\r\n    Mod+Shift+Slash { show-hotkey-overlay; }\r\n```"
      },
      "user": {
        "login": "MikieD-op",
        "avatar_url": "https://avatars.githubusercontent.com/u/177771966?u=a95edfb7cb01e4122a23bb09a68e1698f7e32660&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj6er",
      "number": 3368,
      "title": "How to make a program start with the default size?",
      "body": "As the title.\r\n\r\nI'm using `qemu` with window rule:\r\n\r\n```\r\nwindow-rule {\r\n    match title=\"(.*?)QEMU(.*?)\"\r\n    open-floating true\r\n    open-focused true\r\n}\r\n```\r\n\r\nHow to make it start without black?",
      "created_at": "2026-02-01T11:14:12Z",
      "updated_at": "2026-02-01T21:25:09Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "xuanplus",
        "avatar_url": "https://avatars.githubusercontent.com/u/107631981?u=d8a8a1a51861132ccd4add4fdef202518372dcad&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj6Xv",
      "number": 3367,
      "title": "Wayland DRM Lease?",
      "body": "Hi all,\r\n\r\nI was wondering if this was in niri like gnome and KDE to make VR gaming possible.",
      "created_at": "2026-02-01T06:56:05Z",
      "updated_at": "2026-02-01T18:57:15Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A7wGp",
        "body": "Yes"
      },
      "user": {
        "login": "Mondrethos",
        "avatar_url": "https://avatars.githubusercontent.com/u/9123069?u=1aa2e9c902e8c4550883d04605bfcb439e179a25&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhMOc",
      "number": 2202,
      "title": "Firefox changes title after starting so matching on title doesn't work",
      "body": "Hi,\r\n\r\nAny nice way to make niri's window rule match title when firefox changes it during flight\r\n\r\n```\r\nWindow opened or changed: Window { id: 22, title: Some(\"Mozilla Firefox\"), app_id: Some(\"firefox\"), pid: Some(288408), workspace_id: Some(3), is_focused: true, is_floating: false, is_urgent: false }\r\nWindow opened or changed: Window { id: 22, title: Some(\"Slack — Mozilla Firefox\"), app_id: Some(\"firefox\"), pid: Some(288408), workspace_id: Some(3), is_focused: true, is_floating: false, is_urgent: false }\r\nWorkspace 3: active window changed to Some(3)\r\nWindow focus changed: Some(3)\r\nWindow opened or changed: Window { id: 22, title: Some(\"general (Channel) - group.xxx - Slack — Mozilla Firefox\"), app_id: Some(\"firefox\"), pid: Some(288408), workspace_id: Some(3), is_focused: false, is_floating: false, is_urgent: false }\r\n```\r\n\r\nTried\r\n```\r\nwindow-rule {\r\n    match app-id=\"firefox\" title=\"Slack\"\r\n    open-on-workspace \"slack\"\r\n    open-focused false\r\n}\r\n```\r\n\r\nThe above rule works without the title match",
      "created_at": "2025-08-08T08:19:58Z",
      "updated_at": "2026-02-01T13:11:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "desdic",
        "avatar_url": "https://avatars.githubusercontent.com/u/13243026?u=89449c8c6d1b596d0343c564f6829614d40652b8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj57n",
      "number": 3354,
      "title": "Icons in overview or alt-tab switcher",
      "body": "Is it possible to have icons (or window name?) in the overview or the alt-tab switcher window?",
      "created_at": "2026-01-31T17:10:12Z",
      "updated_at": "2026-02-01T05:41:57Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {}
    },
    {
      "id": "D_kwDOKFkxdc4Aj6Eu",
      "number": 3358,
      "title": "a window rule to match on XWindow apps",
      "body": "am I an idiot or there is no way to match on XWindow apps?",
      "created_at": "2026-01-31T21:06:35Z",
      "updated_at": "2026-01-31T23:10:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "shizeeg",
        "avatar_url": "https://avatars.githubusercontent.com/u/128569?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjbxO",
      "number": 3132,
      "title": "`niri msg action spawn` how to launch a program environment variables?",
      "body": "Curious if this is possible\r\n\r\nworks\r\n\r\n\r\n```sh\r\nniri msg action spawn -- android-studio\r\n```\r\n\r\ndoes not work:\r\n\r\n```sh\r\nniri msg action spawn -- QT_QPA_PLATFORM=xcb android-studio\r\n```",
      "created_at": "2025-12-28T23:33:53Z",
      "updated_at": "2026-01-31T22:00:15Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6lyV",
        "body": "Use spawn-sh"
      },
      "user": {
        "login": "wickedst",
        "avatar_url": "https://avatars.githubusercontent.com/u/18102081?u=e07c9f9c4d48533e8897d2a8392fd900346a1836&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj5rR",
      "number": 3351,
      "title": "Add new IPC feautres to active workspace or window but focus",
      "body": "This feature allows us to dynamically switch the display of the workspace or window without losing the current focus.",
      "created_at": "2026-01-31T08:26:03Z",
      "updated_at": "2026-02-05T10:09:35Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "feng-yifan",
        "avatar_url": "https://avatars.githubusercontent.com/u/15028843?u=1515ca23e25a68a39d43ace1caa1454259526282&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj0Lz",
      "number": 3313,
      "title": "Animation to scroll screen by x% when trying to move focus to a non-existent window, before snapping back",
      "body": "Currently, if we try to do `focus-left` while there are no windows on the left to focus to, there is no feedback. It would be nice to add an animation that could scroll the screen by a small percent (could be a configurable parameter) before snapping back to the current view. We could imagine it as an invisible \"spring\" on both ends. If you try to `focus-left`, it would be like pulling the current leftmost window and due to tension in the spring, it would automatically snap back to the edge after a short moment. Same thing for `focus-right`, `focus-up`, and `focus-down`.\r\n",
      "created_at": "2026-01-26T06:43:57Z",
      "updated_at": "2026-01-31T18:48:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "precondition",
        "avatar_url": "https://avatars.githubusercontent.com/u/57645186?u=13f177b4cf57d412f15aecef355219a0efb4a6b9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai6Q2",
      "number": 2829,
      "title": "disable hotkeys temporarily",
      "body": "On hyprland, I can do that to use shortcuts on apps like scrcpy to control the phone. On niri, I couldn't find this action, only thing available is toggle-keyboard-shortcuts-inhibit, and it doesn't disable shortcuts, it just disable hotkeys set by apps like VMs, OBS, and others.",
      "created_at": "2025-11-18T06:00:12Z",
      "updated_at": "2026-01-31T13:29:12Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "aljustiet",
        "avatar_url": "https://avatars.githubusercontent.com/u/114720383?u=5191f1ccd27096602fa10f03706ed166067faa79&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj5vR",
      "number": 3352,
      "title": "keep windows to a specific workspace (or an ordered list of fallbacks)",
      "body": "something like `open-on-workspace` but it prevents you from moving a window between workspaces (as in, doesn't respond to move-window-to-workspace events, and some kind of feedback, i.e. with interactive move in the overview that pushes the window back as you're dragging it, similar to the behaviour when you're focused on a workspace and you're trying to drag a floating window off screen)\r\n\r\nor rename that window rule to `workspaces` with an `on-open: bool` flag and accept an ordered list of workspaces so that if the first one doesn't exist there's fallbacks",
      "created_at": "2026-01-31T10:52:02Z",
      "updated_at": "2026-01-31T11:28:02Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "hollymlem",
        "avatar_url": "https://avatars.githubusercontent.com/u/35699052?u=3f0286f934e0fef5a79789cbaac71541e1f57ca5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj5mz",
      "number": 3350,
      "title": "Add the ability to round the corners of workspaces in the overview",
      "body": "Could round the layer-shell surfaces that scroll with their workspaces at the corners, similar to the clip-to-geometry and corner radius window rules.\r\n\r\ncould match GNOME's aesthetic:\r\n<img width=\"1102\" height=\"709\" alt=\"image\" src=\"https://github.com/user-attachments/assets/0d70cc48-5d06-4dd0-b93f-62c9a4d6b6d1\" />",
      "created_at": "2026-01-31T05:08:47Z",
      "updated_at": "2026-01-31T05:10:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bluelinden",
        "avatar_url": "https://avatars.githubusercontent.com/u/99615751?u=315422387cb03d6284107741a7feaa8a62fce61f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj5jP",
      "number": 3349,
      "title": "Allow hiding the screenshot UI",
      "body": "I don't like how out-of-place the widget on the bottom looks, and I would like to hide it entirely.",
      "created_at": "2026-01-31T02:25:26Z",
      "updated_at": "2026-01-31T02:25:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bodby",
        "avatar_url": "https://avatars.githubusercontent.com/u/49784526?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj5ET",
      "number": 3347,
      "title": "smooth teleportation for windows between monitors",
      "body": "\r\nhttps://github.com/user-attachments/assets/4dc3c6f9-6ade-408f-a6bb-ba2972290cc7\r\n\r\nAs you can see on video, when you moving the window to other screen (mouse or shortcut) the window just teleports when mouse reaches other monitor.\r\nWhat about adding smooth animations for moving it with mouse and by keybind like in hyprland, gnome, kde etc. Is it possible?",
      "created_at": "2026-01-30T13:28:32Z",
      "updated_at": "2026-01-30T13:28:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "akuraneee",
        "avatar_url": "https://avatars.githubusercontent.com/u/84019866?u=d564e79a008af0bc17f9d39a7987cc7e8650278e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj4zk",
      "number": 3344,
      "title": "Close Button in overview like Gnome",
      "body": "![img](https://itsfoss.com/content/images/size/w1000/2025/03/gnome-48-overview-about-system-3.png)\r\n\r\nThe button appears when you hover the window in the overview, and acts like the close button of a normal window.",
      "created_at": "2026-01-30T08:49:03Z",
      "updated_at": "2026-01-30T08:51:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "iWisp360",
        "avatar_url": "https://avatars.githubusercontent.com/u/114373500?u=2384ea69deb8f5cc878649a94ad92cf844bb8660&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjDzx",
      "number": 2917,
      "title": "v25.11",
      "body": "Two weeks ago, Cloudflare had a major outage that took down a good half of the internet. Their [postmortem](https://blog.cloudflare.com/18-november-2025-outage/) included a snippet of Rust code with an `unwrap()`, causing much internet discourse. Now it is my turn to release Rust software with a healthy dose of `unwrap()`s, `assert!`s, and checked arithmetic enabled in release builds.\r\n\r\nNiri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nHere are the improvements from the last release.\r\n\r\n> [!NOTE]\r\n> Packagers: niri now supports libdisplay-info 0.3. Most niri packages updated this dependency back in September using a patch—this patch is no longer necessary.\r\n\r\n## Alt-Tab\r\n\r\nAfter multiple major iterations and a lot of work by @rustn00b, we have an Alt-Tab recent windows switcher!\r\n\r\nhttps://github.com/user-attachments/assets/4996d0be-638f-403b-b111-89a343d50c00\r\n\r\nIt's got live window previews, window titles that fade if they're too long, and supports [windows blocked out from screencasts](https://yalter.github.io/niri/Screencasting.html#block-out-windows)—they will draw as black rectangles with their titles hidden. Just like in GNOME, there's a small delay to drawing the interface, so that quickly hitting Alt-Tab will switch to the previous window with no visual disturbance.\r\n\r\nThere are some interesting design differences compared to Alt-Tab in other desktops. On niri, I expect it's common to have multiple terminals open, so Alt-Tab must go by windows (not by apps), and the previews must be big enough for you to be able to pick the right window. So, instead of a panel showing all windows at once, we have a scrolling layout with a few large previews.\r\n\r\nThen, since niri is primarily tiling, you might frequently focus intermediate windows while navigating the workspace. Think pressing <kbd>Super</kbd><kbd>→</kbd> a few times to reach some window towards the end, or moving the mouse across the screen with [`focus-follows-mouse`](https://yalter.github.io/niri/Configuration%3A-Input.html#focus-follows-mouse). These intermediate windows shouldn't \"pollute\" the Alt-Tab list, so we have a small debounce delay before a focused window is marked as recent.\r\n\r\nWorkspaces in niri can get *long* (especially if you forget how many terminals you open), so our Alt-Tab can scope windows by current workspace or by current output by pressing <kbd>W</kbd> or <kbd>O</kbd>.\r\n\r\nThe default binds are <kbd>Alt</kbd><kbd>Tab</kbd> / <kbd>Mod</kbd><kbd>Tab</kbd> to switch across all windows, and <kbd>Alt</kbd><kbd>\\`</kbd> / <kbd>Mod</kbd><kbd>\\`</kbd> to switch between windows of the current application. Note that if you bound something else to those keys, your existing binds will take precedence.\r\n\r\nThe [recent windows configuration](https://yalter.github.io/niri/Configuration%3A-Recent-Windows.html#overview) wiki page explains how to change these key bindings, as well as everything else: open delay, debounce, window preview size, and so on.\r\n\r\n![](https://github.com/user-attachments/assets/d2f94c9a-4e2c-4f05-bbbf-bc82d13a8b7f)\r\n\r\nFinally, the niri IPC now exposes the window [`focus_timestamp`](https://yalter.github.io/niri/niri_ipc/struct.Window.html#structfield.focus_timestamp) and an event stream [event](https://yalter.github.io/niri/niri_ipc/enum.Event.html#variant.WindowFocusTimestampChanged), so you can use the recent windows list in your own desktop components and scripts.\r\n\r\n## Un/fullscreen animations\r\n\r\nThe transitions for windows going to and from fullscreen are now fully animated. No more windows jumping and growing to fullscreen size in a single frame.\r\n\r\nThe black backdrop fades in and out and grows if needed, and [`clip-to-geometry`](https://yalter.github.io/niri/Configuration%3A-Window-Rules.html#clip-to-geometry) rounded corners smoothly transition between square and circular during this animation.\r\n\r\nhttps://github.com/user-attachments/assets/05b340b0-4e5e-4b66-93e3-bd42734f33c6\r\n\r\nhttps://github.com/user-attachments/assets/d736341a-7e77-4c06-8fad-96857e2da93a\r\n\r\nEven if you run with animations disabled, you will see an improvement: windows will no longer jump up and down when un/fullscreening.\r\n\r\nhttps://github.com/user-attachments/assets/f3316e87-6086-4608-ae2e-a6e202cf03f3\r\n\r\n## True maximize\r\n\r\nOne of the bigger changes in this release that required several weeks of work: niri now supports the true Wayland maximize. This is the normal \"maximize button next to the X button\" or \"double-click on the titlebar\" maximize.\r\n\r\nhttps://github.com/user-attachments/assets/f2b9bb97-a611-491b-be2d-6c8f95cf2737\r\n\r\nWe historically didn't implement true Wayland maximize because it's very similar to, yet slightly different from, our full-width columns (the `maximize-column` bind). These preserve gaps, borders and struts, and can contain multiple windows. The true Wayland maximize, on the other hand, makes a single window occupy the entire working area, with no gaps or struts.\r\n\r\n| Full-width column | Maximized window |\r\n| --- | --- |\r\n| ![](https://github.com/user-attachments/assets/dafad17d-ebd6-4aa0-9d95-90e1127e58c1) | ![](https://github.com/user-attachments/assets/f45159fc-51df-405c-a77e-6f0eb7b64676) |\r\n\r\nAfter plenty of requests, and thinking about it, I reconsidered. Double-click-to-maximize and the maximize button are things that users (especially new users) expect to work; additionally, plenty of people had asked for variations of \"maximize without borders and gaps\".\r\n\r\nIronically, after implementing true maximize, it has by far become my favorite window sizing mode. I keep windows true-maximized all the time: the browser, code editor, terminal ssh'd into a remote server.\r\n\r\nSince the `maximize-column` and `open-maximized` names are taken by full-width columns, the true-maximize action is called `maximize-window-to-edges`. This name reflects what it does—maximize to the entire working area, right up to the screen edges or exclusive layer-shell surfaces.\r\n\r\nSimilarly to fullscreen, true maximize always puts the window into the scrolling layout (since otherwise it would easily obscure all windows below). Naturally, you can still scroll left and right from a maximized window.\r\n\r\nYou can read more about fullscreen and maximize [on the new wiki page](https://yalter.github.io/niri/Fullscreen-and-Maximize.html).\r\n\r\n## Drag windows horizontally to scroll\r\n\r\nOn a trackpad, you can swipe left and right with three fingers to scroll the view. With a mouse, however, you have to either do a <kbd>Super</kbd><kbd>MMB</kbd> drag, which requires reaching for the keyboard, or switch windows via the Overview hot corner, which causes a lot of movement on screen.\r\n\r\nTo make scrolling the view mouse-only less annoying, I added a new behavior directly inspired by PaperWM: dragging tiled windows by their titlebar horizontally will scroll the view instead of moving the window. To move the window, you can still drag vertically (or with <kbd>Super</kbd>, or in the Overview).\r\n\r\nhttps://github.com/user-attachments/assets/b3dca1c3-fd6f-4139-a431-91de8fc048a5\r\n\r\nThis also works on touchscreens, finally adding an easy way to scroll the view by touch. I opted to make the touchscreen gesture work even when holding <kbd>Super</kbd>, since with touch there's no concern of quickly moving windows across monitors, like you sometimes need to do with a mouse.\r\n\r\nhttps://github.com/user-attachments/assets/59d83b61-dfd9-4b28-983c-4f12a6ea6e19\r\n\r\nAs a bonus, tapping with a second finger while moving a window now switches it between floating and tiling, just like pressing the right mouse button does.\r\n\r\n## Per-output and per-workspace layout config\r\n\r\nYou can now put `layout {}` sections inside [`output {}`](https://yalter.github.io/niri/Configuration%3A-Outputs.html#layout-config-overrides) and [`workspace \"name\" {}`](https://yalter.github.io/niri/Configuration%3A-Named-Workspaces.html#layout-config-overrides) to override layout settings for specific outputs and named workspaces.\r\n\r\n```kdl\r\noutput \"SomeCompany VerticalMonitor 1234\" {\r\n    transform \"90\"\r\n\r\n    // Layout config overrides just for this output.\r\n    layout {\r\n        default-column-width { proportion 1.0; }\r\n\r\n        // ...any other setting.\r\n    }\r\n}\r\n\r\noutput \"SomeCompany UltrawideMonitor 1234\" {\r\n    // Narrower proportions and more presets for an ultrawide.\r\n    layout {\r\n        default-column-width { proportion 0.25; }\r\n\r\n        preset-column-widths {\r\n            proportion 0.2\r\n            proportion 0.25\r\n            proportion 0.5\r\n            proportion 0.75\r\n            proportion 0.8\r\n        }\r\n    }\r\n}\r\n\r\nworkspace \"aesthetic\" {\r\n    // Layout config overrides just for this named workspace.\r\n    layout {\r\n        gaps 32\r\n\r\n        struts {\r\n            left 64\r\n            right 64\r\n            bottom 64\r\n            top 64\r\n        }\r\n\r\n        border {\r\n            on\r\n            width 4\r\n        }\r\n\r\n        // ...any other setting.\r\n    }\r\n}\r\n```\r\n\r\nWhile simple on the surface, this feature required a complete overhaul of niri's config loading and parsing to support merging settings from multiple definitions of the `layout {}` section. As it happens, this was an important prerequisite for...\r\n\r\n## Config includes\r\n\r\nYou can now *include* other files in your niri config.\r\n\r\n```kdl\r\n// Some settings...\r\n\r\ninclude \"colors.kdl\"\r\n\r\n// Some more settings...\r\n```\r\n\r\nIncluded files have the same structure as the main config file. Settings from included files are merged with the settings from the main config. Includes are *positional*: they will override options set *prior* to them in the file.\r\n\r\nIncludes are useful for splitting your config into manageable chunks, and they make it easy for third-party tools to robustly inject niri configuration. For example, my top-level niri config currently looks like this:\r\n\r\n```kdl\r\n// Configuration split into files by sections.\r\ninclude \"debug.kdl\"\r\ninclude \"input.kdl\"\r\ninclude \"outputs.kdl\"\r\ninclude \"workspaces.kdl\"\r\ninclude \"layout.kdl\"\r\ninclude \"animations.kdl\"\r\ninclude \"misc.kdl\"\r\ninclude \"binds.kdl\"\r\n\r\n// Autogenerated settings from DankMaterialShell (DMS).\r\n// https://github.com/AvengeMedia/DankMaterialShell\r\ninclude \"dms/colors.kdl\"\r\ninclude \"dms/wpblur.kdl\"\r\n\r\n// These includes are last, they will override settings from DMS.\r\ninclude \"decorations.kdl\"\r\ninclude \"rules.kdl\"\r\n```\r\n\r\nSee the [config includes wiki page](https://yalter.github.io/niri/Configuration%3A-Include.html) for more details, for instance how different config sections are merged together.\r\n\r\n## DisplayLink support\r\n\r\nThanks to @cmeissl and @scottmckendry, niri now supports monitors connected through DisplayLink docks. This is especially important for Asahi Macs, which currently don't support any other way of connecting external displays.\r\n\r\n## Reduced screen blanking\r\n\r\nIn this release, I finally adapted the logic from [cosmic-comp](https://github.com/pop-os/cosmic-comp) to avoid screen blanking when possible. If your login manager / TTY resolution and refresh rate match the ones in niri, your screen should switch to niri without flickering to black. This works both when starting niri and when switching the TTY back to a running niri session.\r\n\r\nhttps://github.com/user-attachments/assets/7af85cd6-d218-409e-8d0c-414dade0249e\r\n\r\nhttps://github.com/user-attachments/assets/78dc353d-4017-43ed-84fc-b59d1c66ace3\r\n\r\nEven if the screen does blank on your setup (common for high refresh rate monitors where the TTY tends to use a 60 Hz mode, since that's usually the monitor-preferred one), niri should start up faster, as it will do just one modeset instead of two.\r\n\r\n## Custom output modes\r\n\r\n@ToxicMushroom, building upon the initial work of @cmeissl, implemented custom modes and modelines in niri. When configuring an output mode, you can set `custom=true` to force the use of a given mode, even if it's not advertised by the monitor. Alternatively, you can provide a full custom modeline.\r\n\r\nCustom modes can be useful when the monitor's EDID doesn't advertise the right mode for some reason. For example, some monitors can use a lower refresh rate than any of the advertised modes, which can be useful for reduced power consumption.\r\n\r\nKeep in mind that custom modes are not guaranteed to work. Niri is asking the monitor to run in a mode that is not supported by the manufacturer. Trying a non-working mode will generally turn the monitor blank.\r\n\r\n> [!CAUTION]\r\n> Custom modes may damage your monitor, especially if it's a CRT. Follow the maximum supported limits in your monitor's instructions.\r\n\r\n```kdl\r\noutput \"eDP-1\" {\r\n    // Custom modes. Caution: may damage your display.\r\n    mode custom=true \"1920x1080@100\"\r\n    // Or:\r\n    // modeline 173.00  1920 2048 2248 2576  1080 1083 1088 1120 \"-hsync\" \"+vsync\"\r\n}\r\n```\r\n\r\n## Screen reader enhancements\r\n\r\nThanks to an issue report, I found out that niri wasn't entirely correctly signalling keyboard modifiers to screen readers. This has been fixed, so combos like Orca + Ctrl + Space and Orca + Shift + A now work on niri.\r\n\r\nThe new Alt-Tab switcher should also be a nice addition here; from what I understand, it's a common navigation method for screen reader users. I made it speak the selected window title, which, if I'm not mistaken, is the expected behavior. Watch with sound:\r\n\r\nhttps://github.com/user-attachments/assets/3a399726-0d22-4497-9cc6-d4fcc444f882\r\n\r\n## Other improvements in this release\r\n\r\n- @Fireye04 and @Aadniz made the hot corners [configurable](https://yalter.github.io/niri/Configuration%3A-Gestures.html#hot-corners), including [per-output](https://yalter.github.io/niri/Configuration%3A-Outputs.html#hot-corners).\r\n- @ilyx-me made it possible to run windowed `niri --session` in WSL.\r\n- @shaunren added the [`ignore-drm-device`](https://yalter.github.io/niri/Configuration%3A-Debug-Options.html#ignore-drm-device) debug option that prevents niri from touching the given DRM device. This is useful for GPU passthrough when you need exclusive access to a certain device.\r\n- @Szybet made the `calibration-matrix` [input setting](https://yalter.github.io/niri/Configuration%3A-Input.html) work for touchscreens.\r\n- @nenikitov added proportional change support (`+10%`, `-10%`, `10%`) to the `move-floating-window` action.\r\n- @iynaix added a `--path` argument to the `screenshot`, `screenshot-window` and `screenshot-screen` actions that sets the path where niri will write the screenshot.\r\n- @ThatOneCalculator added a new [`ScreenshotCaptured`](https://yalter.github.io/niri/niri_ipc/enum.Event.html#variant.ScreenshotCaptured) IPC event that fires whenever niri captures a screenshot, with the output file path.\r\n- The default config now includes play/stop/prev/next media key binds (thanks @anagram3k) and limits the volume adjustment to 100% (thanks @whiskeyPeak).\r\n- Niri will now retry adding a DRM device if it previously failed. This fixes some cases where plugging a monitor into a laptop's port connected to the discrete GPU didn't work.\r\n- Added support for the panel orientation DRM property, used to set the default screen orientation on some devices.\r\n- Niri no longer sets the max bpc DRM property. It didn't really do any help, at the same time it started hitting an annoying driver bug on some OLED panels. The [`keep-max-bpc-unchanged`](https://yalter.github.io/niri/Configuration%3A-Debug-Options.html#keep-max-bpc-unchanged) debug flag is now deprecated and does nothing.\r\n- The `output { background-color \"...\"; }` setting is now deprecated, use the new `output { layout { background-color \"...\"; } }` setting instead.\r\n- Narrowed the interactive move insert hint in the overview between workspaces. When it was full-width, it gave a false impression that the window would be maximized on the new workspace.\r\n- @ArijanJ made it so when the cursor is [hidden](https://yalter.github.io/niri/Configuration%3A-Miscellaneous.html#cursor) via `hide-when-typing` or `hide-after-inactive-ms`, it will still show up in the screenshot UI, letting you optionally include it in the screenshot.\r\n- Added laptop lid state monitoring through logind. This should fix any issues where niri didn't notice the laptop lid opening after a sleep cycle (due to libinput dropping the event), which then caused the laptop display to erroneously turn off upon connecting an external monitor.\r\n- Niri will now match the [`default-column-width`](https://yalter.github.io/niri/Configuration%3A-Layout.html#default-column-width) to a [preset width](https://yalter.github.io/niri/Configuration%3A-Layout.html#preset-column-widths) when opening a window. This fixes the first <kbd>Mod</kbd><kbd>R</kbd> press (switch preset column width) \"doing nothing\" for certain windows, like [foot](https://codeberg.org/dnkl/foot) in constrain-to-terminal-grid sizing mode.\r\n- @miku4k changed niri to create the screenshot file directory with parent directories if they don't exist. This makes saving screenshots to disk work out of the box in more cases.\r\n- @elivance fixed parsing of the case-sensitive `XF86ScreenSaver` key. Niri parses keys case-insensitively. Unfortunately, there's a colliding `XF86_Screensaver` key (note the small `s`) which is *not* the key that you generally want. Now, for this specific key, niri also checks for a case-sensitive match to disambiguate.\r\n- @valpackett fixed niri building with the systemd feature on musl libc systems.\r\n- @feschber fixed discrete scroll event speed in the virtual-pointer protocol.\r\n- Fixed inability to override border/focus-ring/tab-indicator gradient with a plain color in window rules.\r\n- Fixed window rule border/focus-ring width not getting rounded to physical pixels, leading to small animation jank.\r\n- Fixed drag-and-drop cursor surface being slightly offset.\r\n- Fixed a small jump when releasing an interactively moved window in the overview.\r\n- Fixed the hot corner triggering during the view scrolling gesture.\r\n- Fixed incorrect alpha handling in the layout [`background-color`](https://yalter.github.io/niri/Configuration%3A-Layout.html#background-color).\r\n- Removed Herobrine.\r\n- Updated Smithay:\r\n    - Improved correctness of window commit tracking.\r\n    - Fixed Qt layer-shell popup grabs. Popup menus from LXQt panel and desktop now correctly grab the keyboard focus, and can be closed by clicking outside.\r\n    - Fixed visual ordering of popups when several open at once, for example popup + tooltip in GTK 4, or some popups in xwayland-satellite.\r\n    - Fixed importing DMA-BUFs from v4l2 devices.\r\n    - Fixed a possible integer overflow in the damage shaper, which could cause niri crashes with some misbehaving clients.\r\n    - Added a tablet pressure workaround that improves behavior for some applications like wine and MyPaint.\r\n    - Added support for layer-shell v5 with its `set_exclusive_edge()` request, and changed layer surface ordering to consider exclusive zone surfaces first.\r\n\r\n## Funding\r\n\r\nI work on niri in the spare time that I have from my university studies. If you like what I do, you can support my work on [GitHub Sponsors](https://github.com/sponsors/YaLTeR). Big thanks to all current and past sponsors!\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v25.11'>v25.11</a>.</em>",
      "created_at": "2025-11-29T10:06:23Z",
      "updated_at": "2026-01-29T19:49:32Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj4UO",
      "number": 3340,
      "title": "Fake focus on windows",
      "body": "Tell windows that they're focused, even when they're not, similar to [fake fullscreen](https://yalter.github.io/niri/Screencasting.html#windowed-fakedetached-fullscreen).\r\n\r\nMany applications behave differently, stop processing or similar things when unfocused. Especially games do this a lot.\r\nIt would be very nice to be able to just tell them they're constantly focused and use other windows in the mean time either way.",
      "created_at": "2026-01-29T18:43:27Z",
      "updated_at": "2026-01-29T19:37:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "crispy-caesus",
        "avatar_url": "https://avatars.githubusercontent.com/u/114518720?u=477aea3b1df32e99a87f37aec366f786f1115262&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj4UW",
      "number": 3341,
      "title": "Block/Reject full screen requests",
      "body": "As far as I understand, niri - the compositor handles all window actions. Many windows like to request fullscreens and niri just complies with that and fullscreens them.\r\nI would like to see an option to reject those requests. There are some times where I don't want the window to be in full screen, however I can't do anything about it just getting fullscreened.\r\n\r\n ",
      "created_at": "2026-01-29T18:47:39Z",
      "updated_at": "2026-01-29T19:36:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "crispy-caesus",
        "avatar_url": "https://avatars.githubusercontent.com/u/114518720?u=477aea3b1df32e99a87f37aec366f786f1115262&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj4V3",
      "number": 3342,
      "title": "Multi-seat support",
      "body": "Multi-seat support similar to [how weston does it](https://chaos.social/@blinry/114688713940273681) would be awesome!",
      "created_at": "2026-01-29T19:19:12Z",
      "updated_at": "2026-01-29T19:20:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Jak2k",
        "avatar_url": "https://avatars.githubusercontent.com/u/76660118?u=a81065831f49ff9069e7c61ee2712cb034d90e4d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj3cM",
      "number": 3332,
      "title": "Disable screenshot writing to clipboard",
      "body": "Is there a reason why `--write-to-disk` also writes to the clipboard? Personally I always want to write to just one of them. ",
      "created_at": "2026-01-29T00:22:11Z",
      "updated_at": "2026-01-29T00:22:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "emiham",
        "avatar_url": "https://avatars.githubusercontent.com/u/65129819?u=586870a4cca84e4ac0581f2d24c96348d17cddf7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgIpK",
      "number": 1737,
      "title": "On-the-fly screenshot editing",
      "body": "Hello everyone,\r\n\r\nNew niri user coming from Gnome on X11, I am trying to backport my essential tools to work as before but with a wonderful window manager. \r\n\r\nI am a flameshot user because it's a really good tool for taking AND editing screenshots, but I had struggles making it work on niri. Initially it wasn't working at all, so I compiled it with some new arguments `-DUSE_WAYLAND_CLIPBOARD=ON -DUSE_WAYLAND_GRIM=ON`.\r\n\r\nIt started working but has some flaws: \r\n- After a while the copy to clipboard doesn't work anymore ;\r\n- On multiple screens, only the principal screen can take screenshots ;\r\n- On multiple screens, the editor bar doesn't show.\r\n\r\nDid someone find a way to use Flameshot smoothly in niri? \r\nWhat are your solutions for taking and editing a screenshot? \r\nCan we consider adding on-the-fly screenshot edition within the native screenshot tool of niri?\r\n\r\nThank you,",
      "created_at": "2025-06-06T08:37:30Z",
      "updated_at": "2026-01-28T23:15:58Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A0G_p",
        "body": "Example @Flo354 with my configuration:\r\n\r\n`grim -t ppm -g \\\"$(slurp -d)\\\" - | satty -f - --initial-tool=arrow --copy-command=wl-copy --actions-on-escape=\\\"save-to-clipboard,exit\\\" --brush-smooth-history-size=5 --disable-notifications`\r\n\r\nYou need slurp and grim.\r\n- Slurp let you choose an area on your screen\r\n- Grim takes the screenshot\r\n- This is piped to satty to edit the screenshot\r\n  - Note that I have configured satty to copy the edited screenshot into the clipboard on hitting \"escape\""
      },
      "user": {
        "login": "Flo354",
        "avatar_url": "https://avatars.githubusercontent.com/u/4249311?u=d84565fdf2a78c2d4b606dbd0e4e875dfb5b248f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj2qu",
      "number": 3328,
      "title": "disable (toggle effect) my in-built keyboard in my laptop.",
      "body": "hey.\r\n\r\nis their is any way we can toggle the in-built keyboard in the laptop.\r\n\r\ni had been using i3wm (X11 protocol) previously in my laptop and i have a external keyboard and my in-built keyboard is some what defective (like some keys would randomly not works). so i have a habit of disabling my inbuilt keyboard and keep my external keyboard over my inbuilt keyboard in my laptop and use it. like this in this image\r\n\r\n<img width=\"756\" height=\"304\" alt=\"image\" src=\"https://github.com/user-attachments/assets/6cf90861-14dd-4c83-9ca0-134a3ef26231\" />\r\n\r\nand the script i used previously in my i3wm is attached below\r\n\r\n```bash\r\n#!/bin/bash\r\n\r\n# Built-in keyboard name\r\nBUILTIN_KEYBOARD=\"AT Translated Set 2 keyboard\"\r\n\r\n# List of candidate external keyboards\r\nEXTERNAL_KEYBOARDS=(\r\n    \"BY Tech Gaming KB\"\r\n    \"Compx 2.4G Wireless Receiver Keyboard\"\r\n)\r\n\r\n\r\n# Get ID of built-in keyboard\r\nBUILTIN_ID=$(xinput list | awk -v name=\"$BUILTIN_KEYBOARD\" '$0 ~ name {for(i=1;i<=NF;i++) if($i ~ /id=/) {split($i, a, \"=\"); print a[2]}}')\r\nif [ -z \"$BUILTIN_ID\" ]; then\r\n    echo \"Error: Built-in keyboard '$BUILTIN_KEYBOARD' not found.\"\r\n    exit 1\r\nfi\r\n\r\n# Check if built-in keyboard is enabled\r\nENABLED_STATUS=$(xinput list-props \"$BUILTIN_ID\" | grep \"Device Enabled\" | awk '{print $4}')\r\n\r\nif [ \"$ENABLED_STATUS\" = \"0\" ]; then\r\n    echo \"Built-in keyboard is currently disabled.\"\r\n    read -rp \"Do you want to enable it? (y/N): \" RE_ENABLE\r\n    RE_ENABLE=${RE_ENABLE,,}  # lowercase\r\n    if [ \"$RE_ENABLE\" = \"y\" ]; then\r\n        echo \"Enabling built-in keyboard...\"\r\n        xinput enable \"$BUILTIN_ID\"\r\n    else\r\n        echo \"Built-in keyboard remains disabled.\"\r\n    fi\r\n    exit 0\r\nfi\r\n\r\n# Track whether to disable the built-in keyboard\r\nDISABLE_BUILTIN=\"false\"\r\n\r\n# Check connected external keyboards and ask user if they should be considered\r\nfor KEYBOARD in \"${EXTERNAL_KEYBOARDS[@]}\"; do\r\n    if xinput list | grep -qF \"$KEYBOARD\"; then\r\n        echo \"Detected external keyboard: '$KEYBOARD'\"\r\n        read -rp \"Do you want to consider it as an external keyboard? (y/N): \" INPUT\r\n        INPUT=${INPUT,,}\r\n        if [ \"$INPUT\" = \"y\" ]; then\r\n            DISABLE_BUILTIN=\"true\"\r\n        else\r\n            echo \"Skipped '$KEYBOARD'.\"\r\n        fi\r\n    else\r\n        echo \"Keyboard '$KEYBOARD' is not connected. Skipping.\"\r\n    fi\r\ndone\r\n\r\n# Perform action based on user choice\r\nif [ \"$DISABLE_BUILTIN\" = \"true\" ]; then\r\n    echo \"Disabling built-in keyboard (ID: $BUILTIN_ID)...\"\r\n    xinput disable \"$BUILTIN_ID\"\r\nelse\r\n    echo \"No external keyboard selected and connected. Built-in keyboard remains enabled.\"\r\nfi\r\n```\r\n\r\nI have switched to niri and been using for nearly a couple of weeks and i have been searching for ways to disable the in-built keyboards in niri and nothing works which i found online.\r\nit would be very much helpful if someone helped me to disable my in-built keyboard as i had done before.",
      "created_at": "2026-01-28T10:02:51Z",
      "updated_at": "2026-01-28T10:59:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "akileshas",
        "avatar_url": "https://avatars.githubusercontent.com/u/169392249?u=ad5adb6574aeec8ac5180a8d6e8cc473247272d3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjumI",
      "number": 3286,
      "title": "Window Change Properties for window rules",
      "body": "Currently, using window rules, all kinds of actions can be taken when windows are first opened. However, sometimes the information necessary to take the right action is not available when a window opens (see https://github.com/YaLTeR/niri/discussions/2202#discussion-8700828 for example). If I understand how things work under the hood correctly, it is in principle possible to take actions on every window change (in some sense implementing https://github.com/YaLTeR/niri/discussions/2202#discussioncomment-14061029 in niri itself). I think such an implementation would be very useful, not only for the use case I sketched, but likely people will make all kinds of interesting uses of it.\r\n\r\nThere are different ways to do this. One radical one would be to change/generalize the Window Opening Properties to Window Change Properties that trigger not just when opening a window, but whenever a window rule matches on some change. The properties would become \r\n\r\n- `put-on-output`\r\n- `put-on-workspace`\r\n- `maximize`\r\n- `maximize-to-edges`\r\n- `fullscreen`\r\n- `float`\r\n- `focus`\r\n\r\nWindow matching could then also get some directives next to `on-startup`, such as `on-open` and `on-change`.",
      "created_at": "2026-01-20T08:15:06Z",
      "updated_at": "2026-01-28T10:26:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "equaeghe",
        "avatar_url": "https://avatars.githubusercontent.com/u/601177?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj2Ok",
      "number": 3326,
      "title": "Floating windows on all workspaces",
      "body": "GNOME has an option where a window can be toggled to show on all workspaces or not.\r\n\r\nI've found this to be useful often enough (say maybe I'm playing picture-in-picture and I want to have that view while I move around workspaces).\r\n\r\nI wonder if that would be doable with an extra global floating window layer which would display on workspaces.",
      "created_at": "2026-01-27T22:55:14Z",
      "updated_at": "2026-01-28T00:17:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ackledotdev",
        "avatar_url": "https://avatars.githubusercontent.com/u/111009970?u=3d7ae04e9151ca95628cae3981a74268325bc856&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aidky",
      "number": 2611,
      "title": "Running Niri via dinit + turnstile",
      "body": "Hi! I'm trying to run niri as a dinit user service to make it start automatically on login and properly integrate it into the user service dependency tree. But I'm not able to start it from my dinit instance with a following error:\r\n\r\n```\r\n[I] gera@homestation ~ [1]> dinitctl catlog niri\r\n2025-10-16T13:19:56.311724Z  WARN niri: running as a session but WAYLAND_DISPLAY is set, removing it\r\n2025-10-16T13:19:56.311738Z  INFO niri: starting version 25.08 (01be0e6)\r\n2025-10-16T13:19:56.335271Z DEBUG niri_config: loaded config from \"/home/gera/.config/niri/config.kdl\"\r\n\r\nthread 'main' panicked at src/main.rs:176:6:\r\ncalled `Result::unwrap()` on an `Err` value: error initializing the TTY backend\r\n\r\nCaused by:\r\n    0: Error creating a session. This might mean that you're trying to run niri on a TTY that is already busy, for example if you're running this inside tmux that had been originally started on a different TTY\r\n    1: Failed to open session: Function not implemented (os error 38)\r\nstack backtrace:\r\nnote: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.\r\n```\r\n\r\nHere's my dinit service file:\r\n```\r\ntype              = process\r\ncommand           = /usr/bin/niri --session\r\nrestart           = false\r\nworking-dir       = $HOME\r\ndepends-on        = dbus\r\nwaits-for         = pipewire\r\nwaits-for         = pipewire-pulse\r\nwaits-for         = wireplumber\r\nlog-type          = buffer\r\nafter             = niri-shutdown\r\nchain-to          = niri-shutdown\r\noptions:          always-chain\r\n```\r\n\r\nSeems like the reason for this behavior is my dinit user instance's standart output stream not being connected to any tty, because the user's dinit is launched by turnstile.\r\n\r\nI might just miunderstand the way ttys and user sessions work, but is there a way to make this arrangement work by forcing Niri to run on a specific tty?",
      "created_at": "2025-10-16T13:39:01Z",
      "updated_at": "2026-01-27T22:24:48Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Robogera",
        "avatar_url": "https://avatars.githubusercontent.com/u/51441702?u=9579fdb8bdd8757555f85c0966f50f45be6d6806&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbxuL",
      "number": 717,
      "title": "Behavior of focus-follows-mouse when switching workspace using touchpad gesture",
      "body": "Given for example two applications in a workspace when `focus-follows-mouse` is enabled, using the touchpad gesture to swipe to the next workspace always gives the focus to the rightmost full window when swiping right, and the leftmost window when swiping left. \r\n\r\nIf you wanted to focus on the window currently under the mouse pointer, you'd need to click on it or move the mouse pointer to an empty space and then back. \r\n\r\nI think it would be nice to have the choice to consistently just give focus on whatever is under the mouse pointer.",
      "created_at": "2024-10-06T08:47:35Z",
      "updated_at": "2026-01-27T21:04:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tyressk",
        "avatar_url": "https://avatars.githubusercontent.com/u/4695927?u=6c931ad6c34227ee5493ef515cf634a6797f0608&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj178",
      "number": 3323,
      "title": "Feature Request: Keybinding Chords",
      "body": "Hello, thank you very much for making `niri`. I haven't found a window I have liked this much since I started using `herbstluftwm` a long time ago. `niri` just makes things so simple and intuitive while giving you so much control.\r\n\r\nA large part of my workflow relies on `sxhkd`. This tool pretty much only works in X11 though. A key feature of this tool is that you can define keybindings as key chords. I could define a keybinding like,\r\n```\r\nsuper + x, f\r\n    command\r\n\r\nsuper + x, d\r\n    command\r\n```\r\n\r\nYou can basically press `super + x` first, and in a short amount of time if you just press `f`, it would run another command.\r\n\r\nThis allowed me to create \"contextual menus\" through keybindings. I think this is super powerful really helps to organize keybindings! It would awesome if `niri` could support such a feature. I understand that this might require a lot of design as well. I would like to see if others feel this would a useful feature to add.",
      "created_at": "2026-01-27T16:22:03Z",
      "updated_at": "2026-01-27T16:22:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zamlz",
        "avatar_url": "https://avatars.githubusercontent.com/u/10750027?u=f079d319e427d8c8c585936ca55d727c3a733550&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj1DY",
      "number": 3319,
      "title": "Recent Windows: Alternative to debounce for keyboard navigation",
      "body": "Would it be possible when moving between windows with keyboard navigation to track whether the Mod key used is held down?\r\n\r\nSo, if I have Mod+L to focus-column-right, as long as I have Mod held down it would not consider the window committed. I could move further to the right, or start moving left or some other direction, and it wouldn't matter; nothing would be committed until I released the modifier key.\r\n\r\nI think this would make for a more robust experience when moving around and then switching back to the most recent window, if you primarily use the keyboard.",
      "created_at": "2026-01-26T22:24:22Z",
      "updated_at": "2026-01-27T07:24:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "muhmud",
        "avatar_url": "https://avatars.githubusercontent.com/u/7550982?u=03fb52e70ba3cc3bf0c1da4ea88a82033253d88c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj0fp",
      "number": 3315,
      "title": "Document all default key binding actions",
      "body": "The key bindings documentation ([link](https://yalter.github.io/niri/Configuration%3A-Key-Bindings.html?utm_source=chatgpt.com))shows syntax and a few examples, but many default actions like focus-workspace-up, focus-workspace-down, and move-to-workspace are not explained.\r\n\r\nIt would be helpful to:\r\n\r\n- Explain all default actions.\r\n\r\n- Provide a complete default key binding table.\r\n\r\n- Optionally, include a ready-to-use binds {} template.",
      "created_at": "2026-01-26T12:51:53Z",
      "updated_at": "2026-01-26T22:01:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "shiwu84",
        "avatar_url": "https://avatars.githubusercontent.com/u/242958924?u=11da17e6979091333bef2a41101c8532df63a6f7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aj0di",
      "number": 3314,
      "title": "Hi Guys/Guy. & Girls .. (Help with Build flags)",
      "body": "what build flags do you guys reccomend i use? \r\n\r\nI get a 18.6mb file with these build flags:\r\nRUSTFLAGS=\"-C target-cpu=native -C opt-level=3\" \\\r\n                                     CARGO_PROFILE_RELEASE_LTO=fat \\\r\n                                     CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1 \\\r\n                                     CARGO_PROFILE_RELEASE_PANIC=abort \\\r\n                                     CARGO_PROFILE_RELEASE_DEBUG=false \\\r\n                                     cargo build --release && \\\r\n                                     strip target/release/niri \r\n\r\nThis is what I've been using for the smallest binary plus the most performant and cache friendly setup. Do you guys ( The developers)  agree with these build flags? what would you have done differently? \r\n\r\nI preffer building it from source, getting daily to weekly improvements to niri is really nice. Just want to be sure if this is whats best. Also: I hope my question is useful to those who prefer building from source. Sent with kind regards, Kearan. \r\n",
      "created_at": "2026-01-26T12:21:48Z",
      "updated_at": "2026-01-26T21:53:54Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "arch-user-sudo",
        "avatar_url": "https://avatars.githubusercontent.com/u/211272613?u=afacb11480b8f22ae70a17d8813a5c589127ea9f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai3mc",
      "number": 2795,
      "title": "Window title in border?",
      "body": "Is having the window title (and possibly icon) displayed in the border akin to i3 a supported feature? I could not a definitive yes or no answer in the documentation.\r\n\r\nI find it quite difficult to navigate windows without it.\r\n\r\nApologies if this is covered ground, but I couldn't find anything after a very thorough search.",
      "created_at": "2025-11-14T11:11:05Z",
      "updated_at": "2026-01-26T18:36:10Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "agraven",
        "avatar_url": "https://avatars.githubusercontent.com/u/23525639?u=04416371872ad3789c8ff27a860c8bf067d36d1e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjAcK",
      "number": 2890,
      "title": "How do you deal with this screen recording / floating window use case?",
      "body": "I currently use Windows and record a lot of videos on a 4k monitor but I record only a 1080p region of my screen. I use OBS to control which region gets recorded.  In Windows I use a tool called Sizer where all I do is focus a window and hit a hotkey, and then it resizes and positions a window into that region. I do this ahead of time for usually a few windows I know I'll be recording (terminal. browser, etc.).\r\n\r\nThis has 3 advantages. It allows me to keep the frame of the video focused on what matters (my terminal, browser, etc.) instead of seeing the whole OS. It also lets me keep notes off to the side next to these windows that I can use as a reference without anyone seeing them on video. Lastly, it keeps video sizes small since I'm only recording 1920x1080 instead of 4k.\r\n\r\nFlipping between these windows is easy because I can either ALT-TAB or click their icons in the Windows taskbar.\r\n\r\nWith Niri, I haven't figured out a good workflow for all of this. I know I can use the IPC features to make windows floating and then resize and position them but I'm wondering if I need to throw away my current way of thinking and see if there's a truly better way.\r\n\r\nReally the use case is wanting to record a region of a screen where certain windows always spawn within that region but you can float notes or other extra windows outside of that region. Often times I want my notes to be as close as possible to the edge of the region so my eyes don't need to travel far to read them. Sometimes I have notes on both sides of the recording region.\r\n\r\nIndependent of that I usually zoom in my browser and terminal font sizes for recording so it's easier to see. On Windows I wrote a little shell script to do this but I also wonder if there's a better way. I'd love to be able to somehow scale my native 100% 4k monitor to 200% for only the windows being recorded but keep the native 100% scaling 4k resolution for my notes and everything around those videos.\r\n\r\nDoes Niri have any features to get the best of all worlds here?",
      "created_at": "2025-11-25T13:03:32Z",
      "updated_at": "2026-01-26T13:45:47Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajx_P",
      "number": 3301,
      "title": "If the Firefox window isn't in direct view, when streaming videos with audio through YouTube, the audio often cuts out for a second pretty regularly",
      "body": "I noticed this with both an NVIDIA GPU (750 Ti with 2 GB) and AMD GPU (RX 480 with 8 GB). The same behavior happens.\r\n\r\n1. Open Firefox (hardware accel turned on)\r\n2. Play a music track so there's a constant stream of sound output (it happens with all videos)\r\n4. Move Firefox to workspace 2\r\n5. Go to workspace 1\r\n6. Use your machine normally\r\n7. Likely notice hitches where the audio stops / skips and quickly resumes\r\n    - I can't reproduce it to say it happens after X seconds, I just know it happens frequently enough where I've stopped putting music on a 2nd workspace, let it run at least for 10-15 minutes but I've seen it also happen within 30 seconds, it keeps happening too but not at an exact interval\r\n    - This isn't YouTube pausing the video, it's like the audio signal drops out\r\n\r\nIt's not related to workspaces either. You can replace steps 4 and 5 with using niri tab groups. If you have 2 tabs open and switch to the non-Firefox tab it will do the same hitch on step 6.\r\n\r\nI don't know if these are related but I do see this in journalctl maybe around the time it happens:\r\n\r\n```\r\nJan 23 07:56:25 kaizen /usr/lib/xdg-desktop-portal[1060]: A backend call failed: Inhibiting other than idle not supported\r\nJan 23 07:56:25 kaizen /usr/lib/xdg-desktop-portal[1060]: A backend call failed: Inhibiting other than idle not supported\r\n```\r\n\r\nThis one is very likely related. As soon as it happened I ran to journalctl and saw this without the above log created:\r\n\r\n```\r\nJan 23 08:10:34 kaizen kernel: perf: interrupt took too long (4960 > 4938), lowering kernel.perf_event_max_sample_rate to 40000\r\n```\r\n\r\nIf Firefox stays on workspace 1 (on either of my monitors) it never hitches. Even if I position windows to where there's only a sliver of Firefox in view then it's ok. I've done this for countless hours and it hasn't happened once. It's also not related to Firefox tab focusing either. As long as Firefox itself is in view, YouTube can be in a Firefox tab that's not focused without issues.\r\n\r\nThis is something I've been casually monitoring for 2 weeks but I switched GPUs and assumed prior to this maybe it was related to the NVIDIA card but now I'm seeing it happen with 2 different GPUs.\r\n\r\nIt happens with only 2 Firefox tabs open (1 to play music, 1 to browse whatever). The only extension I have is uBlock Origin.\r\n\r\nThe system is not under any type of meaningful load when this happens. I've noticed it plenty of times with nothing but Firefox and Ghostty open. Oftentimes I have music playing on my personal machine with wired headphones while doing work on a dedicated work laptop and I notice the audio hitches, so this demonstrates the problem isn't related to input (keyboard or mouse) as the machine is just idling in this case with Firefox on a 2nd workspace.\r\n\r\nAny thoughts on how to resolve this? Does anyone else experience this?\r\n\r\nSystem specs:\r\n\r\n```\r\n$ fastfetch\r\n                  -`                     nick@kaizen\r\n                 .o+`                    -----------\r\n                `ooo/                    OS: Arch Linux x86_64\r\n               `+oooo:                   Kernel: Linux 6.18.6-arch1-1\r\n              `+oooooo:                  Uptime: 12 hours, 59 mins\r\n              -+oooooo+:                 Packages: 1116 (pacman)\r\n            `/:-:++oooo+:                Shell: zsh 5.9\r\n           `/++++/+++++++:               Display (BenQ RD320U): 3840x2160 in 32\", 60 Hz [External]\r\n          `/++++++++++++++:              Display (DELL U2515H): 2560x1440 in 25\", 60 Hz [External]\r\n         `/+++ooooooooooooo/`            WM: niri 25.11 (Wayland)\r\n        ./ooosssso++osssssso+`           Theme: tokyonight-moon [GTK3/4]\r\n       .oossssso-````/ossssss+`          Cursor: default (24px)\r\n      -osssssso.      :ssssssso.         Terminal: ghostty 1.2.3-arch2\r\n     :osssssss/        osssso+++.        Terminal Font: Inconsolata Nerd Font (10pt)\r\n    /ossssssss/        +ssssooo/-        CPU: Intel(R) Core(TM) i5-4460 (4) @ 3.40 GHz\r\n  `/ossssso+/:-        -:/+osssso+-      GPU: AMD Radeon RX 480 Graphics [Discrete]\r\n `+sso+:-`                 `.-/+oso:     Memory: 2.82 GiB / 15.55 GiB (18%)\r\n`++:.                           `-/+/    Swap: 12.00 KiB / 4.00 GiB (0%)\r\n.`                                 `/    Disk (/): 78.87 GiB / 232.69 GiB (34%) - ext4\r\n                                         Disk (/data/backup): 888.62 GiB / 931.48 GiB (95%) - fuseblk\r\n                                         Disk (/data/storage): 891.70 GiB / 931.51 GiB (96%) - fuseblk\r\n                                         Local IP (enp0s25): 192.168.50.219/24\r\n                                         Locale: en_US.UTF-8\r\n```",
      "created_at": "2026-01-23T13:07:35Z",
      "updated_at": "2026-01-25T13:43:19Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajsr5",
      "number": 3275,
      "title": "Matcher for when the opened window is the first in the workspace",
      "body": "It seemed a waste to me to open windows at 50% screen width when the window is the only one open in the workspace. I tried to make this window-rule to make the first window opened be maximized, but it didn't work. I figured that no other windows were focused in a new workspace, so it would be focused by default.\r\n\r\n```kdl\r\nwindow-rule {\r\n    match is-focused=true\r\n\r\n    open-maximized true\r\n}\r\n```\r\n\r\nDo we need a new matcher to accomplish this? I'd like to take a crack at it if so.",
      "created_at": "2026-01-18T01:08:52Z",
      "updated_at": "2026-01-25T10:49:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jayhwkns",
        "avatar_url": "https://avatars.githubusercontent.com/u/74466030?u=082e3d0e9dd902a981a5fbfe23327b7c0773a471&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjzgC",
      "number": 3310,
      "title": "Clarification on behaviour of `ignore-drm-device`",
      "body": "Hi, I'm trying to ignore my eGPU so niri only uses my iGPU. In my config I have:\r\n\r\n```\r\ndebug {\r\n    render-drm-device \"/dev/dri/by-path/pci-0000:c2:00.0-render\"\r\n    ignore-drm-device \"/dev/dri/by-path/pci-0000:03:00.0-render\"\r\n}\r\n```\r\n\r\nFrom this discussion: https://github.com/YaLTeR/niri/discussions/1734\r\n\r\n> niri currently always creates a renderer for all GPUs that makes it show up in nvidia-smi. It doesn't mean niri uses the GPU for anything else\r\n\r\nso does `ignore-drm-device` also not prevent the niri from using the GPU? With these settings it still shows up in nvidia-smi so I'm guessing not, but not sure if I'm misunderstanding how it works.",
      "created_at": "2026-01-25T09:14:58Z",
      "updated_at": "2026-01-25T10:40:50Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "frnsys",
        "avatar_url": "https://avatars.githubusercontent.com/u/1059947?u=af77ba8a7fd3a8f4869e21642d866f22f3aa3920&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajxz0",
      "number": 3300,
      "title": "Allow `move-floating-window` to send windows completely offscreen",
      "body": "I wanted to make a drop down terminal. It seems that I am not able to move a floating window outside the screen area, presumably so I don't lose it forever. That is fine and all, but a bit too limited when it comes to scripts. It would be very nice if there was a flag (maybe `--force`?) that ignored this constraint and allowed me to completely hide a window until I trigger an action to reveal it.",
      "created_at": "2026-01-23T09:40:36Z",
      "updated_at": "2026-01-25T01:21:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "radgeRayden",
        "avatar_url": "https://avatars.githubusercontent.com/u/8618621?u=047d19df0ba23e95457bca0b4733f234f315ebd6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjIRx",
      "number": 2973,
      "title": "Enable `center-column` to be a toggle as on/off",
      "body": "To enable `center-column` to be turned on/off, there must be a global variable for each workspace that makes the workspace centered, causing your eyes to focus on where/what to look at.\r\n\r\nand there can be a config option to as:\r\n```kdl\r\n    Mod+C {\r\n        center-column\r\n        toggle-centered-workspace = false/true // default false\r\n    }\r\n```\r\n\r\nEdit:\r\nSorry, mixed up my initial issue between two repos.",
      "created_at": "2025-12-04T17:53:42Z",
      "updated_at": "2026-01-23T20:33:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ABDsheikho",
        "avatar_url": "https://avatars.githubusercontent.com/u/134243344?u=78137fafabbfb4a027fde3cf163e8cee6c12b0f1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aje26",
      "number": 3176,
      "title": "Very high keyboard input latency in games and also unable to launch games with gamescope, it core dumps in niri (NVIDIA)",
      "body": "Edit:\r\n\r\nI tried using KDE Plasma just to see what would happen, and the keyboard input latency disappeared.\r\n\r\n#### KDE Plasma Wayland\r\n\r\n- There's much less keyboard input latency, it's still worse than Windows but it's substantially lower than niri, very playable\r\n  - It's hard to put a number on it but it's very low now, it's not affecting gameplay\r\n- `gamescope` still crashes in the same way as it does with niri\r\n\r\n#### KDE Plasma X11\r\n\r\n- The keyboard input latency was the same as using Wayland\r\n- `gamescope` didn't crash but my frame rate went from 60 FPS to 15 FPS (a whole different set of problems)\r\n\r\n#### How this applies to niri\r\n\r\nI believe this narrows down the scope to this being a niri problem and when I say niri problem, I mean I don't know if it's expected for us to configure something differently than the defaults to make things work as well as KDE Plasma (Wayland).\r\n\r\nHelp would be appreciated as of course I want to continue using niri!\r\n\r\n**Edit 2:**, I'm able to confirm I get the same latency when using an AMD GPU too, so it's not related to NVIDIA. I tried an RX 480 8 GB card as a test and its input latency is the same. Also since I made this post I tried Hyprland too and there's no input lag there.\r\n\r\n---\r\n\r\nI didn't want to use gamescope initially but when using niri on this system I am getting ~150ms of keyboard input latency for any keypress in games I launch directly through Steam. I tried turning off v-sync in the games themselves, it didn't help. I also tried running the game in its full screen mode, not full screen or \"borderless full screen\". All combinations have the same keyboard latency.\r\n\r\nIt only happens in games and mouse input is not delayed. I'm getting a stable 60 FPS and the input delay happens continously. It was no problem in Windows. If I can solve the keyboard input delay then I wouldn't need gamescope (most likely).\r\n\r\nIt's a wired USB Amazon Basics keyboard but I'm able to reproduce the problem with 2 different keyboards.\r\n\r\nLong story short, the internet said to try gamescope to remove this keyboard input delay so I installed it using `pacman -Syu gamescope` and then noticed it crashes every time I run it through Steam using `gamescope -f -W 2560 -H 1440 -- %command%` as the launch options. \r\n\r\nResearch is saying it's a known problem with niri so I'm here asking for help in case there's a workaround or some combination of tools / flags I can use.\r\n\r\n\r\n### Here's details about my GPU and drivers:\r\n\r\n```\r\n$ nvidia-smi\r\nFri Jan  2 07:05:06 2026\r\n+-----------------------------------------------------------------------------------------+\r\n| NVIDIA-SMI 580.119.02             Driver Version: 580.119.02     CUDA Version: 13.0     |\r\n+-----------------------------------------+------------------------+----------------------+\r\n| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |\r\n| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |\r\n|                                         |                        |               MIG M. |\r\n|=========================================+========================+======================|\r\n|   0  NVIDIA GeForce GTX 750 Ti      Off |   00000000:01:00.0  On |                  N/A |\r\n| 43%   48C    P0              2W /   38W |     935MiB /   2048MiB |      0%      Default |\r\n|                                         |                        |                  N/A |\r\n+-----------------------------------------+------------------------+----------------------+\r\n\r\n+-----------------------------------------------------------------------------------------+\r\n| Processes:                                                                              |\r\n|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |\r\n|        ID   ID                                                               Usage      |\r\n|=========================================================================================|\r\n|    0   N/A  N/A             899      G   niri                                    234MiB |\r\n|    0   N/A  N/A             964    C+G   walker                                  129MiB |\r\n|    0   N/A  N/A            1712      G   Xwayland                                  3MiB |\r\n|    0   N/A  N/A           67573      G   ghostty                                 188MiB |\r\n|    0   N/A  N/A           69973      G   /usr/lib/firefox/firefox                224MiB |\r\n+-----------------------------------------------------------------------------------------+\r\n```\r\n\r\nI've also set this `echo \"options nvidia-drm modeset=1\" | sudo tee /etc/modprobe.d/nvidia.conf`.\r\n\r\n### Here's all nvidia related packages I have on my system:\r\n\r\n```\r\n$ pacman -Qs nvidia\r\nlocal/egl-gbm 1.1.2.1-1\r\n    The GBM EGL external platform library\r\nlocal/egl-wayland 4:1.1.21-1\r\n    EGLStream-based Wayland external platform\r\nlocal/egl-x11 1.0.4-1\r\n    NVIDIA XLib and XCB EGL Platform Library\r\nlocal/lib32-nvidia-580xx-utils 580.119.02-1\r\n    NVIDIA drivers utilities (32-bit) (580xx)\r\nlocal/libvdpau 1.5-3\r\n    Nvidia VDPAU library\r\nlocal/linux-firmware-nvidia 20251125-2\r\n    Firmware files for Linux - Firmware for NVIDIA GPUs and SoCs\r\nlocal/nvidia-580xx-dkms 580.119.02-2\r\n    NVIDIA kernel modules - module sources (580xx)\r\nlocal/nvidia-580xx-utils 580.119.02-2\r\n    NVIDIA drivers utilities (580xx)\r\n```\r\n\r\nI've directly installed `nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils`, the rest are dependencies from other packages.\r\n\r\n### I attempted to debug this one from a number of sources, my last resort was ChatGPT:\r\n\r\nIt wrote, you have:\r\n\r\n- NVIDIA proprietary driver (libnvidia-glcore.so)\r\n- niri (not wlroots-based)\r\n- Gamescope headless Wayland backend\r\n- DMA-BUF path required for efficient buffer sharing\r\n\r\nNVIDIA’s DMA-BUF support is still fragile, and niri currently cannot import the buffers Gamescope exports, so Gamescope crashes.\r\n\r\nThis is why this setup often works on:\r\n\r\n- KDE Plasma (Wayland)\r\n- GNOME (Wayland)\r\n- sway / Hyprland\r\n\r\n…but fails on niri. Gamescope specifically cannot be made to work on niri + NVIDIA right now.\r\n\r\n### How I launch niri\r\n\r\nFrom a tty1 I log in as my user and then my zprofile has `if uwsm check may-start; then exec uwsm start -- niri.desktop; fi`.\r\n\r\nI tried setting each of these individually and together, no combination allowed gamescope to launch and neither affected keyboard latency.\r\n\r\n```\r\nexport GBM_BACKEND=nvidia-drm \r\nexport __GLX_VENDOR_LIBRARY_NAME=nvidia\r\n```\r\n\r\nAdditionally, I started niri directly with `niri --sesion` bypassing uwsm and had the same results.\r\n\r\n### Here's the full track trace when I try to launch any game with gamescope\r\n\r\nThis line looks interesting:\r\n\r\n```\r\nJan 02 06:58:24 kaizen uwsm_niri.desktop[899]: 2026-01-02T11:58:24.749669Z DEBUG niri::backend::tty: error importing dmabuf: Error::DeviceMissing\r\n```\r\n\r\n```\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  console: gamescope version 3.16.19 (gcc 15.2.1)\r\nJan 02 06:58:24 kaizen steam[68581]: No CAP_SYS_NICE, falling back to regular-priority compute and threads.\r\nJan 02 06:58:24 kaizen steam[68581]: Performance will be affected.\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts'\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope'\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope/common'\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/inspect.lua' (id: 0)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/modegen.lua' (id: 1)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/util.lua' (id: 2)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope/displays'\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/asus.rogally.lcd.lua' (id: 3)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/deckhd.steamdeck.deckhd-lcd.lua' (id: 4)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/gpd.win4.lcd.lua' (id: 5)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongo.lcd.lua' (id: 6)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongos.lcd.lua' (id: 7)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/valve.steamdeck.lcd.lua' (id: 8)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/valve.steamdeck.oled.lua' (id: 9)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/zotac.zone.oled.lua' (id: 10)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Loading scripts from: '/etc/gamescope/scripts'\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Warn]  scriptmgr: Directory '/etc/gamescope/scripts' does not exist\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  scriptmgr: Loading scripts from: '/home/nick/.config/gamescope/scripts'\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Warn]  scriptmgr: Directory '/home/nick/.config/gamescope/scripts' does not exist\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan: selecting physical device 'NVIDIA GeForce GTX 750 Ti': queue family 0 (general queue family 0)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan: physical device supports DRM format modifiers\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan: The vulkan driver does not support foreign queues, disabling modifier support.\r\nJan 02 06:58:24 kaizen steam[68581]: Fossilize INFO: Overriding serialization path: \"/home/nick/.local/share/Steam/steamapps/shadercache/1030300/fozpipelinesv6/steamapprun_pipeline_cache\".\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  wlserver: [backend/headless/backend.c:67] Creating headless backend\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  xdg_backend: Seat name: seat0\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  xdg_backend: Initted Wayland backend\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan: supported DRM formats for sampling usage:\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   AR24 (0x34325241)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   XR24 (0x34325258)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   AB24 (0x34324241)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   XB24 (0x34324258)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   RG16 (0x36314752)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   NV12 (0x3231564E)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   AB4H (0x48344241)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   XB4H (0x48344258)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   AB30 (0x30334241)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   XB30 (0x30334258)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   AR30 (0x30335241)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  vulkan:   XR30 (0x30335258)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  wlserver: Using explicit sync when available\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  wlserver: Running compositor on wayland display 'gamescope-0'\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  wlserver: [backend/headless/backend.c:17] Starting headless backend\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  wlserver: Successfully initialized libei for input emulation!\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  wlserver: [util/env.c:9] Loading WLR_NO_HARDWARE_CURSORS option: 1\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  wlserver: [xwayland/server.c:107] Starting Xwayland on :1\r\nJan 02 06:58:24 kaizen steam[68581]: ERROR: ld.so: object '/home/nick/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.\r\nJan 02 06:58:24 kaizen steam[68581]: Adding process 69519 for gameID 1030300\r\nJan 02 06:58:24 kaizen steam[68581]: ERROR: ld.so: object '/home/nick/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.\r\nJan 02 06:58:24 kaizen steam[68581]: ERROR: ld.so: object '/home/nick/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  pipewire: stream state changed: connecting\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  pipewire: stream state changed: paused\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  pipewire: stream available on node ID: 106\r\nJan 02 06:58:24 kaizen uwsm_niri.desktop[899]: 2026-01-02T11:58:24.749669Z DEBUG niri::backend::tty: error importing dmabuf: Error::DeviceMissing\r\nJan 02 06:58:24 kaizen uwsm_niri.desktop[899]: error in client communication (pid 69498)\r\nJan 02 06:58:24 kaizen steam[68581]: [gamescope] [Info]  edid: Patching res 800x1280 -> 2560x1440\r\nJan 02 06:58:24 kaizen systemd-coredump[69525]: Process 69498 (gamescope-wl) of user 1000 terminated abnormally with signal 6/ABRT, processing...\r\nJan 02 06:58:24 kaizen systemd[1]: Started Process Core Dump (PID 69525/UID 0).\r\nJan 02 06:58:24 kaizen steam[68581]: Adding process 69521 for gameID 1030300\r\nJan 02 06:58:25 kaizen systemd-coredump[69526]: [🡕] Process 69498 (gamescope-wl) of user 1000 dumped core.\r\n\r\n                                                Stack trace of thread 69501:\r\n                                                #0  0x00007f5f8c69890c n/a (libc.so.6 + 0x9890c)\r\n                                                #1  0x00007f5f8c63e3a0 raise (libc.so.6 + 0x3e3a0)\r\n                                                #2  0x00007f5f8c62557a abort (libc.so.6 + 0x2557a)\r\n                                                #3  0x0000561856711fd6 n/a (/usr/bin/gamescope + 0x78fd6)\r\n                                                #4  0x00007f5f8cae55a4 execute_native_thread_routine (libstdc++.so.6 + 0xe55a4)\r\n                                                #5  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #6  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69507:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6931b4 n/a (libc.so.6 + 0x931b4)\r\n                                                #3  0x00007f5f8c70d9f6 ppoll (libc.so.6 + 0x10d9f6)\r\n                                                #4  0x00007f5f82b08784 n/a (libglib-2.0.so.0 + 0x60784)\r\n                                                #5  0x00007f5f82b08865 g_main_context_iteration (libglib-2.0.so.0 + 0x60865)\r\n                                                #6  0x00007f5f777667be n/a (libdconfsettings.so + 0x77be)\r\n                                                #7  0x00007f5f82b3f8bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                                #8  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #9  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69505:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6931b4 n/a (libc.so.6 + 0x931b4)\r\n                                                #3  0x00007f5f8c70d9f6 ppoll (libc.so.6 + 0x10d9f6)\r\n                                                #4  0x00007f5f82b08784 n/a (libglib-2.0.so.0 + 0x60784)\r\n                                                #5  0x00007f5f82b08865 g_main_context_iteration (libglib-2.0.so.0 + 0x60865)\r\n                                                #6  0x00007f5f82b088b2 n/a (libglib-2.0.so.0 + 0x608b2)\r\n                                                #7  0x00007f5f82b3f8bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                                #8  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #9  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69523:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6931b4 n/a (libc.so.6 + 0x931b4)\r\n                                                #3  0x00007f5f8c70d4ae __poll (libc.so.6 + 0x10d4ae)\r\n                                                #4  0x00005618567d8054 n/a (/usr/bin/gamescope + 0x13f054)\r\n                                                #5  0x00007f5f8cae55a4 execute_native_thread_routine (libstdc++.so.6 + 0xe55a4)\r\n                                                #6  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #7  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69510:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6937dc n/a (libc.so.6 + 0x937dc)\r\n                                                #3  0x00007f5f8c6960a8 pthread_cond_timedwait (libc.so.6 + 0x960a8)\r\n                                                #4  0x00007f5f80e1038c n/a (libnvidia-glcore.so.580.119.02 + 0xa1038c)\r\n                                                #5  0x00007f5f8125b841 n/a (libnvidia-glcore.so.580.119.02 + 0xe5b841)\r\n                                                #6  0x00007f5f80e10544 n/a (libnvidia-glcore.so.580.119.02 + 0xa10544)\r\n                                                #7  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #8  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69504:\r\n                                                #0  0x00007f5f8c71872d syscall (libc.so.6 + 0x11872d)\r\n                                                #1  0x00007f5f82b3782e g_cond_wait (libglib-2.0.so.0 + 0x8f82e)\r\n                                                #2  0x00007f5f82ace1cd n/a (libglib-2.0.so.0 + 0x261cd)\r\n                                                #3  0x00007f5f82b40487 n/a (libglib-2.0.so.0 + 0x98487)\r\n                                                #4  0x00007f5f82b3f8bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                                #5  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #6  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69516:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6937dc n/a (libc.so.6 + 0x937dc)\r\n                                                #3  0x00007f5f8c6960a8 pthread_cond_timedwait (libc.so.6 + 0x960a8)\r\n                                                #4  0x00007f5f742e1254 n/a (libVkLayer_steam_fossilize.so + 0x5c254)\r\n                                                #5  0x00007f5f7434cca0 n/a (libVkLayer_steam_fossilize.so + 0xc7ca0)\r\n                                                #6  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #7  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69513:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6937dc n/a (libc.so.6 + 0x937dc)\r\n                                                #3  0x00007f5f8c6960a8 pthread_cond_timedwait (libc.so.6 + 0x960a8)\r\n                                                #4  0x00007f5f80e1038c n/a (libnvidia-glcore.so.580.119.02 + 0xa1038c)\r\n                                                #5  0x00007f5f8124a13d n/a (libnvidia-glcore.so.580.119.02 + 0xe4a13d)\r\n                                                #6  0x00007f5f80e10544 n/a (libnvidia-glcore.so.580.119.02 + 0xa10544)\r\n                                                #7  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #8  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69524:\r\n                                                #0  0x00007f5f8c64445d n/a (libc.so.6 + 0x4445d)\r\n                                                #1  0x0000561856704d53 n/a (/usr/bin/gamescope + 0x6bd53)\r\n                                                #2  0x000056185670601b n/a (/usr/bin/gamescope + 0x6d01b)\r\n                                                #3  0x00005618567570c3 n/a (/usr/bin/gamescope + 0xbe0c3)\r\n                                                #4  0x0000561856765870 n/a (/usr/bin/gamescope + 0xcc870)\r\n                                                #5  0x00007f5f8cae55a4 execute_native_thread_routine (libstdc++.so.6 + 0xe55a4)\r\n                                                #6  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #7  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69522:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6931b4 n/a (libc.so.6 + 0x931b4)\r\n                                                #3  0x00007f5f8c71acb5 epoll_wait (libc.so.6 + 0x11acb5)\r\n                                                #4  0x00007f5f6c174c2a n/a (libspa-support.so + 0x19c2a)\r\n                                                #5  0x00007f5f6c161c7f n/a (libspa-support.so + 0x6c7f)\r\n                                                #6  0x00007f5f8d0bd014 n/a (libpipewire-0.3.so.0 + 0x83014)\r\n                                                #7  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #8  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69498:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6931b4 n/a (libc.so.6 + 0x931b4)\r\n                                                #3  0x00007f5f8c70d4ae __poll (libc.so.6 + 0x10d4ae)\r\n                                                #4  0x0000561856771240 n/a (/usr/bin/gamescope + 0xd8240)\r\n                                                #5  0x00005618566e23c0 n/a (/usr/bin/gamescope + 0x493c0)\r\n                                                #6  0x00007f5f8c627635 n/a (libc.so.6 + 0x27635)\r\n                                                #7  0x00007f5f8c6276e9 __libc_start_main (libc.so.6 + 0x276e9)\r\n                                                #8  0x00005618566f7e75 n/a (/usr/bin/gamescope + 0x5ee75)\r\n\r\n                                                Stack trace of thread 69500:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6931b4 n/a (libc.so.6 + 0x931b4)\r\n                                                #3  0x00007f5f8c71acb5 epoll_wait (libc.so.6 + 0x11acb5)\r\n                                                #4  0x0000561856752d92 n/a (/usr/bin/gamescope + 0xb9d92)\r\n                                                #5  0x000056185675fb28 n/a (/usr/bin/gamescope + 0xc6b28)\r\n                                                #6  0x00007f5f8cae55a4 execute_native_thread_routine (libstdc++.so.6 + 0xe55a4)\r\n                                                #7  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #8  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69508:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6931b4 n/a (libc.so.6 + 0x931b4)\r\n                                                #3  0x00007f5f8c70d9f6 ppoll (libc.so.6 + 0x10d9f6)\r\n                                                #4  0x00007f5f82b08784 n/a (libglib-2.0.so.0 + 0x60784)\r\n                                                #5  0x00007f5f82b08a17 g_main_loop_run (libglib-2.0.so.0 + 0x60a17)\r\n                                                #6  0x00007f5f786272e4 n/a (libgio-2.0.so.0 + 0x11a2e4)\r\n                                                #7  0x00007f5f82b3f8bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                                #8  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #9  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69503:\r\n                                                #0  0x00007f5f8c71872d syscall (libc.so.6 + 0x11872d)\r\n                                                #1  0x00007f5f82b3782e g_cond_wait (libglib-2.0.so.0 + 0x8f82e)\r\n                                                #2  0x00007f5f82ace1cd n/a (libglib-2.0.so.0 + 0x261cd)\r\n                                                #3  0x00007f5f82ace23d g_async_queue_pop (libglib-2.0.so.0 + 0x2623d)\r\n                                                #4  0x00007f5f7835b51c n/a (libpangoft2-1.0.so.0 + 0xc51c)\r\n                                                #5  0x00007f5f82b3f8bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                                #6  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #7  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69515:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6937dc n/a (libc.so.6 + 0x937dc)\r\n                                                #3  0x00007f5f8c6960a8 pthread_cond_timedwait (libc.so.6 + 0x960a8)\r\n                                                #4  0x00007f5f80e1038c n/a (libnvidia-glcore.so.580.119.02 + 0xa1038c)\r\n                                                #5  0x00007f5f8138a9d9 n/a (libnvidia-glcore.so.580.119.02 + 0xf8a9d9)\r\n                                                #6  0x00007f5f81374736 n/a (libnvidia-glcore.so.580.119.02 + 0xf74736)\r\n                                                #7  0x00007f5f80e10544 n/a (libnvidia-glcore.so.580.119.02 + 0xa10544)\r\n                                                #8  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #9  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69499:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6931b4 n/a (libc.so.6 + 0x931b4)\r\n                                                #3  0x00007f5f8c71acb5 epoll_wait (libc.so.6 + 0x11acb5)\r\n                                                #4  0x0000561856752d92 n/a (/usr/bin/gamescope + 0xb9d92)\r\n                                                #5  0x0000561856770478 n/a (/usr/bin/gamescope + 0xd7478)\r\n                                                #6  0x00007f5f8cae55a4 execute_native_thread_routine (libstdc++.so.6 + 0xe55a4)\r\n                                                #7  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #8  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69506:\r\n                                                #0  0x00007f5f8c71872d syscall (libc.so.6 + 0x11872d)\r\n                                                #1  0x00007f5f82b387be g_cond_wait_until (libglib-2.0.so.0 + 0x907be)\r\n                                                #2  0x00007f5f82ace197 n/a (libglib-2.0.so.0 + 0x26197)\r\n                                                #3  0x00007f5f82b412db n/a (libglib-2.0.so.0 + 0x992db)\r\n                                                #4  0x00007f5f82b3f8bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                                #5  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #6  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n\r\n                                                Stack trace of thread 69512:\r\n                                                #0  0x00007f5f8c69f002 n/a (libc.so.6 + 0x9f002)\r\n                                                #1  0x00007f5f8c69316c n/a (libc.so.6 + 0x9316c)\r\n                                                #2  0x00007f5f8c6937dc n/a (libc.so.6 + 0x937dc)\r\n                                                #3  0x00007f5f8c6960a8 pthread_cond_timedwait (libc.so.6 + 0x960a8)\r\n                                                #4  0x00007f5f80e1038c n/a (libnvidia-glcore.so.580.119.02 + 0xa1038c)\r\n                                                #5  0x00007f5f8127ac22 n/a (libnvidia-glcore.so.580.119.02 + 0xe7ac22)\r\n                                                #6  0x00007f5f80e10544 n/a (libnvidia-glcore.so.580.119.02 + 0xa10544)\r\n                                                #7  0x00007f5f8c69698b n/a (libc.so.6 + 0x9698b)\r\n                                                #8  0x00007f5f8c71a9cc n/a (libc.so.6 + 0x11a9cc)\r\n                                                ELF object binary architecture: AMD x86-64\r\nJan 02 06:58:25 kaizen systemd[1]: systemd-coredump@2-3-69525_69526-0.service: Deactivated successfully.\r\nJan 02 06:58:25 kaizen systemd[1]: systemd-coredump@2-3-69525_69526-0.service: Consumed 414ms CPU time over 464ms wall clock time, 216.8M memory peak.\r\nJan 02 06:58:25 kaizen steam[68581]: (EE) failed to read Wayland events: Broken pipe\r\nJan 02 06:58:25 kaizen steam[68581]: Game Recording - game stopped [gameid=1030300]\r\n```\r\n\r\nAny ideas on where to go from here?",
      "created_at": "2026-01-02T12:19:34Z",
      "updated_at": "2026-01-23T11:36:53Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajtvl",
      "number": 3283,
      "title": "Screenshot options: borders, shadows, rounded corners",
      "body": "When taking a screenshot of a window, decorations like border, shadow, and corners are not included: regardless of config, the window screenshot turns out with square corners, and only includes the window contents.\r\n\r\nPlease consider options to allow screenshots to preserve shadow, border, and corner radius.",
      "created_at": "2026-01-19T11:16:38Z",
      "updated_at": "2026-01-22T14:29:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bennypowers",
        "avatar_url": "https://avatars.githubusercontent.com/u/1466420?u=5e88cd360432ebab03f5500ef910459666375bdc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjtS9",
      "number": 3281,
      "title": "Eventstream support for all modifier key press/release events",
      "body": "I've recently started using Niri and it's absolutely fantastic, thanks so much!\r\n\r\nOne thing I was really pleased to see was the Alt+Tab switching feature, which, IMO, is implemented the way it should be, i.e. based on the release of a Modifier key. What I'd really like is the ability to extend this to any other application I want.\r\n\r\nI used to have my own solution for this in X11, but this doesn't work anymore on Wayland, and not even with Xwayland Satellite, as I'm not able to listen to key release events on the root window. I was wondering, as Niri has access to this information, would it be possible for it to simply output these events on the event stream? That way, I could pick them up and do my own thing with them, and have Alt+Tab style switching in Vim, Tmux, etc., as I had before.\r\n\r\nI'd be happy to work on a PR if the idea was acceptable & we could get it merged.\r\n",
      "created_at": "2026-01-18T23:50:05Z",
      "updated_at": "2026-01-21T21:30:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "muhmud",
        "avatar_url": "https://avatars.githubusercontent.com/u/7550982?u=03fb52e70ba3cc3bf0c1da4ea88a82033253d88c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjvEF",
      "number": 3289,
      "title": "Fullscreen toggle should not scroll to right",
      "body": "When we have two windows open side-by-side, making the right window full-screen, then back to half the size puts it on the left and the right half is now empty. This is annoying when I'm frequently switching between 2 applications. \r\n\r\nThis is just my opinion. I guess others might be used to the same workflow where they have a terminal and a browser open and often have to toggle full-screen for terminal or the browser depending on the content.",
      "created_at": "2026-01-20T16:33:51Z",
      "updated_at": "2026-01-21T12:43:36Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "txtyash",
        "avatar_url": "https://avatars.githubusercontent.com/u/85027668?u=88fae89081f16cc0bb23667b5f2bf9d8982095a7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajume",
      "number": 3287,
      "title": "How to switch all workspaces to other output",
      "body": "When I connect my laptop at work, I would like all workspaces to move to the external display there, as it becomes the primary one when connected. Is there a way to do this?\r\n\r\nCurrently, I move every one of my 12 named workspaces one-by-one, but that is tedious and I was hoping either for an automated solution (something like rules that define workspace location based on which outputs are connected) or some one-key-combo solution for something like `switch-output-role` where workspaces are moved from one output to another and vice versa.",
      "created_at": "2026-01-20T08:20:49Z",
      "updated_at": "2026-01-22T11:22:11Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A7WQW",
        "body": "Thinking about it: if you simply assign workspaces to a monitor they will be moved there when it's connected and moved back if disconnected.\r\n```\r\nworkspace \"Net\" {\r\n   open-on-output \"eDP-1\"\r\n}\r\nworkspace \"Social\"{\r\n open-on-output \"HDMI-A-1\"\r\n}"
      },
      "user": {
        "login": "equaeghe",
        "avatar_url": "https://avatars.githubusercontent.com/u/601177?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajvkn",
      "number": 3290,
      "title": "How do you snap a window into place like this?",
      "body": "I am really used to workflow layouts like this, coming from sway, and I miss the control of placement. Recently I've switched to Niri and it's really amazing, but I saw this in the demo overview and can't figure it out. When I try to place programs like that, it'd rather place strictly in columns or new window; it doesn't suggest snapping in such places. Is there a configuration setting I'm missing? I've tried skimming through them but I'm not even sure what this is named; also skimmed through a dozen Niri videos as well and none demonstrated this capability. I really hope this is possible, as witnessing it has felt autistically distressing.\r\n\r\n<img width=\"949\" height=\"440\" alt=\"image\" src=\"https://github.com/user-attachments/assets/2c2cfe85-6fd6-4b95-afcc-5bc47cf20251\" />\r\n(SOURCE: https://github.com/YaLTeR/niri overview hyperlink and shown in wiki https://github.com/YaLTeR/niri/wiki/Overview)\r\n\r\ncurrent problem:\r\n<img width=\"795\" height=\"397\" alt=\"image\" src=\"https://github.com/user-attachments/assets/e792eded-6a2c-4838-b735-54ddc1a42853\" />\r\n\r\n**edit: OH NO, looking at the gaps closer... I think the demo was just stinky terminal pane managing :(**\r\n<img width=\"163\" height=\"147\" alt=\"image\" src=\"https://github.com/user-attachments/assets/200392bc-e099-4a15-a457-d81d49ca3d2c\" />\r\n",
      "created_at": "2026-01-21T05:51:31Z",
      "updated_at": "2026-01-21T06:12:59Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A7V2v",
        "body": "The layouts you show in your screenshot aren't possible in niri without using floating windows and scripting it via the IPC\r\n\r\nIn niri the overview demo where the Adwaita Demo app is put above that terminal is 2 windows total, the terminal (I think) is being multiplexed\r\n\r\nniri arranges all the windows into columns, a window can't spawn across two columns, you can only expand/shrink the current column"
      },
      "user": {
        "login": "madeupandprobablydoesnotexist",
        "avatar_url": "https://avatars.githubusercontent.com/u/234523773?u=3eba568438a35ce9faa2eebcf3a452ac001136db&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjXoV",
      "number": 3089,
      "title": "way to order windows automatically.",
      "body": "When I start niri I have slack, irc, discord, element, and matrix all load automatically and go to a \"chat\" workspace. The problem is that they do not all open their windows in a predictable order, despite the load order being consistent in the script that launches them. This is due to them taking unpredictable times to start up.\r\n\r\nEvery time I start I need to take time to manually put them back into the correct order. This is also not automatable in any way I can find, and the order is different every startup.\r\n\r\nA couple options I see for implementing a solution:\r\n\r\n1) window weights. Allow window rules to assign a weight between -100 and 100. Negative number means favor moving left, positive means favor moving right. 0 is the default and means to the right of current (ie, no weight). When a window is manually moved its weight resets to 0 as far as any window that opens next is concerned. A -40 window will open to the left of the leftmost window with a weight of -40 or larger. So if you have a window of -60 then also a -30, the -40 will open between them. In the positives if you have a 30 and a 60, same thing, a 40 will open between them. 0's (and windows moved after launch count as 0) are ignored for positioning unless there are no other windows weighted in the direction (+ or -) in which case +weight will go to the right of the 0s, and -weight will go to the left.\r\n\r\n2) add `left-of MATCH` AND `right-of MATCH` window rules. When the window opens it checks for a MATCH window, if found it positions to the left or right of it based on the rule. This can also be a cascade, so if a rules has 4 `X-of MATCH` rules it will use the first one that has a match, if any.",
      "created_at": "2025-12-22T09:42:01Z",
      "updated_at": "2026-01-21T03:39:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "exodist",
        "avatar_url": "https://avatars.githubusercontent.com/u/73914?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfE_X",
      "number": 1365,
      "title": "Add magnifier to color picker",
      "body": "Exactly [this gnome issue](https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6219) but for Niri.\r\n\r\n> The picker not having a magnifing glass is not usable for many tasks, for example checking the color of a small font.\r\n\r\nI know that hyprpicker does it, but having it in the portal would be awesome.",
      "created_at": "2025-03-30T18:06:00Z",
      "updated_at": "2026-01-20T14:58:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "stepanzak",
        "avatar_url": "https://avatars.githubusercontent.com/u/99094176?u=c9ea00404bfaceff78e7a2246db193b6c06f3300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcIJX",
      "number": 762,
      "title": "Window Swallowing",
      "body": "I would like to request a way to set a regex to swallow windows, like mpv in a terminal. Hyprland has it and it works like a charm, super useful.",
      "created_at": "2024-10-26T20:34:51Z",
      "updated_at": "2026-01-20T14:22:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "arthsmn",
        "avatar_url": "https://avatars.githubusercontent.com/u/150680976?u=3a2e561433c635e51d949cbf746c9db7cfc4a3a6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjHck",
      "number": 2965,
      "title": "Keep order of named workspaces",
      "body": "Hello!\r\n\r\nI use niri on my laptop and regularly switch between using it with and without the docking station, where 2 monitors are attached.\r\nI created 7 named workspaces where I keep my applications sorted and can jump there with a simple keystroke.\r\nNext, I set this up, so it opens the workspaces on the desired output, so my browser is always on the correct monitor and my editor is on the one beside that, etc. I hope you get the gist here.\r\n\r\nNow my problem comes from (un)plugging the dock. Whenever the outputs change, the workspaces are moved around to their outputs, but the order in which they appear in my waybar is random. And while I still use my simple keystrokes to get where I want, it bugs me a lot that they are not in order and I keep searching with my eyes. It is especially bad when I take the laptop of the docking station and all workspaces end up on one monitor in random order.\r\n\r\nI would really like to have two ideas which come into place here:\r\n\r\n1. I would like to have an option that sorts named workspaces on any output into the order in which they were defined in my config. An if I moved them manually to another one, or if they are moved because the output disappeared - wherever they are put, they are inserted in a way that the order is kept.\r\n2. I would like to have the option that all named workspaces come always before the unnamed ones. So if I have a first named and 2 unnamed workspaces on an output and move my second named one to that output, it should be inserted between the first named one and the 2 unnamed workspaces.\r\n\r\nLet me know your thoughts or additional ideas,\r\nkind regards,\r\nAntarctris",
      "created_at": "2025-12-03T21:50:44Z",
      "updated_at": "2026-01-19T16:47:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Antarctris",
        "avatar_url": "https://avatars.githubusercontent.com/u/1574222?u=2790fac51b1b9450b8823b64d00ba23f950115ff&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjscI",
      "number": 3272,
      "title": "Making block-out-from more configurable? Focus ring, color choices, optional text, etc.",
      "body": "niri is already unlocking nice things for screen sharing like the ability to block out specific windows.\r\n\r\nCurrently you get a 100% opacity black background color that's shown instead of the window's true content.\r\n\r\nHere's a few things I've been thinking about:\r\n\r\n### Focus ring\r\n\r\nI'd like to propose being able to set a custom ring color which is shown the same way for both the presenter and viewers.\r\n\r\n- As a presenter, this is handy because it lets you know this window is being blocked\r\n- As a viewer, this is handy because it lets you know the presenter has this blocked window focused and is doing something there\r\n\r\nThis is especially more important if we ever get a way to toggle `block-out-from` on the currently focused window as a feature.\r\n\r\nWe already have a way to set `window-rule` on screencasted windows:\r\n\r\n```kdl\r\nwindow-rule {\r\n    match is-window-cast-target=true\r\n\r\n    focus-ring {\r\n        active-gradient from=\"#f38ba8ee\" to=\"#cc241dee\" angle=45\r\n    }\r\n}\r\n```\r\n\r\nIt could be introduced with a new `match is-window-blocked=true` match rule. This way folks could even do other things like add shadows or whatever they want if they don't prefer focus rings. It also lets you individually configure both casted and blocked windows separately.\r\n\r\n### Background color\r\n\r\nRight now it's black and that's fine, it makes sense for redacted things to be black but it would be nice to be able to configure it to a different color so you can have it match your theme's look and feel.\r\n\r\nYou can already do neat things like setting the opacity on the rule itself but this also affects the window when it's not being blocked. For example setting 0% opacity to make the blocked content transparent is kind of cool but that's not really viable because it also makes it transparent for the real window which means you can't see it as the presenter.\r\n\r\n### Optional text\r\n\r\nWhen creating movies, a common phrase is \"show, don't tell\".\r\n\r\nIf you're doing live streams and you have a redacted window, it's not always clear on why it's black for someone without any context if they are just joining in. If you're up on stage giving a live demo / talk, it takes up highly valuable and limited time to have to explain it.\r\n\r\nIt would be potentially useful if you could add an optional property to put in a custom redacted message. It could be displayed in the center (X/Y) of the window and wrap to fit the size of the window dimensions. I know this could get complicated with font sizes unless it also dynamically scaled the font.\r\n\r\n### Importance?\r\n\r\nIf it came down to priorities, personally I think the focus ring is the most valuable of the 3 enhancements because it helps the presenter gain information on what's blocked or not at a glance. The other 2 are nice to haves, I don't know how the background color is set but maybe that's the easiest one to implement?\r\n\r\nAll 3 things could maybe be introduced as new config properties that apply to all `block-out-from` calls? This way it's defined once but used in all rules.\r\n\r\nWhat do you think?",
      "created_at": "2026-01-17T15:52:52Z",
      "updated_at": "2026-01-19T13:04:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajsu3",
      "number": 3277,
      "title": "Add an action to swap workspaces between monitors",
      "body": "Example:\r\n\r\nBefore: \r\n1. eDP-1: Workspace \"Secondary\" (Active, Focused)\r\n2. HDMI-A-1: Workspace \"Main\" (Active)\r\n\r\nAfter:\r\n1. eDP-1: Workspace \"Main\" (Active, Focused)\r\n2. HDMI-A-1: Workspace \"Secondary\" (Active)\r\n\r\nOption to configure focus behavior: keep current focused output (move focus to the new workspace; default) or workspace (keep focus on the current focused workspace).\r\n\r\nI could not find an action for this, so I created an [utility](https://github.com/rossnomann/niri-ws/blob/9dc38156e639f9eee5741ee30bf17dfa00c9ae62/src/main.rs). But it feels like a hack, because I have to send FocusWorkspace after each move to keep visible workspaces active. With animations slowdown=0.5 it is not perfect, but acceptable.",
      "created_at": "2026-01-18T04:16:36Z",
      "updated_at": "2026-01-19T00:53:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rossnomann",
        "avatar_url": "https://avatars.githubusercontent.com/u/28867223?u=a138dada6fe0e058bfe945508469e6ab8757f88e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai2tg",
      "number": 2786,
      "title": "How do I enable three finger drag on touchpad?",
      "body": "libinput [supports three finger drag](https://wayland.freedesktop.org/libinput/doc/latest/drag-3fg.html) now, but I can't work out how to configure Niri to use it.\r\n\r\nHas anyone managed to get this working, or does it require explicit support in niri? (It _would_ be ideal to be able to just set `drag-3finger true` in config.kdl and have it work :)",
      "created_at": "2025-11-13T11:03:05Z",
      "updated_at": "2026-01-18T22:18:38Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "unikitty37",
        "avatar_url": "https://avatars.githubusercontent.com/u/139183?u=8439354ebc6c7e030c9d1b6b470d8b5785a89fe4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajath",
      "number": 3120,
      "title": "Togglable block-out-from for any window",
      "body": "Hi! I've recently switched from Hyprland to Niri, and I'm missing one feature from it: dynamic/togglable block-out-from rules.\r\n\r\nIn Hyprland there are 2 very cool dispatchers (keybind actions): [`tagwindow`](https://wiki.hypr.land/Configuring/Window-Rules/#tags) and [`setprop`](https://wiki.hypr.land/Configuring/Dispatchers/#setprop).\r\nExcluding windows from screenshare is done with the [`no_screen_share` window rule](https://wiki.hypr.land/Configuring/Window-Rules/#:~:text=no%5Fscreen%5Fshare).\r\n\r\nIn my Hyprland config I had a keybind to quickly toggle the `no_screen_share` rule on the currently focused window, which can be done in 2 different ways:\r\n```\r\nbind = SUPER, N, setprop, active no_screen_share toggle\r\n```\r\nor (adds a nice red border to let me know it's working)\r\n```\r\nbind = SUPER, N, tagwindow, noscreenshare\r\nwindowrule = no_screen_share, tag:noscreenshare\r\nwindowrule = bordercolor rgb(f38ba8), tag:noscreenshare\r\n```\r\n\r\nSo, it's kind of ironic how Hyprland copied a Niri feature, while doing it better.\r\n\r\nI think that window rule tags would be useful for many other usecases as well!\r\n\r\nNote: this is **not** the same as https://github.com/YaLTeR/niri/discussions/1001. I'd like to be able to toggle block-out-from for any window, no matter what it is, without writing a layer rule for it.",
      "created_at": "2025-12-26T17:53:53Z",
      "updated_at": "2026-01-18T15:02:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "GGORG0",
        "avatar_url": "https://avatars.githubusercontent.com/u/51029895?u=a6915b3519b4508b1a9a7ca48e9dcc5923a6f862&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajss8",
      "number": 3276,
      "title": "Consistent border for the exit window",
      "body": "When the confirmation window pops up on exit, it doesn't match any other elements. \r\nWould it be possible to apply notification border settings to it?",
      "created_at": "2026-01-18T02:17:33Z",
      "updated_at": "2026-01-18T14:35:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dimitry-ishenko",
        "avatar_url": "https://avatars.githubusercontent.com/u/2858291?u=11064553823332954a05b62693b67e08e0550a83&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajs42",
      "number": 3278,
      "title": "Allow consume-or-expel-window-* to move floating windows left and right like the move-column-*",
      "body": "`move-column-<direction>` and `move-column-<direction>-or-to-monitor-<direction>` let you move floating windows left and right since this is a reasonable analog to what these actions do for tiled windows. \r\n\r\nI feel the same is true for the two `consume-or-expel-window-*` actions as well, which seem to be provided as another alternative for moving tiled windows left and right, and which I use as the default move left/right action",
      "created_at": "2026-01-18T09:54:16Z",
      "updated_at": "2026-01-18T09:54:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SturgeonInc",
        "avatar_url": "https://avatars.githubusercontent.com/u/84652446?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfDm5",
      "number": 1355,
      "title": "Any suggestions on power off specific display?",
      "body": "Recently noticed that there was an option for turning off all monitor in default config file.\nJust wondering if there has any way to turn of specific monitor by key binding or with lid closing?\nSo people can save energy or protect their eyes. LOL.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: niri 25.02 (unknown commit)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon Vega Series / Radeon Vega Mobile Series [Integrated]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:  AMD Ryzen 7 5800H\n",
      "created_at": "2025-03-28T15:43:17Z",
      "updated_at": "2026-01-17T19:22:10Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyZAo",
        "body": "You can already make such a bind"
      },
      "user": {
        "login": "levihuayuzhang",
        "avatar_url": "https://avatars.githubusercontent.com/u/68364307?u=a9c4034a55e80d056ecf73fd31e2e585d6324400&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjsRT",
      "number": 3271,
      "title": "Hold keybinds for window grab and move",
      "body": "Something like Hyprland's bindm option that enables an action for as long as a key is held down.\r\nIt would be like if I have Mod+Z held=true { move-window } and then I hold Mod+Z and the window should be grabbed by my cursor.\r\n\r\nSome of this behavior already exists in how we can hold down Mod to grab and move windows around in normal mode or double click windows in overview mode for the same.\r\n\r\nThis would also allow binding them to gestures or other touch inputs. I mainly want this for something like double-tap to grab and move windows",
      "created_at": "2026-01-17T09:26:03Z",
      "updated_at": "2026-01-17T09:26:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Atan-D-RP4",
        "avatar_url": "https://avatars.githubusercontent.com/u/113052920?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aict0",
      "number": 2602,
      "title": "Focus or spawn",
      "body": "Hi,\r\n\r\nJust started using Niri and loving it. Kudos to the developer!\r\n\r\nI compiled a small script whose purpose is to basically focus an application if there is a window open with a matching app id, or spawn the executable it if it doesn't.\r\n\r\n``` shell\r\n#!/bin/bash\r\n\r\nif [ $# -ne 2 ]; then\r\n    echo \"Usage: $0 <app-id> <executable>\"\r\n    exit 1\r\nfi\r\n\r\nAPP_ID=\"$1\"\r\nEXECUTABLE=\"$2\"\r\n\r\nif ! command -v jq >/dev/null 2>&1; then\r\n    echo \"Error: jq is not installed. Please install jq to use this script.\"\r\n    exit 1\r\nfi\r\n\r\nWINDOW_ID=$(niri msg --json windows | jq -r --arg app_id \"$APP_ID\" '.[] | select(.app_id == $app_id) | .id' | head -n1)\r\n\r\nif [ -n \"$WINDOW_ID\" ]; then\r\n    niri msg action focus-window --id \"$WINDOW_ID\"\r\nelse\r\n    setsid \"$EXECUTABLE\" &\r\nfi\r\n```\r\n\r\nI think this would be a cool feature to implement directly into Niri as `focus-or-spawn`  or something along those lines.\r\n\r\nNot sure if specifying app id and executable as arguments like I've done it is the best approach, but it works for right now.",
      "created_at": "2025-10-15T15:47:16Z",
      "updated_at": "2026-01-16T21:24:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "avesst",
        "avatar_url": "https://avatars.githubusercontent.com/u/810218?u=af96b682a4409c976b16d08b3d1c4854928958f5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajqt1",
      "number": 3261,
      "title": "Screencast with xdg-desktop-portal-gnome problem",
      "body": "Hi.\r\nI saw some people also had this problem with setting up xdg-desktop-portal-gnome for screencasting. And here i am that couldn't fix it myself.\r\n\r\n I have xdg-desktop-portal-gnome and gnome-shell installed and they're both working, but still when i try to screencast and check if screencast integrity is done through \"busctl --user tree org.freedesktop.portal.Desktop | grep -i ScreenCast\" it return no output. But when i use wlr everything works fine. \r\n I want to figure out how to configure portal-gnome cause the devs are recommending it and use it in the setup showkey on their wiki.\r\n \r\n I'll drop here some screenshots from config files that i use currently.\r\n \r\n \r\n<img width=\"479\" height=\"515\" alt=\"image\" src=\"https://github.com/user-attachments/assets/5fddc944-7637-4126-ae39-cf4b5d683f11\" />\r\n\r\nThis is environment block from niri config file.\r\n\r\n<img width=\"545\" height=\"164\" alt=\"image\" src=\"https://github.com/user-attachments/assets/b1d8a851-4bf9-49ad-807f-3468a3569b29\" />\r\n\r\nThis is from niri-portals.conf . Yes, currently there is figuring wlr, but when i tried to make portal-gnome work there was gnome.\r\n\r\nIf you'll need more outputs to help me just ask, i'll send it.\r\nAlso thx in advance for helping me.",
      "created_at": "2026-01-15T22:44:21Z",
      "updated_at": "2026-01-16T21:08:23Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Yatore0",
        "avatar_url": "https://avatars.githubusercontent.com/u/186500146?u=64caec4391329971fbcab957d55fe4748924e767&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjoEv",
      "number": 3250,
      "title": "Can you somehow increase niri’s priority so it doesn’t become unresponsive when another process uses all of the CPU?",
      "body": "I tried to hack something with nice but that didn’t work because nice runs as root",
      "created_at": "2026-01-13T16:16:31Z",
      "updated_at": "2026-01-16T18:30:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "3nt3",
        "avatar_url": "https://avatars.githubusercontent.com/u/39235738?u=bcaf480f8ed03505421938962e2752ee37bfd207&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajrq7",
      "number": 3267,
      "title": "Allow outputs to map to the absolute space with a separate scale than that used to control the size of elements",
      "body": "Currently\r\n```\r\nNote\r\n\r\nOutput scale and rotation has to be taken into account for positioning: outputs are sized in logical, or scaled, pixels. For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080, so to put another output directly adjacent to it on the right, set its x to 1920. If the position is unset or results in an overlap, the output is instead placed automatically.\r\n```\r\n\r\nThis brings some problems, for example sometimes I cannot move the cursor to the left/right to move it to another display:\r\n<img width=\"673\" height=\"495\" alt=\"image\" src=\"https://github.com/user-attachments/assets/8ba12558-cab7-453a-baeb-ba1375bc7775\" />\r\n\r\nI believe a better approach is to allow each output to be able to have an independent scale with which in the absolute space it is mapped. The current scaling model makes sense if screens are fixed in place, but for laptop screens, I want to accomplish the following two things which cannot be done now:\r\n\r\n1. Make elements be displayed with reasonable physical size on a high-dpi laptop screen\r\n2. Map the right edge of the laptop display to the left edge of an external display\r\n\r\nSince the laptop display doesn't have a permanent position, rather than making sure the physical position of the cursor is continuous (which cannot be guaranteed due to the laptop screen is mobile), I would rather guarantee moving the cursor between outputs is always possible. Having a separate scale for mapping to the absolute space could help here.",
      "created_at": "2026-01-16T16:09:09Z",
      "updated_at": "2026-01-16T16:09:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "AprilGrimoire",
        "avatar_url": "https://avatars.githubusercontent.com/u/47601131?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajrp8",
      "number": 3266,
      "title": "Improve default behavior of tablets on multiple displays",
      "body": "Currently, ```Since: 0.1.7 When a tablet is not mapped to any output, it will map to the union of all connected outputs, without aspect ratio correction.```. I believe a better default behavior is to map it to the current active output, which isn't possible now.\r\n",
      "created_at": "2026-01-16T15:47:00Z",
      "updated_at": "2026-01-16T15:47:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "AprilGrimoire",
        "avatar_url": "https://avatars.githubusercontent.com/u/47601131?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjrlE",
      "number": 3264,
      "title": "Mirror screen",
      "body": "Feature request: Allow configuring output (monitor) to mirror some other output. This is a feature supported by GNOME, Plasma, MS Windows, I don't know about other Linux compositors. It is very useful when doing some presentation - showing stuff on a screen you don't directly see. Ideally allow enabling it from the CLI so it can be bound to a keybind, because this feature usually needs to be turned on and off regularly. Thanks in advance, Niri is the best :)",
      "created_at": "2026-01-16T14:23:39Z",
      "updated_at": "2026-01-16T14:25:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "stepanzak",
        "avatar_url": "https://avatars.githubusercontent.com/u/99094176?u=c9ea00404bfaceff78e7a2246db193b6c06f3300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbxCv",
      "number": 714,
      "title": "Headless output",
      "body": "Does Niri have the ability to create headless outputs that aren't tied to any physical monitor? e.g. for programs like Moonlight/Sunshine?\r\n\r\ne.g. https://wiki.archlinux.org/title/Sway#Create_headless_outputs",
      "created_at": "2024-10-05T05:33:55Z",
      "updated_at": "2026-01-16T09:30:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "robbins",
        "avatar_url": "https://avatars.githubusercontent.com/u/31457698?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiX5I",
      "number": 2570,
      "title": "QEMU Display Output is not active",
      "body": "Through libvert, using virtuo and any other display over a virtual machine produces\n<img width=\"1210\" height=\"673\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/028a4900-1615-4a5d-b5e1-3ae4f8e205d9\" />\n\n\nOn nixos this was tried using the sodiboo-flake, but the issue seems to step from niri itself as installed on arch also gives the same error. \n\n\n\n\nniri version: \n<img width=\"553\" height=\"20\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/cb5ade86-65fd-47ad-8773-cc3495b06b96\" />\nAdditionally a separate individual tested this on arch against the latest commit. \n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS, Arch Linux. \n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: NVIDIA Geforce RTX 4070\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\nRyzen 7",
      "created_at": "2025-10-10T18:28:12Z",
      "updated_at": "2026-01-16T07:00:08Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "argosnothing",
        "avatar_url": "https://avatars.githubusercontent.com/u/225423001?u=43e653afb4b7752b894dfb9880cabd7eaf5daec4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai4EO",
      "number": 2798,
      "title": "Possible to make a floating window display even on top of fullscreen windows?",
      "body": "Is there a way to keep a floating window on top even if I fullscreen a different window?\r\n\r\nI kept this in the config to have the firefox picture on picture to be floating by default:\r\n```\r\n// Open the Firefox picture-in-picture player as floating by default.\r\nwindow-rule {\r\n    // This app-id regular expression will work for both:\r\n    // - host Firefox (app-id is \"firefox\")\r\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\r\n    match app-id=\"firefox$\" title=\"^Picture-in-Picture$\"\r\n    open-floating true\r\n}\r\n```\r\n\r\nBut if I use the `fullscreen-window` action on a different window to the floating window, the floating window goes behind it.\r\nI expected to find something in the window-rules but couldn't - is this currently possible?\r\n\r\nMy use case is sometimes I want to play a fullscreen game and also have a youtube video playing in the corner.",
      "created_at": "2025-11-14T20:53:16Z",
      "updated_at": "2026-01-16T06:43:09Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5IMG",
        "body": "You cannot "
      },
      "user": {
        "login": "MeTheFlea",
        "avatar_url": "https://avatars.githubusercontent.com/u/5122470?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajq9J",
      "number": 3262,
      "title": "Allow negative scroll factor to invert natural scroll for select applications (?)",
      "body": "Coming from Hyprland I found Niri doesn't allow for natural scrolling per-application due to libinput handling all of the inputs, but Niri allows per-application scroll factors and does not allow negative values. It would still be sort of a workaround, but a working one? Will be really cool to have that.",
      "created_at": "2026-01-16T05:14:33Z",
      "updated_at": "2026-01-16T05:24:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Sharps1ght",
        "avatar_url": "https://avatars.githubusercontent.com/u/162005925?u=96505ca8a3020c739fb05ce69f58399fc3699de6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfQdl",
      "number": 1420,
      "title": "Any way to direct keybinds to a window?",
      "body": "For example, I'd like to be able to toggle mute in Zoom, even when it isn't focused. I can match on the appropriate window with current window rules, and it would be great if I could then send it \"Alt-A\".",
      "created_at": "2025-04-12T01:24:17Z",
      "updated_at": "2026-01-15T18:50:48Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "paholg",
        "avatar_url": "https://avatars.githubusercontent.com/u/4908217?u=aa2979e5485bbe544c42fad53ea4642bb077b21d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjmRV",
      "number": 3236,
      "title": "Different behavior for scrolling windows with the left mouse button held depending on if a decoration exists?",
      "body": "I have `prefer-no-csd` set but some apps like Firefox still draws something that niri is able to interact with using the mouse without needing to hold down `Mod`.\r\n\r\nI like this behavior for 2 reasons:\r\n\r\n- It lets you drag a Firefox window with the mouse without pressing `Mod` to scroll all open windows\r\n- If Firefox is open by itself taking up the left side of your screen, you can drag it to the right side of your screen\r\n  - It seems this behavior isn't possible with the `Mod` key for non-decorated windows?\r\n  - I like this honestly, with a 32\" 4k monitor sometimes seeing a window by itself on the right is easier to look at based on how I stand / sit\r\n\r\nI have 2 questions:\r\n\r\n- Is the second bullet listed above an unintended behavior?\r\n- Is it possible to get these behaviors to work for all windows, not just Firefox? For example Thunar doesn't act this way, instead the left click is absorbed by the app and niri doesn't capture it, the same goes with Ghostty and most other apps",
      "created_at": "2026-01-11T15:57:50Z",
      "updated_at": "2026-01-15T11:36:57Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A7I0M",
        "body": "This is just possible in general when your windows don't occupy the full monitor width. It works on all view offset gestures, so: dragging by titlebar, Mod+MMB dragging, touchpad 3 finger swipe. On keyboard there's no good way atm but there are open PRs for align left/right."
      },
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjpzA",
      "number": 3256,
      "title": "Feature Request: Per-window shadow configuration and advanced opacity compositing",
      "body": "Is your feature request related to a problem? Please describe.\n  Currently, Niri offers global shadow configuration (layout { shadow { ... } }) and per-window\n  opacity rules. However, achieving a \"deep floating\" effect (similar to macOS) where specific windows\n  (like terminals) have glass-like opacity while others (like video players) remain solid, combined\n  with physically correct shadows that respect these opacity levels, is difficult.\n  Specifically:\n   1. Shadows are global. One cannot set a \"deeper\" shadow for the active window to simulate \"lifting\"\n      it above inactive ones.\n   2. Opacity rules are sometimes rigid. It would be beneficial to have distinct active_opacity and\n      inactive_opacity properties directly, rather than relying on complex match rules that can\n      conflict.\n\n  Describe the solution you'd like\n   1. Per-window shadow override: Allow shadow properties (softness, spread, offset, color) to be\n      overridden inside window-rule. This would allow the active window to have a larger, softer\n      shadow (simulating Z-axis lift), while inactive windows have flatter shadows.\n\n   1    window-rule {\n   2        match is-active=true\n   3        shadow {\n   4            offset x=0 y=20\n   5            spread 15\n   6        }\n   7    }\n   2. Simplified Opacity Logic: Introduce explicit active-opacity and inactive-opacity parameters in\n      the layout or window rules to simplify the \"focus dimming\" effect without writing multiple match\n      blocks.\n\n  Describe alternatives you've considered\n  Currently, I use a complex set of window-rule with match is-active=true/false to toggle opacity, but\n  shadows remain static, making the \"lifting\" effect incomplete.\n\n  Additional context\n  The goal is to achieve a visually rich \"Cyberpunk/Glass\" aesthetic where the active window clearly\n  floats above the rest not just by opacity, but by shadow depth.",
      "created_at": "2026-01-12T07:31:17Z",
      "updated_at": "2026-01-15T08:15:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "FormNest-Founder",
        "avatar_url": "https://avatars.githubusercontent.com/u/219555543?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajp0F",
      "number": 3257,
      "title": "using IPC to control border color/focus ring on niri?",
      "body": "[Fcitx5 has a lua add-on](https://github.com/fcitx/fcitx5-lua)\r\nI want run some command to change the color of window border or focus ring to indicate the input method change, so I don't have to look at the tiny icon on the corner of my screen\r\non sway, there's [run command](https://man.archlinux.org/man/sway.5#Config_or_runtime_commands) like `swaymsg 'client.focused #ffab55 #ffab55 #ffffff #ffab55 #ffab55'`, so the lua script is like below:\r\n```lua\r\n-- ~.local/share/fcitx5/lua/toggle_sway_border/toggle_sway_border.lua\r\n-- \r\nlocal fcitx = require(\"fcitx\")\r\n\r\nfcitx.watchEvent(fcitx.EventType.SwitchInputMethod, \"toggleSwayBorder\")\r\n\r\nlocal function onEnglish()\r\n    os.execute [[swaymsg 'client.focused #ffab55 #ffab55 #ffffff #ffab55 #ffab55']]\r\nend\r\n\r\nlocal function onChinese()\r\n    os.execute [[swaymsg 'client.focused #66ccff #66ccff #000000 #66ccff #66ccff']]\r\nend\r\n\r\nfunction toggleSwayBorder(prev_im)\r\n    if prev_im == \"pinyin\" then\r\n        onEnglish()\r\n    else\r\n        onChinese()\r\n    end\r\nend\r\n```\r\nI see niri can modify the window positions and sizes in the IPC, is it good to add other window attributes like this case?",
      "created_at": "2026-01-15T05:17:38Z",
      "updated_at": "2026-01-15T05:17:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "GRFTSOL",
        "avatar_url": "https://avatars.githubusercontent.com/u/108245502?u=cfc1cf75d942c08a9b121fa841d5e9505092fe15&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajmfj",
      "number": 3239,
      "title": "How to hide Google Meet share screen popup  bar?",
      "body": "<img width=\"617\" height=\"94\" alt=\"image\" src=\"https://github.com/user-attachments/assets/eb321de3-bb35-4dcf-a2b7-dccd8f1d03ae\" />\r\n\r\nLike this bar, `hide` is not working, and always overlay the website. How to hide this bar ?\r\n\r\nI find in other desktop environments, the behavior of `hide` seems to be minimizing to the Dock. Do you support this behavior?\r\n",
      "created_at": "2026-01-12T01:08:16Z",
      "updated_at": "2026-01-15T02:33:06Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "abcfy2",
        "avatar_url": "https://avatars.githubusercontent.com/u/5327677?u=fc3b0c5dfc113a8a2ce184d2a42b359705875c6b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjmSz",
      "number": 3237,
      "title": "Unbind C-M-j",
      "body": "Hello, \r\n\r\nI'm doing my firsts steps with Niri\r\n\r\nI like to find a way to disable \"Ctrl+Alt+J\" keybind. It is bound to an action that spawn a sort of a word suggestion window but I would prefere applications like Emacs to handle the keybind. Currently it is not sended to it.\r\n\r\n<img width=\"960\" height=\"600\" alt=\"image\" src=\"https://github.com/user-attachments/assets/1086d73e-bc47-4510-9d7c-265d60fd68cd\" />\r\n\r\nIt is not in the configuration file and didn't find a way to disable the keybind in the documentation.\r\n\r\nI saw [this](https://github.com/YaLTeR/niri/discussions/3231) and [that](https://github.com/YaLTeR/niri/discussions/3212) similar discussion but the OP issues are fixed with other mechanism.\r\n  \r\n\r\n\r\nThank you",
      "created_at": "2026-01-11T16:41:24Z",
      "updated_at": "2026-01-14T22:21:42Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "tomibennett",
        "avatar_url": "https://avatars.githubusercontent.com/u/3235855?u=566b98e1c2ff3d39b33d612cfa8b22c3ac81c4a4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajj8O",
      "number": 3223,
      "title": "Discord screen share not working",
      "body": "I am open to the idea this is not specifically a Niri issue, but I am wondering if anyone else has seen this or knows the fix. I can capture video with OBS just fine, but discord hangs on the \"pick your window to share\" screen and I can't start streaming. This worked when I was using plasma-wayland as my desktop environment.\r\n\r\nI am using nixOS and latest niri. I have set up XDG desktop portals for gtk and gnome. I have tried Vesktop, Discord, and Discord-Canary.",
      "created_at": "2026-01-08T14:31:43Z",
      "updated_at": "2026-01-14T22:03:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A676N",
        "body": "Ok I figured it out, after using Vesktop which gave me much better error messages, I was able to note that it couldn't find the -gnome desktop portal. I adjusted my XDG portal config as below (I use nixOS).\r\nSpecifically I changed the common.default portal from GTK to Gnome and restarted the portal service. it's working now.\r\n\r\n`systemctl --user restart xdg-desktop-portal.service`\r\n\r\nThis is in my configuration.nix\r\n```\r\n  xdg.portal = {\r\n    enable = true;\r\n    xdgOpenUsePortal = true;\r\n    extraPortals = [\r\n      pkgs.xdg-desktop-portal-gtk\r\n      pkgs.xdg-desktop-portal-gnome\r\n    ];\r\n    config = {\r\n      common.default = [ \"gnome\" ];\r\n    };\r\n  };\r\n```\r\n"
      },
      "user": {
        "login": "westongpt",
        "avatar_url": "https://avatars.githubusercontent.com/u/864259?u=c3b12553a9f5119449b9cff5ab4b0fdee83afbd9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah2el",
      "number": 2358,
      "title": "Exile-exchange-2 electron overlay on top of fullscreen window",
      "body": "Hi! \r\n\r\nI've been Playing Path of Exile 2 and there is a tool for trading in game (called Exiled-exchange-2 and known as EE2) which is written in electron and can pop up in an overlay on to top of the game window.  I managed to get it running on my machine and it captures keyboard inputs but when running it with niri it creates a new window and switches to the new window. Since I play in fullscreen that's not great. I've played around with window rules to try and make it present the EE2 overlay on top of the game window. I have not figure out how to overlay it on top of the game and pass clicks through. Does anyone have any ideas or does something similar?\r\n\r\nThanks!",
      "created_at": "2025-09-10T03:41:15Z",
      "updated_at": "2026-01-14T21:58:07Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "scottbenjamin",
        "avatar_url": "https://avatars.githubusercontent.com/u/22644?u=b9d0bf72f862c9b9525c2f78ef776ffca02568ed&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajm9u",
      "number": 3243,
      "title": "How to order my autostart apps?",
      "body": "I would like to sort my autostart apps in a specific order on my secondary workspace. I can move them there but how to specify that order?",
      "created_at": "2026-01-12T14:03:42Z",
      "updated_at": "2026-01-14T21:22:28Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Jak2k",
        "avatar_url": "https://avatars.githubusercontent.com/u/76660118?u=a81065831f49ff9069e7c61ee2712cb034d90e4d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjoU8",
      "number": 3252,
      "title": "How does scrolling work?",
      "body": "I'm using a laptop with a small display. Sometimes, I use an  application with a window size larger than the display. Hence, I switched to niri because of its scrolling features. However, I haven't found the correct commands to scroll to the right (or down) on a window that is larger than the display. Can anybody help?",
      "created_at": "2026-01-13T20:26:42Z",
      "updated_at": "2026-01-14T21:04:00Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "WorstUsernameAtAll",
        "avatar_url": "https://avatars.githubusercontent.com/u/242961957?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjpSN",
      "number": 3255,
      "title": "Better keybindings on « Exotic » Keyboard Layouts",
      "body": "Hi,\r\n\r\nI'm using an uncommon keyboard layout (Bépo and Ergo-L). The current configuration works, but I have to define keybindings like this:\r\n\r\n```\r\n    Alt+Shift+parenleft hotkey-overlay-title=\"Capture screenshot\" { screenshot; } // parenleft is 4 key on bépo\r\n```\r\n\r\nSwitching layouts required to change the configuration, so it's not very convenient (for example, Ergo-L is closer to QWERTY, with the \"4\" key directly accessible).\r\n\r\nWould it be possible in a future version to allow keybindings based on raw key codes instead of characters?\r\n\r\nSomething like : \r\n\r\n```\r\n    Alt+Shift+KeyCode:52 hotkey-overlay-title=\"Capture screenshot\" { screenshot; } // 52 is letter 4 on the number row of any keyboard layout.\r\n```",
      "created_at": "2026-01-14T16:44:27Z",
      "updated_at": "2026-01-14T16:44:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "c4software",
        "avatar_url": "https://avatars.githubusercontent.com/u/988914?u=6cd376e02f090ed415d2225cded514baaf3ea5f9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajn53",
      "number": 3248,
      "title": "Is there a way to set up a keybind to use a special symbol/key? (For instance \"è\")",
      "body": "I wanted to get the `Mod+LeftBracket` and `Mod+RightBracket` keybinds working on my system (Italian keyboard) however while I was able to bind RightBracket to \"+\", the key that appears in its place, I can't seem to do the same for the button next to it, which enters \"è\" when typed. Did I miss something from the documentation explaining how to do this? Thanks in advance.",
      "created_at": "2026-01-13T13:15:30Z",
      "updated_at": "2026-01-14T12:39:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A7E16",
        "body": "Does the Tip section here help? https://yalter.github.io/niri/Configuration%3A-Key-Bindings.html#overview"
      },
      "user": {
        "login": "InkstainTheBat",
        "avatar_url": "https://avatars.githubusercontent.com/u/76812933?u=a681b04bde463d25bb8a83366fe0633c11aab248&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajoo0",
      "number": 3254,
      "title": "Add tablet region remapping via config, IPC, and UI overlay",
      "body": "### Overview\r\nI just got a drawing tablet and noticed that Niri doesn't have a way to map a tablet to a specific region, so rather than ignore that and learn to draw, I figured I'd take a crack implementing tablet remapping idiomatically. I've split it into three stages on how to invoke the remapping: config, IPC, and a UI overlay like the screenshot interface.\r\n\r\n### Demo Video\r\nhttps://github.com/user-attachments/assets/289b9f72-d92d-4417-b2b6-b86852158377\r\n\r\n### Config\r\nAdd a new config property to tablet called map-to-region that overrides map-to-output, allowing you to specify both an output and the absolute pixel X/Y positioning of the top left corner, alongside the width and height.\r\n```kdl\r\n    tablet {\r\n        // Map tablet to middle 1/3 in both dimensions of DP-1 (3840x2160 display)\r\n        // Center third horizontally: x=1280 (skip first 1/3), width=1280 (one 1/3)\r\n        // Center third vertically: y=720 (skip first 1/3), height=720 (one 1/3)\r\n        map-to-region output=\"DP-1\" x=1280 y=720 width=1280 height=720\r\n    }\r\n```\r\nThen during compute_tablet_position we apply our remapping offset/scaling and return those results instead. Regions are confined to an output, they cant split across multiple outputs.\r\n\r\n### IPC\r\nAdd an IPC interface to invoke with `niri msg tablet` with 3 commands. Niri maintains the state of the most recently requested IPC region separately from the one loaded in config.kdl, so if the region is reset we'll fall back to that.\r\n\r\n```bash\r\n# Set the IPC region using the same 5 arguments in config.kdl\r\nniri msg tablet map-region <OUTPUT> <X> <Y> <WIDTH> <HEIGHT>\r\n# Mark the IPC region as None so the config region will be active\r\nniri msg tablet reset-region\r\n# Print the currently active IPC region\r\nniri msg tablet get-region\r\n```\r\n\r\n### UI Overlay\r\nAdd a native UI overlay that will let the user draw their own bounding box for the tablet remapping visually. This follows the same exact design as the screenshot overlay, but with a few added niceties:\r\n* Invoking the tablet UI shows the box around the currently active remapping region\r\n* Holding down **Mod** or **mouse middle click** allows you to drag the current region around to reposition it\r\n* Pressing **R** cycles through a few aspect ratios that are enforced automatically when drawing the bounding box:\r\n  * Starts on the detected aspect ratio of your tablet and displays (native), in my case it picks 16:10 (native)\r\n  * Defaults cycle of 16:10, 16:9, 1:1, and Free (does not enforce an aspect ratio)\r\n  * Pressing **D** sends the reset-region IPC\r\n* Temporarily map the entire output where the overlay was triggered so you can pick anywhere on the screen with the tablet no matter the current region remap. Mouse can move between outputs while the overlay is open and select any region it wants.  \r\n\r\n### Current Status\r\nRight now I have a vibecoded implementation split into three distinct commits and I've been using it without issue for a few days. I wanted to gauge interest and get feedback on the approach before I spent time code reviewing it and preparing it for a PR. Please Let me know if anyone's interested in this feature or has any feedback!\r\n\r\n* [Commit 1](https://github.com/hbeberman/niri/commit/de4541869a7fc876cc568b9f721218821baaad2f): Add tablet region remapping to input along with a config.kdl line to populate it\r\n* [Commit 2](https://github.com/hbeberman/niri/commit/49caddd232168f7c181a0f8c0e09f6bc32f6bc3e): Add an IPC interface to set tablet remapping at runtime\r\n* [Commit 3](https://github.com/hbeberman/niri/commit/08950fa47c2cfdd8cfcdd49d8d2adae5e9093346): Add a UI interface to set tablet remapping visually\r\n\r\n### Open Thoughts\r\n* We should probably accept percentages for X/Y/Width/Height as well as absolute pixels\r\n* Screenshot and Tablet UI have a lot of shared features, is it worth building some shared code here? If so, before or after a tablet UI is introduced?\r\n* Any cool use cases for extending this to support window-rule mappings that capture the tablet to a window? Probably worth a separate design proposal\r\n* Should this be introducing a \"tablet\" endpoint to the IPC or should we just use tablet specific command names under an \"input\" endpoint?\r\n\r\n### Related Discussions\r\nHere are some discussion topics that would be resolved by this feature change:\r\n* https://github.com/YaLTeR/niri/discussions/1708\r\n* https://github.com/YaLTeR/niri/discussions/1796\r\n* https://github.com/YaLTeR/niri/discussions/3141\r\n* https://github.com/YaLTeR/niri/discussions/2669\r\n* https://github.com/YaLTeR/niri/discussions/2313\r\n\r\n",
      "created_at": "2026-01-14T06:41:03Z",
      "updated_at": "2026-01-14T09:04:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "hbeberman",
        "avatar_url": "https://avatars.githubusercontent.com/u/33466007?u=927e9cbf296f9eacae415db9882ac8a3316705db&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajc0K",
      "number": 3141,
      "title": "Tablet aspect ratio & UltraWide output",
      "body": "# Problem\r\nThe problem I am facing is that I have a tablet which size is 216x135mm (16:10) and an ultra-wide screen resolution of 7680x2160 (32:9).\r\n\r\nCropping the tablet to the output area leave a small band of 60mm (45%) on the tablet, and reduces the relative pencil resolution.\r\nExtending the tablet to the output implies that drawing a square, yields a rectangle which has the same aspect ration as the screen (32:9)\r\n\r\n# Suggestions\r\n\r\n## Suggestion 1\r\nThe suggestion to crop the output to the tablet area, should make the full range of the tablet available, by scaling the tablet area to the minimal dimension of the output, making part of the output non-reachable by the tablet input.\r\n\r\nThe cropping mechanism can be applied to a given output with some alignment (centered, left, right).\r\n\r\n## Suggestion 2\r\nThe suggestion to crop the tablet to a focused window, which aspect ratio can be controlled to match the tablet, should offer the ability to maximize the range of the tablet while keeping the correct aspect ratio.\r\n\r\n## Potential Addition\r\nIn both cases, some shading could be provided as a visual hint for the non-reachable output areas when the tablet input is used.",
      "created_at": "2025-12-29T22:59:45Z",
      "updated_at": "2026-01-14T06:56:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nbp",
        "avatar_url": "https://avatars.githubusercontent.com/u/1179566?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AigJy",
      "number": 2634,
      "title": "NIRI_SOCKET is out of sync with tmux when I exit Niri with Mod+Shift+E",
      "body": "Hello,\r\n\r\nI noticed `niri msg windows` was failing inside of tmux but working outside of tmux.\r\n\r\nUltimately I found if I ran `echo $NIRI_SOCKET` in and out of tmux I was getting different values. The one outside of tmux was correct.\r\n\r\nI think the problem here is I exited Niri with Mod+Shift+E while tmux was running so now the tmux env has an outdated socket path.\r\n\r\nIf I run `tmux kill-server` and restart tmux then the correct value is there but that's pretty disruptive. The main use case here is configuring Niri and my environment in general and wanting to make sure everything works without doing a full reboot. Is there a better way?\r\n\r\nI am not recompiling Niri or doing anything crazy, just using tools like niri + waybar + walker + etc..",
      "created_at": "2025-10-19T17:28:49Z",
      "updated_at": "2026-01-13T20:07:58Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjnuR",
      "number": 3247,
      "title": "Option to change behaviour when double clicking the titlebar",
      "body": "With the 25.11 release the `maximize-window-to-edges` action has been introduced, which can also be activated when double clicking on the titlebar of an application. I would like to have an option to select between `none`, `maximize-window-to-edges`, `fullscreen-window` and `maximize-column` when double clicking the titlebar.",
      "created_at": "2026-01-13T09:38:13Z",
      "updated_at": "2026-01-13T10:51:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "LucasOe",
        "avatar_url": "https://avatars.githubusercontent.com/u/16548335?u=b4ba68057c2a69457cc88466230e1a1c02f2ba33&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjC-S",
      "number": 2909,
      "title": "Virtual Keyboard does not appear.",
      "body": "Virtual Keyboard does not appear. \n\nI have set the setting for tablet-mode as mentioned in https://github.com/YaLTeR/niri/wiki/Configuration:-Switch-Events, but no virtual keyboard appears when clicking into a text input field. In Gnome on the same system everything works. I'd be okay manually triggering to show the virtual keyboard, but it has to be able to be triggered from a touchscreen.\n\n<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n[...]\nswitch-events {\n    lid-close { spawn \"notify-send\" \"The laptop lid is closed!\"; }\n    lid-open { spawn \"notify-send\" \"The laptop lid is open!\"; }\n    tablet-mode-on { spawn \"bash\" \"-c\" \"gsettings set org.gnome.desktop.a11y.applications screen-keyboard-enabled true\"; }\n    tablet-mode-off { spawn \"bash\" \"-c\" \"gsettings set org.gnome.desktop.a11y.applications screen-keyboard-enabled false\"; }\n}\n[...]\n\n### System Information\n\n* Framework 12 Laptop\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version:  25.08 (01be0e6)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro:  Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU:  Intel Raptor Lake\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel Raptor Lake\n",
      "created_at": "2025-11-18T15:11:20Z",
      "updated_at": "2026-01-11T01:48:26Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "tinguin",
        "avatar_url": "https://avatars.githubusercontent.com/u/7721672?u=a7b16e0312a97029ee24d9c14ac47279d12bed97&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajb6v",
      "number": 3135,
      "title": "Translation process for niri and the wiki",
      "body": "Discussion to gather ideas on how we should go about translations, both for the niri binary, and for the wiki. I know there are some community translation projects already like [the Chinese niri wiki](https://github.com/akass-org/niri-wiki-chinese), would be good to have input from them, cc @akatsukiro.\r\n\r\nThere are two parts to this equation: the technical libraries for loading translations, and the process for contributors to submit translations. I'm looking for ideas for both of these. Would be good to have not just ideas, but examples of setups used by real projects, so we can evaluate how well they can work.\r\n\r\n## Libraries\r\n\r\nFor the niri binary, off the top of my head, these two come to mind: gettext and fluent.\r\n\r\nGettext has been the standard tool for Linux translations for decades. Every distro knows how to work with these, every translation editor can do .po files. On the other hand, gettext is kinda awkward to use from Rust, and has a kinda awkward workflow in general. Maybe something better is possible.\r\n\r\n[Fluent](https://projectfluent.org/) is a newish system that is apparently better and more powerful. I think cosmic-comp uses it. I've never had experience with it so I don't know how good the workflow is, and how well it works for distros.\r\n\r\nTranslating the few messages we have in niri should be straightforward. Things that are less clear to me:\r\n- What about error messages like knuffel config parsing errors? Guess they are hardcoded so we can't do anything about them? Or we can somehow translate them when printing?\r\n- What about clap command-line argument parsing help and errors?\r\n- Our entire `niri msg action` help is built from doc comments on the [`Action` enum](https://github.com/YaLTeR/niri/blob/b5640d5293ad8dca06cb447692ea7cbb21680eb1/niri-ipc/src/lib.rs#L190). How do we translate that?\r\n\r\n(Regarding things like left-to-right layout: we'll figure that out separately, it's not really relevant to this discussion.)\r\n\r\nFor the wiki, apparently Material for MkDocs can show a [language selector](https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#site-language-selector) and load files from different folders by language. I guess this is the best option we have?\r\n\r\n## Process\r\n\r\nHere I'm looking for something where contributors can submit translations, probably get them reviewed by other contributors, and merged, with as little of my involvement as possible. Ideally the niri binary translations then appear in niri-git right away, and the wiki translations immediately appear on our GitHub Pages wiki site.\r\n\r\nOne disadvantage of the traditional gettext workflow is that the translated .po files live in the main repository and thus have to go through the normal PR/merge flow. For my GNOME apps, I had experience with two approaches:\r\n1. The (free for open-source) [POEditor](https://poeditor.com/). Contributors would sign up, change stuff in their language, then I would semi regularly (before releases) export all translations through a POEditor button that creates a merge request. There was no real review. One big annoyance is that for every new language, I had to manually look up the correct .po filename (e.g. `pt_BR.po`) and associate it with the language in POEditor. Definitely don't want to do that.\r\n2. The [GNOME translation platform](https://l10n.gnome.org/). This is a custom-built GNOME thing that really makes the process bearable for the maintainers, as it deals with everything automatically. There are translation teams, translations get reviewed, then the platform automatically pushes to the main branch with the correct filename. Good, but obviously GNOME- (and gettext-) specific.\r\n\r\nThere's also the option of simply having .po files and wiki pages in the main repo, and having contributors open PRs with translation updates. But that both involves a lot of manual work for me, and is fairly hostile to not necessarily technical translation contributors.\r\n\r\nFor the wiki, I have even less of an idea on how this process is usually organized. .po files are split by string, both making it easy to translate in parts, and making it so if one string changes, translations for all other strings keep working. For the wiki, I feel like full-page granularity is too coarse: imagine we add and document a new option, in this case we would want the translated pages to keep most of their translated text, and show the English paragraphs for the new option (until it is translated). I believe on GNOME, help pages are somehow hooked up to gettext with a paragraph granularity, but I'm not sure how that works.\r\n\r\nIt's of course always an option to do nothing and have translated wiki projects live in separate repos (possibly link them from the main wiki). However, then those wikis won't get automatic updates from the main one when new options are added and such. It's also hard to find them and then keep track which ones are still alive, etc.",
      "created_at": "2025-12-29T06:25:59Z",
      "updated_at": "2026-01-11T01:35:16Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjfnQ",
      "number": 3189,
      "title": "How to make windows corner sharp square",
      "body": "<img width=\"54\" height=\"47\" alt=\"Screenshot from 2026-01-03 09-15-22\" src=\"https://github.com/user-attachments/assets/364df838-d125-473f-b856-de84287ced43\" />\r\n\r\nAs we see in this corner, the corner border is rounded. How do I make it sharp square. I tried playing with geometry-corner-radius window-rule, but that didn't make all the windows sharp corner.\r\n\r\n",
      "created_at": "2026-01-03T17:23:37Z",
      "updated_at": "2026-01-10T18:30:14Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "r0b0ji",
        "avatar_url": "https://avatars.githubusercontent.com/u/3028943?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajlyq",
      "number": 3231,
      "title": "unbind default key mappings",
      "body": "Hi\r\nI have the Alt+two_superior key (key just above 'tab' on french keyboard) bound in emacs\r\nunfortunately now with the new (great) window switcher, niri binds this key by default to switch to windows of the same app\r\n\r\nIs there a way to unbind this key or to completely remove the default niri bindings ?\r\n\r\nthanks\r\n\r\nI took a look at default-config.kdl and could not find where this key is bound",
      "created_at": "2026-01-10T17:28:45Z",
      "updated_at": "2026-01-10T18:09:00Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "yherve",
        "avatar_url": "https://avatars.githubusercontent.com/u/4946805?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjkN3",
      "number": 3224,
      "title": "Add the ability to use open-on-workspace with an index parameter",
      "body": "Support the ability to use open-on-workspace by calling an integer that represents the workspace index where you'd like the new window to appear. It seems that only named workspaces are supported today.\r\n\r\nExample:\r\n  window-rule {\r\n  match title=\"My Window\"\r\n  open-on-workspace 2\r\n}",
      "created_at": "2026-01-08T20:00:20Z",
      "updated_at": "2026-01-10T06:52:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jbattist",
        "avatar_url": "https://avatars.githubusercontent.com/u/17577908?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afyf5",
      "number": 1581,
      "title": "Expose also language code for keyboard layout",
      "body": "Atm `niri msg keyboard-layouts` shows full names.\r\n```\r\nKeyboard layouts:\r\n   0 Italian\r\n * 1 German (Switzerland)\r\n```\r\nTools like waybar-niri-languages or bash scripts for the \"custom command\" widget in LXQt have so no easy way to expose just \"it\" or \"ch\" (which can be used easily also to display language flags  from `/usr/share/iso-flags-svg/country-4x3/` like \"it.svg\") on the panel. Basically it could export the country code used in `niri.kdl` too. \r\n\r\nIn my case displaying the second one is way to long.\r\nIdeally something like\r\n\r\n```\r\nKeyboard layouts:\r\n   0 Italian:it\r\n * 1 German (Switzerland):ch\r\n```\r\n\r\n\r\n",
      "created_at": "2025-05-16T06:35:15Z",
      "updated_at": "2026-01-09T22:56:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "stefonarch",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?u=a2928499988ebbb05ef99547bd768ab7bbcf2fd2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjlMS",
      "number": 3227,
      "title": "put a screen below another one?",
      "body": "on Gnome I have:\r\n<img width=\"480\" height=\"270\" alt=\"image\" src=\"https://github.com/user-attachments/assets/802b61fc-c6f6-48f4-85f2-5b53c89d7ed5\" />\r\n\r\nAnd I tried to achieve that on Niri, using `niri msg outputs` I set the screen 3 logical pos according to the ones I had from screen 1:\r\n```\r\noutput \"Invalid Vendor Codename - RTK 0x2555 0x20230705\" {\r\n    mode \"1920x1080@60.000\"\r\n\r\n    scale 1\r\n\r\n    transform \"normal\"\r\n\r\n    position x=2860 y=1440\r\n}\r\n```\r\n\r\nbut it put the screen 3 at the bottom left corner of screen 2 and pushed their logical position to the right.\r\n\r\nIs it possible to do it? ",
      "created_at": "2026-01-09T21:47:03Z",
      "updated_at": "2026-01-09T22:41:36Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Geobert",
        "avatar_url": "https://avatars.githubusercontent.com/u/72570?u=22086674483f5720967165e4e1902c89a8924526&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abhrj",
      "number": 680,
      "title": "Got Remote Desktop working via KMS capture",
      "body": "Well, there's no way to capture via VNC, RDP, RustDesk, etc, at the moment. Until daddy YaLTeR or some brave rust wayland dev implements it. So for now the only way I managed to do remote desktop is by bypassing wayland completely :D \r\n\r\n### Ingredients: \r\n#### Server (with niri wayland archbtw)\r\n- [Sunshine](https://github.com/LizardByte/Sunshine)\r\n#### Client (with whatever)\r\n- [Moonlight](https://flathub.org/apps/com.moonlight_stream.Moonlight)\r\n\r\nThis is a guide for Arch BTW cus ArchBTW. \r\n- Follow [this guide](https://github.com/LizardByte/pacman-repo) to add the sunshine repo. Or install using a AUR helper `paru -Syu sunshine-bin`\r\n- Install sunshine `sudo pacman -Syu sunshine` \r\n- Enable avahi-daemon first, otherwise you'll get an error `systemctl enable --now avahi-daemon`\r\n- Give sunshine root permission to KMS capture (bypassing wayland) `sudo setcap cap_sys_admin+p $(readlink -f $(which sunshine))`\r\n- Enable the sunshine service as user `systemctl --user enable --now sunshine`\r\n- Go to https://localhost:[port] and setup username and password for sunshine.\r\n- Go to your client and put your server's ip on moonlight, install with [this guide](https://github.com/moonlight-stream/moonlight-qt?tab=readme-ov-file#downloads), check the ip on the server with `ip a`, moonlight might detect it automatically.\r\n- Pair the pin on the server.\r\n- That's it I guess... I'm too lazy to finish writing this correctly. I'm going to sleep. zzzzzzz.\r\n\r\n> Lesson of the day: Writing documentation sucks, but its so important tho. So do it.\r\n\r\nDemo image:\r\n![image](https://github.com/user-attachments/assets/092d0875-dc7c-4128-b7f5-4bb41d92b956)\r\n\r\n",
      "created_at": "2024-09-22T02:43:51Z",
      "updated_at": "2026-01-08T21:26:42Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "thepragmaticmero",
        "avatar_url": "https://avatars.githubusercontent.com/u/169491353?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajjfo",
      "number": 3219,
      "title": "Is there any ordering guarantees when responding to IPC requests?",
      "body": "Hello! \r\n\r\nI'm in the middle of writing my own shell and I'm currently writing the interface to Niri (which is really just a thin wrapper over socket operations) and was wondering if there's any guarantees in output order, e.g. if I send a request, could an event arrive earlier than the response? and if I write multiple requests before flushing the socket so that Niri receives it all at once, would responses be in the order of the requests?\r\n\r\nThanks!",
      "created_at": "2026-01-08T05:14:09Z",
      "updated_at": "2026-01-08T14:09:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A66gx",
        "body": "The order of responses is not guaranteed because some requests are async, for example PickWindow. Other than that I try to keep the order reasonable where it's possible"
      },
      "user": {
        "login": "Jiramide",
        "avatar_url": "https://avatars.githubusercontent.com/u/16442486?u=6cc58ccbdc6cc7b9e0442327174a2bb7a49804b2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajjt_",
      "number": 3221,
      "title": "Bind mouse double click",
      "body": "I have bound an extra button on my mouse to mod+middle click, which is very useful to navigate around in niri mouse-only. I would now really like to also be able to perform at least one other action using this button, probably maximize the window, or open the overview.\r\n\r\nBeing able to bind mod+mouse button double click, and maybe also just mouse click, differentiated from mouse drag, would be nice, and allow for most common actions to be mouse only, even without titlebars.",
      "created_at": "2026-01-08T10:24:14Z",
      "updated_at": "2026-01-08T10:24:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "topisani",
        "avatar_url": "https://avatars.githubusercontent.com/u/3133596?u=31eb62479f5082aa9ddcf058430f96d39d30bb6a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaSVs",
      "number": 508,
      "title": "Remove border when window is the only one on screen",
      "body": "I'd like the focus-ring and border to go away when there is only one window visible on screen (no matter the matter the reason: maximized, the only window at all etc.).",
      "created_at": "2024-07-02T18:55:17Z",
      "updated_at": "2026-01-08T01:37:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Schweber",
        "avatar_url": "https://avatars.githubusercontent.com/u/64630479?u=d3a79244cac2fc22782dfe29dde79e9637b61ee7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajiid",
      "number": 3214,
      "title": "Modify scrolling direction",
      "body": "Would like the option to set the direction that new windows spawn in. In particular, I use 2 vertical monitors on the sides and I would like to have them spawn windows that are 1/3 of the height of the workspace; spawning in new windows below the active one and scrolling downwards. This could be set with settings like:\r\n```\r\nlayout {\r\n    default-column-width { proportion 0.33333; }\r\n    orientation \"horizontal\"\r\n    spawn-direction \"left\"\r\n}\r\n``` \r\n\r\nor per display:\r\n```\r\noutput \"HDMI-A-1\" {\r\n    mode \"1920x1080@60.00\"\r\n    transform \"90\"\r\n    layout {\r\n        default-column-width { proportion 0.33333; }\r\n        orientation \"vertical\"\r\n        spawn-direction \"down\"\r\n    }\r\n    scale 1\r\n}\r\n```",
      "created_at": "2026-01-07T04:57:51Z",
      "updated_at": "2026-01-07T05:06:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "DarkXoa",
        "avatar_url": "https://avatars.githubusercontent.com/u/37259435?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXgue",
      "number": 149,
      "title": "Sticky columns",
      "body": "Coming from i3/sway I'm used to one window (column) being visible all the time, left on the screen. I use split/tabbed/stacked on the right side. \r\n\r\nIn terms of niri this could be a sticky column, e.g. toggled with a bind. \r\n\r\nFeel very free to close this if that doesn't make sense in terms of what niri is/should be or in terms of codebase. Otherwise I'm  looking forward to something like that.",
      "created_at": "2024-01-31T18:34:05Z",
      "updated_at": "2026-01-07T02:22:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "muchgitsuchwow",
        "avatar_url": "https://avatars.githubusercontent.com/u/97453054?u=c7c1da4841c7a7d46575ea7985cbf9a67abd3b6a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjiM9",
      "number": 3212,
      "title": "Is there a way to truly unbind (not just intercept) a hotkey?",
      "body": "Hi,\r\n\r\nI've been trying to separate my personal config from the standard `config.kdl` (`dms/*.kdl`) as much as possible. Mod+Space I'd prefer to keep free for my IBus keyboard switch.\r\n`common.kdl`, included at the end of `config.kdl`:\r\n```\r\nbinds {\r\n    // Mod+Space reserved for IBus switch.\r\n    Mod+Space hotkey-overlay-title=null {\r\n        spawn \"true\";\r\n    }\r\n    Ctrl+Space hotkey-overlay-title=\"Application Launcher\" {\r\n        spawn \"dms\" \"ipc\" \"call\" \"spotlight\" \"toggle\";\r\n    }\r\n}\r\n```\r\nApplication Launcher goes to Ctrl+Space, but Mod+Space hotkey just gets grounded. No great surprise. Is there a way to actually unbind Mod+Space, besides commenting it out in `dms/binds.kdl`?",
      "created_at": "2026-01-06T18:14:28Z",
      "updated_at": "2026-01-06T19:43:24Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Tyrn",
        "avatar_url": "https://avatars.githubusercontent.com/u/1386942?u=c7d3cdda1db5b21c3245413918902ebd213350b6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajhw2",
      "number": 3209,
      "title": "[Feature request] support hyprcursor",
      "body": "Currently with xcursor, when the cursor is trying to render in a different size (for example, on multiple displays), the result can be flawed:\r\n<img width=\"169\" height=\"225\" alt=\"image\" src=\"https://github.com/user-attachments/assets/dad3f378-f17a-4f35-b944-dc4374c82a6a\" />\r\nThere are weird dots on the upper-right edge of the cursor.\r\nHyprcursor uses svg to store cursor images, so there won't be similar issues.",
      "created_at": "2026-01-06T07:57:32Z",
      "updated_at": "2026-01-06T17:21:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "AprilGrimoire",
        "avatar_url": "https://avatars.githubusercontent.com/u/47601131?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkLkK",
      "number": 3455,
      "title": "Focus not triggered after closing overview",
      "body": "Focus is not being triggered for windows after the overview has been closed. \n\nhttps://github.com/user-attachments/assets/e725b56c-4505-4dab-a8c8-b73d29b07022\n\n\nI have `focus-follows-mouse` on and expect the window the cursor is above to gain focus again after moving. This issue also occurs when the cursor is on top of an old window when a new one is launched.\n\nThe issue lies with `if !self.layout.is_overview_open() && current_focus.window.as_ref() != Some(window)` in niri.rs 6283. We queried the current `PointContents` with `self.contents_under` which ends up being the same as the `new_focus` var.\n\n",
      "created_at": "2025-11-20T22:45:02Z",
      "updated_at": "2026-02-16T04:38:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "whiskeyPeak",
        "avatar_url": "https://avatars.githubusercontent.com/u/73116038?u=4f376c12b34d8a93b5aa34a7207d9836adc1f71a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiPJE",
      "number": 2506,
      "title": "Waybar duplicating on waking up",
      "body": "For a while now I've been getting multiple waybars showing, though it's only a single process running. It seems to happen when the computer wakes up (the lid opens). To get it back to normal I run `pkill -SIGUSR2 waybar`.\r\n\r\nThis is what it looked like when I opened the lid about 5 minutes ago:\r\n\r\n<img width=\"472\" height=\"476\" alt=\"screenshot-20251002T203928\" src=\"https://github.com/user-attachments/assets/2a129a38-c66d-46f9-be51-2c85b8e28d3f\" />\r\n\r\nHas anyone else seen this behaviour?",
      "created_at": "2025-10-02T18:44:38Z",
      "updated_at": "2026-01-06T14:48:59Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "magthe",
        "avatar_url": "https://avatars.githubusercontent.com/u/327270?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiaNs",
      "number": 2590,
      "title": "Setting an alias for the output name",
      "body": "Hi,\r\nI have outputs with very long IDs (e.g., \"Philips Consumer Electronics Company PHL 278B1 UKXXXXXXXXXXX\") that are not descriptive at all.\r\nIt would be nice to be able to set an alias (e.g., \"office-left\") for an output that then can be referenced in workspace rules.",
      "created_at": "2025-10-13T06:50:45Z",
      "updated_at": "2026-01-06T14:22:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "derchr",
        "avatar_url": "https://avatars.githubusercontent.com/u/44267643?u=690fd706c11851e4617f3fe48c3304b355cd2a61&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajh4Q",
      "number": 3210,
      "title": "message about layout switching",
      "body": "it will be cool, get message (via hotkey-overlay-title, idk) when you switching keyboard layout",
      "created_at": "2026-01-06T10:46:26Z",
      "updated_at": "2026-01-06T10:46:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "unazikx",
        "avatar_url": "https://avatars.githubusercontent.com/u/189107707?u=d9014d94c8b9625a926e359edae35c42a161ac8e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajht_",
      "number": 3208,
      "title": "synchronous run dialog, terminal, etc",
      "body": "niri is amazing! Thank you!\r\n\r\nI am particular and have strong feelings about how my computer should respond to me, and I got 90% of what I want in far less time with niri than with the several other window managers and compositors that I've tried over the years (eg xmonad, dwm, sway).\r\n\r\nUnfortunately, the thing that bugs me most is not supported by any window manager / compositor. So while it drives me crazy, I hope nobody feels like I'm saying niri is bad, just that there's an opportunity to do something well that nobody is even trying to do (except in the terminal here it almost always works).\r\n\r\n\r\nHere is a use case that drives me nuts several times a day:\r\n\r\nI press F1 for my run dialog, or F2 to spawn a terminal and start typing, and the first few characters go to some other program before the window opens and takes terminal focus.\r\n\r\nThis isn't about saving 0.3 seconds, it's about not getting distracted, having to backtrack, and forgetting what I was trying to type, and getting frustrated, and having to go back and look at what I was doing, getting distracted by some other document that's open, find the right thing, remember what I was thinking/doing, and hopefully this next time I go to type it into the run dialog/terminal/etc it doesn't lag on me again the 2nd time and I want to break my computer.\r\n\r\nI know it's very trendy to believe that we are good at multitasking, but there's abundant research that says that distractions are shockingly costly. I really want to make it so cool modern software like niri can be as good at keeping up with my keypresses as software from 40 years ago.\r\n\r\nI'm not interested in things that just make the terminal spawn faster, that only works sometimes. This should work 100% of the time even if the system is swapping like mad.\r\n\r\nThe key here is that the solution is synchronous, ie something is done immediately before further keypress events are processed to make sure that subsequent key presses go to the terminal or run-dialog or whatever. So anything using \"spawn\" is not going to work, that's async.\r\n\r\nThere are probably many ways to solve this problem:\r\n\r\nExample 1: back when I was running dwn, I hacked in a command like \"spawn\" called kb_spawn that would freeze the keyboard event processing (this is a thing X11 can do), then un-freeze the keyboard event processing when the next window opens and takes focus.\r\n\r\nExample 2: in sway, you can spawn a terminal and run dialog ahead of time, and hide them in a workspace you don't use, then bind F2 to look for a terminal in workspace-you-dont-use and bring it to the current workspace and focus it. sway can do this synchronously so subsequent keypresses go to that app.\r\n\r\n\r\nBefore I consider writing code for niri that can fix this classic interface race condition I thought I should start a discussion about what sort of solution might get merged.\r\n\r\nI skimmed all the commands that I could find that you can bind a key to. I see lots that move the currently focused window places, but none that bring a window from elsewhere to you in the current workspace/position. I also didn't see any commands that could target a specific window besides the focused one. The closest I can get with current niri is to pre-spawn a terminal in a named workspace, and bind F2 to focus that workspace. This would get me my synchronous typing into the terminal, but I want the terminal to come to me, not the other way around.\r\n\r\nI think all the solutions I can think of (besides input buffering, which I'm guessing is off the table) require the ability to have a keybind run multiple commands. Currently keybinds are limited to a single action right? Are devs open to allowing multiple commands to be configured to run in succession immediately on keybinds?\r\n\r\nI could imagine adding some new action, and solving this use case with a sequence such as:\r\n\r\nPerhaps the simplest solution would be to implement a bindable command like fetch-window-from-workspace:\r\n\r\n```\r\nspawn-at-startup \"spawn-terminal-for-later.sh\"; # this spawns a terminal in a way that a window-rule puts it in the \"pre-spawned-terminals\" workspace\r\nbinds {\r\n    F2 { fetch-window-from-workspace \"pre-spawned-terminals\"; spawn \"spawn-terminal-for-later.sh\"; }\r\n}\r\n```\r\n\r\nOr maybe something more general like `fetch-window-matching [rule]`.\r\n\r\nOr maybe we could make it so `windows-rule`s can tag windows, and I could:\r\n\r\n```\r\nF2 { fetch-window-tagged \"pre-spawned-terminal\"; remove-tag \"pre-spawned-terminal\"; spawn \"spawn-terminal-for-later.sh\"\r\n```\r\n\r\nUsing window-rule would be cool.\r\n\r\n\r\nthis is all kinda messy. it sucks to pre-spawn things, and when you do you have to have separate bits of config to hide and organize them so you can find them when you need them, and sometimes something goes wrong and they don't exist or there are multiple. and even when it all does work, it sucks that your terminal commandline history is out of date because this terminal spawned a while ago.\r\n\r\nThe much cleaner solution was input buffering of keyboard events, which was easy in dwm, but might be untenable in wayland/niri.\r\n\r\nI'm hoping we can come up with some features that will be broadly useful to lots of people who don't want to mess around with pre-spawning. Perhaps command(s) that can find a particular window and bringing it to the user would get some use. Though it would be awesome if we had a solution for the many people that use run dialogs and use the keyboard to spawn terminals so they didn't have to be distracted by watching for when the computer was ready for them to type.",
      "created_at": "2026-01-06T06:49:07Z",
      "updated_at": "2026-01-06T09:58:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "JasonWoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/31515?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjgnD",
      "number": 3198,
      "title": "Ephemeral named workspaces",
      "body": "I'm thinking about a hybrid mode for named workspaces that give the advantage of named workspaces, but fit better with the niri way of ephemeral workspaces.\r\n\r\nEphemeral named workspaces would not be created by default, and would be culled after they no longer have any windows left, the same as regular workspaces. They would be created on demand in a few scenarios:\r\n- A window rule has an `open-on-workspace <ws-name>`\r\n- One of the key binding/ipc actions calls for that workspace, i.e. `focus-workspace <ws-name>` and `move-window-to-workspace <ws-name>`\r\n\r\nThis keeps the main advantages of named workspaces:\r\n- Still have the ability to specify window rules to group certain applications on the same workspace.\r\n- Still able to set up keybinds to switch directly to the named workspace no matter what order it's in.\r\n- Able to specify layout config overrides for the workspace and which monitor it should open on.\r\n- Able to have fun icons for specific named workspaces in dms on the workspace bar widget.\r\n\r\nWhile removing the one main disadvantage:\r\n- Empty named workspaces clog up the normal niri flow of moving windows/workspaces up/down.\r\n\r\nThere could be two ways of creating them. In the config:\r\n```\r\nworkspace \"chat\" {\r\n    ephemeral true\r\n}\r\n```\r\nOr via ipc\r\n```niri msg action set-workspace-name --ephemeral chat```",
      "created_at": "2026-01-05T01:48:25Z",
      "updated_at": "2026-01-06T04:21:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "gazpachoking",
        "avatar_url": "https://avatars.githubusercontent.com/u/187133?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajdlm",
      "number": 3154,
      "title": "Config options for touchpad three-finger gesture for moving across workspaces?",
      "body": "I recently got a Logitech t650 touchpad since I used to use niri on my laptop and feel like the trackpad experience actually fits very well with niri. On my laptop when I swipe with my three-finger horizontally the windows only move one by one each time I swipe which is what I wanted. However on my desktop when I swipe it just swipe through multiple windows depends on how far I swipe my fingers on the trackpad. This is annoying for me since I like to open windows and resize them to 1/3 of the screen size so that they fits nicely in my screen without scrolling through workspaces and since these windows are small it's really hard to control how far I swipe to switch one or multiple windows. Is it possible to add an option in config to make niri only move on window per swipe on touchpad?\r\n\r\nAlso is there a way to change the sensitivity for gesture recognization? I'm not sure if it's just a touchpad problem or if it's a niri problem but whenever I do gesture (especially three and four fingers) I have to swipe across at least 2/3 of the touchpad for it to activate.\r\n\r\nThank you,",
      "created_at": "2025-12-31T03:00:53Z",
      "updated_at": "2026-01-06T02:32:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "PSERUM",
        "avatar_url": "https://avatars.githubusercontent.com/u/92060233?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjgsJ",
      "number": 3200,
      "title": "Support custom keybinds/actions for touchpad multi-finger clicks/swipes",
      "body": "I'd like to be able to bind custom keybind actions to a touchpad 4-finger click and 4-finger swipes in different directions. On Windows I use a 4-finger click to toggle my mic muting, and swipes for things like toggling media play/pause.\r\n\r\nFrom looking around the Niri wiki, it seems the touchpad gestures (3-finger swipes for moving, 4-fingers up for overview) are hardcoded. I appreciate how smooth these gestures/animations are and I understand allowing rebinding them may worsten that experience. Open to thoughts on this.",
      "created_at": "2026-01-05T05:24:31Z",
      "updated_at": "2026-01-06T02:29:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "josh-sukheja",
        "avatar_url": "https://avatars.githubusercontent.com/u/45578963?u=728aaea96d050db29bdd21e92f86235cb3d23ba2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajg93",
      "number": 3204,
      "title": "Niri documentation doesn't cover all available actions",
      "body": "I stumbled upon a problem with the current documentation - **it doesn't cover all of the actions niri has.**\r\n\r\n**Case and point:** I use ```focus-window-or-workspace-up/down``` actions in my configuration:\r\n\r\n\r\n<img width=\"462\" height=\"43\" alt=\"изображение\" src=\"https://github.com/user-attachments/assets/8a85efda-bca0-4b7d-942d-f27105ed5014\" />\r\n\r\nHowever, when searching the wiki, there's no reference of these actions existing at all:\r\n\r\n\r\n<img width=\"764\" height=\"911\" alt=\"изображение\" src=\"https://github.com/user-attachments/assets/1e2186a0-40d1-49b9-8be6-84f59e0f9311\" />\r\n<img width=\"804\" height=\"1089\" alt=\"изображение\" src=\"https://github.com/user-attachments/assets/10dd807d-cbc0-4a10-ae2e-777d605766d7\" />\r\n\r\nHow did I find out about them? I looked at previous releases one day and found them in notes of [v0.1.0-alpha.2](https://github.com/YaLTeR/niri/releases/tag/v0.1.0-alpha.2):\r\n\r\n\r\n<img width=\"868\" height=\"71\" alt=\"изображение\" src=\"https://github.com/user-attachments/assets/4a6c255c-59f0-441b-acba-7476ddc7aba6\" />\r\n\r\n\r\n\r\nThis is *not* a severe problem, but it does, in my opinion, obfuscate how feature-rich the project actually is, and other than that I am content with the Wiki - it explains enough for a comfortable system to be.\r\n\r\nWhat I ask is to at least **include the missing actions in the documentation. Just their names will be enough for now,** since the actions' names are self-explanatory in my opinion.\r\n\r\nAdding a snippet like this to Key Bindings section should be enough I think:\r\n<img width=\"788\" height=\"960\" alt=\"изображение\" src=\"https://github.com/user-attachments/assets/3ba27810-3009-4b89-a0ff-7b6b864f7025\" />\r\n",
      "created_at": "2026-01-05T11:43:44Z",
      "updated_at": "2026-01-05T16:27:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "DiamondArrowTheLizard",
        "avatar_url": "https://avatars.githubusercontent.com/u/164989836?u=8e7f325d17de315f62f3beda690e28f8cde1c64a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjgyB",
      "number": 3202,
      "title": "Use Docusaurus instead of mkdocs for documentation",
      "body": "### Consider switching to [Docusaurus](https://docusaurus.io/) for documentation.\r\n- It's more powerful & same easy as mkdocs to setup. \r\n- Also, it gives better experience for both users & docs writer (plain markdown & mdx support).\r\n- Optionally, It also allows to use react to make customized homepage.\r\n \r\nFor reference we can see [yazi docs](https://yazi-rs.github.io)\r\n\r\nIf given permission, i wanna help migrating to it. i am moderately familier with docusaurus.",
      "created_at": "2026-01-05T08:03:12Z",
      "updated_at": "2026-01-05T13:23:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "soymadip",
        "avatar_url": "https://avatars.githubusercontent.com/u/84225810?u=fd101ce3de30e2454e37bb720d81c600b3db1cb1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajga7",
      "number": 3197,
      "title": "Stupid question: why is the niri binary so big?",
      "body": "Mine is ~125Mb. To compare, Hyprland is ~12Mb and mango is ~740Kb.\r\nJust wondering.",
      "created_at": "2026-01-04T20:04:04Z",
      "updated_at": "2026-01-05T07:39:21Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "vaskark",
        "avatar_url": "https://avatars.githubusercontent.com/u/33555080?u=3cb072ea9404e0948cd1615dec3eb8a50733466c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjgYT",
      "number": 3196,
      "title": "Add a way to toggle centering the current column",
      "body": "I like to often have my current window centered, but not always. I have tried to use the default Mod+C bind that centers it, but that leads to me having to use that keybind most of the time I switch between any windows. I'd very much prefer it if I could just toggle between centering the current column and not. So I suggest adding a `toggle-center-focused-column` option in the config, and have it act accordingly.\r\n\r\nI have considered making a shell script to update my config whenever I press a keybind. Which I'll probably do for now, but it seems hacky.",
      "created_at": "2026-01-04T19:13:09Z",
      "updated_at": "2026-01-04T19:16:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Sietse2202",
        "avatar_url": "https://avatars.githubusercontent.com/u/144368086?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgfOM",
      "number": 1945,
      "title": "Window rules: support executing a shell command for matching window",
      "body": "In [nirius](https://sr.ht/~tsdh/nirius/) I have some `toggle-follow-mode` command which makes the focused window follow the active workspace.  That's mostly suitable for floating windows, especially video players or browser picture-in-picture windows.  I would be great if I could have a window rule matching such windows and then calling a custom shell command (like `nirius toggle-follow-mode` in my case) when the window appeared and is focused, or if the latter won't work, run a shell command which receives the window id as argument.\r\n\r\nWould that be feasible?",
      "created_at": "2025-07-01T05:59:18Z",
      "updated_at": "2026-01-04T18:22:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tsdh",
        "avatar_url": "https://avatars.githubusercontent.com/u/103854?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjgTA",
      "number": 3195,
      "title": "Rebinding horizontal view movement (Mod+MMB)",
      "body": "Hi,\r\n\r\nI think it would be nice to be able to rebind the default Mod+MMB bind for the [horizontal view movement](https://yalter.github.io/niri/Gestures.html#horizontal-view-movement) / [workspace switch](https://yalter.github.io/niri/Gestures.html#workspace-switch) gesture.\r\n\r\nI'm coming from Hyprland, and I would imagine it being configurable like Hyprland's [`bindm`](https://wiki.hypr.land/Configuring/Binds/#mouse-binds).\r\n\r\nI'm willing to implement it in a PR, but I wanted to ask about how it should be configurable (what the config syntax should look like) and whether you think it's generally a good idea.\r\n\r\nI'm open to suggestions.",
      "created_at": "2026-01-04T17:29:39Z",
      "updated_at": "2026-01-04T17:44:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "TymekV",
        "avatar_url": "https://avatars.githubusercontent.com/u/80421694?u=6f3e9584e36df3d2cca23eff7b1cf376430fb19b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiX_0",
      "number": 2574,
      "title": "Support hidden workspaces",
      "body": "Feature description: The ability to declare named workspaces that do not appear on the overview and are not accessible by regular vertical scrolling.\r\n\r\nExample: \r\nFor example I would like to declare a `minimize` workspace for window that I don't want to be visible and a `control-hub` workspace contains a bunch of preset windows that I want to bring up together.\r\n```\r\n### config.kdl ###\r\nworkspace \"minimize\" {\r\n    is-hidden \r\n}\r\n\r\nworkspace \"control-hub\" {\r\n    is-hidden\r\n}\r\n\r\nspawn-sh-at-startup \"script that builds control workspace\"\r\nMod+$key1 {spawn \"fuzzel script that brings minimized windows to the current workspace\"; }\r\nMod+$key2 {spawn-sh \"move to minimize workspace\"; }\r\nMod+$key3 {spawn-sh \"toggle current/control-hub workspace\";}\r\n```\r\n\r\nReasoning:\r\nI think this feature would allow us to script our way into a more fully featured wm and projects like https://github.com/gvolpe/niri-scratchpad demonstrate the user-base's need for such a feature.\r\n\r\n\r\nThis is the most well thought out and ergonomic window manager I've ever used since I discovered window mangers, so I'd like to thank the contributors for their superb efforts.",
      "created_at": "2025-10-11T11:36:00Z",
      "updated_at": "2026-01-04T09:40:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "VMichailidis",
        "avatar_url": "https://avatars.githubusercontent.com/u/59122717?u=cf615cd0998a1f81fb795a62bafd9391aaae2b41&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjSXU",
      "number": 3047,
      "title": "Add a full overview zoom for easier navigation between multiple workspaces and large rows.",
      "body": "I firstly want to say that Niri has completely changed the way I do work and has made me a lot more productive over the last couple of months :).\r\n\r\nThanks to the scrolling layout and workspaces, my setup is basically to create 5 worspaces at boot and populate each with apps I am likely to use in a layout I am familiar with.\r\n\r\nThe one issue I do tend to run into is that when my workspaces start to be populated with long rows, it's hard to tell exactly where one is in the \"workspace grid\". This is why I think it may be valuable to have an option to view the entire workspace grid within the bounds of the current output. I was thinking maybe a 4 finger swipe down gesture that shows the entire layout and allows for navigation via mouse clicks, keys and trackpad gestures. Basically a very zoomed out overview, but maybe rendered in a cleaner manner than just zooming out the overview.",
      "created_at": "2025-12-15T21:34:42Z",
      "updated_at": "2026-01-04T08:52:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "whiskeyPeak",
        "avatar_url": "https://avatars.githubusercontent.com/u/73116038?u=4f376c12b34d8a93b5aa34a7207d9836adc1f71a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjVKf",
      "number": 3069,
      "title": "Request: Smart-maximize for single window columns",
      "body": "Request: Smart-maximize for single window columns. It would be great to have a window-rule or layout option that automatically maximizes a column if it's the only one on the workspace, and unmaximizes it when a second column is opened/moved there. Example:\r\n\r\n1. smart-maximize optino under layout section or\r\n2.  window-rule { match window-count=1; ... }\r\n",
      "created_at": "2025-12-18T21:12:12Z",
      "updated_at": "2026-01-04T07:12:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "og900aero",
        "avatar_url": "https://avatars.githubusercontent.com/u/49487376?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajfk6",
      "number": 3188,
      "title": "Zotero's window opening behavior prevents distinguishing between main window and sub-windows",
      "body": "## Problem Description\r\n\r\nZotero opens all windows (main window, dialogs, progress windows) using the same pattern:\r\n1. Creates a base window with generic `title=\"Zotero\"` and `app-id=\"Zotero\"`\r\n2. Then updates the title to the actual content (e.g., `\"My Library - Zotero\"`)\r\n\r\nSince `open-maximized` and `open-floating` are evaluated only at window creation (step 1), niri cannot distinguish between different window types - they all look identical initially.\r\n\r\n## Desired Behavior\r\n\r\n- **Main window** (first Zotero window opened): `open-maximized true`\r\n- **Sub-windows** (progress dialogs, message windows opened from within Zotero): `open-floating true`\r\n\r\n## Proposed Solution\r\n\r\n**Add a matcher to check if other windows of the same app already exist:**\r\n\r\n```kdl\r\nwindow-rule {\r\n    // First Zotero window (main window) - maximize\r\n    match app-id=\"Zotero\" has-existing-window=false\r\n    open-maximized true\r\n}\r\n\r\nwindow-rule {\r\n    // Subsequent Zotero windows (dialogs, progress) - float\r\n    match app-id=\"Zotero\" has-existing-window=true\r\n    open-floating true\r\n}\r\n```\r\n\r\nAlternative naming: `is-first-window-of-app`, `has-sibling-windows`, or `existing-window-count`.\r\n\r\n## Current Workaround\r\nDefault all Zotero windows to floating, then manually tile/maximize the main window using keybinds.\r\n",
      "created_at": "2026-01-03T16:12:22Z",
      "updated_at": "2026-01-04T05:17:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "payprays",
        "avatar_url": "https://avatars.githubusercontent.com/u/151654433?u=08d536c4a805ea3b38714c526d5d8dbc6e09bdd9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af46J",
      "number": 1642,
      "title": "Use empty screen space more efficiently and evenly",
      "body": "I think one of the essential benefits of tiling and scrolling window managers is the fact that you don't have to worry about where to place the windows anymore. It's handled reasonably and consistently for you. There are two places where I think this could be improved in Niri:\r\n\r\n1. If the existing windows do not fill the entire width of the screen, always make them centered. The way it works now, windows spawn at the left edge of the screen. This is usually not what I want. I would like the empty space on the left and right edge of the screen to be evenly distributed.\r\n\r\n   For a single window, this can be achieved already with the `center-column` action. With an even number of windows it's impossible. With an odd number of equally-sized windows it's possible, but increasingly tedious.\r\n\r\n2. If the existing windows are wider than the screen, always scroll until there is no empty space at the screen edge. This is currently not always the case, for example when closing a window at the edge. The rest of the windows are not always scrolled to fill the empty space. In some situations they are, e.g. when closing a window or consuming it into the adjacent column right after opening it. But if it was opened for a while, you have to focus a couple windows in the other direction, then go back, in order to fill the entire screen space.\r\n\r\nI think this proposal conflicts with `layout.{,always-}center-focused-column`. (I don't use it, I searched if my proposal or something similar exists already.) So my proposal could be:\r\n- The default, but possibly overriden by `center-focused-column`.\r\n- A separate config option where `niri validate` checks that only one is set.\r\n\r\nThank you for considering this!",
      "created_at": "2025-05-22T11:51:00Z",
      "updated_at": "2026-01-03T22:22:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "senekor",
        "avatar_url": "https://avatars.githubusercontent.com/u/54984957?u=1ff809c95abe38c74daee3f24cecc8f81dbe3fff&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjcjP",
      "number": 3138,
      "title": "Browser shortcut strange behaviour",
      "body": "I am very new to Niri and have had a search through the documentation but can't seem to find anything relating to this. I also searched through some previous issues but also didn't find anything.\r\n\r\nThis seems to only happen to me with Google Chrome as a browser, Firefox works fine....\r\n\r\nI added a shortcut for chrome:\r\n\r\n``` \r\nMod+B hotkey-overlay-title=\"Open Browser: google chrome\" { spawn \"google-chrome\" ;}\r\n``` \r\n\r\nWhich seems to open some sort of global keyboard shortcuts GUI? Initially I thought it was related to GNOME as I have Fedora Workstation with GNOME installed and switched to Niri with Noctalia Shell.\r\n\r\nHas anyone encountered anything else like this? \r\n\r\n### Screenshot\r\n\r\n<img width=\"1914\" height=\"1182\" alt=\"image\" src=\"https://github.com/user-attachments/assets/a730f2bd-46ff-491e-9fff-168f557d7384\" />\r\n\r\n\r\n",
      "created_at": "2025-12-29T17:43:05Z",
      "updated_at": "2026-01-06T13:24:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "rosscondie",
        "avatar_url": "https://avatars.githubusercontent.com/u/121060540?u=a2e6999ce1cc740477a86e2551d9b7f9c66e589c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjfdG",
      "number": 3185,
      "title": "Tabbed columns should fill available height regardless of set window heights",
      "body": "When switching a column to tabbed mode with `toggle-column-tabbed`, if any window has a fixed height, the tabbed column uses the tallest fixed-height window's size instead of filling the screen height.\r\n\r\n# Steps to Reproduce\r\n\r\n1. Open two terminals in separate columns\r\n2. Set the first terminal to a specific height (e.g., set-window-height 30%)\r\n3. consume-window-into-column the second terminal into the first\r\n4. toggle-column-tabbed\r\n5. Observe: tabbed column stays at the tallest fixed-height window's size instead of filling the screen\r\n\r\n# Expected Behavior\r\n\r\nIn tabbed mode, the column should always fill the available screen height, regardless of individual window heights set. Since only one window is visible at a time, there's no reason for the column to be shorter than the screen.\r\n\r\nIndividual window heights should be preserved internally so they're restored when switching back to non-tabbed mode.\r\n\r\n# Optional\r\nIf others have use for this behavior, here are options\r\n1. Make this a setting.\r\n2. There could be a separate way to set column height in tabbed mode that would allow to have only part of the screen taken by the the column. This would not reflect on window heights in non-tabbed mode at all.\r\n\r\n# Somehow related discussion I found\r\n- #1811 — fixed vs auto height confusion\r\n- Discussion #593 — window height design",
      "created_at": "2026-01-03T11:26:51Z",
      "updated_at": "2026-01-03T11:26:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "benabraham",
        "avatar_url": "https://avatars.githubusercontent.com/u/334494?u=3a826d543668078fe113593f0830e1ba7045d30d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjfOB",
      "number": 3183,
      "title": "Using niri for ambient background apps: multi-timezone view",
      "body": "# Ambient multi-timezone background app in niri\r\n\r\nI wanted to try **niri without a bar**, and instead put *ambient information* directly into the background.\r\n\r\nThis is a small **Wayland background app** that renders **multiple timezones** as shared time:\r\n\r\n* always visible\r\n* non-interactive by default\r\n* never stealing focus\r\n\r\n---\r\n\r\n## Workspace-aware\r\n\r\nThe app is **workspace-aware** — you can choose exactly which workspaces it appears on.\r\n\r\nFor example:\r\n\r\n* visible on coordination / home workspaces\r\n* hidden on focus / coding workspaces\r\n\r\n---\r\n\r\n## Implementation\r\n\r\n* Tauri (Rust)\r\n* Wayland layer-shell (`background` layer)\r\n* no exclusive zone\r\n* no keyboard focus\r\n* no bar or panel\r\n\r\n---\r\n\r\n**Screencast**\r\n\r\nhttps://github.com/user-attachments/assets/8193604f-c97c-420e-a622-cf8e39091898\r\n",
      "created_at": "2026-01-02T23:06:18Z",
      "updated_at": "2026-01-02T23:12:48Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "VladimirPal",
        "avatar_url": "https://avatars.githubusercontent.com/u/555405?u=59f77ac2149ca53031131b355ad1febf6b6767a5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aje7C",
      "number": 3181,
      "title": "Allow changing touchpad horizontal view movement \"threshold\"",
      "body": "On my laptop, when trying to use a three-finger horizontal swipe on the touchpad to move between fullscreen columns, I have to scroll from one end of the touchpad to the other to move a single window. I find this highly annoying.\r\n\r\nIt would be great if the \"threshold\" used for this movement could be configurable. This was also [noted](https://github.com/YaLTeR/niri/issues/372#issuecomment-3423525441) in #372 by @SLUCHABLUB, but I think a separate discussion post is warranted.\r\n\r\nI [implemented a simple configuration solution](https://github.com/ThePuzzlemaker/niri/tree/touchpad-horiz-config), but I figured I'd open a discussion rather than a PR at this point to let the relevant developers and community members discuss how to implement this best, as I know configuration options are intended to be backwards-compatible. (Also, I don't know enough about the niri codebase to know if I accidentally messed something up, though it seems to work in my testing.)",
      "created_at": "2026-01-02T14:19:01Z",
      "updated_at": "2026-01-02T14:19:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ThePuzzlemaker",
        "avatar_url": "https://avatars.githubusercontent.com/u/12666617?u=f8e663a474ac1fc82c58228a9d8c4f3fe847ebcc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai_j1",
      "number": 2886,
      "title": "Single Instance Behaviour",
      "body": "```bash\r\n#!/usr/bin/env bash\r\n\r\nkitty_id=$(niri msg --json windows | jq '.[] | select(.app_id==\"kitty\") | .id' | head -n 1)\r\n\r\ncurrent_ws=$(niri msg --json workspaces | jq '.[] | select(.is_focused==true) | .id')\r\n\r\nif [ -z \"$kitty_id\" ]; then\r\n    kitty -e /bin/fish &\r\n    exit 0\r\nfi\r\n\r\nniri msg action move-window-to-workspace --window-id \"$kitty_id\" \"$current_ws\" --focus true\r\n\r\n```\r\n\r\nHi I wanted to open kitty if it isn't\r\nif its already opened, move it to the current focused workspace and focus it\r\n\r\nI've attached my script above\r\n\r\nBut it seems to work weirdly, what am I doing wrong here\r\n\r\nThanks!",
      "created_at": "2025-11-24T16:22:29Z",
      "updated_at": "2026-01-02T13:16:43Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "kulothunganug",
        "avatar_url": "https://avatars.githubusercontent.com/u/63696279?u=392ddd9a42dc0ad25dda5b8b4704d08436c1335d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajew6",
      "number": 3174,
      "title": "change modifier to drag and drop windows",
      "body": "Hi.\r\nBy default, you can drag and drop windows using the 'mod' modifier. This is very convenient... except for left-handed people \r\nbecause the left hand is on the mouse and the super key is on the left side of the keyboard.\r\n\r\nOn french keyboard there is this 'mod5' (alt-gr) modifier on the right side of the keyboard.\r\n\r\nSo I would like to be able to move windows with the mouse by pressing this 'mod5'. Is it possible ? \r\n(Note that I don't want to global change 'mod' to 'mod5')",
      "created_at": "2026-01-02T09:47:55Z",
      "updated_at": "2026-01-02T10:45:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "yherve",
        "avatar_url": "https://avatars.githubusercontent.com/u/4946805?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjbQl",
      "number": 3126,
      "title": "Add set-dynamic-cast-tab action to the dynamic cast target?",
      "body": "The docs currently state:\r\n\r\n> set-dynamic-cast-window to cast the focused window.\r\n\r\nThis is helpful but imagine the scenario where you are jumping between a terminal and web browser and you want to cast both of them depending on which one is in view. You'd prefer to do this instead of sharing your whole screen because you have other things open.\r\n\r\nThe current feature requires you to press a key bind every time you switch focus between the terminal / browser.\r\n\r\nAfter recording almost 1,000 videos, I can say with certainty it will be too difficult to micro-manage this while giving a live demo or live streaming. You'll certainly forget to hit the key bind and end up not casting what you're talking about out loud.\r\n\r\n#### Introducing \"set-dynamic-cast-tab\"\r\n\r\n- Uses the existing \"niri Dynamic Cast Target\" which will cast the tab in focus instead of window\r\n  - Could work exactly the same as how the window one works except operate on tabs\r\n  - Can be initiated with a key bind or running a command just like windows\r\n\r\nI don't know the implementation details in code but I'm hoping this is technically possible without introducing a ton of complexity.",
      "created_at": "2025-12-27T20:55:52Z",
      "updated_at": "2026-01-02T07:28:56Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjenY",
      "number": 3172,
      "title": "pipewire casting without `xdg-desktop-portal-gnome`/`mutter`",
      "body": "It should have some alternative methods like `niri-ipc`(`niri msg ...`) at least for debugging purpose.\r\nI tried to implement my own but this results to gpu freeze, so just posting here.\r\n\r\nfwiw someone mentions drmmodifier diff could be issue of casting but didnt make it work at gstpipewire ",
      "created_at": "2026-01-02T02:57:43Z",
      "updated_at": "2026-01-02T03:18:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ilsubyeega",
        "avatar_url": "https://avatars.githubusercontent.com/u/37479424?u=a78295ff0f39d8044cc562ea08012d667773462a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjeVJ",
      "number": 3166,
      "title": "Please help with putting together a custom window rule",
      "body": "Hi. I'm banging head against a wall with something supposedly trivial here. Mainly due to zero prior Rust experience and no proper understanding of Niri code design I think. \r\n\r\nBasically I'm trying to mod Niri sources to add a few custom window rules that I'm missing in the stock build:\r\n\r\n- A custom \"is-in-overvew\" rule matcher which I needed for completely turning off opacity for all windows when in Niri Overview mode. Otherwise it becomes hard to see what is what depending on the window content and the background color under it. Have this one working and doing what I needed already. A closed topic.\r\n\r\n- A custom \"is-fully-visible\" rule matcher which I need for enabling opacity only for windows that are partially off-screen. So that only the content you are currently working with is fully opaque e.g. a single centered column or two side-by-side columns. While the adjacent partially off-screen columns should be aggressively dimmed via opacity window rule. Simply because these could be extremely distracting depending on the window content making it hard to focus on the current task in the fully visible columns. This one gives a head scratcher as the horizontal column position looks a bit like the most closely guarded secret everywhere through the code. Not immediately obvious how to access it from an arbitrary context because of a hierarchy of mut/immut iterators involved.\r\n\r\nI'm digging through Niri code and struggling to come up the right place that:\r\n\r\n1. Ideally is a common code path that traps all changes to visible horizontal column position and column size on the screen.\r\n2. Has a read access to horizontal column position and column size on the screen. \r\n3. Has a read access to workspace view size so you can figure if the column is entirely within the current workspace view or is partially off-screen. \r\n4. Has a write access to column tiles and tile windows so you can set some kind of flag on each like e.g. tile.window.set_fully_visible(true/false). The flag to be used for implementing the intended \"is-fully-visible\" rule matcher.\r\n\r\nScrollingSpace.refresh() handler looks like it could be the right place but I'm struggling to get hold of column horizontal position inside current workspace view and workspace view size in that context due to mutable self. \r\n\r\nOn the other hand I think I can get all the info I need in various update_render_elements() handlers but these look like the wrong place to change any info affecting window rule solving. As I think these are called after rule solving therefore it is already too late to change any window struct fields at that point and also I think it may cause repeated redraws etc. \r\n\r\nAny ideas anyone please? \r\n\r\nThanks",
      "created_at": "2026-01-01T14:04:52Z",
      "updated_at": "2026-01-02T03:07:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "iamvoidcoder",
        "avatar_url": "https://avatars.githubusercontent.com/u/81540569?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjegC",
      "number": 3170,
      "title": "duplicate output",
      "body": "ive been reading through the wiki and maybe im just missing it but is there a way i can duplicate my DP-1(1440P) output onto HDMI-A-2(1080P) as my HDMI is my TV downstairs id like it show the same as my desk monitor",
      "created_at": "2026-01-01T20:27:37Z",
      "updated_at": "2026-01-02T00:25:04Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6s51",
        "body": "We recommend wl-mirror for this.\r\nhttps://github.com/Ferdi265/wl-mirror"
      },
      "user": {
        "login": "WiKiDClown",
        "avatar_url": "https://avatars.githubusercontent.com/u/7257779?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjKpd",
      "number": 2995,
      "title": "Allow scrolling until reaching the left edge of the most right window",
      "body": "Currently, the most right position to scroll to is the right edge of the most right window:\r\n\r\nhttps://github.com/user-attachments/assets/ca5eb189-0b39-4e47-9fc4-7e99ade0d38a\r\n\r\nWhich is quite annoying because it basically prevents you from resizing the right window with mouse:\r\n\r\nhttps://github.com/user-attachments/assets/51fcd2c3-007c-4383-a717-e43bbc3f1bc7\r\n\r\nThe only way you can resize it is to use keyboard shortcuts (you can bind something to resize window to the left, or you can center the view and resize it with only mouse after). So allowing scrolling further would make niri more usable for with mouse, touchpad and touchscreen.\n\nAlso, it can be useful if you don't want to see other windows (to prevent them distracting you), but don't want to maximize the window you're working with and don't want to make it fullscreen.",
      "created_at": "2025-12-07T10:48:51Z",
      "updated_at": "2026-01-01T23:23:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Nikitf777",
        "avatar_url": "https://avatars.githubusercontent.com/u/127026067?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajb6E",
      "number": 3134,
      "title": "Niri being runned with LXQT",
      "body": "Recently I watched brodie's youtube video about niri, and how cool it is to have a WM that is scrollable\r\nI tried - and it's really cool! It does have it's other cool things too, like overview workspace feature, when you bring mouse to the top left corner.\r\nI recently also found out, that LXQT officialy supports niri on their wiki. Just boot to lxqt, select niri as wayland session and whoo, you're here! I find confusing, that configs weren't on .config/niri, but on .config/lxqt, but I got used already\r\nI don't know why I wanted to try LXQT with niri, but it's comfortable for me, so I'm cool\r\n_I wonder if someone also combines window managers with other DEs like me_\r\n\r\nUPD: I gave up on lxqt-session, because I can't screenshare in obs! Even if I use wlr protocol for screensharing - it's ugly and slow.\r\nFor now, I use plain niri only with my dotfiles. It's not bad making my own desktop, so I'm happy again.\r\nRelevant https://github.com/YaLTeR/niri/issues/2881\r\n\r\n<img width=\"2560\" height=\"1440\" alt=\"image\" src=\"https://github.com/user-attachments/assets/502f3fd1-de4d-4b00-8ad0-ccc98cfd9fe4\" />\r\n",
      "created_at": "2025-12-29T06:11:04Z",
      "updated_at": "2026-01-01T20:41:32Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "Vlad55432",
        "avatar_url": "https://avatars.githubusercontent.com/u/78297186?u=0dbdc2a5347b66f2b5ebf1f2c58a3e7d491442cf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjZ-Q",
      "number": 3115,
      "title": "Can we have move-window-down-or-to-monitor-down?",
      "body": "And move-window-up-or-to-monitor-up?",
      "created_at": "2025-12-25T11:39:11Z",
      "updated_at": "2026-01-01T20:18:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "YaQia",
        "avatar_url": "https://avatars.githubusercontent.com/u/61108050?u=d88c0c570ff35520701bd06a3a2923c112d2f9e7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjeXU",
      "number": 3167,
      "title": "Preserve XDG_CURRENT_DESKTOP",
      "body": "`XDG_CURRENT_DESKTOP` (and other related vars, like `XDG_MENU_PREFIX`, `XDG_SESSION_DESKTOP`, etc) could be set before niri start.\r\n\r\nIf a DM is used, it sets `XDG_CURRENT_DESKTOP` according to `DesktopNames` key from compositor's entry. UWSM does the same.\r\n\r\nSomeone may make a spin on a compositor with a different set of `DesktopNames`. Compositor would hinder this if `XDG_CURRENT_DESKTOP` is hardcoded. It's better to set it only if it is unset or empty.",
      "created_at": "2026-01-01T15:19:48Z",
      "updated_at": "2026-01-01T16:18:27Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Vladimir-csp",
        "avatar_url": "https://avatars.githubusercontent.com/u/4061903?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiWdc",
      "number": 2557,
      "title": "spawn-on-focus window rule to auto-switch keyboard layouts and more",
      "body": "Would be nice to have a possibility to execute shell commands and scripts each time the window is focused. One obvious use case is automatic keyboard layout switching: e.g. I rarely use English to start a message in Telegram, and at the same time I never use Russian in terminal or IDE — and I’d love to have window-specific layout switcher out of the box or config-hackable w/o event listening scripts.\r\n\r\nI’m sure there are other workflows that would benefit from spawn-on-focus window rule — can’t point them w/o your help :)",
      "created_at": "2025-10-09T15:01:22Z",
      "updated_at": "2026-01-01T13:26:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "magvag",
        "avatar_url": "https://avatars.githubusercontent.com/u/20383744?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdjOU",
      "number": 897,
      "title": "Bind a keymap to to perform multiple functions?",
      "body": "Is is possible to bind a single keymap to perform multiple functions in niri? \r\nFor my usecase, I wish to bind the `Mod+Shift+Return`  to open a terminal window at workspace 1.\r\nI tried everything I could think of, but did not succeed, So did I miss something from the wiki?",
      "created_at": "2024-12-26T17:33:10Z",
      "updated_at": "2025-12-31T05:44:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AshM6",
        "body": "Not at the moment. You can work around by binding something like `\"sh\" \"-c\" \"niri msg action focus-workspace 1 && niri msg action spawn -- alacritty\"`"
      },
      "user": {
        "login": "voidstar-null",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?u=9284ed0b1e1f71e30306d1672bfc0f045ddf9003&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeSn7",
      "number": 1111,
      "title": "open-on-workspace to allow non-named workspace",
      "body": "\n> [!NOTE]\n> Prior effort: went through the entire wiki, read the default config, went over the --help pages of `niri`, searched open and closed issues and prs\n\nin my workflow, I actively don't want any named workspaces; I quite like them being fully dynamic \\\nyet I know that some windows I don't want to open wherever I currently am.\n\nfor example I run an \"update everything\" script in a terminal window every day automatically; not focusing it is not enough, I don't want it to be on the current workspace at all. I don't want to create a named workspace just for it, either. \\\nit is very common that I want a window opened *on its own*; creating a named workspace for each of those possibilities is a bit silly.\n\nif I want to open krita, I probably want that to be on its own workspace. that updating script can be in a general \"services\" workspace, sure. gimp will be separate, steam will be separate, qbittorrent would be separate... you can probably see how creating named workspaces for each individual thing gets kind of unreasonable\n\nallowing open-on-workspace to create a dynamic workspace for you is AMAZING in my eyes. instead of a name, you don't pass anything, or maybe \"new\", or maybe \"above\", \"below\" with maybe also \"above-current\" and \"below-current\".\n\nnow I can set a window rule for windows that open on their own workspace, not bothering the other workflows I already have going on, and not requiring me to pollute my config by creating named workspaces that I don't actually want.\n\n",
      "created_at": "2025-02-09T15:24:49Z",
      "updated_at": "2025-12-31T05:20:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Axlefublr",
        "avatar_url": "https://avatars.githubusercontent.com/u/101342105?u=d83eb94a87455ab03dc949683fddd938f5806ca8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajddi",
      "number": 3151,
      "title": "Window focus animation with custom shader",
      "body": "I feel like it wouldn't be too hard to implement either.\r\nWould greatly improve the readability, mainly having border shaders on focus would be great, idk why no one opened an issue for this lol",
      "created_at": "2025-12-30T20:59:31Z",
      "updated_at": "2025-12-31T00:11:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "TheItroma",
        "avatar_url": "https://avatars.githubusercontent.com/u/75866194?u=ab9c20ad154c65a47196538f204345c96fe960c3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajdfr",
      "number": 3152,
      "title": "Is it possible to add a close button for each window in overview?",
      "body": "Like in GNOME when we toggle overview each window has a close button",
      "created_at": "2025-12-30T22:10:56Z",
      "updated_at": "2025-12-30T22:40:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "felri",
        "avatar_url": "https://avatars.githubusercontent.com/u/56592364?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjdPj",
      "number": 3147,
      "title": "Static background",
      "body": "Currently when switching workspace, the stacks of windows and wallpaper move up/down.\r\nAn option could be to have static backgroud: to move up/down only the stacks of windows when changing workspace.\r\n\r\nInspiration from: https://extensions.gnome.org/extension/8505/static-workspace-background/\r\n\r\nIt's coherent with touchpad gestures.\r\nGestures with three fingers horizontaly move only windows, not the background. The windows seems to be tied together, but not to the background. \r\nWhen moving up/down with three fingers, it should also move the windows only. \r\n\r\n**Gestures**\r\n* Three fingers gesture, either horizontal or vertical, only move the stacks of windows.\r\n\r\n**Overview**\r\n* Stacks of windows are zoomed-out\r\n* The background is blured and slightly zoomed-in\r\n",
      "created_at": "2025-12-30T15:13:39Z",
      "updated_at": "2025-12-30T19:53:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "maelgith",
        "avatar_url": "https://avatars.githubusercontent.com/u/21042278?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjdbT",
      "number": 3150,
      "title": "[Feature request] Is maximized to edges",
      "body": "Would be great, if I get windows status, if it maximized to edges. Example: When I type niri msg focused-windows, I get:\r\n```\r\nWindow ID 82: (focused)\r\n  Title: \"foot\"\r\n  App ID: \"foot\"\r\n  Is floating: no\r\n  PID: 70364\r\n  Workspace ID: 4\r\n  Layout:\r\n    Tile size: 952 x 1160\r\n    Scrolling position: column 2, tile 1\r\n    Window size: 952 x 1160\r\n    Window offset in tile: 0 x 0\r\n```\r\n\r\nWould be great:\r\n\r\n```\r\nWindow ID 82: (focused)\r\n  Title: \"foot\"\r\n  App ID: \"foot\"\r\n  Is floating: no\r\n  Is maximized to edges: yes\r\n  PID: 70364\r\n  Workspace ID: 4\r\n  Layout:\r\n    Tile size: 952 x 1160\r\n    Scrolling position: column 2, tile 1\r\n    Window size: 952 x 1160\r\n    Window offset in tile: 0 x 0\r\n```\r\n",
      "created_at": "2025-12-30T19:49:18Z",
      "updated_at": "2025-12-30T19:49:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "og900aero",
        "avatar_url": "https://avatars.githubusercontent.com/u/49487376?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjdU3",
      "number": 3149,
      "title": "Regex for output devices",
      "body": "This allows for rules that apply to all outputs by having a string that matches everything and for people who have the same monitor (different serial) at different locations.",
      "created_at": "2025-12-30T17:38:50Z",
      "updated_at": "2025-12-30T17:38:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "TimoNotThy",
        "avatar_url": "https://avatars.githubusercontent.com/u/67267822?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajc_g",
      "number": 3142,
      "title": "Support \"Maximize to Edges\" while maintaining floating state",
      "body": "Hello,\r\n\r\nFirst of all, I would like to express my sincere gratitude to the niri developers and contributors for creating such a magnificent window manager.\r\n\r\nI have used various window managers over the years, and I truly believe that niri is the most outstanding and perfect one, especially in terms of rendering and user experience.\r\n\r\nWhile enjoying niri, I have a small suggestion that I would like to share:\r\n\r\n[Current Behavior]\r\n-\r\nCurrently, when I execute the `Mod+shift+f { maximize-window-to-edges; }` action on a floating window, the window is temporarily converted into the tiling (scrolling) layout to perform the maximization.\r\n\r\nWhile it works perfectly when unmaximizing (returning to the original floating state), I was wondering if it would be possible to maximize the window to the edges while maintaining its floating state.\r\n\r\n[Use Cases]\r\n-\r\nYou might think this is a minor detail, but it has significant practical use cases:\r\n\r\nProductivity: When using a semi-transparent floating terminal, being able to maximize it while it remains \"floating\" allows the user to see the content of a web browser or documentation underneath it.\r\n\r\nEngagement: As a fan of both niri and mpv, I imagine a scenario where I could watch a video playing in the background (mpv) while working on a maximized, semi-transparent floating terminal over it. It would make terminal work so much more enjoyable!\r\n\r\n[Final Thoughts]\r\n-\r\nEven if this request is not feasible or doesn't align with the current roadmap, my gratitude for your hard work on niri will remain unchanged. However, I must admit I would be a little sad if this weren't possible!\r\n\r\nAs someone who loves niri and mpv, I sincerely hope to see this feature in the future.\r\n\r\nThank you once again for your incredible dedication and for providing us with such an amazing tool.\r\n\r\nBest regards,",
      "created_at": "2025-12-30T07:25:36Z",
      "updated_at": "2025-12-30T16:08:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sephid86",
        "avatar_url": "https://avatars.githubusercontent.com/u/77107998?u=fbb2c81dbb74e1c5b1f0205b20d1c3411ee98a38&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjdH1",
      "number": 3143,
      "title": "Tab indicator scrollwheel support",
      "body": "It would be nice to be able to navigate through tabs by hovering the mouse cursor over the tab indicator and using the scroll wheel, similar to how it works in browsers and with i3's tabbed containers.",
      "created_at": "2025-12-30T11:46:42Z",
      "updated_at": "2025-12-30T15:27:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dmyates",
        "avatar_url": "https://avatars.githubusercontent.com/u/3908852?u=e2a37c24c90d42e58e20096ab8f88957f26107e1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjdP1",
      "number": 3148,
      "title": "Button to switch between preset column width",
      "body": "Currently the only way to change between the presets of column width is using keyboard shortcuts. \r\nAn option to change between presets with the mouse pointer could be usefull.\r\n\r\nA solution could be to add a button - like the maximize one - at the top of the windows to switch between presets.",
      "created_at": "2025-12-30T15:22:12Z",
      "updated_at": "2025-12-30T15:22:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "maelgith",
        "avatar_url": "https://avatars.githubusercontent.com/u/21042278?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ajcyd",
      "number": 3140,
      "title": "iio switch events (mainly for 2-in-1 laptops)",
      "body": "We already have the acpi switch events `lid-open/close` and `tablet-mode-on/off`, could iio events also be supported?\r\nFor 2-1 laptops the rotating display gives outputs like:\r\n```\r\nTilt changed: tilted-down\r\nTilt changed: vertical\r\nTilt changed: face-down\r\nAccelerometer orientation changed: bottom-up\r\nAccelerometer orientation changed: normal\r\nLight changed: 171.000000 (lux)\r\n```\r\n I'd like to use these to change how niri behaves: rotate screen, disable keyboard, stuff like that.\r\n\r\nUseful for checking iio devices:\r\n```sh\r\nfor d in /sys/bus/iio/devices/iio:device*; do echo \"$d\"; cat \"$d/name\"; done\r\n```\r\nand the  `monitor-sensor` command to print all event updates.",
      "created_at": "2025-12-29T21:51:12Z",
      "updated_at": "2025-12-30T04:22:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "TimoNotThy",
        "avatar_url": "https://avatars.githubusercontent.com/u/67267822?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aerbr",
      "number": 1212,
      "title": "pin column position with a keybind",
      "body": "is there a way to pin a column and have the rest of the windows scroll around or beside it? if not are there any plans?\r\nCan be useful when you're working on multiple windows but you need a main one always on screen. Can sort of do it with floating windows but  it ends up hiding tiled windows and it gets clunky.",
      "created_at": "2025-03-05T11:44:08Z",
      "updated_at": "2025-12-29T18:25:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "fawzee94",
        "avatar_url": "https://avatars.githubusercontent.com/u/68717647?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjcYQ",
      "number": 3137,
      "title": "Incorrect PID Reported for Windows Running Under xwayland-satellite",
      "body": "I discovered an issue where using the niri msg pick-window command to select a window running under xwayland-satellite returns the PID of xwayland-satellite itself, rather than the actual application's PID.\r\n\r\nAfter some research, I've found that it seems difficult to proactively report the actual application PID from the xwayland-satellite side. I'm wondering if there's a good way on the compositor side to obtain the actual application PID?\r\n\r\nRelated discussion: https://github.com/Supreeeme/xwayland-satellite/discussions/336",
      "created_at": "2025-12-29T14:46:47Z",
      "updated_at": "2025-12-29T14:46:47Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "GoodbyeNJN",
        "avatar_url": "https://avatars.githubusercontent.com/u/6856639?u=366da162683e8bd29fdbb04f1073a7f8a0ba3a89&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aja9Q",
      "number": 3121,
      "title": "How to prevent quitting niri when swaylock is active?",
      "body": "Even if swaylock is running, I can do Ctrl+Alt+Delete to quit niri. Which effectively drops you into already logged in tty.\r\nCan I prevent that?",
      "created_at": "2025-12-27T06:58:01Z",
      "updated_at": "2025-12-29T14:07:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Parad0x84",
        "avatar_url": "https://avatars.githubusercontent.com/u/36677584?u=ba2b9d1b34dcd2fa312a5cf7bc9c45a0ed2d06ae&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjbFW",
      "number": 3122,
      "title": "disable touchpad gestures",
      "body": "disable touchpad gestures\r\nalso is possible to change area border in screenshot ui? to custom color",
      "created_at": "2025-12-27T12:59:25Z",
      "updated_at": "2025-12-29T06:01:24Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {}
    },
    {
      "id": "D_kwDOKFkxdc4Ajbb6",
      "number": 3130,
      "title": "Retrieving user idle time",
      "body": "I maintain user-idle2-rs, which reports how long the user has been idle for. For GNOME, the information is usually retrieved `org.gnome.Mutter.IdleMonitor` over DBus. Does Niri's compositor have an API for this?",
      "created_at": "2025-12-28T08:55:46Z",
      "updated_at": "2025-12-29T05:11:06Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6lDd",
        "body": "We have the Wayland idle protocols"
      },
      "user": {
        "login": "pieterdd",
        "avatar_url": "https://avatars.githubusercontent.com/u/1407980?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjbT8",
      "number": 3127,
      "title": "How to get pid of spawned process",
      "body": "Is there a way to get the pid of the process created by the `spawn` action? The IPC returns no information other than success/failure. The only way I can think of is querying the highest pid from `niri msg windows` right after spawning which is very hacky.",
      "created_at": "2025-12-28T00:20:51Z",
      "updated_at": "2025-12-28T17:06:47Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "plax-00",
        "avatar_url": "https://avatars.githubusercontent.com/u/75195921?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjbJt",
      "number": 3124,
      "title": "White line at the top in Minecraft",
      "body": "When I launch new versions of Minecraft, a white bar always appears when I open my inventory, and when I close the game, it moves the game down .Is there a way to fix this?",
      "created_at": "2025-12-27T16:05:42Z",
      "updated_at": "2025-12-27T22:20:28Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "davidmegaskuf",
        "avatar_url": "https://avatars.githubusercontent.com/u/202507371?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjbLk",
      "number": 3125,
      "title": "2 Axis Scrolling, Workspaces on the depth axis (forward and back based on a user sitting at a desk)",
      "body": "I'm aware this is probably out of scope and likely will never be implemented, I just assume it's too complex and disrupts the current overall design, would have needed to be in the design much earlier. But just want to see what people think.\r\n\r\nCurrently all works space designs for all window managers, that I know of, either orient work spaces vertically or horizontally. Since niri does horizontal scrolling its work spaces are vertical.\r\n\r\nWhat I was curious about is to have both horizontal and vertical scrolling windows with work spaces arranged on the third depth axis. Visually the overview would zoom out and show both axis of scrolling windows stretching out in both directions. \r\n\r\nWorkspace visualization might have to be limited to waybar or other status bar, but to have a visual que for niri natively for this I'd imagine just a vertical bar on the left or right, or bottom/top (niri config), or just hidden, similar to how gnome used to (vertical) and does now (horizontal) workspace indicators in the overview.\r\n\r\nNo idea how this could be done, never looked at the code structure and don't know enough about wayland layers, my intuition says this would be a huge job to implement, would disrupt the current default hotkeys I think, but just wanted to throw the idea out there. ",
      "created_at": "2025-12-27T17:04:24Z",
      "updated_at": "2025-12-27T17:50:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "AustinFoss",
        "avatar_url": "https://avatars.githubusercontent.com/u/22974919?u=869a596e6212e1179e4216fd7930b33f376b01e6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa7Ln",
      "number": 601,
      "title": "Screen Magnification/Zooming",
      "body": "I just migrated from Hyprland and something I'm missing is a way to easily zoom into the screen. I rely on such functionality to comfortably view smaller details without having to lean too close to my screen (I'm a fan of maintaining my non-scoliosis status).\r\n\r\nI thought a second about implementation details:\r\nThe zoom level should be controlled by an action, so there's an easy way to use it with keybinds, I'm thinking something similar to set-column-width functionality wise. \r\nIf a configuration option exists, it should only control the zoom level on compositor startup or config reload. \r\n\r\nAlso gotta watch out for naming conflicts with #352",
      "created_at": "2024-08-16T00:48:04Z",
      "updated_at": "2025-12-27T16:29:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "miku4k",
        "avatar_url": "https://avatars.githubusercontent.com/u/89653242?u=713f44c870a7d50612e6447c07eda6b800144a4e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjbH0",
      "number": 3123,
      "title": "Am I doing this correctly to position a primary and secondary monitor? My concern is when I adjust the scale (potential feature request)",
      "body": "Here's what's working in my config currently:\r\n\r\n```kdl\r\noutput \"DP-1\" {\r\n    position x=0 y=0\r\n    scale 1.0\r\n    focus-at-startup\r\n}\r\n\r\noutput \"HDMI-A-1\" {\r\n    position x=3840 y=0\r\n    scale 1.0\r\n}\r\n```\r\n\r\n- DP-1 is my primary 4k monitor, physically located on the left\r\n- HDMI-A-1 is my secondary 1440p monitor, physically located on the right\r\n\r\nEverything works with this set up, going to the right edge of DP-1 smoothly moves over to HDMI-A-1 if I continue going right and vice versa.\r\n\r\nI record a lot of videos and long story short, niri makes it super easy to be able to do `niri msg output DP-1 scale 4.0` to zoom in on my primary monitor to make font sizes and UI widgets larger on video without me needing to tinker with bumping font sizes and zoom levels in every app. This is very helpful.\r\n\r\nThe issue here is I can't move my mouse between both monitors anymore because `x=3840`  is no longer reachable from the scale change.\r\n\r\nThen I figured ok, maybe I can run `niri msg output HDMI-A-1 position set 960 0` to resolve that since 3840 / 4 is 960. This works. If I run the scale command on my primary monitor and the position command on my secondary monitor it's all good.\r\n\r\nBut now I'm wondering if there's a better way. If I want to set the scaling to maybe 2x instead of 4x then I always need to calculate the `x` value. I could wrap this into a script and auto-calculate this value but it makes me think of 2 questions:\r\n\r\n1. Is there a way to do this without altering the position of the 2nd monitor?\r\n2. Would it ever make sense for niri to handle this behind the scenes if your scale is anything but 1.0? On scale change it could internally perform the position calculation adjustment, is there ever a use case where you wouldn't want this behavior?",
      "created_at": "2025-12-27T14:58:03Z",
      "updated_at": "2025-12-27T14:58:03Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjWG2",
      "number": 3074,
      "title": "Inner- and outer borders",
      "body": "<img width=\"292\" height=\"30\" alt=\"2025-12-19_21:13:44\" src=\"https://github.com/user-attachments/assets/f9d412f9-f2df-4c53-a981-1e071662615c\" />\r\n<img width=\"584\" height=\"60\" alt=\"2025-12-19_21:13:44\" src=\"https://github.com/user-attachments/assets/f9d412f9-f2df-4c53-a981-1e071662615c\" />\r\n\r\nScreenshots from current waybar config and style. Did this with sharp *inset* CSS *box-shadow*. What if Niri had **inner- and outer borders with configurable colors for each side of the window?**\r\n\r\nHere's a mockup of what configuration could look like to not become a wall of text. \r\n\r\n```\r\nborder-outer {\r\n  on\r\n  width 1\r\n  active-color 1 0 0 1 \"#ffffff\" // top, left\r\n  active-color 0 1 1 0 \"#000000\" // right, bottom\r\n  inactive-color 1 0 0 1 \"#000000\" // top, left\r\n  inactive-color 0 1 1 0 \"#ffffff\" // right bottom\r\n}\r\n\r\nborder-inner {\r\n  on\r\n  width 1\r\n  active-color \"#656565\" // assumes all sides.\r\n}\r\n```\r\n\r\n*border* is assumed to be *border-outer* if *border-inner* is not configured. Sadly not a dev, just a desktop enthusiast. I can imagine the maths involved with getting this looking correct for rounded corners will be \"fun\".\r\n\r\nI imagine the community would enjoy these border options a lot and come up with many creative uses :)\r\n\r\n",
      "created_at": "2025-12-19T22:21:04Z",
      "updated_at": "2025-12-27T00:15:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "gurgelgubbe",
        "avatar_url": "https://avatars.githubusercontent.com/u/44402757?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiX49",
      "number": 2569,
      "title": "unable to enter nvidia D3 after first connected to external monitor even unpluged",
      "body": "My system is archlinux. My computer is a laptop with a nvidia dGPU. \r\n\r\nAlthough niri doesn't clear gpu memory when the dGPU is unused, nvidia D3cold can be entered when dGPU is unused. However, after the monitor is first plugged in, there is something keeping nvidia awake.(I guess my computer uses nvidia to deal with video output)\r\n\r\nThe thing is, even after the ext monitor is unplugged, D3cold cannot be entered.\r\n\r\nI think clearing all video memory(of niri) when dGPU is unused might work. There might be other solutions, like the state before first plugging in the monitor.",
      "created_at": "2025-10-11T06:48:06Z",
      "updated_at": "2025-12-26T19:04:16Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "jdksjfisdf",
        "avatar_url": "https://avatars.githubusercontent.com/u/80867768?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad5F-",
      "number": 1001,
      "title": "Toggle block-out-from",
      "body": "I absolutely love the `block-out-from` feature, but sometimes I deliberately want to take a screenshot or recording of something that should be blocked by default.\r\n\r\nSo it would be great, if there was some way to for example globally toggle `block-out-from`. If this becomes a thing, I'd like to have some visual indicator. For that, an event in the event stream would be good. That would be enough to display something in a bar for example.\r\n\r\nWhat are your thoughts on this? ",
      "created_at": "2025-01-17T16:13:49Z",
      "updated_at": "2025-12-26T17:56:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "phisch",
        "avatar_url": "https://avatars.githubusercontent.com/u/1282767?u=a93459a9132bcae0f9d15ff800698c6b0eb164af&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjaZ7",
      "number": 3119,
      "title": "typ.ing Daily Challenge leaderboard",
      "body": "Congrats @YaLTeR for being the 3rd on the leaderboard this month. 🥉",
      "created_at": "2025-12-26T06:20:18Z",
      "updated_at": "2025-12-26T07:29:18Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "karesztrk",
        "avatar_url": "https://avatars.githubusercontent.com/u/5886428?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjZr5",
      "number": 3112,
      "title": "Fullscreen but partial width",
      "body": "Heyo, I'd like to start off by saying I've only recently started using niri and, so far, have been really enjoying it.\r\n\r\nI'm wondering if there's a way to get a column to stretch the full vertical space (i.e. from the very top pixel of the screen to the very bottom one) similar to fullscreen, without covering the full horizontal space. I'm on a 32:9 monitor and would love to be able to \"fullscreen\" a column in say 16:9 aspect ratio, and retain the other half of the screen for other columns. It's particularly frustrating with apps that do not properly support the (admittedly somewhat absurd) 32:9 aspect ratio and end up with half a screen of black space. Since fullscreen windows appear to still be \"just\" columns, I am somewhat hopeful there's some way to limit them in width, though they appear unresponsive to the `max-width` window-rule.",
      "created_at": "2025-12-24T23:57:25Z",
      "updated_at": "2025-12-25T12:55:55Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Sharp-Eyes",
        "avatar_url": "https://avatars.githubusercontent.com/u/55550164?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjZhh",
      "number": 3111,
      "title": "Place floating windows behind the window strip",
      "body": "Hey, so I want to set up sticky notes for my desktop, but I have one issue.\r\n\r\nThe sticky notes do float using a window rule, but they float **above** my current window.\r\n\r\nI want to have them *behind* the window strip, and, ideally, stay on-screen when changing workspaces\r\n\r\nI'm using [indiicator-stickynotes](https://aur.archlinux.org/packages/indicator-stickynotes) from the AUR",
      "created_at": "2025-12-24T15:48:32Z",
      "updated_at": "2025-12-24T19:00:19Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "StikyPiston",
        "avatar_url": "https://avatars.githubusercontent.com/u/156162907?u=08838f543f47944dea878729004122a95fccf331&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjZW8",
      "number": 3109,
      "title": "Firefox manage bookmarks window doesn't float by default, which internal rules auto-float dialogs?",
      "body": "Hello,\r\n\r\nI noticed the \"Manage bookmarks\" dialog box doesn't float automatically but dialog boxes from a number of tools do float by default.\r\n\r\nThe fix for this specific use case is:\r\n\r\n```kdl\r\nwindow-rule {\r\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture|Library$\"\r\n    open-floating true\r\n}\r\n```\r\n\r\nBut a takeaway I'm trying to figure out is what dictates whether or not a window is floated by default without needing to define a rule?\r\n\r\nI was going to open a PR to add this to the examples but hesitated in case there's a better way.\r\n",
      "created_at": "2025-12-24T10:49:06Z",
      "updated_at": "2025-12-24T10:49:40Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjZQF",
      "number": 3108,
      "title": "Configuring behaviour when moving mouse between monitors",
      "body": "Plasma has a feature where the mouse does not instantly switch monitors when you move it over the border, but instead you have to wait a bit before it acutally switches.\r\ni actually really like this featue and would want it in Niri too.\r\nprobably also good would be to be able to disable switching between monitors using the mouse entirely (duplicate of #2704)",
      "created_at": "2025-12-24T08:23:40Z",
      "updated_at": "2025-12-24T08:23:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjYxd",
      "number": 3104,
      "title": "DPI way to big and wont go below 1.25 even when explicitly set",
      "body": "Hello, apologies if there is an easy solve, i searched for quite awhile now and read everything i could find and nothing worked out for me.\r\n\r\ndefault niri set my scale to 1.5, i changed it to 1. nothing happened. rebooted and it kept my setting of 1 but when i do 'niri msg outputs' it displays it as 1.25. changing this via wlr-randr works.. partially.\r\n\r\ngsettings can change font scaling, and that works. the gsettings dpi scale doesnt appear to change anything though, but wlr-randr is able to get the dpi settings set across most apps correctly and everything looks good... except browsers (and i installed fuzzle since it was suggested for niri.) firefox, chrome, fuzzle all are enormous and i cant seem to get them smaller, anyone have any ideas? had no issues with this on sway, and rebooting back to sway everything is fine there.\r\n\r\nif you need any more info to help me pinpoint this I'm happy to provide. appreciate any and all help, would love to play with this rad wm some more!\r\n\r\nSpecs:\r\nArch\r\nNiri/Wayland\r\nsingle monitor T480 laptop\r\nxwayland-satellite\r\nwlr-randr\r\nsome gsettings that i think are installed via dependency to nwg-look that i used to set gtk themes on sway.\r\neverything up to date, just installed niri to try it out.",
      "created_at": "2025-12-23T15:52:04Z",
      "updated_at": "2025-12-24T04:41:40Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6fLR",
        "body": "was able to fix it with these after a reboot\r\ngsettings set org.gnome.desktop.interface scaling-factor 1\r\ngsettings set org.gnome.desktop.interface text-scaling-factor 1.1\r\nwlr-randr --output eDP-1 --scale 1\r\n\r\njust made a startup script to force it to persist.\r\n\r\n"
      },
      "user": {
        "login": "Naughtyusername",
        "avatar_url": "https://avatars.githubusercontent.com/u/52771412?u=f70bda22955d872ec19911d5f871e9fb610d8f49&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkLks",
      "number": 3457,
      "title": "Better `disabled-on-external-mouse` detection is needed for the option to work.",
      "body": "I read the code, currently while it looks good on paper, but in reality it doesn't account for funky stuff existing.\n\nHere on my Framework 12, where stylus, touch and fancy touchpad stuff exist, it's very much never going to work.\nThere is also keyd, which is a virtual kb/mouse remapping daemon which also appears as a libinput device.\n\nI did create experiemental patches for catching and filtering it out, but it didn't quite work out as my system has a lot more stuff that doesn't get detected properly.\n\nHere's libinput data, no external mouse attached:\n```\n[bill88t@FraemeWoke | ~]> sudo libinput list-devices\nDevice:                  Video Bus\nKernel:                  /dev/input/event15\nId:                      host:0000:0006\nGroup:                   1\nSeat:                    seat0, default\nCapabilities:            keyboard\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             n/a\nNat.scrolling:           n/a\nMiddle emulation:        n/a\nCalibration:             n/a\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          n/a\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  Lid Switch\nKernel:                  /dev/input/event0\nId:                      host:0000:0005\nGroup:                   2\nSeat:                    seat0, default\nCapabilities:            switch\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             n/a\nNat.scrolling:           n/a\nMiddle emulation:        n/a\nCalibration:             n/a\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          n/a\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  Power Button\nKernel:                  /dev/input/event1\nId:                      host:0000:0001\nGroup:                   3\nSeat:                    seat0, default\nCapabilities:            keyboard\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             n/a\nNat.scrolling:           n/a\nMiddle emulation:        n/a\nCalibration:             n/a\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          n/a\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  ILIT2901:00 222A:5539\nKernel:                  /dev/input/event7\nId:                      i2c:222a:5539\nGroup:                   4\nSeat:                    seat0, default\nSize:                    264x166mm\nCapabilities:            touch\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             n/a\nNat.scrolling:           n/a\nMiddle emulation:        n/a\nCalibration:             identity matrix\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          n/a\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  ILIT2901:00 222A:5539 Stylus\nKernel:                  /dev/input/event8\nId:                      i2c:222a:5539\nGroup:                   4\nSeat:                    seat0, default\nSize:                    264x166mm\nCapabilities:            tablet\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             n/a\nNat.scrolling:           n/a\nMiddle emulation:        n/a\nCalibration:             identity matrix\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          none\nRotation:                n/a\nArea rectangle:          n/a\n\nDevice:                  ILIT2901:00 222A:5539 Mouse\nKernel:                  /dev/input/event9\nId:                      i2c:222a:5539\nGroup:                   4\nSeat:                    seat0, default\nSize:                    264x166mm\nCapabilities:            pointer\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             disabled\nNat.scrolling:           disabled\nMiddle emulation:        disabled\nCalibration:             identity matrix\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          n/a\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  FRMW0004:00 32AC:0006 Consumer Control\nKernel:                  /dev/input/event6\nId:                      i2c:32ac:0006\nGroup:                   5\nSeat:                    seat0, default\nCapabilities:            keyboard pointer\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             n/a\nNat.scrolling:           disabled\nMiddle emulation:        n/a\nCalibration:             n/a\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          n/a\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  FRMW0004:00 32AC:0006 Wireless Radio Control\nKernel:                  /dev/input/event5\nId:                      i2c:32ac:0006\nGroup:                   5\nSeat:                    seat0, default\nCapabilities:            keyboard\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             n/a\nNat.scrolling:           n/a\nMiddle emulation:        n/a\nCalibration:             n/a\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          n/a\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  PIXA3854:00 093A:0239 Touchpad\nKernel:                  /dev/input/event10\nId:                      i2c:093a:0239\nGroup:                   6\nSeat:                    seat0, default\nSize:                    113x70mm\nCapabilities:            pointer gesture\nTap-to-click:            disabled\nTap-and-drag:            enabled\nTap button map:          left/right/middle\nTap drag lock:           disabled\nLeft-handed:             disabled\nNat.scrolling:           disabled\nMiddle emulation:        disabled\nCalibration:             n/a\nScroll methods:          *two-finger edge\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           *button-areas clickfinger\nClickfinger button map:  left/right/middle\nDisable-w-typing:        enabled\nDisable-w-trackpointing: enabled\nAccel profiles:          flat *adaptive custom\nRotation:                n/a\nArea rectangle:          n/a\n\nDevice:                  PIXA3854:00 093A:0239 Mouse\nKernel:                  /dev/input/event11\nId:                      i2c:093a:0239\nGroup:                   6\nSeat:                    seat0, default\nCapabilities:            pointer\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             disabled\nNat.scrolling:           disabled\nMiddle emulation:        n/a\nCalibration:             n/a\nScroll methods:          *button\nScroll button:           BTN_RIGHT\nScroll button lock:      disabled\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          flat *adaptive custom\nRotation:                n/a\nArea rectangle:          n/a\n\nDevice:                  gpio-keys\nKernel:                  /dev/input/event14\nId:                      host:0001:0001\nGroup:                   7\nSeat:                    seat0, default\nCapabilities:            switch\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             n/a\nNat.scrolling:           n/a\nMiddle emulation:        n/a\nCalibration:             n/a\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          n/a\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  AT Translated Set 2 keyboard\nKernel:                  /dev/input/event2\nId:                      serial:0001:0001\nGroup:                   8\nSeat:                    seat0, default\nCapabilities:            keyboard\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             n/a\nNat.scrolling:           n/a\nMiddle emulation:        n/a\nCalibration:             n/a\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          n/a\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  ImExPS/2 Generic Explorer Mouse\nKernel:                  /dev/input/event12\nId:                      serial:0002:0006\nGroup:                   9\nSeat:                    seat0, default\nCapabilities:            pointer\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             disabled\nNat.scrolling:           disabled\nMiddle emulation:        disabled\nCalibration:             n/a\nScroll methods:          button\nScroll button:           BTN_MIDDLE\nScroll button lock:      disabled\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          flat *adaptive custom\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  keyd virtual keyboard\nKernel:                  /dev/input/event16\nId:                      usb:0fac:0ade\nGroup:                   10\nSeat:                    seat0, default\nCapabilities:            keyboard\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             n/a\nNat.scrolling:           n/a\nMiddle emulation:        n/a\nCalibration:             n/a\nScroll methods:          none\nScroll button:           n/a\nScroll button lock:      n/a\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          n/a\nRotation:                0.0\nArea rectangle:          n/a\n\nDevice:                  keyd virtual pointer\nKernel:                  /dev/input/event17\nId:                      usb:0fac:1ade\nGroup:                   11\nSeat:                    seat0, default\nCapabilities:            pointer\nTap-to-click:            n/a\nTap-and-drag:            n/a\nTap button map:          n/a\nTap drag lock:           n/a\nLeft-handed:             disabled\nNat.scrolling:           disabled\nMiddle emulation:        disabled\nCalibration:             identity matrix\nScroll methods:          button\nScroll button:           BTN_MIDDLE\nScroll button lock:      disabled\nClick methods:           none\nClickfinger button map:  n/a\nDisable-w-typing:        n/a\nDisable-w-trackpointing: n/a\nAccel profiles:          flat *adaptive custom\nRotation:                0.0\nArea rectangle:          n/a\n\n[bill88t@FraemeWoke | ~]>\n```\n\nI could roughly begin patching out and blacklisting devices, but I don't think this will quite pan out that well.\nHow do you think this should be fixed?",
      "created_at": "2025-11-01T13:36:54Z",
      "updated_at": "2026-02-16T04:49:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bill88t",
        "avatar_url": "https://avatars.githubusercontent.com/u/21365918?u=8ca20a74cedb55df68b308c96b3ac82ef3c338e7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjY_4",
      "number": 3107,
      "title": "Tabs always have semi-transparent tab indicators when you are not focused on a window in the tab column.",
      "body": "Hi, \r\n\r\nI've had a good look through the available documentation and unfortunately do not see anything that matches the behaviour I am seeing. When you are active on another window that is not in a tab column, if you do have a tab column on screen, the indicators always go semi-transparent. Is there a way to disable this behaviour?",
      "created_at": "2025-12-23T23:24:41Z",
      "updated_at": "2025-12-23T23:24:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "lwilletts",
        "avatar_url": "https://avatars.githubusercontent.com/u/8454096?u=17e5ac016223a2e9d84fe894efe779bd39fe086f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjI0N",
      "number": 2980,
      "title": "Niri Settings with keybind editor",
      "body": "Some time I'm playing with this, now added a shortcut editor. \r\n`niri validate` is built-in in the \"Files\" tab. Niri v25.11 is mandatory for it.\r\nTesting appreciated :)\r\n\r\n<img width=\"713\" height=\"1001\" alt=\"editor\" src=\"https://github.com/user-attachments/assets/78e2dea4-f6b0-4183-b79b-6f08704c1d57\" />\r\n\r\n\r\nhttps://github.com/stefonarch/niri-settings",
      "created_at": "2025-12-05T09:16:27Z",
      "updated_at": "2025-12-23T23:06:22Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "stefonarch",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?u=a2928499988ebbb05ef99547bd768ab7bbcf2fd2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjYvU",
      "number": 3103,
      "title": "Ability to stitch displays / Create super displays",
      "body": "The idea is to combine 2 monitors that are physically the same size into one bigger monitor. This would mean that niri doesn't think of them as seperate monitors but as one big monitor. When a window is fullscreen it would thus span both monitors. \r\n\r\nThis is useful for monitors like the Barco Fusion series that physically look like they're one screen but actually have 2 displayport inputs, one for each half of the monitor. This is because of the limit in bandwith that the cables support.\r\n\r\nAnother use case is when using a DIY ultrawide monitor by just putting 2 normal displays next to each other and making your window so big it spans both monitors.\r\n```\r\n|-------------|-------------|         |---------------------------|\r\n|             |             |         |                           |\r\n|             |             |   -->   |                           |\r\n|             |             |         |                           |\r\n|-------------|-------------|         |---------------------------|\r\n```",
      "created_at": "2025-12-23T15:00:47Z",
      "updated_at": "2025-12-23T19:18:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "TimoNotThy",
        "avatar_url": "https://avatars.githubusercontent.com/u/67267822?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJKg",
      "number": 2454,
      "title": "Span workspace across monitors",
      "body": "I want to use two or three monitors side by side with a single workspace spanning both of them. I simulated this in VR with a virtual 32:9 and found the workflow to be very nice since scrolling didn't make my windows disappear, without the need to move my windows to another monitor.\r\n\r\nPartially related to #2309.\r\n\r\nAlso thank you to the devs! I'm a big Niri fan.",
      "created_at": "2025-09-26T19:42:51Z",
      "updated_at": "2025-12-23T19:17:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tarkpate",
        "avatar_url": "https://avatars.githubusercontent.com/u/25259698?u=0e53b8c56c6a5f0307a8aa1d2724cba6bbdfdd55&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjYtS",
      "number": 3102,
      "title": "Remove empty workspace when unplugging the screen and keep focus",
      "body": "With two outputs (one external screen and one laptop), when I unplug the external screen the workspaces get moved to the laptop. That's great!\r\n\r\nBut when there is a single empty workspace on the laptop, it would feel a bit better (in terms of discoverability and workflow) to overwrite that empty workspace with non-empty workspaces from the unplugged screen. After plugging the external screen back in, they would be moved back to it.\r\n\r\nSimilarly with focus: if I have something focused on the external screen, it would be great if after unplugging that screen, the focus would be kept - but now on laptop screen.",
      "created_at": "2025-12-23T14:17:32Z",
      "updated_at": "2025-12-23T14:17:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alternateved",
        "avatar_url": "https://avatars.githubusercontent.com/u/45176912?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiUnx",
      "number": 2545,
      "title": "How to set a dark theme?",
      "body": "Hello,\r\n\r\nI'm using niri that came with CachyOS. There are apps like LibreOffice and Thunar that I'd like to have a dark theme for, but changing the GTK_THEME variable doesn't seem to do anything. If I run them with the command `GTK_THEME=Adwaita:dark thunar`, it does work. I could make aliase for these apps, but is there a simpler way to enforce a theme for all apps that use it?",
      "created_at": "2025-10-07T18:48:27Z",
      "updated_at": "2025-12-23T13:27:48Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "jkimsis",
        "avatar_url": "https://avatars.githubusercontent.com/u/27342353?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjXsf",
      "number": 3091,
      "title": "Window rule two match with AND operation",
      "body": "I want WIndow rule, but with AND operation:\r\n\r\n```\r\nwindow-rule {\r\n    match app-id=r#\"localsend_app$\"#\r\n    match at-startup=true\r\n    open-floating true\r\n    open-on-workspace \"3\"\r\n}\r\n```\r\nThis two match work with OR operand. But I would like it to work with an AND operand, so that this rule only applies if both matches are true at the same time.\r\nIs this possible?\r\n",
      "created_at": "2025-12-22T10:59:45Z",
      "updated_at": "2025-12-22T22:36:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6cib",
        "body": "I had a typo, here is the correct one:\r\n```\r\nwindow-rule {\r\n    match app-id=r#\"localsend_app$\"# at-startup=true\r\n    open-floating true\r\n    open-on-workspace \"3\"\r\n}\r\n```"
      },
      "user": {
        "login": "og900aero",
        "avatar_url": "https://avatars.githubusercontent.com/u/49487376?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjX4F",
      "number": 3094,
      "title": "Fallbak Keybindings",
      "body": "Is there a way to create a fallback action for a single keybind? \r\n\r\nFor example, I would like to use `SUPER+arrows` to move between columns and monitors. If there are no columns left in the workspace it would move my focus to the next monitor. \r\n\r\nI tried these 2 approaches but neither were considered valid syntax.\r\n```kdl\r\n    Mod+Left  { focus-column-left;  focus-monitor-left; }\r\n    Mod+Right { focus-column-right; focus-monitor-right; }\r\n\r\n    Mod+Left  { focus-column-left || focus-monitor-left; }\r\n    Mod+Right { focus-column-right || focus-monitor-right; }\r\n```",
      "created_at": "2025-12-22T14:40:05Z",
      "updated_at": "2025-12-22T20:44:38Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6b8X",
        "body": "No, you cant."
      },
      "user": {
        "login": "pladypus",
        "avatar_url": "https://avatars.githubusercontent.com/u/56337621?u=46b3512fa3d5ca603cd3e7d06016e0dc2746b909&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjYHP",
      "number": 3098,
      "title": "Feature Request: Dont show border and focus ring, when only one window opened.",
      "body": "It would be nice to have an option to disable the border and focus ring when only one window is open in a workspace. In Bspwm, this was called borderless monocle.",
      "created_at": "2025-12-22T20:37:15Z",
      "updated_at": "2025-12-22T20:37:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "og900aero",
        "avatar_url": "https://avatars.githubusercontent.com/u/49487376?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjX9l",
      "number": 3096,
      "title": "IDEA: Cycle through focus states, think of something like CTRL+O / CTRL +I in Vim",
      "body": "I have a few key binds that help me \"launch or focus\" certain tools that should only run 1 instance, like `rmpc` (mpd client). I wired that up with niri to either find the window and focus it or spawn it.\r\n\r\nBut it got me to thinking, it would be neat if you could hit `Mod+O` to go back to where you were previously focused, just like `CTRL+O` in Vim lets you move between your jumps. `Mod+I` would go forward instead of back.\r\n\r\nIf keeping track of all focus states is too resource intensive it would handy to have a way to go back and forth between the last and current focused windows. Tools like `cd -` let you do this to quickly jump between 2 paths. Likewise `git checkout -` lets you switch branches.\r\n\r\nRandom aside, I'm only a few hours into using niri on my main dev box and this is the best piece of software I've ever used in over 20+ years of computing. It's a masterpiece that has such a deep connection and involvement to how you use your environment. I'm only including this because my excitement level is well over 100% at the moment.",
      "created_at": "2025-12-22T16:39:00Z",
      "updated_at": "2025-12-22T20:11:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6cXM",
        "body": "Maybe niri's Alt-tab feature can help with this."
      },
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjXXW",
      "number": 3085,
      "title": "Niri ScreenCast through xdg-desktop-portal-gnome requires Mutter to be running?",
      "body": "ScreenCast doesn't work on Niri in Google Meet on both Firefox and Chromium. While trying to debug this, I noticed that if I run `busctl --user introspect org.freedesktop.impl.portal.desktop.gnome /org/freedesktop/portal/desktop`, I don't see `org.freedesktop.impl.portal.ScreenCast` in the list. However, if I run `mutter --headless` in the background, it pops up magically:\r\n```\r\norg.freedesktop.impl.portal.ScreenCast      interface -                      -            -\r\n.CreateSession                              method    oosa{sv}               ua{sv}       -\r\n.SelectSources                              method    oosa{sv}               ua{sv}       -\r\n.Start                                      method    oossa{sv}              ua{sv}       -\r\n.AvailableCursorModes                       property  u                      7            emits-change\r\n.AvailableSourceTypes                       property  u                      7            emits-change\r\n.version                                    property  u                      5            emits-change\r\n```\r\n\r\nI looked at the [source code](https://github.com/GNOME/xdg-desktop-portal-gnome) and it seems like `org.freedesktop.impl.portal.ScreenCast` is exported only if `org.gnome.Mutter.ScreenCast` is exported, which seem to require Mutter to be running.\r\n\r\nScreenCast initialization in `xdg-desktop-portal-gnome` is done in [`screencast.c`](https://github.com/GNOME/xdg-desktop-portal-gnome/blob/0a3499e0e04f4f9b657bf404f9266dd23d03d2ae/src/screencast.c#L956). Function [`on_gnome_screen_cast_enabled`](https://github.com/GNOME/xdg-desktop-portal-gnome/blob/0a3499e0e04f4f9b657bf404f9266dd23d03d2ae/src/screencast.c#L848) is the function that actually exports `org.freedesktop.impl.portal.ScreenCast`, which only gets called on the `enabled` signal of `GnomeScreenCast`:\r\n```c\r\ngboolean\r\nscreen_cast_init (GDBusConnection  *connection,\r\n                  GError          **error)\r\n{\r\n  /*\r\n   * Ensure ShellIntrospect and DisplayStateTracker are initialized before\r\n   * any screencast session is created to avoid race conditions when restoring\r\n   * previous streams.\r\n   */\r\n  display_state_tracker_get ();\r\n  shell_introspect_get ();\r\n\r\n  impl_connection = connection;\r\n  gnome_screen_cast = gnome_screen_cast_new (connection);\r\n\r\n  g_signal_connect (gnome_screen_cast, \"enabled\",\r\n                    G_CALLBACK (on_gnome_screen_cast_enabled), NULL);\r\n  g_signal_connect (gnome_screen_cast, \"disabled\",\r\n                    G_CALLBACK (on_gnome_screen_cast_disabled), NULL);\r\n\r\n  return TRUE;\r\n}\r\n```\r\nand the creation of `GnomeScreenCast` watches for the existence of `org.gnome.Mutter.ScreenCast` to turn on the `enabled` signal in [`gnomescreencast.c`](https://github.com/GNOME/xdg-desktop-portal-gnome/blob/0a3499e0e04f4f9b657bf404f9266dd23d03d2ae/src/gnomescreencast.c#L786):\r\n```c\r\nstatic void\r\ngnome_screen_cast_class_init (GnomeScreenCastClass *klass)\r\n{\r\n  signals[ENABLED] = g_signal_new (\"enabled\",\r\n                                   G_TYPE_FROM_CLASS (klass),\r\n                                   G_SIGNAL_RUN_LAST,\r\n                                   0,\r\n                                   NULL, NULL,\r\n                                   NULL,\r\n                                   G_TYPE_NONE, 0);\r\n  signals[DISABLED] = g_signal_new (\"disabled\",\r\n                                    G_TYPE_FROM_CLASS (klass),\r\n                                    G_SIGNAL_RUN_LAST,\r\n                                    0,\r\n                                    NULL, NULL,\r\n                                    NULL,\r\n                                    G_TYPE_NONE, 0);\r\n}\r\n\r\nGnomeScreenCast *\r\ngnome_screen_cast_new (GDBusConnection *connection)\r\n{\r\n  GnomeScreenCast *gnome_screen_cast;\r\n\r\n  gnome_screen_cast = g_object_new (gnome_screen_cast_get_type (), NULL);\r\n  gnome_screen_cast->screen_cast_name_watch =\r\n    g_bus_watch_name (G_BUS_TYPE_SESSION,\r\n                      \"org.gnome.Mutter.ScreenCast\",\r\n                      G_BUS_NAME_WATCHER_FLAGS_NONE,\r\n                      gnome_screen_cast_name_appeared,\r\n                      gnome_screen_cast_name_vanished,\r\n                      gnome_screen_cast,\r\n                      NULL);\r\n\r\n  return gnome_screen_cast;\r\n}\r\n```\r\n\r\nTo make matters worse, screencasting this way still doesn't work (i.e. the window selection dialog pops up, but I get an error when sharing):\r\n```\r\nDec 21 23:10:03 solus xdg-desktop-portal-gnome[35536]: Failed to associate portal window with parent window\r\nDec 21 23:10:04 solus xdg-desktop-portal-gnome[35536]: vkAcquireNextImageKHR(): A swapchain no longer matches the surface properties exactly, but can still be used to present to the surfa>\r\nDec 21 23:16:38 solus xdg-desktop-portal-gnome[35536]: Failed to associate portal window with parent window\r\n```\r\nAdmittedly `xdg-desktop-portal-wlr` works, but it only supports sharing the entire window. The only feature-rich screencasting portal with an intuitive UI that I can find is GNOME's implementation, so I really want to use it if I can.\r\n\r\nFor people who have screencast with GNOME portals working (the recommended way in the Wiki), can you check your running processes to see if `mutter` is running when your screencast is working? ",
      "created_at": "2025-12-22T04:33:10Z",
      "updated_at": "2025-12-22T17:32:37Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6cTC",
        "body": "Thank you so much @nickjj! Turns out my distro was not enabling the correct Cargo features (`xdp-gnome-screencast`), and after fixing that getsolus/packages#7454 all the screencasting are working good again!"
      },
      "user": {
        "login": "GZGavinZhao",
        "avatar_url": "https://avatars.githubusercontent.com/u/74938940?u=b89428090adc93ed89495397e7c23ac5192d8cdc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjV2_",
      "number": 3072,
      "title": "Maybe a silly question: Niri auto-theme configuration",
      "body": "does it exist something like this: https://github.com/JaKooLit/Hyprland-Dots\r\n\r\nfor niri?",
      "created_at": "2025-12-19T15:31:27Z",
      "updated_at": "2025-12-22T11:14:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6Xu5",
        "body": "Perhaps,  [`DMS`](https://github.com/AvengeMedia/DankMaterialShell) will work "
      },
      "user": {
        "login": "Salvodif",
        "avatar_url": "https://avatars.githubusercontent.com/u/107290?u=2aece97cba1a070635010fea259341b696fec60f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjXrJ",
      "number": 3090,
      "title": "flash on focused windows",
      "body": "According to this PR [2918](\r\nhttps://github.com/YaLTeR/niri/pull/2918), I used AI to generate code that implements window scaling when the window is focused. How does this effect look? Since the code was generated by AI and I'm not very familiar with Rust, if everyone thinks it's good, you can refer to the code [impl](https://github.com/obmutescences/niri/commit/8e1a6603bee948ee8856d18aa47d9fcbb988f75a) implementation and submit a PR. Additionally, I used AI to generate some custom shaders.\r\n\r\nflash:\r\n\r\nhttps://github.com/user-attachments/assets/5e7cf7a1-1d05-44c8-8a18-34c70e2cf399\r\n\r\n\r\ncustom shaders:\r\n\r\n\r\nhttps://github.com/user-attachments/assets/4fc4e0a2-eeff-4695-b3cf-6c695c5fe321\r\n\r\n",
      "created_at": "2025-12-22T10:24:42Z",
      "updated_at": "2025-12-25T02:13:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "obmutescences",
        "avatar_url": "https://avatars.githubusercontent.com/u/29330637?u=2d7b6f2494d0a25b312178edc2bae4618b95680d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjXhG",
      "number": 3088,
      "title": "Is there a way to get the PID of the main process associated with a window",
      "body": "I need to perform some action on the window created by a spawned command, but I do not find any way to relate the window to the spawned command ?\r\nI think in sway the  json windows tree contains the PID for each window. Does something similar exists for niri ?",
      "created_at": "2025-12-22T08:07:02Z",
      "updated_at": "2025-12-22T09:46:58Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6bLn",
        "body": "`niri msg windows -j` and `jq` magic."
      },
      "user": {
        "login": "matclab",
        "avatar_url": "https://avatars.githubusercontent.com/u/985910?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjXXe",
      "number": 3086,
      "title": "\"scroll-button-lock-cancel-on-button-down\" how do i set it up in niri config ?",
      "body": "        scroll-method \"on-button-down\"\r\n        scroll-button-lock\r\n        scroll-button-lock-cancel-on-button-down  // Applies here too\r\n    }\r\n   \r\n    was trying to configure niri using AI for better scrolling, and when tried to apply this to the config file, the config wasnt valid.\r\n    Then at the web, the AI said that it doesnt exist in niri 25.08 and gave me some workarounds which are as follows :\r\n    \r\n    bind 0, mouse:1 to \"code: cancel-scroll\"  // Left click exits scroll",
      "created_at": "2025-12-22T04:37:47Z",
      "updated_at": "2025-12-22T04:37:47Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "theogc0mp1ex15",
        "avatar_url": "https://avatars.githubusercontent.com/u/247753387?u=4a0eefc54000abc8c08bd03525ad3482babebdb9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjXXS",
      "number": 3084,
      "title": "\"scroll button lock cancel on button down\" feature request",
      "body": "``` mouse {\r\n        scroll-method \"on-button-down\"\r\n        scroll-button-lock\r\n        scroll-button-lock-cancel-on-button-down  // Applies here too\r\n    }\r\n    ```\r\n    was trying to configure niri using AI for better scrolling, and when tried to apply this to the config file, the config wasnt valid.\r\n    Then at the web, the AI said that it doesnt exist in niri 25.08 and gave me some workarounds which are as follows :\r\n    \r\n    bind 0, mouse:1 to \"code: cancel-scroll\"  // Left click exits scroll",
      "created_at": "2025-12-22T04:31:11Z",
      "updated_at": "2025-12-22T04:31:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theogc0mp1ex15",
        "avatar_url": "https://avatars.githubusercontent.com/u/247753387?u=4a0eefc54000abc8c08bd03525ad3482babebdb9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjW6Y",
      "number": 3082,
      "title": "A windowrule or layer rule for open windows in new workspace",
      "body": "Hello, I would like to suggest an idea related to creating two or three new lines for use in the rules.  \r\n\r\nTheir essence is simple: when using this line, windows automatically open in a new, empty workspace, instead of opening in the current one.  They can still be moved around as before. \r\n\r\nWhy two rules? One for using a line with an empty workspace before the others, and the second for the classic behavior. Perhaps something similar could be added for layout, but I don't quite understand how that could be implemented.",
      "created_at": "2025-12-21T13:30:00Z",
      "updated_at": "2025-12-21T13:30:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "justpav05",
        "avatar_url": "https://avatars.githubusercontent.com/u/207265050?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfYhW",
      "number": 1453,
      "title": "Zoom meeting screen sharing",
      "body": "Hi everyone,\r\n\r\nDoes anyone have a working config for Zoom meeting screen sharing? I can screencast in OBS etc but when I try to start sharing in Zoom I get a message saying that I need to use gnome, sway, hyprland, or x... \r\n\r\nThanks!",
      "created_at": "2025-04-21T15:40:29Z",
      "updated_at": "2025-12-21T01:47:54Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "emenel",
        "avatar_url": "https://avatars.githubusercontent.com/u/13215?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjV_C",
      "number": 3073,
      "title": "How to disable modal window?",
      "body": "One of my windows is modal which means I can't use my MOD key as it takes full keyboard control.\r\n\r\nHow can i disable said behavior?",
      "created_at": "2025-12-19T18:19:18Z",
      "updated_at": "2025-12-19T22:56:07Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6X_h",
        "body": "Perhaps this..?\r\nhttps://yalter.github.io/niri/Configuration%3A-Key-Bindings.html#toggle-keyboard-shortcuts-inhibit"
      },
      "user": {
        "login": "BluewyDiamond",
        "avatar_url": "https://avatars.githubusercontent.com/u/115411576?u=784fbbf63c47cf5135b8f5d281af4f2caac27331&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjVGq",
      "number": 3068,
      "title": "Option to disable any unconfigured output screen",
      "body": "I would like a config options like one of these:\r\n\r\n```\r\nenable_unknown_outputs true # default, current behavior\r\nenable_unknown_outputs false # New behavior\r\n\r\n```\r\n\r\nCurrently Niri will automatically enable any monitor it finds, even if it is not configured in config.kdl. This is a perfectly reasonable and sane default. This may not however always be desired.\r\n\r\n**Gotcha**\r\n\r\nWill need to make sure that at least 1 screen is always turned on, even if it is not configured when this option is set to false. Would not want to end up with no outputs.\r\n\r\n**My use case:**\r\n\r\nI have an AMD gpu that causes OOMs when connected to multiple monitors while idle and screens off. So if I lock my screen and leave for ~6 hours I will come back to find everything has been closed by the OOM killer. This is a known issue with AMD cards, and is not a niri issue. There was a kernel fix, but it added new bugs and was reverted.\r\n\r\nAnyway, I have a fix where my lock script is this:\r\n\r\n```\r\n#!/usr/bin/sh\r\nln -sf /home/exodist/.config/niri/screens_locked.kdl /home/exodist/.config/niri/screens.kdl\r\ndms ipc call lock lock &\r\nniri msg action power-off-monitors &\r\n\r\nsleep 2;\r\n\r\nwhile [ 1 ]; do\r\n    if [ `dms ipc call lock isLocked` = 'false' ]; then\r\n        ln -sf /home/exodist/.config/niri/screens_unlocked.kdl /home/exodist/.config/niri/screens.kdl\r\n        exit 0;\r\n    fi\r\n    sleep 1;\r\ndone\r\n```\r\n\r\nAnd it works. Problem is I move between multiple docking stations, and I also sometimes use various external monitors.\r\n\r\nCurrently I have to add a section to mt screens_locked.kdl for every monitor I want to turn off. If I end up on a dock I have not been on before, or a new external monitor, I need to add a section. This is tedious. I would prefer if I could configure screens_locked.kdl to just disable any unconfigured monitor, and list only the main one as being on.",
      "created_at": "2025-12-18T19:22:25Z",
      "updated_at": "2025-12-18T19:22:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "exodist",
        "avatar_url": "https://avatars.githubusercontent.com/u/73914?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjU_c",
      "number": 3066,
      "title": "Keep floating window centered when resized",
      "body": "Hello,\r\nI'm using  centered floating windows for pdf and image preview, but when i resize them, they don't keep centered...\r\nAny way to archive that ? I searched the options, but found none.",
      "created_at": "2025-12-18T16:40:53Z",
      "updated_at": "2025-12-18T17:58:17Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6VYm",
        "body": "ok thanks @YaLTeR and @Sempyos \r\n\r\nI made this script :\r\n\r\n ```bash\r\n #!/usr/bin/env bash\r\n\r\nWINDOW_JSON=$(niri msg --json focused-window)\r\nIS_FLOATING=$(echo \"$WINDOW_JSON\" | jq '.is_floating')\r\n\r\nniri msg action set-column-width $1;\r\n\r\nif [ \"$IS_FLOATING\" == \"true\" ]; then\r\n  niri msg action center-window\r\nfi\r\n```\r\n\r\nafter put this in my niri config:\r\n\r\n```kdl\r\n    Mod+Equal { spawn-sh \"~/Code/nixos-config/scripts/center-after-resize.sh +10%\"; }\r\n    Mod+Minus { spawn-sh \"~/Code/nixos-config/scripts/center-after-resize.sh -10%\"; }\r\n```\r\n\r\nProbably not the most elegant way but it seems to work."
      },
      "user": {
        "login": "mrflos",
        "avatar_url": "https://avatars.githubusercontent.com/u/124845?u=6cdaa2e5b8552e05b5911c4155a6d065758895a0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjU3Y",
      "number": 3065,
      "title": "Structured output of all key binds accessible through the CLI?",
      "body": "I've set up all of my binds using `hotkey-overlay-title` but I noticed the important mappings window is not tall enough to view them all. There is an open issue calling that out in https://github.com/YaLTeR/niri/issues/173.\r\n\r\nFor now I'd like to create my own little menu by getting both the key map and the title for each bind. I was hoping to be able to get a JSON dump of this data or at least something that can be parsed.\r\n\r\nIf not, parsing the config file directly will be possible but that would involve scanning all kdl files and using a regex to extract out everything. It's all easy to do in a shell script but was wondering if listing all binds could be something added in the future?\r\n\r\nOr is it better to focus on the important mappings window to support it showing an unlimited amount of binds? Splitting into multiple columns and / or allowing searching to filter it down would be great.",
      "created_at": "2025-12-18T14:01:21Z",
      "updated_at": "2025-12-18T17:19:23Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjTid",
      "number": 3057,
      "title": "New experimental xx-keyboard-filter protocol",
      "body": "https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/465 ",
      "created_at": "2025-12-17T04:16:07Z",
      "updated_at": "2025-12-18T12:13:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "falser101",
        "avatar_url": "https://avatars.githubusercontent.com/u/62228193?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjUtE",
      "number": 3064,
      "title": "Corner radius for overview",
      "body": "It would be nice if we can set the corner radius for the overview wallpaper frame, just like we can with windows.",
      "created_at": "2025-12-18T10:42:45Z",
      "updated_at": "2025-12-18T10:42:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "musjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/72612857?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjUYp",
      "number": 3062,
      "title": "Customize touchpad/touchscreen gesture bindings to shortcut keys",
      "body": "https://gesturesign.win/#/\r\n\r\nSome software similar to the one linked above，GestureSign\r\n\r\nCould you add shortcut key bindings for various gestures in the configuration file for a better experience on the touchpad/touchscreen?",
      "created_at": "2025-12-18T01:39:33Z",
      "updated_at": "2025-12-18T01:41:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Ekkone",
        "avatar_url": "https://avatars.githubusercontent.com/u/38444906?u=d755fb41363b2adc09c214e858ae172b4921b874&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjUAX",
      "number": 3059,
      "title": "Allow windows to have a fully transparent background",
      "body": "I'm not sure if this is already in Niri or has been suggested before since I couldn't find any relevant issue or discussion. I'm interested in having this feature to be able to use desktop companions like [On-Together](https://store.steampowered.com/app/3707400/OnTogether_Virtual_CoWorking/). The way Niri currently behaves is rendering a black background on blank areas that is expected to be transparent.\r\n\r\nHere's a screenshot of how things look like right now:\r\n<img width=\"1920\" height=\"1080\" alt=\"Image of On-Together in desktop mode with a black background instead of a transparent one\" src=\"https://github.com/user-attachments/assets/0d95250c-d217-4fc3-a102-158e57ac49b7\" />\r\n\r\nI don't know if this is the WM's responsibility or Xwayland Satellite's. Let me know what you all think.\r\n\r\nRelated discussions:\r\n- #2743 ",
      "created_at": "2025-12-17T14:49:00Z",
      "updated_at": "2025-12-17T20:19:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "itsanonmelody",
        "avatar_url": "https://avatars.githubusercontent.com/u/37172966?u=7cc7d94f90507097b14189299e5521424909b1fb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjULQ",
      "number": 3060,
      "title": "Move column to workspace named",
      "body": "I'm not sure if this is a feature or a bug, but when having a binding that's running the \"focus-workspace\" command with a number after it, it can focus on a specific named workspace as well. \r\n\r\nFor example, if I have a named workspace as my first workspace that's called \"main\" and I have a bind that says \"focus-workspace 1\", it will focus on that named \"main\" workspace. \r\n\r\nWhile trying out the \"move-column-to-workspace\" command, it doesn't work the same way as the example above and just doesn't do anything. Is this a bug, or is this how it's supposed to be? ",
      "created_at": "2025-12-17T18:42:57Z",
      "updated_at": "2025-12-17T18:44:28Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "spiros132",
        "avatar_url": "https://avatars.githubusercontent.com/u/98518357?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjTQ9",
      "number": 3056,
      "title": "Gauging interest: working towards window-rule matcher completeness",
      "body": "Just to preface this, I absolutely adore niri and the ideas behind it. It has changed my workflow immensely, in ways large and small. That being said, I don't think anyone would argue with my saying that it's very much a work-in-progress. One area that's a bit lacking in my opinion is window-rule matchers: what they can specify, where they can be put, etc.\r\n\r\n***\r\n\r\nI'm mostly a Python and C/C++ programmer and have no experience in Rust, so some of this next bit might be not quite correct, but I think part of this shortfall comes from the internal structure of niri itself. Window-rules and the boolean values they reference seem to be managed by the individual \"Window\" structs, with setter functions to change the values. For activity- and focus-related fields, the setter functions are called in the `refresh` functions of the `ScrollingSpace` and `FloatingSpace` layouts that belong to the `Workspace`  layout element. Each layer of the structure has approximately zero information about anything above it in the hierarchy, aside from values passed in the arguments of `refresh`. This limits the information that can be passed to windows to set window-rule values. For example, the `ScrollingSpace` element knows about its columns, so it can tell which of its columns is active (even if it's not in the active workspace or output or if the floating layout is active) and which window in each column is the active one (even if, again, that column is not active). From the `refresh` arguments, it knows whether it is an active element and whether it has focus, so it can find the active and focused sub-elements. But if the activity boolean is false, it doesn't know much else about the state of the system.\r\n\r\nHaving said all that, I think the following possibly-useful window-rule matchers are worth considering and would help allow specification of a more logically-complete set of window activity states  (some overlap with previous posts, and the names are just a first-stab):\r\n\r\n- `is-in-active-column`: Works like `is-active-in-column`, except for the active column of a scrolling layout instead of the active tile in a column. Always true for floating windows. This would be trivially easy to implement, just follow `is-active-in-column`. Fully independent of the active output and focus state.\r\n  - NOTE: with this addition, I also think that for floating windows, `is-active-in-column` should only be true for the active floating window. The current behavior would be replicated by using `is-in-active-column` instead.\r\n- `is-in-active-layout`: Same as above, but for whether the window is in the active element between scrolling and floating. A bit more work to implement, as it could require passing the value of `floating_is_active` from the workspace to the scrolling and floating layouts during the refresh\r\n- `is-in-active-workspace`: You see where I'm going with this; I'm less sure about implementation difficulty due to the way workspaces and monitors are handled\r\n- `is-on-active-output`: same as previous\r\n\r\nAs an example of usefulness for this set: I like to keep non-active and non-focused windows somewhat transparent, but I often put something on my second monitor (a video, a reference, etc) that I would like to be opaque. In fact, I would like the active windows on all outputs to be opaque. Using a simple `match is-active=true` works for active windows on the current output, but not the others. Instead, I would use `match is-in-active-layout=true is-in-active-column=true is-active-in-column=true`. This should have the same behavior as saying \"if focus-ring is enabled, would it be drawn around this window in *either* the active or inactive color?\"\r\n\r\nFinally, to echo other posts, I think it would be useful to have the following (self-explanatory) rules:\r\n\r\n  - `is-fullscreen`\r\n  - `is-true-maximized`\r\n\r\nThough I think these are probably in more than one pull request already so I don't really want to touch them. \r\n\r\n***\r\n\r\nAside from this wish-list of window-rule matchers, I would also like to see window-rule overrides for named workspaces. For example, as an alternative solution for the previous example, if a window is in workspace with name \"opaque_always\", then perhaps the following would override any previous opacity definition for windows in that workspace:\r\n\r\n    workspace \"opaque_always\" {\r\n        window-rule {\r\n            opacity 1.00\r\n        }\r\n    }\r\n\r\n(I wrote this before I found #1012, but that seems to have had very little movement since it was opened so I figured I'd leave this in to maybe renew interest.)\r\n\r\n I'd also like to echo some previous requests for the ability to give windows a niri-specific 'tag'. In my mind, this would be similar in operation to POSIX groups - the actual tag could be a string containing a semicolon-delimited list of groups that the window is a member of. Then, because the individual windows would know their group memberships, it would be straightforward to implement window-rule matching for specific groups, or combinations of groups. Windows would be added or removed from groups dynamically using `niri msg` commands.\r\n\r\n***\r\n\r\nAt the moment and with no further consideration, I think that I'd be able to implement `is-in-active-column` and `is-in-active-layout`, as well as the change in behavior for `is-active-in-column`. However, I'm not a rust programmer and my familiarity with niri's source code and dev process is limited, to say the least. I'm worried about accruing any performance overhead, and stepping on toes by adding arguments to those `refresh` functions. I do understand that abstraction and hierarchical separation should be respected.\r\n\r\nI suppose what I'm asking for is a) any advice, recommendations, additions, and just general interest from the community, and b) some indication that if I implement the changes I mentioned (and assuming I do it correctly) that this is a change with a good chance of getting merged (I have no desire to try to make my own fork of niri).",
      "created_at": "2025-12-16T18:32:23Z",
      "updated_at": "2025-12-16T20:28:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "lostinthemath",
        "avatar_url": "https://avatars.githubusercontent.com/u/236709493?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkKVX",
      "number": 3450,
      "title": "mru: Sensitivity of select-on-hover in recents switcher",
      "body": "In the mru switcher, any small movement of the mouse will select the hovered window. This means, when using a sensitive mouse, i cannot use repeated alt-tab in the switcher without taking my hand off the mouse, and/or moving the cursor out of the preview area.\n\nI think the simplest solution would be to disable select-on-hover in the switcher and have to click a window to select it with the cursor, but this should maybe be behind a config toggle if anyone prefers the current solution.\n\nAlternatively, logic like in focus-follows-mouse could be used to require moving the mouse over the edge of a preview to select it, or simply a cutoff requiring the mouse to move at least X pixels to change selection. ",
      "created_at": "2025-11-26T17:26:09Z",
      "updated_at": "2026-02-15T04:54:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "topisani",
        "avatar_url": "https://avatars.githubusercontent.com/u/3133596?u=31eb62479f5082aa9ddcf058430f96d39d30bb6a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjTFT",
      "number": 3055,
      "title": "Change hotkey overlay background and border",
      "body": "Not sure but there doesn't seem to be anything about this in the wiki, is it even possible?",
      "created_at": "2025-12-16T15:11:40Z",
      "updated_at": "2025-12-16T19:02:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "aledraken",
        "avatar_url": "https://avatars.githubusercontent.com/u/153851162?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjSzm",
      "number": 3052,
      "title": "IPC Feature: Expose whether a window is currently visible on display",
      "body": "I want to make an EWW widget that adds indicators for windows that are either to the left or right off-screen in my current workspace. \r\n\r\nIf I currently have focus on a single maximised/fullscreen window, then this is easy, I just map the columns of all other windows in the workspace relative to this one.\r\n\r\nHowever things get trickier if I have multiple windows/columns\r\n- I can't tell if the focused window is to the left or right of another visible window\r\n- I can't tell how many windows are actually visible. I could have a small centred column and two others to either side, don't know!\r\n\r\nIt gets even more tricky if the currently focused window is a floating window. In this case I can only at best approximate relative position based on whatever was the most recently focused non-floating window.\r\n\r\nWhat I'd like to see is some sort of booleans like\r\n`is_visible`: Whether the window is visible at all\r\n`is_full_visible`: Whether the window is completely visible or partially cut off (less necessary, just nice to have)\r\n\r\nRelated discussion:\r\n- https://github.com/YaLTeR/niri/discussions/2935#discussion-9193683",
      "created_at": "2025-12-16T10:35:45Z",
      "updated_at": "2025-12-16T14:06:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rittycat",
        "avatar_url": "https://avatars.githubusercontent.com/u/36797079?u=7839b4c755f5e92ac49393bf713eff6bf2975fbf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjQ2V",
      "number": 3035,
      "title": "Completely separate set of workspaces",
      "body": "What I am looking for is kind of like 'Master Desktops'. Each master desktop will have it's own unique set of workspaces.\r\n\r\nMy use case - I am a consultant who has anywhere from 2-5 clients on the regular.\r\n\r\nRight now I am using 1 workspace per client, sometimes maybe 2 but I have 2 problems with this\r\n1. I don't want any notifications, overview, etc showing if I were to screen share\r\n2. Every workspace ends up getting way too cluttered, sometimes like 8-15 windows and I get lost on which window is where.\r\n\r\nWhen I use niri for my personal computer, I split things kind of by activity. Workspace 1 would be for web browsing, discord, spotify. 2 is for a personal dev project, etc.. and it keeps it cleaner.\r\n\r\nSo what I kind of want is like SUPER+CTRL+1 would give me a unique desktop different than say, SUPER+CTRL+2.",
      "created_at": "2025-12-13T17:08:45Z",
      "updated_at": "2025-12-16T14:05:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rayzorben",
        "avatar_url": "https://avatars.githubusercontent.com/u/7737834?u=839d208881163b858cb8d98c58867e256d01abea&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjS1X",
      "number": 3053,
      "title": "With bigger monitor like 4k, how can I open apps in Z order?",
      "body": "Right now, the apps open column wise with one app falling in one clumn and new apps rendering in new columns. That spares a lot of space and my 4k monitor can accomodate two apps in one column. In that case, can we have something like Z order where first app opens in first column, second app opens in second column, third app opens in first column and fourth app opens in second column. Later, fifth app again can open in third column ideally.\r\n<img width=\"3824\" height=\"2115\" alt=\"image\" src=\"https://github.com/user-attachments/assets/ac10c61c-50c9-43da-8c34-cbbac46be112\" />\r\n\r\nPlease guide.\r\n\r\nThank you.",
      "created_at": "2025-12-16T11:19:03Z",
      "updated_at": "2025-12-16T12:57:18Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "hirenchhatbar",
        "avatar_url": "https://avatars.githubusercontent.com/u/30938794?u=070469a90d9688e459f761159f9b4bd9c400fe5c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfVwu",
      "number": 1435,
      "title": "Different tab colors for active and inactive columns?",
      "body": "We have different border colors for active and inactive windows. I would like to make the tab indicator match these, but Niri currently allows (as far as I know) only one pair of tab colors. I think we would need either two separate pairs: a pair for an active column, and another pair for inactive columns, or three colors: an active color, an inactive color, and an active color for inactive columns. \r\n\r\nFor example if I have a setup where the border color for active windows in green, but gray for inactive windows, and I set the active tab color to green but the inactive tab color to gray, then, if I switch focus to a different column so that the tabbed column's border is gray, the indicator for the active tab will still be green.\r\n\r\nI think we could either change the configuration so that there is a pair of active and inactive tab indicator colors for active columns, and there's another pair for inactive columns. \r\n\r\nAnother option could be to add a third color for the active indicator color for inactive columns, leaving the current `active-color` and `inactive-color` config options the same, for a total of three tab indicator color options: `active-color`, `inactive-color`, and a new `selected-inactive-color` (or a better name than that). \r\n\r\nWhat do you think? If this idea sounds good, I could look into making the change and submitting the pr when I get some free time. ",
      "created_at": "2025-04-17T18:16:09Z",
      "updated_at": "2025-12-16T02:49:59Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zonotope",
        "avatar_url": "https://avatars.githubusercontent.com/u/1419863?u=a341d9d53a85a5ea6834ae5748bca71796688566&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag0I0",
      "number": 2079,
      "title": "Extra Mouse Buttons",
      "body": "Would love a way to bind to some extra buttons on my mouse. Mines a logitech mouse with some extra buttons on it meant for gaming. But the MX Master also has a 2nd scroll wheel which would be helpful for scrolling horizontally. Anyways, lots of mice have lots of extra buttons that would be useful to bind. ",
      "created_at": "2025-07-19T04:27:47Z",
      "updated_at": "2025-12-16T02:17:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "MrDowntempo",
        "avatar_url": "https://avatars.githubusercontent.com/u/8398380?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjSeN",
      "number": 3049,
      "title": "Lock the cursor to the specific window",
      "body": "It'd be great if we had the opportunity to grab the cursor how gamescope does (to discard extra layer = gamescope, especially if gamescope doesn't work properly in general). What do you think? Can it be achieved?",
      "created_at": "2025-12-16T01:32:49Z",
      "updated_at": "2025-12-16T01:32:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Forceres",
        "avatar_url": "https://avatars.githubusercontent.com/u/99032355?u=5b3cfe9e9926832a543c5f7d2498eb6f8d07891b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeQRj",
      "number": 1098,
      "title": "cli actions: allow overriding settings by cli flag",
      "body": "i use a niri setup with `input.warp-mouse-to-focus` enabled.\r\nin my bar waybar, i use niri's [workspace module](https://github.com/Alexays/Waybar/wiki/Module:-Niri#workspaces) to display buttons corresponding to my workspaces.\r\nto facilitate interactions by mouse, i have added a bind to scroll-wheel actions to these, triggering niri workspace switches `niri msg action focus-workspace-up` / `niri msg action focus-workspace-down`.\r\nfollowing my `input.warp-mouse-to-focus` setting, these would then reset the cursor position.\r\nwhereas in other cases i would like it to, in this particular case tho, i would rather allow the cursor to remain positioned at the waybar buttons, to allow follow-up scroll-wheel actions to switch workspaces multiple times.\r\ncurrently, such an override for a particular command-line action appears not supported (or at least not documented):\r\n\r\n```\r\nniri msg action focus-workspace-up --help\r\nFocus the workspace above\r\n\r\nUsage: niri msg action focus-workspace-up\r\n\r\nOptions:\r\n  -h, --help  Print help\r\n```\r\n\r\nto account for exceptions like this, it would be nice if the cli actions would allow passing a flag to override such settings.\r\n",
      "created_at": "2025-02-08T10:56:19Z",
      "updated_at": "2025-12-15T14:43:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjR5v",
      "number": 3043,
      "title": "Focused and Tabbed in `niri msg focused-window`",
      "body": "What's the preferred way to check if a window is tabbed/fullscreen? This data is missing in:\r\n* `niri msg focused=window`\r\n* `niri msg windows`\r\n* `niri msg event-stream` and the IPC equivalent.",
      "created_at": "2025-12-15T11:22:26Z",
      "updated_at": "2025-12-15T11:22:26Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "actuday6418",
        "avatar_url": "https://avatars.githubusercontent.com/u/56124831?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjQ4g",
      "number": 3036,
      "title": "My mod key stopped working",
      "body": "Hey, so I just did a system update on my arch linux setup and now the mod key does not seem to work\n\nMy other keybinds that dont use the mod key seen to work just fine, but the rest doesn't and makes the system unusable. \n\nDoes anyone know why this happened? ",
      "created_at": "2025-12-13T18:39:20Z",
      "updated_at": "2025-12-14T20:02:14Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "pedro-meinen",
        "avatar_url": "https://avatars.githubusercontent.com/u/136459053?u=e577c8c2d542572505193505d9f13031352eb7f1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjRWt",
      "number": 3041,
      "title": "feature_request(tablet): support tool_mode relative",
      "body": "On sway there is a [configuration option](https://github.com/swaywm/sway/blob/master/sway/sway-input.5.scd#tablet-configuration) for relative modes on a tablet. \r\n\r\nIn my sway nix config this looked as follows in my case:\r\n\r\n```nix\r\nsway.config.input\"1386:914:Wacom_Intuos_Pro_S_Pen\" = {\r\n  tool_mode = \"* relative\";\r\n};\r\n```\r\n\r\nThe [PR that introduced this feature to sway](https://github.com/swaywm/sway/pull/5472/files#diff-ae89bb9a4b01cd12162ff7b382994241aa783f460adff0a251464b048e9b336c) might be helpful in guiding the implementation.",
      "created_at": "2025-12-14T15:28:12Z",
      "updated_at": "2025-12-14T15:28:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "steveej",
        "avatar_url": "https://avatars.githubusercontent.com/u/1181362?u=a4e7e49db3f6d626ca240d24a08344f4db0ff08a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjRQP",
      "number": 3040,
      "title": "Running `niri-session` on WSL2 fails to start. The process immediately exits, and IPC connections report \"Connection reset by peer (os error 104)\".",
      "body": "2025-12-14T11:43:55.912910Z INFO niri: starting version 25.11 (b35bcae)\r\n2025-12-14T11:43:55.930568Z DEBUG niri_config: loaded config from \"/root/.config/niri/config.kdl\"\r\nlibEGL warning: failed to get driver name for fd -1\r\nlibEGL warning: MESA-LOADER: failed to retrieve device information\r\nlibEGL warning: failed to get driver name for fd -1\r\nMESA: error: ZINK: vkCreateInstance failed (VK_ERROR_INCOMPATIBLE_DRIVER)\r\nlibEGL warning: egl: failed to create dri2 screen\r\n2025-12-14T11:43:56.005452Z INFO niri: listening on Wayland socket: wayland-1\r\n2025-12-14T11:43:56.007957Z WARN niri::utils::xwayland::satellite: error opening X11 sockets, disabling xwayland-satellite integration: wrong X11 directory permissions\r\nCaused by:\r\nX11 directory is missing the sticky bit\r\nEnvironment variable $DISPLAY not set, ignoring.\r\nIo error: Connection reset by peer (os error 104)",
      "created_at": "2025-12-14T11:49:25Z",
      "updated_at": "2025-12-14T11:49:25Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "87074139",
        "avatar_url": "https://avatars.githubusercontent.com/u/16484971?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjQ_k",
      "number": 3038,
      "title": "Add \"niri quit\" as a scriptable way to log out gracefully",
      "body": "I use wlogout as a logout menu, with multiple options for shutdown/reboot/lock/log out. However, niri doesn't have a scriptable way to perform a graceful logout besides just setting a bind to quit in config.kdl.\r\n\r\nI would like a way to invoke a logout as a command, such as `niri quit`, such that it can be scripted to work on external tools such as wlogout.\r\n\r\nI have tried `loginctl terminate-user $USER` but this doesn't seem to perform a graceful logout as it leaves me in a broken shell without returning to my greeter (SDDM). Ideally the loginctl command should also be fixed to do a graceful logout\r\n\r\nPossibly related to https://github.com/YaLTeR/niri/issues/2063 ",
      "created_at": "2025-12-13T22:26:29Z",
      "updated_at": "2025-12-14T02:13:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "AmmoniumX",
        "avatar_url": "https://avatars.githubusercontent.com/u/75765000?u=2741c1f162ee18fa38edb30ff59e1b0db420b6e3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeEYs",
      "number": 1057,
      "title": "Best way to pipe a screenshot into swappy?",
      "body": "In order to annotate a screenshot I would like to use [swappy](https://github.com/jtheoof/swappy) but I don't know how to get the image output of `niri msg action screenshot`.\r\n\r\nIs the best approach to scan the output dir for the latest file and pipe that into swappy?",
      "created_at": "2025-01-27T17:15:36Z",
      "updated_at": "2025-12-13T19:58:34Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AtrDA",
        "body": "There's been ideas to add a flag to `niri msg action screenshot` to output to stdout, but so far there's no way. So yeah, I guess scan the output dir."
      },
      "user": {
        "login": "sommerper",
        "avatar_url": "https://avatars.githubusercontent.com/u/1512048?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AedDV",
      "number": 1142,
      "title": "Breaking changes for KDLv2",
      "body": "We're getting KDLv2: https://github.com/YaLTeR/niri/pull/1139\r\n\r\nAnd it works in such a way that niri will accept *both* a KDLv2 config and a KDLv1 config, preserving full backwards compatibility for old configs. This gives us a unique opportunity to do some breaking changes, but only in the new KDLv2 config, so that KDLv1 configs remain working exactly as they did before.\r\n\r\nI listed some ideas before in https://github.com/YaLTeR/niri/discussions/447. However, thinking about it now, some of these ideas (renames) might be more appropriate for a full backwards compat break rather than a \"soft\" break like here.\r\n\r\nSo, here are my current ideas for what to change for KDLv2. Smaller changes from the issue above:\r\n1. Remove deprecated four-number color format, i.e. `active-color 255 0 0 0`. These are all representable in the CSS syntax.\r\n2. Change linear animation settings to be set as properties similarly to spring animation settings, i.e. `linear duration-ms=200 curve=\"ease-out-quad\"`.\r\n3. Fix the [`layout { border {} }` special case](https://yalter.github.io/niri/Configuration%3A-Include.html#border-special-case).\r\n\r\nNow, for what I mainly wanted to get feedback on.\r\n\r\nThere's a lot of confusion about `spawn` and `spawn-at-startup`: they don't use a shell, so you have to do weird argument quoting, and can't use shell variables and expansions. The reason for this is to avoid the (small, but several ms long) overhead of starting a shell for every bind.\r\n\r\n```kdl\r\nbinds {\r\n    // Correct: every argument is in its own quotes.\r\n    Mod+T { spawn \"alacritty\" \"-e\" \"/usr/bin/fish\"; }\r\n\r\n    // Wrong: will interpret the whole `alacritty -e /usr/bin/fish` string as the binary path.\r\n    Mod+D { spawn \"alacritty -e /usr/bin/fish\"; }\r\n\r\n    // Wrong: will pass `-e /usr/bin/fish` as one argument, which alacritty won't understand.\r\n    Mod+Q { spawn \"alacritty\" \"-e /usr/bin/fish\"; }\r\n}\r\n```\r\n\r\nKDLv2 makes this a bit nicer on the one hand by removing most of the quotes, on the other hand some problems remain:\r\n\r\n```kdl\r\nbinds {\r\n    // This works now: KDL splits arguments by space.\r\n    // You still need to quote the argument starting from \"/\", but it will complain at you about it so it's fine.\r\n    Mod+T { spawn alacritty -e \"/usr/bin/fish\" }\r\n\r\n    // Still wrong: ~ is not expanded because we're not in a shell.\r\n    Mod+D { spawn alacritty --working-directory \"~/source\" }\r\n\r\n    // Still wrong: $() is not expanded because we're not in a shell.\r\n    Mod+Q { spawn notify-send clipboard \"$(wl-paste)\" }\r\n}\r\n```\r\n\r\nSo I wanted to add a new `spawn-sh` (`spawn-sh-at-startup`) command that accepts a single argument and passes it to the shell.\r\n\r\nThe reason for accepting a single argument is that shells accept their command as a single argument, and do their own parsing and word splitting. While we could accept multiple arguments and join them back with whitespace, I don't think it's a good idea because it would appear as though you can pass one argument `\"like this\"`, but you actually cannot (it will all be re-split by the shell).\r\n\r\n```kdl\r\nbinds {\r\n    // These work:\r\n    Mod+D { spawn-sh \"alacritty --working-directory ~/source\" }\r\n    Mod+Q { spawn-sh \"notify-send clipboard $(wl-paste)\" }\r\n}\r\n```\r\n\r\nNow, this is not a breaking change by itself. The breaking change part is that I want to also rename `spawn` to `spawn-raw` (`spawn-raw-at-startup`). This is to remove the bias towards `spawn`: I don't want to guide people to unknowingly using (raw) `spawn` and having it not work. But I still want it to remain easily accessible if you don't want the shell overhead. And I don't want to straight up replace `spawn` itself with a shell because it will make the migration more difficult.\r\n\r\nSo, what do you think? Both about the \"spawn\" ideas, and about maybe doing some other changes for KDLv2, since we have this opportunity.",
      "created_at": "2025-02-18T06:02:51Z",
      "updated_at": "2025-12-13T15:23:35Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjQgj",
      "number": 3031,
      "title": "Is that kind of layout possible?",
      "body": "A friend of mine loves everything about Niri apart from the fact that he couldn’t find a way to do that\r\n\r\n<img width=\"1388\" height=\"1030\" alt=\"image\" src=\"https://github.com/user-attachments/assets/b5a79cae-6d6b-4970-935f-469200dbffb8\" />\r\n\r\nIs he missing something?",
      "created_at": "2025-12-12T22:29:49Z",
      "updated_at": "2025-12-13T09:10:57Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A6JzG",
        "body": "I don't think we can do that outside of uh floating windows and some IPC window management script thingy, because  niri puts every window in a column, the top window there would be across 2 columns "
      },
      "user": {
        "login": "Geobert",
        "avatar_url": "https://avatars.githubusercontent.com/u/72570?u=22086674483f5720967165e4e1902c89a8924526&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjP5k",
      "number": 3030,
      "title": "Soft-walls between monitors (for edge/corner buttons in maximized windows)",
      "body": "In multi-monitor setups, KDE Plasma has this thing (by default) where your mouse does not move beyond the monitor until you push through the invisible soft-wall between monitors.\r\n\r\nThis makes it easy to reach buttons which can be clicked from the edges and corners of the screen, without needing to be precise.\r\n\r\nThis is *especially* relevant now that Niri v25.11 has true maximized windows, which means that edge and corner buttons are actually at the edges and corners of the screen. But you have to be pretty precise with your mouse if you have a monitor next to that corner/edge.\r\n\r\n(KDE Plasma also makes it a configurable pixel value of how much you have to move the mouse before it goes to the other monitor, but I have no clue how that works at all)\r\n\r\nEdit: The corner button thing doesn't work on Firefox for tabs, and sidebar stuff is a \"maybe\", even for a single monitor setup. That might be bug worthy in a separate thing, actually.",
      "created_at": "2025-12-12T08:04:40Z",
      "updated_at": "2025-12-13T03:21:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "JacksonChen666",
        "avatar_url": "https://avatars.githubusercontent.com/u/50755746?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjQkA",
      "number": 3032,
      "title": "Open programs where the program was launched.",
      "body": "Hello,\r\n\r\nOften times I will open a program, and it takes a few seconds to open, and I switch to another monitor/workspace. \r\n\r\nIs it possible to open a program in the workspace/monitor that I launched it via the launcher, rather than the workspace/monitor that I am currently using? For example on my main monitor I will launch steam (via rofi usually), then switch to my other monitor with Discord, then Steam will open on my side monitor. So then I have to move it to my main monitor. ",
      "created_at": "2025-12-13T01:18:52Z",
      "updated_at": "2025-12-13T01:18:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "RossSmyth",
        "avatar_url": "https://avatars.githubusercontent.com/u/18294397?u=0cbfc92135e7ea02dc559171a41921fbae7e19eb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJzw",
      "number": 2464,
      "title": "Request: Fine horizontal scroll action",
      "body": "\r\nRight now Niri only has actions like center-column, which snap a column to the middle of the screen. But when a column is wider than the screen, I often need to adjust the view by a small offset. Centering doesn’t line up, and jumping to the next column feels misaligned. It would be very helpful to have actions like scroll-column-left/right with small step sizes for precise horizontal adjustment.",
      "created_at": "2025-09-28T03:30:38Z",
      "updated_at": "2025-12-13T00:14:12Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "yebei199",
        "avatar_url": "https://avatars.githubusercontent.com/u/129029530?u=3c99b9377d3ebfdf40cf7ee4934f3a6de1082016&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai1NT",
      "number": 2781,
      "title": "In Niri in Nixos, the theme changes to light",
      "body": "After switching to Niri, every time the system is restarted, the theme in Zen becomes light, even though the userChrome theme is set.\r\nThis can be fixed by exiting Niri, going to a different desktop environment, opening Zen there, and returning to Niri.\r\nPlease help me fix this",
      "created_at": "2025-11-11T22:30:37Z",
      "updated_at": "2025-12-12T22:00:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Inarizxc",
        "avatar_url": "https://avatars.githubusercontent.com/u/128096405?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjPwi",
      "number": 3028,
      "title": "How to skip empty workspaces when switching via keyboard shortcuts?",
      "body": "I'm trying to improve my workspace-switching workflow and would like to avoid landing on empty workspaces.\r\n\r\nCurrently, when I cycle through workspaces using keyboard shortcuts, the navigation moves sequentially through all workspace indexes — including those with no windows. This slows down navigation and makes switching feel less fluid.\r\n\r\n### What I'm looking for\r\n\r\nA way to **automatically skip empty workspaces** when switching forward/backward with shortcuts. Ideally:\r\n\r\n* Cycling forward jumps to the next workspace that contains at least one window\r\n* Cycling backward behaves the same\r\n* No change to how workspaces are created or managed — just smarter navigation\r\n\r\n### Questions\r\n\r\n* Is there an existing configuration option or plugin to achieve this?\r\n* If not, what would be the recommended approach for implementing it?\r\n* Are there known limitations with dynamic workspace skipping?\r\n\r\nAny suggestions or examples would be appreciated!\r\n",
      "created_at": "2025-12-12T03:46:16Z",
      "updated_at": "2025-12-12T13:04:03Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "baddate",
        "avatar_url": "https://avatars.githubusercontent.com/u/37013819?u=3bbed1c3683935f39c942259b6b7f7b6b1042c63&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjPxX",
      "number": 3029,
      "title": "Possible to make fullscreen window \"floating\" or make floating window fullscreen?",
      "body": "use case: media viewer in telegram\r\nI tried window-rule:\r\n```\r\nwindow-rule {\r\n    match app-id=r#\"^com.telegram.desktop$\"# title=\"^Media viewer$\"\r\n    open-floating true\r\n    open-fullscreen false\r\n    draw-border-with-background false\r\n    geometry-corner-radius 0\r\n    focus-ring {\r\n        off\r\n    }\r\n}\r\n```\r\nproblem: it cannot overlap the status bar (in my case, the dank material shell)\r\n\r\nthe original fullscreen mode will make the viewer window opaque and be placed in a different column",
      "created_at": "2025-12-12T04:14:54Z",
      "updated_at": "2025-12-12T11:35:17Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "codehz",
        "avatar_url": "https://avatars.githubusercontent.com/u/13158903?u=62b1e2b3fb160318bf07eaffd676054e66557420&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjOpL",
      "number": 3023,
      "title": "Introspecting key bindings (mapping them to configuration)",
      "body": "I've seen Mod+Shift+? which renders an \"Important Hotkeys\" modal.\r\n\r\n1. I want something like this for _all_ possible bindings.\r\n\r\n2. Another related thing I would want is the ability to have `niri` tell me which action is related to a binding when I execute it. So, either display something like through `notify-send` (pop-up/notification to screen) or something within a terminal kind of like `xev`.\r\n\r\nIn the case of 2. a nice extra would be to tell me which configuration line defines this (or if it's built-in/default).",
      "created_at": "2025-12-10T20:30:39Z",
      "updated_at": "2025-12-11T16:40:57Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "johnrichardrinehart",
        "avatar_url": "https://avatars.githubusercontent.com/u/6321578?u=c984e40c9e51c44e0f2e83ef2c966fbbe8de716d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjPNS",
      "number": 3026,
      "title": "Implement text input protocol",
      "body": "Hello,\r\nI‘m using niri with dms on a surface pro. It‘s a beautiful combo :)\r\nRight now I have a custom action in the menubar to toggle wvkbd via the dank actions plugin.\r\nWould it be possible to implement the text input protocol to trigger the osk or a custom action when touching a text input field?",
      "created_at": "2025-12-11T12:14:53Z",
      "updated_at": "2025-12-11T12:43:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tecumses",
        "avatar_url": "https://avatars.githubusercontent.com/u/4162790?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgNfA",
      "number": 1776,
      "title": "Drag and drop between windows",
      "body": "I'm running on Arch Linux. I can't drag and drop a file, for example, from a file manager in one window to an application in another window. I'm assuming I'm missing something in the settings.  \r\nI've been using I3 and the drag and drop works fine in I3.   \r\n Thanks\r\n",
      "created_at": "2025-06-12T00:56:16Z",
      "updated_at": "2025-12-11T11:38:22Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "FredTH98",
        "avatar_url": "https://avatars.githubusercontent.com/u/147123816?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjOdJ",
      "number": 3020,
      "title": "Bigger IBus layout icon for the tray",
      "body": "Hi,\r\n\r\n<img width=\"574\" height=\"58\" alt=\"image\" src=\"https://github.com/user-attachments/assets/c9d07fc7-14d5-4e42-bdcf-b111803005d8\" />\r\n\r\nThis is a tolerable size for me, but for some people it could be a showstopper. Is it possible to make it bigger? I'm using DMS, but with Noctalia it's no bigger.\r\n\r\nPS Many thanks that the IBus works properly! It isn't the case with Hyprland, for instance.",
      "created_at": "2025-12-10T16:17:37Z",
      "updated_at": "2025-12-11T08:29:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Tyrn",
        "avatar_url": "https://avatars.githubusercontent.com/u/1386942?u=c7d3cdda1db5b21c3245413918902ebd213350b6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjOpz",
      "number": 3024,
      "title": "User configurable animation for baba-is-float window rule",
      "body": "This is a very very low priority feature.\r\n\r\nThis window rule is a very cool idea (even if it's an april fool). I personally use it to differentiate floating windows from tiled windows but, in my opinion, the movement is too wide for an everyday use.\r\n\r\nFrom a user perspective, the way to configure it would be to add the following inside the config file :\r\n```kdl\r\nanimations {\r\n    baba-is-float {\r\n        duration-ms 150\r\n        curve \"ease-out-expo\"\r\n        range\r\n    }\r\n}\r\n```\r\nThe range could either be a completely different variable or controlled directly with the curve properties.\r\n\r\nIf I understand the curve properties correctly:\r\n```\r\nProperties | Type           | X1   | Y1  | X2  | Y2\r\ncurve        \"cubic-bezier\"   0.05   0.7   0.1   1\r\n```\r\nWith X being the duration and Y being the maximum distance. So Y<1 should move less and Y>1 move more",
      "created_at": "2025-12-10T20:40:41Z",
      "updated_at": "2025-12-11T06:42:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "DoggoNako",
        "avatar_url": "https://avatars.githubusercontent.com/u/58150318?u=b78ddb64cc29720aa4b55a3c498e5e54d01800a0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjNp4",
      "number": 3017,
      "title": "How do you guys turn off your PC?",
      "body": "This is a half-Q&A and half-discussion request, but here we go.\r\n\r\nI have some programs that require `SIGTERM` signal or extra shutdown steps to clean things up properly. When I just run `poweroff` or `reboot` command, it seems that it just shuts down greetd and all child processes altogether, leaving \"unclean\" states. Namely, Firefox and Emacs have been bothering me recently.\r\n\r\nIs this a problem for any of you, by any chance? If you managed to fix (or work around) the issue, how did you do that?\r\n\r\nThanks!",
      "created_at": "2025-12-10T05:33:40Z",
      "updated_at": "2025-12-10T09:48:39Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "RangHo",
        "avatar_url": "https://avatars.githubusercontent.com/u/10833976?u=28fc86a39e62242cc863bb23aa35b0c791ad3c4c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjNxr",
      "number": 3018,
      "title": "\"Other output(s)\" scope for recent windows (Window MRU)",
      "body": "I've been fiddling with the new `recent-windows` and I find myself wishing it had a scope for just windows outside of the display I invoke the command on. I generally keep a lot of windows open to where I can't use the `all` scope efficiently and the `workspace` and `output` scopes are specific to the output I invoked the alt tab which doesn't exactly help either. \r\n\r\nFor now I've been using `toggle-overview` to solve the situations where I need something on the other monitors but I'd prefer to use alt tab so that mouse centers on the new window. In situations where what I need is on the same monitor I just use MOD+WHEELSCROLL[direction], or MOD+Arrowkeys depending on where I have my hands(whatever is faster).",
      "created_at": "2025-12-10T08:13:44Z",
      "updated_at": "2025-12-10T08:13:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Kei-Shin",
        "avatar_url": "https://avatars.githubusercontent.com/u/22483737?u=b8449be734a4c90c01245abd798f0d221e26f5aa&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjNmx",
      "number": 3015,
      "title": "Screencasting troubles",
      "body": "I had a bunch of trouble getting screencasting setup. I tried advice from many sources:\r\n* https://github.com/YaLTeR/niri/wiki/Screencasting\r\n* #2116\r\n* #2301\r\n\r\nand some other places not on the niri repo. None of them worked. But it finally worked after I looked at\r\nhttps://cashmere.rs/blog/20250612002456-how-to-fix-screensharing-for-niri-wm-under-nixos/ ",
      "created_at": "2025-12-10T03:35:27Z",
      "updated_at": "2025-12-10T03:37:13Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "RossSmyth",
        "avatar_url": "https://avatars.githubusercontent.com/u/18294397?u=0cbfc92135e7ea02dc559171a41921fbae7e19eb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjNlP",
      "number": 3014,
      "title": "Support `spawn-sh` in `lid-close` and `lid-open`",
      "body": "```sh\r\n$ niri validate -c /etc/niri/config.kdl\r\nError:   × error loading config\r\n  ├─▶ error parsing\r\n  ╰─▶ error parsing KDL\r\n\r\nError:   × unexpected node `spawn-sh`\r\n     ╭─[config.kdl:665:1]\r\n 665 │ switch-events {\r\n 666 │     lid-close { spawn-sh \"notify-send -u normal $'Sleeping!' && /nix/store/208wiw2975z8q10daxglfwlk476bzhwp-systemd-258.2/bin/systemctl suspend-then-hibernate || /nix/store/208wiw2975z8q10daxglfwlk476bzhwp-systemd-258.2/bin/systemctl suspend\"; }\r\n     ·                 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────\r\n     ·                                                                                                                                  ╰── unexpected node\r\n 667 │     lid-open { spawn-sh \"notify-send -u normal Welcome back!\"; }\r\n     ╰────\r\nError:   × child node `spawn` is required\r\n     ╭─[config.kdl:665:1]\r\n 665 │ switch-events {\r\n 666 │     lid-close { spawn-sh \"notify-send -u normal $'Sleeping!' && /nix/store/208wiw2975z8q10daxglfwlk476bzhwp-systemd-258.2/bin/systemctl suspend-then-hibernate || /nix/store/208wiw2975z8q10daxglfwlk476bzhwp-systemd-258.2/bin/systemctl suspend\"; }\r\n     ·     ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\r\n     ·                                                                                                                              ╰── node starts here\r\n 667 │     lid-open { spawn-sh \"notify-send -u normal Welcome back!\"; }\r\n 668 │ }\r\n     ╰────\r\n```",
      "created_at": "2025-12-10T02:45:50Z",
      "updated_at": "2025-12-10T02:45:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "johnrichardrinehart",
        "avatar_url": "https://avatars.githubusercontent.com/u/6321578?u=c984e40c9e51c44e0f2e83ef2c966fbbe8de716d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjNFa",
      "number": 3010,
      "title": "niri + alacritty image preview",
      "body": "Is it possible to achive image preview in lf or yazi using niri + alacritty? It's working with foo but can't make it works with alacritty using using ueberzugpp.",
      "created_at": "2025-12-09T13:27:29Z",
      "updated_at": "2025-12-09T19:57:27Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "crassicus",
        "avatar_url": "https://avatars.githubusercontent.com/u/62633178?u=773bd56eebc2d94b618c3fa6997f3af1d14678ea&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjNGV",
      "number": 3011,
      "title": "Is it possible to bind LMB + RMB to window move? (Left+Right click)",
      "body": "I.e. behave same as Mod+Middle Click?",
      "created_at": "2025-12-09T13:41:30Z",
      "updated_at": "2025-12-09T19:52:18Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "dolzenko",
        "avatar_url": "https://avatars.githubusercontent.com/u/43391?u=f95ea25a9a74393abd99b0dbddb4539bcbe42050&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjLxL",
      "number": 3002,
      "title": "Different Keyboard Layouts based on input device.",
      "body": "I don't know if I misused behavior of sway, but I got used to it. \r\n\r\nIn sway I was able to define multiple input devices:\r\n\r\n```\r\ninput type:keyboard {\r\n\txkb_layout \"de\"\r\n}\r\n\r\ninput specific_keyboard_model {\r\n  xkb_layout \"us\"\r\n}\r\n```\r\n\r\nThat way I was able to switch between different keyboards with different layouts on the fly. Would it be possible to add something like this to niri?",
      "created_at": "2025-12-08T09:29:02Z",
      "updated_at": "2025-12-09T15:49:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ninanomenon",
        "avatar_url": "https://avatars.githubusercontent.com/u/38247461?u=5146f19d9a751a85860f6cbb48aeb483ac95d991&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXuj_",
      "number": 197,
      "title": "Configure Mod key",
      "body": "    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\r\n    // when running as a winit window. \r\n\r\nWhy...., I literally need the reverse behavior ",
      "created_at": "2024-02-14T20:43:27Z",
      "updated_at": "2025-12-09T14:34:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "xiro-codes",
        "avatar_url": "https://avatars.githubusercontent.com/u/146094155?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AemJm",
      "number": 1184,
      "title": "Reset all windows width",
      "body": "Hi, \r\nI was missing something like `reset-window-height` but applied to width of all windows across workspace\r\n\r\nHere is what I came up with:\r\n```bash\r\n#!/usr/bin/env bash\r\n\r\nfocused_window=$(niri msg --json windows | jq -r '.[] | select(.is_focused?) | .id')\r\ncurrent_workspace=$(niri msg --json workspaces | jq -r '.[] | select(.is_active? and .is_focused?) | .id')\r\nworkspace_windows=$(niri msg --json windows | jq -r \".[] | select(.workspace_id==${current_workspace}) .id\")\r\n\r\nniri msg action do-screen-transition --delay-ms=10\r\nIFS=$'\\n'\r\nfor window_id in $workspace_windows; do\r\n\tniri msg action focus-window --id \"$window_id\"\r\n\tniri msg action set-column-width '33.333%'\r\ndone\r\n\r\nniri msg action focus-column-first\r\nniri msg action focus-window --id \"$focused_window\"\r\n```\r\nUsage:\r\n```kdl\r\nbinds {\r\n    Mod+R hotkey-overlay-title=\"[R]eset all windows width\" { spawn \"/home/alteriks/bin/niri_reset_all_windows_width.sh\" \"33.333%\"; }\r\n}\r\n```\r\n\r\nI've remapped `Mod+R` to this instead and ` Mod+W { switch-preset-column-width; }` because that's more natural for me. You should probably change it to your liking",
      "created_at": "2025-02-27T14:06:17Z",
      "updated_at": "2025-12-08T21:11:14Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "alteriks",
        "avatar_url": "https://avatars.githubusercontent.com/u/6512767?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfLN1",
      "number": 1399,
      "title": "Black background on full screen transparent terminal",
      "body": "is it me or it sets background to black on full screening any application with transparency?    \r\nor    \r\nam i missing on some config options??    \r\n\r\n\r\n![2025-04-07 01-54-35](https://github.com/user-attachments/assets/8446725a-064c-4a08-8d9f-8d29663e8f5f)\r\n![2025-04-07 01-54-39](https://github.com/user-attachments/assets/a950a95e-0bb9-4651-b1ce-67e54342185a)",
      "created_at": "2025-04-06T20:25:44Z",
      "updated_at": "2025-12-08T16:56:53Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AwnwG",
        "body": "It is intended. This is how fullscreen is defined in the xdg-toplevel protocol. Also for niri it helps to indicate a fullscreen surface that is smaller than the full screen."
      },
      "user": {
        "login": "cybergaz",
        "avatar_url": "https://avatars.githubusercontent.com/u/43444535?u=57366784876cf3fc80e9694d9d0965dd528757aa&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjLQ0",
      "number": 2996,
      "title": "Feedback on Implementing Interactive Keybind Help (something like whichkey)",
      "body": "I came across https://github.com/MaxVerevkin/wlr-which-key and thought this makes alot of sense. It would be really cool to have something like this show all the niri keybinds interactively. Maybe holding down the modifier key brings up a menu like this and then, with the menu there you can still trigger the binds.\r\nThis would help people who are new to tiling window managers by reminding them of the keybinds, but is also good for everybody if you have alot of them. I think the idea of having one place to unify all the keybinds for your system is pretty cool and menus like that really help me in emacs.\r\nI though about writing something like this as an independent program but to interact nicely with the niri keybinds maybe it has to be built in. Im not sure, especially with waylands handling of keyboard input.\r\nI am curious of what people think, does something like this makes sense? Also im willing to do the work but im not familiar with the niri codebase. I know rust and am just unsure where to start or if an inbuilt feature like this will ever be an option.\r\n\r\n(Moved it from issue)",
      "created_at": "2025-12-07T23:22:27Z",
      "updated_at": "2025-12-08T07:30:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "oniX0n",
        "avatar_url": "https://avatars.githubusercontent.com/u/39184576?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgPma",
      "number": 1799,
      "title": "Scroll windows into view to eliminate empty space",
      "body": "\r\nThis was discussed a few times (https://github.com/YaLTeR/niri/discussions/156, https://github.com/YaLTeR/niri/discussions/466, https://github.com/YaLTeR/niri/discussions/1642) and I believe many users would prefer the proposed behaviour.\r\n\r\nIn https://github.com/YaLTeR/niri/issues/161 it was partially addressed by restoring the view onto the window to the left, but only **if** the closing window had never been unfocused. Plus, any empty space that existed prior to spawning the window is preserved.\r\n\r\nA more generic solution, that never allows empty screen space if windows can't fit the screen, should work when:\r\n\r\n1. **closing windows or moving windows to other workspaces**\r\n   \r\n   Starting from this state:\r\n   ```\r\n             ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍\r\n   ┌─────────┬─────────┬─────────┐\r\n   │    A    │    B    │    C    │\r\n   └─────────┴─────────┴─────────┘\r\n             ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍\r\n   ```\r\n\r\n   and closing/moving B:\r\n   \r\n   ```\r\n   desired:                                  current:\r\n            ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍                      ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍\r\n            ┌─────────┬─────────┐            ┌─────────┬─────────┐\r\n            │    A    │    C    │            │    A    │    C    │\r\n            └─────────┴─────────┘            └─────────┴─────────┘\r\n            ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍                      ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍\r\n   ```\r\n   \r\n   or closing/moving C:\r\n   \r\n   ```\r\n   desired:                                  current:\r\n            ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍                      ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍\r\n            ┌─────────┬─────────┐            ┌─────────┬─────────┐\r\n            │    A    │    B    │            │    A    │    B    │\r\n            └─────────┴─────────┘            └─────────┴─────────┘\r\n            ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍                      ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍\r\n   ```\r\n   \r\n2. **exiting fullscreen**\r\n\r\n   Starting from this state:\r\n   ```\r\n                       ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍\r\n   ┌─────────┬─────────┬───────────────────┐\r\n   │    A    │    B    │         C         │\r\n   └─────────┴─────────┴───────────────────┘\r\n                       ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍\r\n   ```\r\n\r\n   and exiting fullscreen:\r\n   \r\n   ```\r\n   desired:                                  current:\r\n             ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍                               ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍\r\n   ┌─────────┬─────────┬─────────┐           ┌─────────┬─────────┬─────────┐\r\n   │    A    │    B    │    C    │           │    A    │    B    │    C    │\r\n   └─────────┴─────────┴─────────┘           └─────────┴─────────┴─────────┘\r\n             ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍                               ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍\r\n   ```\r\n\r\nExamples assume the affected window is focused.\r\n\r\nWith this, the only way to end up with empty space is if all windows can fit the screen or a window has been explicitly resized (not by fullscreening).\r\n\r\nIt would however conflict with `center-focused-column`, which should probably take precedence.\r\n",
      "created_at": "2025-06-14T12:15:08Z",
      "updated_at": "2025-12-07T03:46:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "neunato",
        "avatar_url": "https://avatars.githubusercontent.com/u/23129307?u=897f570b61c290a249625664f66b6796e8dda418&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhTts",
      "number": 2237,
      "title": "The niri package does not build with libdisplay-info-0.3.0.",
      "body": "The niri package does not build with libdisplay-info-0.3.0.\r\nThe assembly fails with an error.\r\n\r\nPKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --libs --cflags libdisplay-info 'libdisplay-info >= 0.1.0' 'libdisplay-info < 0.3.0'\r\n  The system library `libdisplay-info` required by crate `libdisplay-info-sys` was not found.\r\n",
      "created_at": "2025-08-14T16:54:52Z",
      "updated_at": "2025-12-06T21:38:38Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "VictorR2007",
        "avatar_url": "https://avatars.githubusercontent.com/u/28569471?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjJu_",
      "number": 2991,
      "title": "Add focus=false to move-window-up/down-or-to-workspace-up/down",
      "body": "currently you can add focus=false when moving columns with move-column-to-workspace-down and itll stop your workspace from swapping when you move it, but id like for it to be added for moving only windows up and down instead of the whole column",
      "created_at": "2025-12-06T14:10:03Z",
      "updated_at": "2025-12-06T14:10:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nishiiko",
        "avatar_url": "https://avatars.githubusercontent.com/u/142626254?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AikYO",
      "number": 2665,
      "title": "[Doc request] Explain \"surfaces\", \"layers\" \"namespaces\"",
      "body": "The docs are already pretty great to be honest, thank you very much for that.\r\n\r\nReading them \"cover to cover\" just leaves me with two major suggestions for improvement. This is the first one.\r\n\r\nA \"concept\"/usage page would be great that explains these terms that are used without introduction in the docs:\r\n\r\n## Layers\r\n\r\nThere are the docs for \"[layer rules](https://yalter.github.io/niri/Configuration%3A-Layer-Rules.html)\" but they don't really explain what a layer is. There is the usage page on [Layer-Shell components](https://yalter.github.io/niri/Layer%E2%80%90Shell-Components.html). Is layer == layer-shell? It's not clear from the docs.\r\n\r\n## Surfaces & Namespaces\r\n\r\nThe docs mention\r\n\r\n> This is a regular expression that should match anywhere in the surface namespace.\r\n\r\nbut don't explain anywhere really what a surface is or which other namespaces might exist.\r\n\r\n## Concrete question\r\n\r\nI tried to answer the question for myself if I can \"block out\" an entire workspace using layer rules but have not been able to get thet answer from the docs. I'll just test it out so it's fine. But if I'm stumbling over it then I'm sure others will as well.",
      "created_at": "2025-10-23T08:36:51Z",
      "updated_at": "2025-12-06T05:30:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "lfrancke",
        "avatar_url": "https://avatars.githubusercontent.com/u/122850?u=553b678c209d0ba83f5e5978b70adedefe30f0bd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjJdI",
      "number": 2988,
      "title": "Keep Aspect Ratio Support",
      "body": "I want to bring up an idea with the niri community and contributors but I am very new so I apologize if this isn't the right channel. I tried to find any similar discussions but as far as I can tell there was none.\r\n\r\nBasically this is a very simple proposal and its for a new window rule similar to [Hyprland's `keep_aspect_ratio`](https://wiki.hypr.land/Configuring/Window-Rules/#dynamic-effects) window rule. I believe this would only really apply to floating windows. It's main purpose would be to keep pop-out video players like Firefox's PIP from having black borders around the content. Scaling a window with `Super+RightClick` would only scale the window in a way that preserves the video's aspect ratio.",
      "created_at": "2025-12-06T01:03:38Z",
      "updated_at": "2025-12-06T01:03:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "WindFreaker",
        "avatar_url": "https://avatars.githubusercontent.com/u/3680852?u=d5bf77f034f867d575f606e8f8ccf13bdb0cf19d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjJOZ",
      "number": 2985,
      "title": "Firefox show \"Error writing to file descriptor: Broken pipe\"?",
      "body": "I'm not sure if this is a niri issue.\r\nBut when copying something in Firefox, does the terminal show the warning: \r\n'Gdk-WARNING: Error writing selection data: Error writing to file descriptor: Broken pipe'?\r\nI tested with river and dwl, and found that it only occurs with niri.",
      "created_at": "2025-12-05T17:25:05Z",
      "updated_at": "2025-12-05T23:44:46Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Mental-Vortex",
        "avatar_url": "https://avatars.githubusercontent.com/u/206187961?u=61da987467a9a797b113e6304fe1745158011755&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afk8t",
      "number": 1522,
      "title": "Battery drains faster in niri ??",
      "body": "Daily driving both niri and hyprland on my laptop, I've observed that my laptop battery drains faster while I'm in a niri session as compared to the latter (~0.5 hrs difference).\r\n\r\nI've also noticed that niri uses more cpu at idle than other wm's and the cpu usage also spikes to higher percentages than the other wm's while the animations are going on. Has anyone else noticed this or I'm just delusional ??",
      "created_at": "2025-05-04T06:12:31Z",
      "updated_at": "2025-12-05T19:48:06Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "voidstar-null",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?u=9284ed0b1e1f71e30306d1672bfc0f045ddf9003&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjI6R",
      "number": 2983,
      "title": "Add infinite vertical scrolling columns similar to scroll/hyprscroller",
      "body": "[Scroll](https://github.com/dawsers/scroll), which is a scrolling compositor similar to niri, includes a feature where, instead of infinite horizontal scrolling with fixed tiling columns, each column can also separately scroll vertically. \r\n\r\nI have no idea how it works under the hood, of course, so it might not be possible to replicate it in niri. But I think it would be a very good alternative to the already existing tiling and tabbed column modes, if it is possible.",
      "created_at": "2025-12-05T11:37:56Z",
      "updated_at": "2025-12-05T19:14:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "riverofsilk",
        "avatar_url": "https://avatars.githubusercontent.com/u/134794820?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai3af",
      "number": 2792,
      "title": "split a workspace into 2+",
      "body": "Would be neat if I could split my huge monitor into 2 workspaces, a top and bottom. Then I can scroll either one independently. Would also be nice if they could be different heights. Splitting into 3 would also be useful for verticle monitors and could eliminate the need for the feature request for verticle scrolling.",
      "created_at": "2025-11-14T07:03:47Z",
      "updated_at": "2025-12-05T17:01:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "exodist",
        "avatar_url": "https://avatars.githubusercontent.com/u/73914?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai3Hj",
      "number": 2791,
      "title": "Command to toggle devices, such as touchpad",
      "body": "I have a pretty large touchpad on my laptop, which often has an impact on aiming in games, even with a functional `dwt` feature.\r\nUnfortunately, touchpad toggling is not hardware-based on my model and should be disabled via software (XF86TouchpadToggle button).\r\n\r\nFor example, hyprland allows disabling specific devices via cli:\r\n`hyprctl keyword -r device[$device]:enabled false`\r\n\r\nHowever, I've yet to find similar functionality in Niri.",
      "created_at": "2025-11-13T20:26:42Z",
      "updated_at": "2025-12-05T15:24:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "atimofeev",
        "avatar_url": "https://avatars.githubusercontent.com/u/39891735?u=68c1226b1f5edf92b5edebe3bf58746d98b79bf3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjIzl",
      "number": 2979,
      "title": "Builtin support for \"modes\"?",
      "body": "I've recently been trying niri after a few years of i3/sway, and can't figure out if there is some builtin support for \"modes\"? (not sure what to call it other than that?)\r\n\r\nExample from my old i3/sway config:\r\n\r\n```\r\nbindsym Mod4+Shift+e mode \"power\"\r\n\r\nmode \"power\" {\r\n  bindsym Escape mode default\r\n  bindsym q exec --no-startup-id i3-msg exit, mode \"default\"\r\n  bindsym r exec --no-startup-id systemctl reboot, mode \"default\"\r\n  bindsym s exec --no-startup-id systemctl poweroff, mode \"default\"\r\n}\r\n```\r\n\r\nSo to turn off my computer I had to press `Super+Shift+e`, release all and then press `s`.\r\n\r\nIs this possible in niri or am I going to have to write up some script to do this?",
      "created_at": "2025-12-05T09:04:01Z",
      "updated_at": "2025-12-05T13:55:59Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "vae-21",
        "avatar_url": "https://avatars.githubusercontent.com/u/206676477?u=c0fdba500cbfc8470742ed7c4978e83c006f88b2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiTNv",
      "number": 2530,
      "title": "Screenshot notifications",
      "body": "Is there a way to change the notification urgency of the screenshot tool? I would like the screenshot notifications to display, even when I have Do Not Disturb enabled in swaync.\r\nI have tried to make an exception in swaync, but can't seem to get it to work.",
      "created_at": "2025-10-06T11:11:35Z",
      "updated_at": "2025-12-05T11:46:38Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5VRW",
        "body": "I managed to get it working in swaync with this:\r\n\r\n```json\r\n  \"notification-visibility\": {\r\n    \"niri-screenshot-low-urgency\": {\r\n      \"app-name\": \"^niri$\",\r\n      \"summary\": \"^Screenshot captured$\",\r\n      \"override-urgency\": \"low\"\r\n    }\r\n  },\r\n```\r\n\r\nI'd also love to be able to attach an action so I can open the screenshot folder directly from the notification, but that's probably a bit more advanced :)"
      },
      "user": {
        "login": "nishiiko",
        "avatar_url": "https://avatars.githubusercontent.com/u/142626254?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjIRT",
      "number": 2972,
      "title": "Add close button in overview for windows",
      "body": "It will be a great addition to be able to close windows when in overview by just clicking a close button of the window in the corner. Gnome has something similar. Its convenient to do that without actually focusing on window itself",
      "created_at": "2025-12-04T17:44:34Z",
      "updated_at": "2025-12-05T10:31:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "gevera",
        "avatar_url": "https://avatars.githubusercontent.com/u/1085337?u=2cec8f67f04c0062ae2c166a336426382cceecc1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjImO",
      "number": 2978,
      "title": "Render windows that are being screenshared",
      "body": "Windows that are offscreen don't fully render to save performance, but when screensharing something that means it looks like a slideshow when you tab out. Is it possible to detect that a window is being recorded and render it at full speed?",
      "created_at": "2025-12-05T03:53:26Z",
      "updated_at": "2025-12-05T03:55:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Hikiru",
        "avatar_url": "https://avatars.githubusercontent.com/u/18605854?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjIlL",
      "number": 2977,
      "title": "Add app icons to window previews in Alt + Tab",
      "body": "because most probably all windows look similar, so having app icon below window may help a bit in quick recognition. As app icons can be recognized faster than windows title or from window previews",
      "created_at": "2025-12-05T03:12:41Z",
      "updated_at": "2025-12-05T03:12:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "radiorambo",
        "avatar_url": "https://avatars.githubusercontent.com/u/64721943?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjIF2",
      "number": 2970,
      "title": "Moving a window all the way up should create a new workspace at the top",
      "body": "The same behavior works if you drag a window to the lowest workspace with keybinds and then down once more, but not for up. However, opening the overview and dragging the window up with the mouse does create a new workspace, so it would be nice if the same applied to keybinds too.\r\n\r\nI use these binds:\r\n``` \r\nMod+Ctrl+J     { move-window-down-or-to-workspace-down; }\r\nMod+Ctrl+K     { move-window-up-or-to-workspace-up; }\r\n```",
      "created_at": "2025-12-04T14:03:46Z",
      "updated_at": "2025-12-08T13:10:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ArijanJ",
        "avatar_url": "https://avatars.githubusercontent.com/u/56356662?u=b7a509e82168655da71247fec7d124e8d65969d3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjI08",
      "number": 2981,
      "title": "Scrolling with mousewheel in overview is too fast",
      "body": "Hello!\n\nIt seems that cooldown for scrolling with mousewheel is [hardcoded to 50ms](https://github.com/YaLTeR/niri/blob/main/src/input/mod.rs#L3134). It would be great if instead that cooldown was configurable or if it could pull those values from respective actions.\n\n<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: 25.11 \n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Fedora 43 Sway Atomic",
      "created_at": "2025-12-04T19:08:01Z",
      "updated_at": "2025-12-05T09:33:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alternateved",
        "avatar_url": "https://avatars.githubusercontent.com/u/45176912?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhIwv",
      "number": 2188,
      "title": "Make window-movement animation visible when moving full width columns - Option to change foreground window in the window-movement animation",
      "body": "When you have 0 struts and you have a 100% width window focused, the whole window-movement animation while swapping windows is hidden behind the focused window. You get no visual feedback for swapping windows.\r\n\r\nIt would be nice to have a option to  make the window movement animation happen in front of the active window. So that the focused window is behind the other one while swapping them.\r\n\r\nI've already opened a related bug report (https://github.com/YaLTeR/niri/issues/2183) and closed it to request that as a feature behind an option.",
      "created_at": "2025-08-05T07:00:09Z",
      "updated_at": "2025-12-04T19:30:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rkunschke",
        "avatar_url": "https://avatars.githubusercontent.com/u/29981387?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai4eS",
      "number": 2802,
      "title": "Allow excluding layer-shell components from workspace-switch animation",
      "body": "I'm trying niri once again, with a horizontal bar (waybar). One thing I find kind of disorienting is that the bar becomes invisible during the `workspace-switch` animation. For now I've just disabled the `workspace-switch` animation altogether.\r\n\r\nWould it be possible, perhaps with an animation option specifically for `workspace-switch`, to just keep the bar in place during the animation instead? If translucent like in my case, I would expect the bar to have a higher z-index than the windows, i.e. they would move \"under\" it.",
      "created_at": "2025-11-15T15:40:56Z",
      "updated_at": "2025-12-04T13:52:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jplatte",
        "avatar_url": "https://avatars.githubusercontent.com/u/951129?u=c865ac569258c762f56304803cd5c6a1978e259b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjHf3",
      "number": 2966,
      "title": "Multi-monitor configuration support",
      "body": "As someone who works on a laptop and moves it between work, home, and standalone, it would be fantastic if I can control my monitor configurations based on which other outputs are in use.\r\n\r\nNote: I am referring explicitly to a laptop being moved between locations, not multiple hosts sharing the same dotfiles (which can be resolved with a dotfiles manager).\r\n\r\nI would love to hear thoughts on this, and my proposed solution. Apologies if this is a duplicate or already solved issue - I couldn't find anything when searching through discussions and issues, but came across a few posts asking the same thing (reddit etc).\r\n\r\n## Issues\r\nThere are two primary use-cases I have for this:\r\n- positioning\r\n- scaling\r\n- output-specific configs\r\n\r\n### Positioning\r\nMy work setup is `[monitor] [monitor] [laptop]`, and my home setup is `[laptop] [monitor] [monitor]`. During my early setup at work I naively set my laptop to `x=3840`, just to realise that it wouldn't work at home. I have since set my laptop to be `x=0` and all my monitors are relative to that, however it would have been nice if I could clearly separate my \"work\" from my \"home\" setups.\r\nAs a side note, perhaps the \"monitors relative to laptop\" comment is worth adding to the docs, both as a tip and because some people (such as myself) won't know that negative is possible until they try it out.\r\n\r\n### Scaling\r\nScaling is a separate matter, and one I haven't been able to solve. When docked, I prefer to have my monitor between 1.5-2x scale so that it's easier to see. When working only with the laptop, I'm much closer to it and so want it back at 1x scale.\r\n\r\n### Output-specific configs\r\nWe can already add configs such as \"layout\" under our `output`. If I wanted my work setup to look drastically different from my home setup, I could put options under each output rather than the top-level config, as outlined below.\r\n\r\nWe now have two issues:\r\n- duplicated configs because I want a different backdrop depending on location\r\n- a laptop output which can't adapt based off the location\r\n\r\n```kdl\r\noutput \"home-dp-1\" {\r\n    backdrop-color \"#000000\"\r\n}\r\n\r\noutput \"home-dp-2\" {\r\n    backdrop-color \"#000000\"\r\n}\r\n\r\noutput \"work-dp-1\" {\r\n    backdrop-color \"#111111\"\r\n}\r\n\r\noutput \"work-dp-2\" {\r\n    backdrop-color \"#111111\"\r\n}\r\n\r\noutput \"eDP-1\" {\r\n    backdrop-color \"#???????\"\r\n}\r\n```\r\n\r\n## Proposal\r\nI would like to propose another config `outputs` which simply wraps specific output setups. It allows options to be set based off the current monitor configuration, without detracting from any existing behaviours.\r\n\r\n```kdl\r\noutputs \"work\" {  // named monitor configurations (may not be necessary)\r\n  backdrop-color \"#111111\"  // applies to all outputs\r\n  output \"work-dp-1\" {\r\n    position x=0, y=0\r\n  }\r\n  output \"work-dp-2\" {\r\n    position x=1920, y=0\r\n  }\r\n  output \"eDP-1\" {\r\n    position x=3840, y=0  // no longer needs to be x=0\r\n  }\r\n}\r\n\r\noutputs \"home\" {\r\n  backdrop-color \"#000000\"  // applies to all outputs\r\n  output \"eDP-1\" {\r\n    position x=0, y=0\r\n  }\r\n  output \"home-dp-1\" {\r\n    position x=1920, y=0\r\n  }\r\n  output \"home-dp-2\" {\r\n    position x=3840, y=0\r\n  }\r\n}\r\n\r\noutputs \"alone\" {\r\n  output \"eDP-1\" {\r\n    scale 1.0\r\n  }\r\n}\r\n\r\n// The default state for my monitor. An alternative way of doing this\r\n// would be setting scale 1.5 under my work and home setups, having this\r\n// as 1.0, and totally dropping the \"alone\" outputs. The reason I have not\r\n// done this is because, personally, I will always want 1.5 when plugged in.\r\n// Therefore 1.5 is the default state and 1.0 is the unique state.\r\noutput \"eDP-1\" {\r\n  scale 1.5\r\n}\r\n```\r\n\r\nThis solution does not break the existing `output` config, but instead expands upon it by allowing it to be nested. There is also no reason why people couldn't continue to just use `output` at the top level and ignore `outputs` entirely, if they have no need for config switching.\r\n\r\nWhen determining how to apply monitor configurations, the outputs are parsed and turned into sets of output. The one matching reality would be applied. As with all things, more specific configurations will overwrite more generic ones. Order of precedence (first to last) are:\r\n1. `outputs.output.myconfig`\r\n2. `outputs.myconfig`\r\n3. `output.myconfig`\r\n4. `myconfig`\r\n\r\nI'm undecided about the ordering of 2 and 3, and it comes down to if an explicit `outputs` configs or default `output` takes precedence. I would err towards the outputs taking precedence, with output remaining the default-state if nothing is specified for the specific setup.",
      "created_at": "2025-12-03T23:55:42Z",
      "updated_at": "2025-12-04T06:40:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "BVengo",
        "avatar_url": "https://avatars.githubusercontent.com/u/43019560?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjHZF",
      "number": 2961,
      "title": "Ran into edge-case with my \"universal copy\" Super+C implementation (wtype vs dotool)",
      "body": "Coming from macOS, I don't want to conditionally use Ctrl+C in GUIs vs Ctrl+Shift+C in terminals. My flow state is too fragile for that!\r\n\r\nSo I made a universal-copy script that I bind in niri config: `\"Super+C\": spawn universal-copy\"`.\r\n\r\n## Attempt 1: wtype\r\n\r\nThis impl was working fine:\r\n\r\n```bash\r\n# is_terminal is simply true if app_id matches a known terminal like foot, kitty, etc. \r\n# e.g. it doesn't work correctly in a terminal nested inside a GUI like vscode.\r\n# but that's another convo.\r\n\r\nif is_terminal then\r\n  # Send Ctrl+Shift+C to terminal\r\n  wtype -M ctrl -M shift c -m shift -m ctrl\r\nelse\r\n  # Send Ctrl+C to GUI\r\n  wtype -M ctrl c -m ctrl\r\nfi\r\n```\r\n\r\nHowever, a fail case I ran into was trying to copy selection inside the\r\nmonaco editor inside Chromium or Firefix.\r\n\r\nFor example: Super+C in the editor at https://microsoft.github.io/monaco-editor/\r\nwouldn't copy anything.\r\n\r\nI'm not sure what the exact issue is, but where wtype fails, dotool usually\r\nworks since it sends real key events instead of synthetic ones.\r\n\r\n## Attempt 2: dotool\r\n\r\n```bash\r\nif is_terminal then\r\n  # ...\r\nelse\r\n  echo \"key ctrl+c\" | dotool # 700ms startup delay!\r\nfi\r\n```\r\n\r\nThis kinda works -- I can now select text in Monaco editor on the web -- but I\r\nrealized it would only copy 700ms later, long after my selection changed.\r\n\r\nSo then I installed the `dotoold` daemon to avoid the 700ms startup delay.\r\n\r\n## Attempt 3: dotoold + dotoolc\r\n\r\n```bash\r\nif is_terminal then\r\n  # ...\r\nelse\r\n  echo \"key ctrl+c\" | dotoolc # Now I use dotoolc to connect to dotoold\r\nfi\r\n```\r\n\r\nHowever, this didn't work. It didn't work anywhere! I couldn't copy anything.\r\n\r\nAfter a bunch of troubleshooting, I realized that it's because now it's \"too\r\nfast\"; `Super` is still held down when this runs, so I'm actually sending `Super+Ctrl+C` to the app\r\ninstead of `Ctrl+C`.\r\n\r\nI tried releasing Super first: `printf '%s\\n%s\\n' \"keyup super\" \"key ctrl+c\" | dotoolc` but that doesn't work since it only releases the key on dotool's virtual keyboard device, not our physical keyboard device, and modifiers are aggregated across all devices apparently.\r\n\r\nAdding `sleep 0.2` before the dotoolc kinda works but is too hacky and only works 90% of the time.\r\n\r\n## Discussion\r\n\r\nAnyone have any ideas on a more reliable impl?\r\n\r\nLooks like hyprland has a `send-shortcut` action that sends keys using wl_keyboard, though I can't test it to see if it solves the problem:  `bind = SUPER, C, sendshortcut, CTRL, c`\r\n\r\n",
      "created_at": "2025-12-03T20:18:30Z",
      "updated_at": "2025-12-04T03:52:14Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "danneu",
        "avatar_url": "https://avatars.githubusercontent.com/u/529580?u=012be0ff43fc004322be4bb49ecc77764e88e704&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjHaF",
      "number": 2963,
      "title": "color management protocol support?",
      "body": "Hi here,\r\n\r\nWhere are we with [color management](https://wayland.app/protocols/wayland-protocols/386) on Niri?\r\n\r\nThe page says Niri doesn’t support it yet, is it up to date?",
      "created_at": "2025-12-03T20:44:42Z",
      "updated_at": "2025-12-03T21:24:35Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5zoQ",
        "body": "Here !\r\nhttps://github.com/YaLTeR/niri/discussions/1128"
      },
      "user": {
        "login": "Geobert",
        "avatar_url": "https://avatars.githubusercontent.com/u/72570?u=22086674483f5720967165e4e1902c89a8924526&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AijE2",
      "number": 2652,
      "title": "How to have niri focus something spawned via `xdg-open`?",
      "body": "1. I use `xdg-open` a lot (programmatically mostly), and would love to have my focus change to the spawned window in that case. I'm not entirely sure how to approach doing this yet...\r\n\r\nDo you guys have any idea?\r\n\r\n2. Ideally, I'd also like for it to possibly follow after an `xdg-open` that only does something in *a window that was already spawned elsewhere*.\r\n\r\n3. And possibly follow even when I'm currently in full screen: for example, if I'm watching some YouTube video in full-screen and spawn up another window to do a quick search online, it just quietly opens *to the right* while I keep seeing my full-screen app.\r\n\r\nI think that the point 1. is probably something I can make work on my own. I'm probably fine with aliasing `xdg-open` to something else...\r\n\r\nFor 2. and 3. (and even 1.?), I was considering maybe running something in the background that hooks into `niri msg event-stream`. That actually seems somewhat doable, with `niri msg --json event-stream` and `jq`, but I figured I'd ask here first, in case I'm not the first guy wanting this sort of thing.\r\nSurely I'm not... surely. :thinking:",
      "created_at": "2025-10-21T23:04:19Z",
      "updated_at": "2025-12-03T19:59:00Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5zez",
        "body": "```kdl\r\ndebug {\r\n    honor-xdg-activation-with-invalid-serial\r\n}\r\n```\r\n\r\nSee https://yalter.github.io/niri/Configuration%3A-Debug-Options.html#honor-xdg-activation-with-invalid-serial"
      },
      "user": {
        "login": "ccjmne",
        "avatar_url": "https://avatars.githubusercontent.com/u/6822545?u=dd881e22a2ac21309ea90301109f75d74658d253&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjGZL",
      "number": 2952,
      "title": "Full-screening a window should hide the top shell contents more neatly",
      "body": "I have seen a number of requests for layer shell animation already, but I couldn't find any instance of users complaining about how layer shell is handled in combination of a fullscreening animation. It isn't clear to me if this is best addressed through generic animations like what we have for, say, window opening, which is why I am filing a separate discussion/feature request.\r\n\r\n## Current status\r\n\r\nRight now when a window is full-screened the top layer shell windows will remain on top for a split second after the full-screen animation completes and then the top layer is hidden. This leads to a somewhat jarring result. See the following slowed down animation… demo(?)\r\n\r\nhttps://github.com/user-attachments/assets/268d6039-7969-45de-b465-2ec8a7578182\r\n\r\n## Desired results\r\n\r\nI can see users wanting to animate the top layer elements in different ways here:\r\n\r\n1. Slide the layer shell windows away (by default this could work well if sliding happens in the direction of their attachment) as the window is animating to its full screen state;\r\n2. Have the top layer stay visible and on top of a full-screen window for some configurable time and then animate out with a separate configurable animation;\r\n3. Have the full-screen window just go on top of the windows inside the top layer shell with no separate animation for layer shell at all.\r\n\r\nSimilarly during un-fullscreen the reverse would happen:\r\n\r\n1. The layer shell windows would slide out from their attachment points(?);\r\n2. Animate \"in\" using user configurable animation;\r\n3. Just appear from under the window as the window itself animates.\r\n\r\nI can try drawing some animations here to demo what I mean if any of these need clarification.\r\n\r\nI personally would find just the option 3 a significant improvement (and it might be easy to implement without otherwise implementing any animation support for the layer shell.)",
      "created_at": "2025-12-02T20:36:29Z",
      "updated_at": "2025-12-03T19:48:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nagisa",
        "avatar_url": "https://avatars.githubusercontent.com/u/679122?u=66d559914b9aa9e3eb004b14040fcb66abaf3a23&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjHCu",
      "number": 2960,
      "title": "Killing last window in row doesn't move me to a populated window",
      "body": "First: Sorry if this is a reposted issue (I searched but didn't find anything) or already fleshed out in the Wiki/default configuration comments (also searched). \r\n\r\nThe problem that I'm encountering is that I'll have a single window on a new row for a bit and then kill that single window. Then I'm left in an empty row when the row above (or below) has plenty of active windows which I'd prefer to take focus. I guess practically for me, it would make sense to return to the prevously-focused/active window before I had killed the last one on the row (like a stack), which would also have the benefit of clearing out (deleting/removing) the unused row since focus would move from a row with no windows which already clears it. But, even if it wasn't the previous window but just _some_ window on _some_ row I think it'd still alleviate some of my OCD tension. It feels weird to kill the last window in a row and be stuck in a view with no windows when rows above and below have active windows.\r\n\r\nIs something like this possible through configuration, already?",
      "created_at": "2025-12-03T13:23:48Z",
      "updated_at": "2025-12-03T15:39:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "johnrichardrinehart",
        "avatar_url": "https://avatars.githubusercontent.com/u/6321578?u=c984e40c9e51c44e0f2e83ef2c966fbbe8de716d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjHCU",
      "number": 2959,
      "title": "Cycling Full makes window \"stick\" to new column",
      "body": "First: Sorry if this is a reposted issue (I searched but didn't find anything) or already fleshed out in the Wiki/default configuration comments (also searched).\r\n\r\nThe problem that I'm encountering is that I'll start working with two half-width terminal windows and want to expand one of them to full column (Mod+F). Then, I'll usually be done with whatever I needed at full column on the one terminal and so I'll cycle Mod+F on that window. When the terminal window is the _left_ window of the pair then I return to my original, two half-width-within-one-column state. However, if I cycle the _right_ window then the first Mod+F \"pushes\" the right window into a new column and it gets \"stuck\" there. What I would _want_ is for it to collapse to the left and fill the void in the original column from whence it came (so that 2xMod+F on the right window looks and behaves exactly the same as 2xMod+F on the left window once all is said and done).\r\n\r\nIs this possible to configure through a configuration change (\"fill-voids\" or \"sticky-column-on-resize\" or something)?",
      "created_at": "2025-12-03T13:15:18Z",
      "updated_at": "2025-12-03T14:33:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "johnrichardrinehart",
        "avatar_url": "https://avatars.githubusercontent.com/u/6321578?u=c984e40c9e51c44e0f2e83ef2c966fbbe8de716d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjFk8",
      "number": 2946,
      "title": "Dim inactive (unfocused) windows",
      "body": "Hi. Recently I discovered Niri and honestly can't put it down ever since. What a nice piece of software!\r\n\r\nI'm trying to migrate from my old Gnome + PaperWM setup to Niri. I can get everything working pretty much feature-for-feature identical to my old trusty Gnome setup but one single thing:\r\n\r\nOn desktop I used to run two Gnome extensions PaperWM and also [Dim Background Windows](https://github.com/stephane-13/gnome-shell-extension-dim-background-windows) by @stephane-13. What it does basically it lets you dim the unfocused windows anywhere in 10-90% range. I always have the focused window in the center column occupying most of screen space with windows on the left and right only partially visible. I dim the inactive windows on the sides quite aggressively to about 30% otherwise they can get way too distracting. \r\n\r\nMost users use dark-ish color themes in their WMs. So when you have some bright content in the neighboring tile (such as e.g. a web browser page with a white background or just an odd GUI app with bright background not supporting theming), it is like a giant annoying sore in the eye. You always see this distracting bright spot with your peripheral view and it is super distracting.\r\n\r\nThe Dim Background Windows extension mostly sorted the issue completely. You can configure it to not dim windows when fully visible if you have some tiles side-by-side fully visible on the screen. But still have them dimmed when partially visible like the left and right side columns with partially visible off-screen content. You can also configure to not dim overlay always-on-top windows. Per-monitor config. Hotkey to dynamically dim/undim focused window etc.   \r\n \r\nI had a dig through Niri config docs and seems can't find anything relevant.\r\n\r\nAny chance you guys can consider inactive window dimming support as a core Niri feature?\r\n\r\nOr maybe point in the right direction for modding? Can something like that be achieved by messing with the shaders alone or needs large scale code mods? \r\n\r\nThanks for any ideas! \r\n",
      "created_at": "2025-12-02T00:46:20Z",
      "updated_at": "2025-12-03T12:58:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "iamvoidcoder",
        "avatar_url": "https://avatars.githubusercontent.com/u/81540569?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjGef",
      "number": 2954,
      "title": "Allow escaping pointer constraints via IPC",
      "body": "I'd like the IPC to expose a command to force pointer to escape the current constraints. This is perhaps a rather niche use case, but I hope this could be considered to be implemented.\r\n\r\nMy specific use case where this comes up is game development. When running a game with a debugger, the mouse pointer is often constrained to the game window. When a breakpoint is hit in code, an IDE will usually try to signal the compositor to free the mouse from the application, so you can interact with the IDE. This is very often spotty on tiling window managers/wayland compositors, where usually you have the IDE as a tiled window, but the game as a floating window. Currently, I haven't found a way to force this to happen on Niri, which as you can probably imagine is rather problematic. You can sort of do this by sending the application to another workspace, then returning back to the IDE, but this obviously is problematic if you also need to monitor the application state while you step through code.\r\n\r\nFor reference, Sway implements this exact behavior via their IPC. You can simply execute `swaymsg seat seat0 pointer_constraint escape`, which will free the pointer from the application that is currently capturing it.\r\n\r\nhttps://man.archlinux.org/man/sway-input.5.en#SEAT_CONFIGURATION\r\n\r\nSorry if this is a duplicate of an existing discussion, but I could not find anything like this from a quick search.",
      "created_at": "2025-12-02T23:16:11Z",
      "updated_at": "2025-12-03T07:08:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Aciz",
        "avatar_url": "https://avatars.githubusercontent.com/u/14221121?u=1cdfd072737e842073f8f0cebc0386156aaadb3c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afw02",
      "number": 1575,
      "title": "Allow configuring the font size for Hotkey, Screenshot, and Alt-Tab UI text",
      "body": "Currently, Niri hardcodes the font size for the hotkey, screenshot, and Alt-Tab text, which causes the text to sometimes be too small without modifying the output scale (and increasing the scale then causes all UI elements to scale too). It'd be nice if there was a way to configure what font size Niri used, although looking at the config, it does raise an interesting question of where a `font-size` setting would logically live. Perhaps a new section would be needed? Per output? Honestly not sure",
      "created_at": "2025-05-14T20:50:50Z",
      "updated_at": "2025-12-03T03:55:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Winterhuman",
        "avatar_url": "https://avatars.githubusercontent.com/u/86165318?u=a747d681f3cfae7c8702df89004a3add23952899&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjGds",
      "number": 2953,
      "title": "Recent windows don't respect the warp-mouse-to-focus feature",
      "body": "I use `input { warp-mouse-to-focus }` and after upgrading to 25.11, I've noticed the new Recent Windows feature doesn't appear to respect this option.  Focus switches but the cursor remains where it was.\r\n\r\nThis appears to be inconsistent with all the other methods of changing focus that I'm aware of, but I'm still not sure if this is intentional or an oversight, or whether this should be separately configurable.",
      "created_at": "2025-12-02T22:43:21Z",
      "updated_at": "2025-12-02T22:43:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "contyk",
        "avatar_url": "https://avatars.githubusercontent.com/u/572410?u=f117f0228700891bf4687672d7eb1305465867f5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjEjT",
      "number": 2935,
      "title": "Indicate off-screen windows",
      "body": "I would like to see when there are more windows to the left or to the right of the currenlty visible windows. I imagine something like a 1 to 3 pixel wide red (or configurable color) bar at the corresponding edge of the screen. I tried aproximating sommething like this with uneven proportions for my windows (like 0.32, 0.49 and 0.6) but this does not quite scratch my itch.",
      "created_at": "2025-11-30T21:09:37Z",
      "updated_at": "2025-12-02T21:57:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "julkip",
        "avatar_url": "https://avatars.githubusercontent.com/u/3310080?u=58420117bfec9e761acc096344e2a959c5af256d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjGYL",
      "number": 2951,
      "title": "change mouse sensitivity for a window",
      "body": "Is it possible to change mouse sensitivity for a specific window?",
      "created_at": "2025-12-02T20:10:10Z",
      "updated_at": "2025-12-03T16:06:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5wYj",
        "body": "It is currently not sorry"
      },
      "user": {
        "login": "BluewyDiamond",
        "avatar_url": "https://avatars.githubusercontent.com/u/115411576?u=784fbbf63c47cf5135b8f5d281af4f2caac27331&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfmOE",
      "number": 1529,
      "title": "Waybar error calling StartServiceByName for org.freedesktop.portal.Desktop: Timeout was reached",
      "body": "I am noticing a problem. When I boot up and login (Login manager LightDM) directly to niri, my waybar does not open. If I try to launch it from a terminal I get Error calling StartServiceByName for org.freedesktop.portal.Desktop: Timeout was reached, I also notice all programs taking at least 10 secs or more to open, and my gnome-polkit is not working. If at first I login to LeftWM, gnome-polkit does work and I can open synaptic or software manager no problem. Then if I logout and then back into niri, waybar does start and does not have the error, BUT gnome-polkit does not work and synaptic and software manager will open with a warning (see attached pic) \r\n![Screenshot from 2025-05-05 15-08-01](https://github.com/user-attachments/assets/4fbfc65e-bd3c-4116-8797-5ac589d0a71f)\r\nand I can not install programs. Weird, has anyone else had this problem or know a solution. Thanks in advance.",
      "created_at": "2025-05-05T22:11:28Z",
      "updated_at": "2025-12-02T13:52:15Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "grndplane",
        "avatar_url": "https://avatars.githubusercontent.com/u/6069678?u=ab75993d17b236c2a5a4c85de260ad560ab7257c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjGB0",
      "number": 2950,
      "title": "Any way to support niri development monetarily?",
      "body": "I have a policy of donating to projects that I use daily and I was wondering if there is a donate page for niri?",
      "created_at": "2025-12-02T12:48:20Z",
      "updated_at": "2025-12-02T12:55:26Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "filiptrplan",
        "avatar_url": "https://avatars.githubusercontent.com/u/8643457?u=0997b55d37e1f301d86ec5dfd5f50257daffbbd5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AijPu",
      "number": 2656,
      "title": "Side scrolling with mouse wheel button doesn't focus next/prev column",
      "body": "My mouse(Rysen Basilisk v3) has a wheel button which can side scroll with \"click\" it left or right. \r\nThe problem is that when using it with mod key the binds \r\n```\r\nMod+Ctrl+Shift+WheelScrollDown { move-column-right; } \r\nMod+Ctrl+Shift+WheelScrollUp   { move-column-left; } \r\n```\r\ninstead of focus on next/prev window, jumps to the first/last window. Is there a way to fix this? I tried the cooldown ms option which seems that ignored.",
      "created_at": "2025-10-22T05:01:24Z",
      "updated_at": "2025-12-02T12:28:13Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "dancaer69",
        "avatar_url": "https://avatars.githubusercontent.com/u/43911684?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai8aV",
      "number": 2851,
      "title": "Can't access vivaldi account when using Niri",
      "body": " hey guys! im using fedora 43. I just installed the Niri instead of my KDE. But it can't work very well.\r\n im using xdg-desktop-portal-wlr.  \r\nThe biggest problem I have encountered so far is that when I use Vivaldi, I am reminded to enter the key. When I try to enter Vivaldi's account password and data password, they are both prompted incorrectly. Finally, when I try to use my Linux account password, it is also incorrect. After searching I found that it seems to be because of the problem with the default password manager. Does anyone know the best way to solve this problem?\r\n\r\nThe second problem is that the file manager in vscode cannot be opened. When I click on the open folder, nothing happens. I see that it requires using xdg-desktop-portal-gnome and the accompanying Nautilus. Can I continue to use Dolphin?",
      "created_at": "2025-11-20T10:48:15Z",
      "updated_at": "2025-12-02T10:18:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "XC-Xinze",
        "avatar_url": "https://avatars.githubusercontent.com/u/176416602?u=5da3013fa032b64fb01e241757d46f1a179b2189&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjFv2",
      "number": 2947,
      "title": "Proposal: Semantic Context-Aware Navigation for Niri (Column-First, Workspace Fallback, Overview-Aware)",
      "body": "Hi! I’ve been exploring ways to make directional navigation in Niri feel more predictable and semantic in stacked layouts, workspace boundaries, and Overview mode.\r\nI wrote a small reference implementation and a design document, and I would love to get feedback on whether this direction aligns with Niri’s long-term goals.\r\n\r\n---\r\n\r\n## 1. **Motivation**\r\n\r\nDirectional actions such as:\r\n\r\n- `focus-window-{left,down,up,right}`\r\n- `focus-window-or-workspace-*`\r\n- `move-window-*`\r\n\r\nwork well in simple layouts, but they do not currently account for:\r\n\r\n- stacked columns (where a “column-first” behavior is expected),\r\n- the boundary between columns and workspaces,\r\n- floating windows,\r\n- Overview mode behaving as a separate navigation context,\r\n- lack of feedback when a directional action fails.\r\n\r\nAs a result, directional keys sometimes:\r\n\r\n- do nothing,\r\n- unexpectedly switch workspaces,\r\n- or behave differently depending on subtle layout conditions.\r\n\r\nMy goal is to explore a unified navigation model that matches user intuition in Niri’s scrollable-tiling paradigm.\r\n\r\n---\r\n\r\n## 2. **Proposed Navigation Semantics**\r\n\r\nThe idea is to treat directional navigation as a small decision process:\r\n\r\n```\r\nif Overview is open:\r\n    run overview-specific action\r\nelif focused window is floating:\r\n    run fallback action\r\nelse:\r\n    run primary action (focus/move)\r\n    if focus/layout changed:\r\n        success\r\n    else:\r\n        run fallback action (e.g., workspace navigation)\r\n```\r\n\r\nThis yields:\r\n\r\n### ✔ Column-first semantics\r\n\r\nStay inside the column when a neighbor exists.\r\n\r\n### ✔ Workspace fallback\r\n\r\nIf movement inside the column is impossible, fall back to workspace navigation in the same direction.\r\n\r\n### ✔ Mode-aware behavior\r\n\r\nDirectional keys behave differently in Overview vs. normal tiling.\r\n\r\n### ✔ Predictable behavior for floating windows\r\n\r\nFloating windows bypass column logic.\r\n\r\nThese rules create a consistent user mental model across layouts, monitors, and workspaces.\r\n\r\n---\r\n\r\n## 3. **Reference Implementation**\r\n\r\nI put together a small helper script that demonstrates this behavior using:\r\n\r\n- `niri msg -j windows` to inspect the layout,\r\n- stable window identity detection,\r\n- snapshot-based layout diffing,\r\n- and selecting an appropriate Niri action at runtime.\r\n\r\nRepo:\r\n[https://github.com/Ac-Ada-Lovelace/niri-config](https://github.com/Ac-Ada-Lovelace/niri-config) (navigation helper + design notes)\r\n\r\n**Note:**\r\nThis is _not_ intended for upstream as-is.\r\nIt is only a prototype for discussing semantics.\r\n\r\n---\r\n\r\n## 4. **Why compositor-level support might make sense**\r\n\r\nThe prototype works, but a compositor-level implementation could be:\r\n\r\n- instantaneous (no IPC delay),\r\n- more accurate (no layout polling),\r\n- better integrated with Overview,\r\n- fully aware of animation/focus transitions,\r\n- less fragile than a script interpreting JSON state.\r\n\r\nThis discussion is mainly about whether such semantics belong in Niri.\r\n\r\n---\r\n\r\n## 5. **Open Questions for Niri maintainers**\r\n\r\nI would love feedback on these points:\r\n\r\n1. **Should Niri adopt a column-first directional navigation model?**\r\n2. **Should failed focus/move attempts fall back to workspace navigation?**\r\n3. **Should Overview have its own directional semantics?**\r\n4. **Would event-driven IPC (layout/focus changed) be desirable long-term?**\r\n5. **Is a small rules engine / navigation policy layer something Niri might consider?**\r\n6. **Does this proposal align with Niri’s design philosophy, or are there concerns?**\r\n\r\n---\r\n\r\n## 6. **Intent**\r\n\r\nThe goal is _not_ to replace existing actions,\r\nnor require any large architectural change.\r\nThis is meant as a focused exploration of:\r\n\r\n> **What should directional navigation _mean_ in Niri’s scrollable-tiling model?**\r\n\r\nAny feedback—positive, negative, or alternative models—is very welcome.\r\n\r\nThank you for reading, and thanks for all the work on Niri!\r\nIt’s already a fantastic compositor, and I hope this sparks a useful discussion.\r\n",
      "created_at": "2025-12-02T06:22:47Z",
      "updated_at": "2025-12-02T06:22:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Ac-Ada-Lovelace",
        "avatar_url": "https://avatars.githubusercontent.com/u/53103202?u=6081782d92e0913d45b8f343fe9e7ed7cb7c4cd3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AV2o1",
      "number": 50,
      "title": "command to \"merge\" workspaces",
      "body": "whats your thoughts on adding functionallity to combine workspaces of windows, while preserving were they are in the list of columns?",
      "created_at": "2023-10-04T18:18:11Z",
      "updated_at": "2025-12-02T04:13:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SomeGuyNamedMay",
        "avatar_url": "https://avatars.githubusercontent.com/u/83663766?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0yC",
      "number": 1603,
      "title": "niri gaming",
      "body": "show off your screenshots with the game in [overview](https://github.com/YaLTeR/niri/wiki/Overview)\r\n\r\n![image](https://github.com/user-attachments/assets/9473de42-6bcf-4795-bd21-99d114c609e0)\r\n\r\n",
      "created_at": "2025-05-18T18:29:13Z",
      "updated_at": "2025-12-02T02:58:59Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "edpyt",
        "avatar_url": "https://avatars.githubusercontent.com/u/125578104?u=98e351ffdd27f53822300fb96a1612df321d2ae7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjFgH",
      "number": 2940,
      "title": "save session",
      "body": "I would love to see saved session support. Each time I login it works be great to have everything reopen and restored.",
      "created_at": "2025-12-01T21:58:14Z",
      "updated_at": "2025-12-01T23:29:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Gibbz",
        "avatar_url": "https://avatars.githubusercontent.com/u/650506?u=2feb09807c68dff5cc305a8d3312989e1c87c944&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjFhf",
      "number": 2941,
      "title": "Click-and-drag from the Alt+Tab list",
      "body": "It could be useful if windows in the Alt+Tab list were able to be clicked-and-held, such that releasing Alt+Tab (or dragging the window far away enough vertically) would put the window under the cursor like when drag-moving them by their title bar. This would make it possible to drag windows from the ends of a long list to the current view, without needing to first scroll the view over to it.\r\n\r\nThe only problem is that it would change the behaviour of clicking a window from on-press to on-release in order to support dragging, which may of been an intentional and desirable choice for Alt-tabbing.",
      "created_at": "2025-12-01T22:36:39Z",
      "updated_at": "2025-12-01T22:36:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Winterhuman",
        "avatar_url": "https://avatars.githubusercontent.com/u/86165318?u=a747d681f3cfae7c8702df89004a3add23952899&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjEdy",
      "number": 2934,
      "title": "Recent windows: open-on-output",
      "body": "Hi,\r\n\r\nFirst of all, congratulations on the `25.11` release. Brilliant work! The recent windows feature is elegantly composed.\r\n\r\nWith this thread I would like to propose the ability to configure `open-on-output` for `recent-windows`.\r\n\r\nMy use case is that I use a dual monitor setup, where i treat one as as primary and one as secondary, and I would like to ability to configure the recent windows to always show up on my primary monitor.\r\n\r\nThanks!",
      "created_at": "2025-11-30T17:24:56Z",
      "updated_at": "2025-12-01T20:37:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "avesst",
        "avatar_url": "https://avatars.githubusercontent.com/u/810218?u=af96b682a4409c976b16d08b3d1c4854928958f5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agsj0",
      "number": 2016,
      "title": "Subcolumns",
      "body": "Ability to create sub-columns (columns within columns; see the simple ASCII drawing below depicting one use case) would be a useful feature for even more fine-grained window control.\r\n\r\n```text\r\n-------------\r\n|           |\r\n-------------\r\n|     |     |\r\n-------------\r\n```\r\n\r\nSub-columns could be stacked or tabbed the same as columns.\r\n\r\nWould this be feasible?\r\n\r\nThis feature request partially overlaps with https://github.com/YaLTeR/niri/discussions/1044, but its purpose is a bit different.\r\nI also found that the term \"subcolumn\" is used in https://github.com/YaLTeR/niri/discussions/662#discussioncomment-10613445 but in a different context, as far as I understand.",
      "created_at": "2025-07-12T14:10:28Z",
      "updated_at": "2025-12-01T01:18:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "eandersons",
        "avatar_url": "https://avatars.githubusercontent.com/u/9976861?u=52190ffee07180300529172ee59b0b430e37b0d0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjEoO",
      "number": 2937,
      "title": "Implement focusonactivate window rule option",
      "body": "This is basically a continuation of https://github.com/YaLTeR/niri/issues/2120\r\n\r\nI would love to see this feature, as it's pretty annoying that Firefox PiP (or other apps) may steal the focus, when it's not desired.\r\n\r\nHad this happen with my Telegram client, which was stealing focus on every incoming message for some reason.\r\n\r\nhttps://wiki.hypr.land/0.45.0/Configuring/Window-Rules/#dynamic-rules\r\nThis must also be implemented on other compositors/DEs.",
      "created_at": "2025-12-01T01:06:45Z",
      "updated_at": "2025-12-01T01:06:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "atimofeev",
        "avatar_url": "https://avatars.githubusercontent.com/u/39891735?u=68c1226b1f5edf92b5edebe3bf58746d98b79bf3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjEkO",
      "number": 2936,
      "title": "Ability to Wrap previews on recent window view",
      "body": "Great work on this so far, \r\nIf possible it would be great to provide an option to be able to wrap the previews onto the  \"next line\" when they are too many as opposed to scrolling through the previews. Similar to the way it works on windows.",
      "created_at": "2025-11-30T21:53:39Z",
      "updated_at": "2025-11-30T23:23:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SaverinOnRails",
        "avatar_url": "https://avatars.githubusercontent.com/u/71329328?u=11283c3c3536f7545b48ed7670bb1b8452da3ae1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0WV",
      "number": 1591,
      "title": "Overview: Allow layer shell components to only be visible in overview, like Newm",
      "body": "I suggest that, for a cleaner desktop experience, layer-shell components like Waybar should be able to hide in \"normal\" or \"desktop mode\" and appear only when the user is in overview. This could be controlled by an \"overview-only\" flag: if set to false, the component should be visible in both \"desktop\" and \"overview\" modes; if set to true, it should only be visible in \"overview\".  I've attached a video showing how Newm (another scrolling wm) implements this feature.\r\n\r\nhttps://github.com/user-attachments/assets/99254be3-c9dc-40f2-969c-e3548cfaae18\r\n\r\n> https://www.youtube.com/watch?v=mDw-hMW0b70\r\n",
      "created_at": "2025-05-18T00:29:20Z",
      "updated_at": "2025-11-30T20:04:55Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "LBY-L",
        "avatar_url": "https://avatars.githubusercontent.com/u/93894290?u=fcf94a812eec7e6df66dd9ce94f89fb2f540bf90&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfQBm",
      "number": 1419,
      "title": "Allow spawning windows in the same column/tab stack",
      "body": "I couldn't find a dedicated issue for this (only a comment in the original tabbed PR: https://github.com/YaLTeR/niri/pull/1085#issuecomment-2644715833).\r\n\r\nIt would be really great to be able to spawn apps in the same column/tab stack.\r\n\r\nI'm not sure how this could be implemented, but maybe the `spawn` action could accept an optional property like `in-focused-column=true`?",
      "created_at": "2025-04-11T13:34:24Z",
      "updated_at": "2025-11-30T18:54:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rizo",
        "avatar_url": "https://avatars.githubusercontent.com/u/308413?u=8458ff79b4960e150747402567626778707bb360&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjEc0",
      "number": 2931,
      "title": "Cyclic tabs",
      "body": "Currently, it is possible to switch tabs with  ```focus-window-down/up```. When I have two tabs, I don't want to think if the focused window is first or second and switch it regardless of the action. It can be generalized for more than two tabs: when the focused window is the lowest in the tab, we would be able to jump to the highest...\r\n\r\nIt would be nice to config it in layout, for example ```cyclic-tab=true```.\r\n\r\nSomething similar was discussed [here](https://github.com/YaLTeR/niri/discussions/1190), but with no progress. I can try to implement this.",
      "created_at": "2025-11-30T16:46:01Z",
      "updated_at": "2025-11-30T18:03:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SashaT9",
        "avatar_url": "https://avatars.githubusercontent.com/u/146673833?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjEdu",
      "number": 2933,
      "title": "How to clone/mirror niri output on a second monitor?",
      "body": "**edit: see [previous discussion](https://github.com/YaLTeR/niri/discussions/1152).** \r\n\r\nOn X11, I can run the following `xrandr` command to make the window manager behave as if there is only a single monitor, and then display the same window manager output on both monitors:\r\n```sh\r\nxrandr --output HDMI-1 --same-as HDMI-0\r\n```\r\n\r\nMy typical use-case for this configuration is during presentations, where I have a projector connected to my laptop and I want the audience to see the same via the projector as I am seeing on my laptop display. I believe this behavior is usually referred to as \"cloning\" or \"mirroring\".\r\n\r\nIs it possible to achieve such behavior with niri?",
      "created_at": "2025-11-30T17:22:45Z",
      "updated_at": "2025-11-30T17:24:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "m0rphism",
        "avatar_url": "https://avatars.githubusercontent.com/u/11156969?u=f6758b26e6aae307f9414a0e3a854f1690878661&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjEdt",
      "number": 2932,
      "title": "Support `wp_single_pixel_buffer_manager_v1`",
      "body": "Hi,\r\n\r\nA program I want to use required `wp_single_pixel_buffer_manager_v1` and apparently it is not supported by Niri. [[1]](https://wayland.app/protocols/single-pixel-buffer-v1#compositor-support)\r\n\r\nI wonder: could this be considered for implementation at some point?\r\n\r\nThanks!",
      "created_at": "2025-11-30T17:22:40Z",
      "updated_at": "2025-11-30T17:22:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cardboardcpu",
        "avatar_url": "https://avatars.githubusercontent.com/u/185692243?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjEZO",
      "number": 2929,
      "title": "How to customize the new alt-tab background and border colors?",
      "body": "I noticed the default config file wasn't changed with the latest release.\r\n\r\nI know you can adjust a window's border color as well as the overview's backdrop color. I am hoping we can also customize the alt-tab colors as well?",
      "created_at": "2025-11-30T14:24:55Z",
      "updated_at": "2025-11-30T14:29:38Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5qqx",
        "body": "Ah, I was focused on looking for a border color but I think that's dynamically calculated with opacity off the main color.\r\n\r\nHere is how to customize the color in case anyone else stumbles upon this:\r\n\r\n```kdl\r\nrecent-windows {\r\n    highlight {\r\n        active-color \"#14151fff\"\r\n    }\r\n}\r\n```\r\n\r\nIt is documented here: https://yalter.github.io/niri/Configuration%3A-Recent-Windows.html#overview"
      },
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeZb0",
      "number": 1128,
      "title": "HDR Support?",
      "body": "Apparently the Wayland Color Profile for HDR just got merged:\r\nhttps://www.phoronix.com/news/Wayland-CM-HDR-Merged\r\n\r\nIn what way does this affect Niri? Is it up to Niri to add an implementation for this or is it the distro or how does it work?",
      "created_at": "2025-02-15T02:06:05Z",
      "updated_at": "2025-11-30T08:34:09Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "DominicDolan",
        "avatar_url": "https://avatars.githubusercontent.com/u/30657900?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjEDz",
      "number": 2924,
      "title": "Insert new columns vertically instead of horizontally",
      "body": "I have one of my screens setup in portrait mode, and I was wondering if it was possible to make it so that new columns added in this particular screen are added vertically, instead of horizontally? That way, whenever I open a new window, it would be placed at the bottom of the screen, taking half the screen height, instead of opening to the right of the previous window, taking half of the width",
      "created_at": "2025-11-29T20:52:37Z",
      "updated_at": "2025-11-30T05:44:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "iErik",
        "avatar_url": "https://avatars.githubusercontent.com/u/3172683?u=b66ef658207f4b8b2ec40c813797d4ec730f813e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjDqD",
      "number": 2915,
      "title": "Is there stayfocused window rule in niri?",
      "body": "like: https://github.com/hyprwm/Hyprland/issues/1317\r\n\r\nWith this rule, some popup window can always be focused: focus is not lost even when we move mouse accidently out of current window.",
      "created_at": "2025-11-29T01:18:17Z",
      "updated_at": "2025-11-29T22:05:50Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "yangyingchao",
        "avatar_url": "https://avatars.githubusercontent.com/u/990329?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjEBa",
      "number": 2923,
      "title": "Global shortcuts with the ability to manage which keys go to which application",
      "body": "Hello!\r\n\r\nOne sore point with Wayland after all these years (I switched 5 years ago) are global shortcuts like \"press to talk\" for various voice applications, but also other usages of course.\r\n\r\nI get that the old X11 model was insecure, but I don't see how we can't make this backwards compatible and secure (!) if we allow users to decide which keystrokes get distributed to which application.\r\n\r\nFor the application it would be transparent. If niri doesn't send a specific key unless the application is focused, then it's not receiving it.\r\n\r\nWe could say that the press to talk key gets forwarded to specific applications, but no other global shortcut...\r\n\r\nThe decision would be the one of the user.\r\n\r\nAny thoughts on that? Can we explore that route? Because right now, it's super annoying to work around that for every application and global shortcut I'd like to enable.",
      "created_at": "2025-11-29T19:04:03Z",
      "updated_at": "2025-11-29T22:00:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mogambro",
        "avatar_url": "https://avatars.githubusercontent.com/u/97800396?u=7a91e0ca6350db03d097ff5df07a6b6a4d217663&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjD75",
      "number": 2921,
      "title": "Animation options for window-rules and layer-rules",
      "body": "An option to enable/disable animation for each windows or layers. The animation format could be inside the `window-rules`/`layer-rules` like with the `focus-ring`, `border` or `shadow` options.",
      "created_at": "2025-11-29T15:20:43Z",
      "updated_at": "2025-11-29T15:20:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "neyfua",
        "avatar_url": "https://avatars.githubusercontent.com/u/111333721?u=53892bf5224594accacf7ba3eafa04f2a8fc1a77&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjD5H",
      "number": 2920,
      "title": "Scrollable wallpaper like on android",
      "body": "I don't know how feasible this would be/ good looking, since on android this feature only updates the amount the wallpaper is scrolled, when adding/removing pages from the home screen. (I don't even know if all the launchers support it)\r\nOn niri, the amount of columns you have changes constantly, which could make the wallpaper jump a lot/ or in a jarring way (probably mainly if relative scrolling is done). Another thing that would make it scroll a lot in an instant is alt-tab (or not, and only have the wallpaper scroll when you walk between the window columns next to each other).\r\n\r\nNontheless, if there is a way to make it work, it'd be cool to set a very wide wallpaper and see it scroll by as you switch between your windows (at least in idea).\r\nI don't know if a set amount a scrolling would fix the jarringness or a relative amount would work better based on the number of open windows.\r\n\r\nJust an idea that popped in my mind, I wonder how others would feel about this.\r\n\r\nSo as soon as I post this I find [this](https://github.com/YaLTeR/niri/discussions/2630) already open, didn't read that it would be put in discussions instead of issues (ﾉ☉ヮ⚆)ﾉ ⌒*:･ﾟ",
      "created_at": "2025-11-29T13:33:53Z",
      "updated_at": "2025-11-29T13:47:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Kingproone",
        "avatar_url": "https://avatars.githubusercontent.com/u/118820223?u=65341cb3a21dff10e890692542157b72c59e1b1b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjD4u",
      "number": 2919,
      "title": "Specify a default formatter for `config.kdl` file",
      "body": "Although the default format of the `config.kdl` file makes it easy to read and understand niri's configurations, having a default formatter like [kdlfmt](https://github.com/hougesen/kdlfmt) makes it easier to track changes/updates between our personal configs and the default config file from the project.\r\n\r\nSetting this step now also reduces conflicts and confusion, and it can be set as a flexible rule, which may lead to a stricter rule in the future. *but I belive a rule should be made at some point.*\r\n\r\nI would like to hear your thoughts on this.",
      "created_at": "2025-11-29T13:16:42Z",
      "updated_at": "2025-11-29T13:16:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ABDsheikho",
        "avatar_url": "https://avatars.githubusercontent.com/u/134243344?u=78137fafabbfb4a027fde3cf163e8cee6c12b0f1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjDCY",
      "number": 2911,
      "title": "session menu when fullscreen?",
      "body": "Session menu (noctalia shell) isn't in front of a **fullscreen** window. How can I change that?",
      "created_at": "2025-11-28T06:56:48Z",
      "updated_at": "2025-11-29T13:02:30Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "bobblkabb",
        "avatar_url": "https://avatars.githubusercontent.com/u/7815101?u=30f6d40c7d0361f14b6b239e13a9a72a18d59972&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjDiH",
      "number": 2912,
      "title": "Window titles in tab indicator?",
      "body": "[ My apologies if this has been discussed, search sucks ]\r\n\r\nI've been trying to wean myself off tab-endowed terminals by grouping individual terminal windows into tabbed columns, and the experience feels like flying blind at times: as far as the windows in hidden tabs are concerned all I can rely on is my memory -- there are no titles on the tab \"labels\" and nothing relevant in the overview.  I can toggle the column's tabbed state off and back on to refresh my memory, but that causes windows to redraw and redrawing is not always a good idea.\r\n\r\nMaybe I'll get over it at some point, maybe not.",
      "created_at": "2025-11-28T19:27:54Z",
      "updated_at": "2025-11-29T07:29:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cmm",
        "avatar_url": "https://avatars.githubusercontent.com/u/718298?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AijI8",
      "number": 2653,
      "title": "How to calculate window geometry",
      "body": "This was discussed in discussion #721 and implemented in MR #1265.\r\n\r\nHowever, MR #1265 does not expose window geometry directly and states that \"clients can compute on their own.\"\r\n\r\nCould someone please demonstrate how this can be accomplished?\r\n\r\nThank you.\r\n",
      "created_at": "2025-10-22T01:00:06Z",
      "updated_at": "2025-11-29T00:35:33Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "yangyingchao",
        "avatar_url": "https://avatars.githubusercontent.com/u/990329?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjDoa",
      "number": 2914,
      "title": "Solution to slow reconnection to wifi?",
      "body": "Greetings, I have a unique situation. Due to some temporary address issues, I can't get a home modem. Therefore, I am using hotspot on my laptop from my cellular network. It does the job, however, whenever I have to take my phone to elsewhere my hotspot connection breaks. In Gnome, I can easily reconnect from the panel menu. However, in Niri (using Dank Material Shell) same procedure does not work. Niri waits for a certain timeout (usually like 30 seconds) to reconnect, and forcing the Wi-Fi off and on does not work either. I believe this is not a bug, this is probably by design, it's kind of frustrating though. Anyone has a way around this?\r\n\r\nI'm on Arch btw.",
      "created_at": "2025-11-28T23:55:40Z",
      "updated_at": "2025-11-29T00:21:16Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5o1C",
        "body": "You should go make a post with the DankMaterialShell github"
      },
      "user": {
        "login": "agoodfellow123",
        "avatar_url": "https://avatars.githubusercontent.com/u/36235265?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjAr2",
      "number": 2894,
      "title": "EVE Online issues",
      "body": "Hey there! Recently switched to niri from hyprland and **really** liking it. Enough so that I am moving over to it full time. I'm using the nix flake and home-manager module, and my config can be found [here](https://github.com/rykugur/dotfiles/blob/master/modules/desktop/niri/default.nix).\r\n\r\nI'm having several issues with my primary game - EVE Online - and hoping some folks here might be able to offer some insight.\r\n\r\n1. ~~Sometimes when I am doing stuff on other workspaces and click back into EVE, the EVE window disappears. The client remains running, but the window itself is gone. I have to force-quit and restart the client from the launcher.~~ This seems to have been resolved by swtiching from Proton Experimental to GE-Proton10-25.\r\n2. Similar to the first, frequently when I click back into EVE my camera will spin wildly, and continue to do so whenever I try to manipulate the camera until I unfocus/refocus the window (I usually just quickly pull up and dismiss the overview). This is relatively minor but can be annoying if I need to act quickly.\r\n3. Addition to 2 - sometimes after I click back into the EVE window, it won't take any input (mouse or keyboard), even if I don't get the spinny camera bug. Fixed with unfocus/refocus.\r\n\r\nWhat I've tried:\r\n\r\n- Most of the performance tweaks found here: https://gitlab.com/chloroken/eve-on-linux/-/wikis/tweaks\r\n  - Gamescope has its own set of issues, and isn't really an option since I usually run two EVE clients.\r\n- VRR on/off/on-demand (w/ window rule for EVE when on-demand is true).\r\n- Skipping cursor-only updates as outlined [here](https://github.com/YaLTeR/niri/pull/1616/files#diff-2b20caa4e283f3155921773d8b274ad00e8d9c5fd582b7b5f4867d1f06e37e9c).\r\n- ProtonGE\r\n\r\nI use `Proton Experimental` in Steam with these launch options:\r\n`PULSE_LATENCY_MSEC=40 PROTON_USE_NTSYNC=1 PROTON_NO_ESYNC=1 PROTON_NO_FSYNC=1 LD_PRELOAD= %command%`\r\n\r\nAnybody here experienced this and/or have some recommendations?\r\n\r\nEDIT: Forgot to add that I did try ProtonGE before, but I didn't try it with VRR+window-rule. Trying that now.",
      "created_at": "2025-11-25T16:42:27Z",
      "updated_at": "2025-11-28T20:28:56Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "rykugur",
        "avatar_url": "https://avatars.githubusercontent.com/u/2609898?u=992f4cd83b47edd1adb29ca92d260f5cba172ba1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfOKy",
      "number": 1411,
      "title": "How does a niri workflow look?",
      "body": "I've been using dynamic tiling window managers for a couple of years now and have gotten pretty used to the workflow. I usually have dedicated workspaces for firefox, discord and work, with each workspace usually only containing one fullscreen window. That makes it easy to quickly switch between applications and doesn't waste any screen space.\r\n\r\nWhen I want to look at two things at the same time, I can just spawn a new window and they'll be arranged side by side. In the rare case I need more than two windows they then split horizontally, as having three windows next to each other makes them too small to read anything.\r\n\r\nI played around a bit with niri and from a first look this is not how it's supposed to be used. Windows normally only take up half of the screen and when I fullscreened it and spawned another window next to it, the first window was cut off and I couldn't see the full content. Having multiple windows next to each other also makes it inconvenient to switch between them when you need to skip some.\r\n\r\nI'm used to having (theoretically) infinite space in one dimension (workspaces) but how do you work with infinite space in two dimensions? How do you work with niri?",
      "created_at": "2025-04-09T16:49:56Z",
      "updated_at": "2025-11-28T16:11:12Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "kiaraly",
        "avatar_url": "https://avatars.githubusercontent.com/u/29002762?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcftH",
      "number": 800,
      "title": "`prefer-no-csd` as a window rule property",
      "body": "I'm not against CSD, so don't really want to disable them as the toplevel, but would for example prefer `alacritty` not to have a title bar. For this reason I tried seeing if `prefer-no-csd` was available as a window-rule:\r\n\r\n```\r\nwindow-rule {\r\n    match app-id=\"^Alacritty$\"\r\n\r\n    prefer-no-csd\r\n}\r\n```\r\n\r\nbut it isn't. If this seems like a sensible change, I'd be happy trying to PR it!",
      "created_at": "2024-11-12T13:04:10Z",
      "updated_at": "2025-11-29T12:59:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zeroeightysix",
        "avatar_url": "https://avatars.githubusercontent.com/u/27009727?u=6b2bde752dfb2a1b3c9bdf868a15f916bb8e7a48&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai_vd",
      "number": 2887,
      "title": "niri / Firefox / nvidia open drivers RTX2080",
      "body": "Having problems running Firefox in niri on this hardware:\r\n\r\n* Opening new Firefox Window often results in an invisible window.\r\n* Sometimes single Firefox Window will cycle rapidly between two sets of tabs for - around 10 seconds. This one is particularly weird.\r\n* Sometimes Window will freeze (e.g. when full screening video), and won't update.\r\n\r\nIn all cases, Firefox is still working, can still interact with it, but can't see what you are doing. e.g. can start/stop videos and hear the results. Can press Ctrl+L Ctrl+A Ctrl+C and copy the URL even when Window is invisible.\r\n\r\nNot seen any problems with Chrome or Brave. Or any other application. Is Firefox specific. Makes Firefox unusable. And never seen this problem on a computer with AMD graphics hardware.\r\n\r\nIn [another discussion](https://discourse.nixos.org/t/nvidia-geforce-rtx-2080-super-hibernate-niri-broken/72024/15?u=penguin_brian) it was suggested that this was because niri doesn't have [sync support](https://github.com/YaLTeR/niri/issues/843). But I am somewhat skeptical this is the issue I am facing.\r\n\r\nCurrently on NixOS 25.05, will try NixOS 25.11 when released (or maybe if somebody thinks I should try sooner).\r\n\r\nAny ideas?\r\n\r\nThanks",
      "created_at": "2025-11-24T20:57:18Z",
      "updated_at": "2025-11-28T04:26:18Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "brianmay",
        "avatar_url": "https://avatars.githubusercontent.com/u/112729?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai_Xd",
      "number": 2884,
      "title": "`pick-window` and `focused-window` should return coordinates as well as dimensions",
      "body": "When I use `niri msg` to get information on a window, it gives the dimensions but not the screen coordinates.\r\n\r\nThis makes it very difficult to use grim or other screenshot tools. The built-in screenshot commands aren't useful for me as they save the data directly rather than opening it in satty, meaning I have to find the file, open it in satty, make the edit, and save the file. If I want the data on the clipboard, I still have to save to file, edit in satty, copy to clipboard, use the copied data, then manually delete the saved file.\r\n\r\nMy command for full-screen works:\r\n\r\n```\r\ngrim -o $(niri msg --json focused-output | jq -r .name) - | satty --filename -\r\n```\r\n\r\nbut grim needs the coordinates to screenshot a window:\r\n\r\n```\r\ngrim -g \"10,20 300x400\"\r\n```\r\n\r\nand I don't see how I can get niri to give me those x and y coordinates. \r\n\r\nI can't get flameshot to work reliably with niri (not unless I have the screen scaling at 1, because it looks like it's not taking that into account) so this pipeline really seems to be the only way I have of making it work. Manually selecting a region containing the window and then cropping is too much hassle.\r\n\r\nAlternatively, could the screenshot actions have an option to just pipe the image data to satty and let satty deal with saving, notifications, etc?",
      "created_at": "2025-11-24T12:54:17Z",
      "updated_at": "2025-11-28T01:32:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "unikitty37",
        "avatar_url": "https://avatars.githubusercontent.com/u/139183?u=8439354ebc6c7e030c9d1b6b470d8b5785a89fe4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjCuK",
      "number": 2905,
      "title": "Unable to record screen or windows with OBS on Arch Linux",
      "body": "I have been trying to debug this for a bit but I don't know where to go from here so I'm asking for help. It would be much appreciated!\r\n\r\nWithin OBS there is simply no option to choose to capture anything that resembles a screen. It it helps, I can capture screenshots outside of OBS.\r\n\r\nI have Arch Linux and the latest stable Niri release from August 2025. Here's details about my system:\r\n\r\n```\r\n                  -`                     nick@laptop\r\n                 .o+`                    ---------\r\n                `ooo/                    OS: Arch Linux x86_64\r\n               `+oooo:                   Host: N155L (Version 1.0)\r\n              `+oooooo:                  Kernel: Linux 6.17.9-arch1-1\r\n              -+oooooo+:                 Uptime: 38 mins\r\n            `/:-:++oooo+:                Packages: 943 (pacman)\r\n           `/++++/+++++++:               Shell: zsh 5.9\r\n          `/++++++++++++++:              Display (BOE0C4E): 1920x1080 in 15\", 60 Hz [Built-in]\r\n         `/+++ooooooooooooo/`            WM: niri (Wayland)\r\n        ./ooosssso++osssssso+`           Cursor: default (24px)\r\n       .oossssso-````/ossssss+`          Terminal: ghostty 1.2.3-arch2\r\n      -osssssso.      :ssssssso.         Terminal Font: Inconsolata Nerd Font (10pt)\r\n     :osssssss/        osssso+++.        CPU: AMD Ryzen 7 6800H (16) @ 4.79 GHz\r\n    /ossssssss/        +ssssooo/-        GPU: AMD Radeon 680M [Integrated]\r\n  `/ossssso+/:-        -:/+osssso+-      Memory: 2.47 GiB / 30.59 GiB (8%)\r\n `+sso+:-`                 `.-/+oso:     Swap: 0 B / 4.00 GiB (0%)\r\n`++:.                           `-/+/    Disk (/): 43.86 GiB / 914.82 GiB (5%) - ext4\r\n.`                                 `/    Local IP (wlan0): 192.168.50.213/24\r\n                                         Battery (SR Real Battery): 34% (2 hours, 14 mins remaining) [Discharging]\r\n                                         Locale: en_US.UTF-8\r\n```\r\n\r\nThe following packages are installed:\r\n\r\n```sh\r\npipewire\r\npipewire-alsa\r\npipewire-jack\r\npipewire-pulse\r\nwireplumber\r\n\r\nxdg-desktop-portal-gnome\r\nxdg-desktop-portal-gtk\r\n```\r\n\r\nIn my `.zprofile` I start Niri like this:\r\n\r\n```sh\r\nif uwsm check may-start 1>/dev/null; then exec uwsm start -F -- niri-session -l; fi\r\n```\r\n\r\nAlso I have these defined in `~/.config/uwsm/env`:\r\n\r\n```sh\r\n$ cat ~/.config/uwsm/env\r\n# Configure the cursor.\r\nexport XCURSOR_SIZE=24\r\n\r\n# GTK: Use Wayland if available, if not, try X11 and then any other GDK backend.\r\nexport GDK_BACKEND=\"wayland,x11,*\":\r\n\r\n# Qt: Use Wayland if available, if not, try X11.\r\nexport QT_QPA_PLATFORM=\"wayland;xcb\"\r\n\r\n# Qt: Disables window decorations.\r\nexport QT_WAYLAND_DISABLE_WINDOWDECORATION=1\r\n\r\n# Qt: Pick your theme from qt6ct (use with Kvantum).\r\nexport QT_QPA_PLATFORMTHEME=qt6ct\r\n\r\n# Use Wayland in Firefox.\r\nexport MOZ_ENABLE_WAYLAND=1\r\n\r\n# Use Wayland for Ozone compatible apps.\r\nexport OZONE_PLATFORM=wayland\r\nexport ELECTRON_OZONE_PLATFORM_HINT=wayland\r\n\r\n# Run SDL2 apps on Wayland, remove or set to X11 if certain games have issues.\r\nexport SDL_VIDEODRIVER=wayland\r\n```\r\n\r\nThe only things I start from within Niri are:\r\n\r\n```kdl\r\nspawn-at-startup \"swayidle\" \"-w\"\r\nspawn-at-startup \"mako\"\r\nspawn-at-startup \"waybar\"\r\nspawn-at-startup \"elephant\"\r\nspawn-at-startup \"walker\" \"--gapplication-service\"\r\n```\r\n\r\nHere's a couple of outputs if it helps. Looks like the Gnome portal is dead but the GTK one is not. I am not sure if they conflict with each other about Niri required the GTK one:\r\n\r\n```sh\r\n$ systemctl --user status xdg-desktop-portal-gnome.service --no-pager -l\r\n○ xdg-desktop-portal-gnome.service - Portal service (GNOME implementation)\r\n     Loaded: loaded (/usr/lib/systemd/user/xdg-desktop-portal-gnome.service; static)\r\n     Active: inactive (dead)\r\n\r\nNov 27 13:29:13 nimo systemd[2054]: Starting Portal service (GNOME implementation)...\r\nNov 27 13:29:13 nimo xdg-desktop-portal-gnome[2269]: GDK backend forced via env var, portal dialogs will not work properly.\r\nNov 27 13:29:13 nimo xdg-desktop-portal-gnome[2269]: Non-compatible display server, exposing settings only.\r\nNov 27 13:29:13 nimo systemd[2054]: Started Portal service (GNOME implementation).\r\nNov 27 13:33:58 nimo systemd[2054]: Stopping Portal service (GNOME implementation)...\r\nNov 27 13:33:58 nimo systemd[2054]: Stopped Portal service (GNOME implementation).\r\n\r\n$ systemctl --user status xdg-desktop-portal-gtk.service --no-pager -l\r\n● xdg-desktop-portal-gtk.service - Portal service (GTK/GNOME implementation)\r\n     Loaded: loaded (/usr/lib/systemd/user/xdg-desktop-portal-gtk.service; static)\r\n     Active: active (running) since Thu 2025-11-27 13:50:59 EST; 13min ago\r\n Invocation: e4a2bb282292448bbaa15b3241cd63a6\r\n   Main PID: 6932 (xdg-desktop-por)\r\n      Tasks: 6 (limit: 37362)\r\n     Memory: 9.1M (peak: 11.1M)\r\n        CPU: 91ms\r\n     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/xdg-desktop-portal-gtk.service\r\n             └─6932 /usr/lib/xdg-desktop-portal-gtk\r\n\r\nNov 27 13:50:58 nimo systemd[2054]: Starting Portal service (GTK/GNOME implementation)...\r\nNov 27 13:50:58 nimo xdg-desktop-portal-gtk[6932]: Theme parsing error: gtk.css:1048:16: 'border-spacing' is not a valid property name\r\nNov 27 13:50:59 nimo systemd[2054]: Started Portal service (GTK/GNOME implementation).\r\n```\r\n\r\nPipewire is running as far as I know:\r\n\r\n```sh\r\n$ pw-cli ls Node | grep -i pipewire\r\n        id 29, type PipeWire:Interface:Node/3\r\n        id 30, type PipeWire:Interface:Node/3\r\n        id 45, type PipeWire:Interface:Node/3\r\n        id 48, type PipeWire:Interface:Node/3\r\n        id 52, type PipeWire:Interface:Node/3\r\n        id 54, type PipeWire:Interface:Node/3\r\n        id 56, type PipeWire:Interface:Node/3\r\n        id 62, type PipeWire:Interface:Node/3\r\n\r\n$ systemctl --user status pipewire --no-pager -l\r\n● pipewire.service - PipeWire Multimedia Service\r\n     Loaded: loaded (/usr/lib/systemd/user/pipewire.service; disabled; preset: enabled)\r\n     Active: active (running) since Thu 2025-11-27 13:29:13 EST; 37min ago\r\n Invocation: 461cfaed6ec34b9989c432d766f533be\r\nTriggeredBy: ● pipewire.socket\r\n   Main PID: 2308 (pipewire)\r\n      Tasks: 3 (limit: 37362)\r\n     Memory: 10.2M (peak: 13.1M)\r\n        CPU: 2.615s\r\n     CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire.service\r\n             └─2308 /usr/bin/pipewire\r\n\r\nNov 27 13:29:13 nimo systemd[2054]: Started PipeWire Multimedia Service.\r\n```\r\n\r\nA couple of env vars set in my current shell:\r\n\r\n```sh\r\n$ env | grep -E \"(XDG|WAYLAND)\"\r\nXDG_DATA_HOME=/home/nick/.local/share\r\nXDG_CONFIG_HOME=/home/nick/.config\r\nXDG_SEAT=seat0\r\nXDG_SESSION_TYPE=wayland\r\nXDG_CURRENT_DESKTOP=niri\r\nWAYLAND_DISPLAY=wayland-1\r\nXDG_CACHE_HOME=/home/nick/.cache\r\nXDG_SESSION_CLASS=user\r\nXDG_VTNR=1\r\nXDG_SESSION_ID=4\r\nXDG_STATE_HOME=/home/nick/.local/state\r\nXDG_RUNTIME_DIR=/run/user/1000\r\n```\r\n\r\nWhat would I do from here to continue troubleshooting?",
      "created_at": "2025-11-27T19:09:16Z",
      "updated_at": "2025-11-27T23:41:53Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5mnV",
        "body": "Does the gnome portal for screencasting show up at all..?\r\n\r\nTry removing the gdk_backend vars"
      },
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhCaD",
      "number": 2154,
      "title": "niri health",
      "body": "Something like `hx --health` or `:checkhealth` in Neovim. Check for some common misconfiguration pitfalls. Something that people can run when they're having a problem to diagnose the common causes.\r\n\r\nSo far my ideas for checks are:\r\n- the config exists (print path) and parses correctly\r\n- xwayland-satellite exists (print path), and whether it supports listenfd for the new integration\r\n- CLI vs. compositor version check like in `niri msg version`\r\n\r\nWhat else would be useful to check and print here?",
      "created_at": "2025-07-31T14:14:25Z",
      "updated_at": "2025-11-27T18:08:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai_Uk",
      "number": 2883,
      "title": "Can I install niri on RHEL 10?",
      "body": "I learned from the manual page that niri can be installed on Fedora 41-43. So for RHEL 10 (based on Fedora 40), can niri be installed on it? Meanwhile, I didn't see any support for RHEL on the official manual page. RHEL might be a bit outdated. ",
      "created_at": "2025-11-24T12:13:45Z",
      "updated_at": "2025-11-27T07:36:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5eld",
        "body": "You should be fine just using YaLTeR's COPR repository "
      },
      "user": {
        "login": "QingWanNiang",
        "avatar_url": "https://avatars.githubusercontent.com/u/96718304?u=aae687f098fa7b63021d22cd13c17a4a1078f939&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjB9_",
      "number": 2902,
      "title": "Overview: implement a dynamic-background zoom",
      "body": "Presently at 25.08 , overview's background layer is static.\r\n\r\nThis suggested feature is for a realistic motion of entering/leaving overview mode for when overview background layer is defined (ie with a wallpaper).\r\n\r\nFunctions, when called:\r\n\r\n+ open-overview : animates the scaling of overview's layer to active output's size.\r\n \r\n+ close-overview : animates overview's layer scaling by ( active output size / dynamic_background_zoom ) and render(crop) the scaled layer at its center.\r\n\r\nUser defined variables:\r\n+ dynamic_background_layer (boolean)\r\n+ dynamic_background_zoom (float) \r\n\r\nOn defining and values of dynamic_background_zoom:\r\n+ if set to 1, no motion takes place (ie: wallpaper, workspaces and user remain in a theoretical-static position)\r\n\r\n+ if dynamic_background_zoom = zoom then workspaces will seem fixed to overview's background layer and \"user is stepping backwards\" (ie: wallpaper is static, workspaces are static, user takes 10 steps back)\r\n\r\n+ if dynamic_background_zoom >= zoom then an exploded-type animation elapses (ie: wallpaper is static, workspaces take 3 steps back, user takes 10 steps back)\r\n\r\nConditions:\r\n+ dynamic_background_zoom must always be greater or equal to zoom",
      "created_at": "2025-11-27T00:37:47Z",
      "updated_at": "2025-11-27T00:37:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sail3r",
        "avatar_url": "https://avatars.githubusercontent.com/u/82087684?u=46ab08cc07580f18c373c9d9c770ebde006114a0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjB1I",
      "number": 2899,
      "title": "Customize keybinding in Hotkey Overlay",
      "body": "Showing an entire group of hotkeys in the hotkey overlay doesn't make sense. That's why I propose a new option  `hotkey-overlay-key` that changes what keys are displayed instead of the normal ones. In a similar way as `hotkey-overlay-title` does. This would also allow for invalid key combinations like `Mod+SHift+Ctrl+Arrowkey` to combine the following commands:\r\n```    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\r\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\r\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\r\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\r\n```\r\nAnother use of this option would be putting in ASCII characters like ↑ as a visual indicator for a key.",
      "created_at": "2025-11-26T19:50:42Z",
      "updated_at": "2025-11-26T19:50:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "TimoNotThy",
        "avatar_url": "https://avatars.githubusercontent.com/u/67267822?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjA14",
      "number": 2897,
      "title": "Recency heuristic for ambiguous `focus-monitor-{left,right}` command resolution",
      "body": "When two monitors stacked vertically (`L1` and `L2`) are both found at one of the vertical edges of a third one (`R`), navigating horizontally away from `R` into `L1` or `L2` seems to always favour a specific one.\r\n\r\nIt'd be really nice to have the `focus-monitor-{left,right}` prefer the one that was most recently focused prior to the move to the current monitor, as is done with `focus-column-{left,right}`.\r\n\r\nFor illustration, consider this setup:\r\n\r\n```\r\noutput \"L1\" {\r\n    mode \"1920x1080\"\r\n    position x=0 y=-1080\r\n}\r\noutput \"L2\" {\r\n    mode \"1920x1080\"\r\n    position x=0 y=0\r\n}\r\noutput \"R\" {\r\n    mode \"1920x1080\"\r\n    position x=1920 y=-1080\r\n    transform \"270\"\r\n}\r\n```\r\n\r\nIn the following diagram, I visually represent the setup at the start, after `focus-monitor-right`, then `focus-monitor-left`, respectively. I mark the focused output with doubly-stroked outline and an asterisk in the name:\r\n\r\n```\r\n     (start)       >  focus-monitor-right  >  focus-monitor-left\r\n                   >                       >\r\n╔═══════╗ ┌───┐    >    ┌───────┐ ╔═══╗    >    ┌───────┐ ┌───┐\r\n║  L1*  ║ │   │    >    │  L1   │ ║   ║    >    │  L1   │ │   │\r\n╚═══════╝ │ R │    >    └───────┘ ║ R ║    >    └───────┘ │ R │\r\n┌───────┐ │   │    >    ┌───────┐ ║ * ║    >    ╔═══════╗ │   │\r\n│  L2   │ └───┘    >    │  L2   │ ╚═══╝    >    ║  L2*  ║ └───┘\r\n└───────┘          >    └───────┘          >    ╚═══════╝\r\n```\r\n\r\nIn the scenario above, `L2` is systematically focused whenever I `focus-monitor-left` from `R`.\r\n\r\n\r\nConversely, when considering windows laid out in the same way (`l1` and `l2` stacked vertically in a column adjoined to `r`), switching left and right between both columns will systematically bring us back to that of `l1` or `l2` which we started from:\r\n\r\n```\r\n     (start)          >    focus-column-right    >    focus-column-left\r\n                      >                          >\r\n┌────────────────┐    >    ┌────────────────┐    >    ┌────────────────┐\r\n│╔══════╗ ┌─────┐│    >    │┌──────┐ ╔═════╗│    >    │╔══════╗ ┌─────┐│\r\n│║  l1* ║ │     ││    >    ││  l1  │ ║     ║│    >    │║  l1* ║ │     ││\r\n│╚══════╝ │  r  ││    >    │└──────┘ ║  r  ║│    >    │╚══════╝ │  r  ││\r\n│┌──────┐ │     ││    >    │┌──────┐ ║  *  ║│    >    │┌──────┐ │     ││\r\n││  l2  │ │     ││    >    ││  l2  │ ║     ║│    >    ││  l2  │ │     ││\r\n│└──────┘ └─────┘│    >    │└──────┘ ╚═════╝│    >    │└──────┘ └─────┘│\r\n└────────────────┘    >    └────────────────┘    >    └────────────────┘\r\n```\r\n\r\nIt's possibly somewhat nitpick-y, but considering that we do have that \"memory\" mechanism implemented when focusing columns left and right, I figured it may be worth considering.\r\n\r\nIf you think it'd be a reasonable feature to have, I believe it's probably a fairly easy task that I could try and take on to get familiar with the code base :)",
      "created_at": "2025-11-25T21:05:42Z",
      "updated_at": "2025-11-26T12:48:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ccjmne",
        "avatar_url": "https://avatars.githubusercontent.com/u/6822545?u=dd881e22a2ac21309ea90301109f75d74658d253&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aii6x",
      "number": 2650,
      "title": "Way to remove default workspace?",
      "body": "I'm using niri/waybar module to show my niri workspaces in waybar. It works fine, except that the default workspaces made by niri also show up in waybar (named after its index/id). All three of my monitors have named workspaces set in my config, so the default workspaces are redundant and leave an extra workspace icon in waybar even though it is unused.",
      "created_at": "2025-10-21T18:44:18Z",
      "updated_at": "2025-11-26T09:35:42Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "ASong5",
        "avatar_url": "https://avatars.githubusercontent.com/u/44077969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abpwy",
      "number": 698,
      "title": "implementing tabbed-like window stacks, like pop shell",
      "body": "![image](https://github.com/user-attachments/assets/26e2c8b7-a5d0-4862-af5c-a8c77b65f995)\r\nsomething like this. my usual setup is one primary window and one for messaging, but some are seperate apps (like discord) and being able to stack these would be massively beneficial. let me know if you have any suggestions about this!",
      "created_at": "2024-09-29T01:58:49Z",
      "updated_at": "2025-11-26T04:56:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sound-friend",
        "avatar_url": "https://avatars.githubusercontent.com/u/155748443?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af4al",
      "number": 1636,
      "title": "Make Window Trackpad Gestures More Continuous and Configurable",
      "body": "At the moment there are some inconsistencies between how swipe gestures behave across niri.\r\n\r\nNotably, when doing a 3-finger horizontal swipe, the focus _jumps_ some number of windows proportional to the velocity/distance of the gesture.\r\n\r\nBy contrast, in overview mode, when switching workspaces with either the 2-finger or 3-finger vertical swipes, there is a scrolling visualization that indicates what workspace you would \"land\" on.\r\n\r\nIf this same behavior could be applied to the window gestures that would be appreciated. This need not be an animation, although that would be useful, it could just be the focus ring indicating the targeted window as you move your fingers along the trackpad.\r\n\r\nAlso(x2) or alternatively, an option to make the window change gesture be discrete, as in, only move one window horizontally, regardless of distance, like the workspace switch in non-overview mode.\r\n\r\nAlso, at least on my trackpad, the sensitivity feels too high, and I frequently find myself jumping two windows when I went to move 1. If this sensitivity could be adjusted that would be much appreciated.\r\n\r\n",
      "created_at": "2025-05-22T03:06:58Z",
      "updated_at": "2025-11-26T00:48:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SturgeonInc",
        "avatar_url": "https://avatars.githubusercontent.com/u/84652446?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AjAuE",
      "number": 2895,
      "title": "feat: multi column hotkey overview for overflow",
      "body": "When the hotkey overview menu becomes fully populated so that it reaches the end of the screen, have it wrap into a second column so that all hotkeys in the overview can still be fully displayed. ",
      "created_at": "2025-11-25T17:33:09Z",
      "updated_at": "2025-11-25T21:00:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "midischwarz12",
        "avatar_url": "https://avatars.githubusercontent.com/u/38054771?u=41c4fd8465a9d821ffb59b738cd451747dd0b130&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai-N8",
      "number": 2872,
      "title": "Has anyone managed to get `tofi` to work correctly under `niri`?",
      "body": "Some of `tofi`'s configuration options seem to get ignored on `niri`, but not on other compositors.",
      "created_at": "2025-11-22T20:13:55Z",
      "updated_at": "2025-11-24T22:08:38Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "LeyviRose",
        "avatar_url": "https://avatars.githubusercontent.com/u/123862027?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiRr5",
      "number": 2522,
      "title": "External Display Management?",
      "body": "What is the recommended way to manage external displays with Niri.\r\nFor example, connecting a second Monitor, mirroring Displays, Connecting to a Projector - stuff like that.\r\n\r\nI am aware of multiple wayland tools to manage Displays, but with Niri, I assume I have to write them to the config file.\r\nIs there any GUI tool that is recommended for Niri?",
      "created_at": "2025-10-05T18:14:59Z",
      "updated_at": "2025-11-24T21:31:26Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "766F6964",
        "avatar_url": "https://avatars.githubusercontent.com/u/34845270?u=93d2efed816eb89dffd1989c0376ca51e1abd7bf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai7td",
      "number": 2842,
      "title": "Overview-specific binds",
      "body": "I'd like to be able to modify my bindings when the overview is open, eg. to change my window movement binds to move workspaces instead.\r\n\r\nI would envision the syntax looking something like this:\r\n```kdl\r\nbinds {\r\n    Mod+J {focus-window-down; }\r\n}\r\noverview {\r\n    binds {\r\n        // overrides the normal bindings\r\n        Mod+J { focus-workspace-down; }\r\n        // ...\r\n    }\r\n}\r\n```\r\n\r\nWhich could work nicely with window rules as well:\r\n```kdl\r\nwindow-rule {\r\n    match app-id=\"firefox\"\r\n    binds {\r\n        Mod+Q { spawn \"wtype -M ctrl w\"; }\r\n    }\r\n}\r\n```\r\n\r\nHowever, this syntax would also be fine, if it's simpler to implement:\r\n```kdl\r\nbinds {\r\n    Mod+J overview=false { focus-window-down; }\r\n    Mod+J overview=true { focus-workspace-down; }\r\n}\r\n```",
      "created_at": "2025-11-19T15:33:31Z",
      "updated_at": "2025-11-24T21:18:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "silversquirl",
        "avatar_url": "https://avatars.githubusercontent.com/u/14016168?u=42d372f775e4adaac4c1177c4387e3cf5111e7ca&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai-lP",
      "number": 2875,
      "title": "Move window to new workspace without changing focus to new workspace",
      "body": "Sometimes I have lots of windows in a workspace which I want to move to a new or predefined workspace. As I am from sway/i3, I always used to select the window and transfer them to a different workspace without changing focus from the original workspace. \r\n\r\nIn niri, whenever I transfer a window, my focus also changes to the new workspace as well. For some people, this might be the preferred workflow but it's too jarring for me. If I have multiple such windows, i need to constantly shift between the two workspaces.\r\n\r\nCan there be a flag like `change-workspace-with-window true` where `true` means the default behavior of niri? I can set it to `false` for my intended use case.\r\n\r\nPS: A big thank you to the Niri team for the incredible work that they have done!\r\n",
      "created_at": "2025-11-23T15:00:49Z",
      "updated_at": "2025-11-25T08:33:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "thexavier666",
        "avatar_url": "https://avatars.githubusercontent.com/u/15179380?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah3aL",
      "number": 2363,
      "title": "How to move between windows in touchscreen",
      "body": "Gestures like 4 finger or 3 finger swipe on the touchpad don't work on the touchscreen. Is there a way to emulate those gestures using touch gestures?\r\n\r\nThanks,",
      "created_at": "2025-09-10T17:20:36Z",
      "updated_at": "2025-11-24T17:56:26Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "64-bitman",
        "avatar_url": "https://avatars.githubusercontent.com/u/60551350?u=cd14c4af9a4f97bb3abefd27463216400caff03a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiU0p",
      "number": 2548,
      "title": "Add option for sticky keys!",
      "body": "Every time someone realizes I use sticky keys they are surprised because sticky keys is associated with the annoying wind*ws shortcut to activate sticky keys. So I explain what it's actually useful for.\r\n\r\nMy case for sticky keys: \r\nEven though I usually get by without needing its functionality, sometimes when typing fast, I let go of my Shift key a bit too early before hitting the key I want to capitalize. Sticky keys allows for the next character I type to still be capitalized even if I let go of Shift a bit too early.\r\nHaving the ability to toggle something like this (especially with a hotkey) in niri would be nice :)",
      "created_at": "2025-10-08T01:23:00Z",
      "updated_at": "2025-11-24T16:43:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sixfoldsquealer",
        "avatar_url": "https://avatars.githubusercontent.com/u/32818287?u=36cd0e7f986c5f7550d5a575d92db25ba2330e49&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai_X-",
      "number": 2885,
      "title": "focus-window-next/previous in a tabbed setting",
      "body": "Hello,\r\nI'd like to set an `Alt+Tab` and `Alt+Shift+Tab` binds to infinitely focus between windows in a tabbed column.\r\nSo far the best I found is focus-window-up/down but it stops when it reaches the end of the tab list.\r\n\r\nAm I missing something, or is this not implemented yet?",
      "created_at": "2025-11-24T13:04:18Z",
      "updated_at": "2025-11-24T13:32:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5dWo",
        "body": "focus-window-down-or-top"
      },
      "user": {
        "login": "EcksDy",
        "avatar_url": "https://avatars.githubusercontent.com/u/994443?u=36d0bbba768cba28e2187b8551ec87952b54ec18&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai-n_",
      "number": 2876,
      "title": "Shortcut for native app launcher menu",
      "body": "Hiya!\r\n\r\nTo start with, many many thanks for this amazing compositor. Its flexibility, smoothness and power are truly blowing my mind and I wouldn't even dream of going back to any other WM or DE!\r\n\r\nI have a quick question: I can't find any keybind to simply open the app menu in the native status bar and use its integrated launcher (which would also spare users from the need to install a separate launcher, fuzzel or something else).\r\n\r\nHave I missed something or is it not implemented yet?\r\n\r\nThank you very much and sorry if that's a silly question!",
      "created_at": "2025-11-23T16:47:56Z",
      "updated_at": "2025-11-24T00:40:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5bow",
        "body": "There's a whole page just for keybinds !\r\nhttps://danklinux.com/docs/dankmaterialshell/cli-keybinds-cheatsheets"
      },
      "user": {
        "login": "stephanelambion",
        "avatar_url": "https://avatars.githubusercontent.com/u/239169943?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai4i5",
      "number": 2806,
      "title": "Command Palette",
      "body": "The \"Important Hotkeys\" overlay is nice, but limited. It's a hard-coded list of binds that require property overrides to modify, and even then, the ordering is semi-fixed and you have to search with your eyes to find what you're looking for\r\n\r\nIt would be really nice to have an interactive command palette, where you can search _all_ key binds by either title, action, or binding. I've come to really enjoy this feature, especially in the Helix editor.",
      "created_at": "2025-11-15T19:05:59Z",
      "updated_at": "2025-11-23T19:54:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rockboynton",
        "avatar_url": "https://avatars.githubusercontent.com/u/32227280?u=62ab9176011221f8cbac720b933c96544a0aebf0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai90B",
      "number": 2866,
      "title": "How will virtual keyboard going to be implemented in niri?",
      "body": "Will niri going to develop built-in virtual keyboard and manage invocation of such keyboard or it will be handled by third-party app using some kind of API?\r\nIf it will be user space third party app I wonder how will niri manage which window should receive sent events",
      "created_at": "2025-11-22T01:30:31Z",
      "updated_at": "2025-11-23T19:51:20Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "oisanjaya",
        "avatar_url": "https://avatars.githubusercontent.com/u/26103050?u=da67f971606e867f421982a5048b665a2dfe7cba&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai-Bw",
      "number": 2868,
      "title": "Swap a visible window with an off-screen window without shifting the viewport?",
      "body": "I'm trying to figure out whether Niri supports swapping a window that is inside the current viewport with a window that is outside the viewport, without causing the view to pan. For example  A [ B C ] D -> B [ A C ] D . ",
      "created_at": "2025-11-22T12:43:11Z",
      "updated_at": "2025-11-23T16:23:58Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "iamth3danger",
        "avatar_url": "https://avatars.githubusercontent.com/u/85238495?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai-kS",
      "number": 2874,
      "title": "Ability to vertically center non-full sized windows",
      "body": "On bigger monitors (non-ultra-wide) sometimes you just want a browser to be centered - looking all the way to the top is not desirable. So if you have n windows in a column that are not vertically full sized, pressing Super+Shift+C could center them all vertically\r\nThanks\r\n",
      "created_at": "2025-11-23T14:30:36Z",
      "updated_at": "2025-11-23T14:30:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "graphicalx",
        "avatar_url": "https://avatars.githubusercontent.com/u/6995589?u=906538898af5de1b24366dac37c95e2e3629d878&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai-IZ",
      "number": 2871,
      "title": "Gutter bars",
      "body": "There is one thing that scrolling desktop has - that others don't.. infinite space for activities.\r\nSo I wanted to make use of it. I have been designing a simple gtk app that I spawn on the right side of the active tile. This is still in very early stages. But I aim to make it a replacement of waybar and rofi (and also a replacement for struts), that... essentially only makes sense in scrolling desktops.\r\n\r\nHas this idea come up before? is someone building this as well?\r\n\r\nEDIT: ADDED A MOCKUP\r\n\r\nThis is a really rough sketch. I don't mean a side bar, I meant more like an in-between-bar... I was thinking in the lines of this:\r\n<img width=\"1720\" height=\"1433\" alt=\"image\" src=\"https://github.com/user-attachments/assets/5bf8dbce-b548-44f9-a3d8-a6db8e566060\" />\r\nAnd the design could obviously be refined. like how it could only act as a thin divider bar that only has launcher buttons for example.\r\n<img width=\"2552\" height=\"1440\" alt=\"image\" src=\"https://github.com/user-attachments/assets/2b70feb9-62ee-4790-8958-f3b3276cd45c\" />\r\nAnd those in-between bars will naturally become a sidebar if you have struts enabled. (spawned 2 gutter-bars for example purposes). Of course it should also look like a sidebar.\r\n<img width=\"2555\" height=\"1440\" alt=\"image\" src=\"https://github.com/user-attachments/assets/aa937ff0-8f5a-4609-8835-da9d27599d19\" />\r\n\r\nSo I think that gutter-bars are only viable for scrolling desktops. But I think the only thing missing from niri to make this work. is for the gutter-bar to know when it is in `strut space`. so that it can switch views as a `in-between-bar` and as a `side-bar`. ",
      "created_at": "2025-11-22T16:18:04Z",
      "updated_at": "2025-11-23T00:17:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "veighnsche",
        "avatar_url": "https://avatars.githubusercontent.com/u/16469623?u=0f89385be6e7fed40db8ef595fbd3eaf2dd276f5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah-7m",
      "number": 2398,
      "title": "move-column-to-workspace-previous",
      "body": "is it easy to implement this? it's something i often used in awesomeWM.",
      "created_at": "2025-09-16T21:25:21Z",
      "updated_at": "2025-11-22T23:26:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sfranky",
        "avatar_url": "https://avatars.githubusercontent.com/u/1530259?u=5dcd3aa69d2c69a800e13843252c363bbd0395cf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai-Ch",
      "number": 2869,
      "title": "Option to disable mouse dragging windows that are full screen?",
      "body": "I have the Mod key set as Alt_L because it's easier for my thumb, but this makes it difficult for me to shoot while holding Alt in games, because the window gets grabbed by the mouse. An option to disable this either as a window rule or for fullscreen windows specifically would be great.",
      "created_at": "2025-11-22T13:24:38Z",
      "updated_at": "2025-11-22T13:24:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Yilmaz4",
        "avatar_url": "https://avatars.githubusercontent.com/u/77583632?u=a32723535b134b6431b613619e18d6397aed220f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgFcr",
      "number": 1725,
      "title": "VRR on-demand fullscreen window-rule",
      "body": "With the introduction of [`variable-refresh-rate on-demand`](https://github.com/YaLTeR/niri/pull/586) property it's possible to dynamically trigger Adaptive Sync via a [`window-rule`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#variable-refresh-rate). However, there does not seem to be any [`match`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#window-matching) directive for `fullscreen` matching.\r\n\r\n**Is there any way to limit VRR to just fullscreen windows?**",
      "created_at": "2025-06-03T19:41:52Z",
      "updated_at": "2025-11-22T09:15:42Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ay-SK",
        "body": "Not at the moment, as in the last discussion: https://github.com/YaLTeR/niri/discussions/1176"
      },
      "user": {
        "login": "GrabbenD",
        "avatar_url": "https://avatars.githubusercontent.com/u/45666572?u=05a6beb90012812ae0f981df8353b26773a1f6f9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Admea",
      "number": 906,
      "title": "has anyone managed to get gnome polkit agent working correctly ?",
      "body": "debian 12 sid with policykit-1-gnome installed, works fine on gnome but not in niri, i know gnpme auth agent isnt known for being the most compatible but i'm curious if anyone got it running ?",
      "created_at": "2024-12-30T01:31:55Z",
      "updated_at": "2025-11-22T03:52:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Hanibachi",
        "avatar_url": "https://avatars.githubusercontent.com/u/106400997?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai9Qs",
      "number": 2863,
      "title": "Focust workspace or go to last workspace",
      "body": "Hi,\r\n\r\nThanks for this great window manager! Loving it :) It would be awesome to have a behavior common in i3/sway - when you refer to workspace by name or index and you are currently on the workspace you decided to switch to - instead of doing nothing you could be redirected to last used workspace (similarly to `focust-workspace-previous`). So if you have workspaces 1, 2 and 3 and you first focus workspace 1 using `Alt+1 { focus-workspace 1}` and then go to workspace 3 with `Alt+3 { focust-workspace 3}`. When you already are on workspace 3 and hit `Alt+3` instead of doing nothing this would redirect to last used  workspace - that is workspace 1.\r\n\r\n",
      "created_at": "2025-11-21T09:54:03Z",
      "updated_at": "2025-11-21T15:42:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "deep4lpha",
        "avatar_url": "https://avatars.githubusercontent.com/u/149267693?u=62af135b6bd0fb179b87cb8eb3062fc8b948f261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai8h0",
      "number": 2854,
      "title": "Block-out-from rule",
      "body": "So, I'm not sure if this is a skill issue or a niri issue, so I figure I'd ask some help with clarifying the behaviour I'm experiencing...\r\nI am currently trying out niri, and read from the wiki about the different block-out-from rules to which I thought \"I'd really like my bitwarder client to be excluded from screen sharing and screenshots in case of some unfortunate accident!\" so I tried it out!\r\n\r\nI tried testing it out with screenshot tool, to see how it turned out, and to my surprise it only works part of the time? Let me explain.\r\n\r\nI have the three default bindings set for \"screenshot\", \"screenshot-window\", and \"screenshot-screen\". It works very well with the later two, but not with the first one! See pictures attached.\r\n\r\nIs this some missing configuration I'm overlooking, or could this be a bug?\r\n\r\nThanks for any help you can provide!\r\n<img width=\"1046\" height=\"1041\" alt=\"Screenshot from 2025-11-20 08-05-48\" src=\"https://github.com/user-attachments/assets/930d8c0d-e279-441b-8efe-f267340056ea\" />\r\n<img width=\"1920\" height=\"1080\" alt=\"Screenshot from 2025-11-20 08-07-02\" src=\"https://github.com/user-attachments/assets/a95b23fa-21b8-41f4-8e27-ef53ea3b27d9\" />\r\n",
      "created_at": "2025-11-20T13:12:18Z",
      "updated_at": "2025-11-21T13:24:28Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5Wtt",
        "body": ">This setting will still let you use the interactive built-in screenshot UI, but it will block out the window from the fully automatic screenshot actions, **such as screenshot-screen and screenshot-window. The reasoning is that with an interactive selection, you can make sure that you avoid screenshotting sensitive content.**"
      },
      "user": {
        "login": "Zorkyx22",
        "avatar_url": "https://avatars.githubusercontent.com/u/56091508?u=abb38d91b0b85620ea13cbc29428fb9e8067139f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai9Pz",
      "number": 2862,
      "title": "mangowc like layouts?",
      "body": "Is it possible to have different layouts on each workspace in some way, similar to mangowc?\r\nMaybe by disabling scrolling?\r\n",
      "created_at": "2025-11-21T09:37:51Z",
      "updated_at": "2025-11-21T09:37:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "bobblkabb",
        "avatar_url": "https://avatars.githubusercontent.com/u/7815101?u=30f6d40c7d0361f14b6b239e13a9a72a18d59972&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhZ0K",
      "number": 2262,
      "title": "Always on active workspace?",
      "body": "GNOME has a feature for keeping a window on the active workspace. I like it for picture-in-picture, which I have floating. I didn't come across that feature in my searches, I'm wondering if it exists under a different name already. ",
      "created_at": "2025-08-18T16:09:18Z",
      "updated_at": "2025-11-21T09:30:44Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A19U3",
        "body": "https://yalter.github.io/niri/FAQ.html#can-i-make-a-window-sticky-pinned-always-on-top-appear-on-all-workspaces"
      },
      "user": {
        "login": "losnappas",
        "avatar_url": "https://avatars.githubusercontent.com/u/25119292?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai9MA",
      "number": 2861,
      "title": "Unmapping keybinds (Alt+Tab)",
      "body": "I've been looking through the wiki but can't find an answer to this. I switched to the git version of niri to get output specific layouts working, and I also got the hard coded Alt+Tab mapping. The problem is that I use Alt+Tab in zed to accept predictions. So I would need to un-map Alt+Tab somehow. I can map it to something else, but that doesn't really help me.\r\n\r\nIs there a way to remove key bindings in the config file?",
      "created_at": "2025-11-21T08:22:46Z",
      "updated_at": "2025-11-21T09:19:14Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5W3P",
        "body": "https://yalter.github.io/niri/Configuration%3A-Recent-Windows.html"
      },
      "user": {
        "login": "foonly",
        "avatar_url": "https://avatars.githubusercontent.com/u/1481639?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai9Iz",
      "number": 2859,
      "title": "Option to specify borders for an output that is being screencasted",
      "body": "This feature would be useful for multi-monitor setups, as track of which output is being screencasted can be quickly lost while actively doing something in multiple outputs.\r\nVisual distinction for a screencasted output would also serve as a reminder that a screen is being shared.\r\n\r\nIdeally this feature would target outputs both specifically selected for sharing and set as dynamic screencast target (personally I am interested in the latter).",
      "created_at": "2025-11-21T07:23:33Z",
      "updated_at": "2025-11-21T07:23:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "eandersons",
        "avatar_url": "https://avatars.githubusercontent.com/u/9976861?u=52190ffee07180300529172ee59b0b430e37b0d0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiqTZ",
      "number": 2705,
      "title": "Is it possible to use `focus-workspace-previous` across monitors?",
      "body": "When using `focus-workspace-previous` I'm toggling between the 2 previous used workspaces on this monitor. Is it possible to toggle between the last two workspaces, if one of the workspaces was used on a different monitor?",
      "created_at": "2025-10-29T19:06:33Z",
      "updated_at": "2025-11-21T04:05:35Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "DerEchteJoghurt",
        "avatar_url": "https://avatars.githubusercontent.com/u/69429360?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai8Bc",
      "number": 2848,
      "title": "Windows seemingly aren't blurring/unfocusing correctly when switching workspaces",
      "body": "I like to have a workspace just for Discord. I'll switch to the workspace to check messages, but when I switch from that workspace, it seems that Discord isn't aware it was unfocused and won't send notifications.\r\n\r\nI know this was a long standing issue with Discord for Linux though, so to experiment some more I tried it with Firefox. Firefox did send focus and blur events to the page, but the browser UI never dimmed to indicate the window wasn't focused.\r\n\r\nFurthermore, if I instead have two windows in my Discord workspace, and just switch to the non-Discord window before switching workspaces, Discord is aware it was unfocused.\r\n\r\nIt's a bit of a dance to try not to miss messages.\r\n\r\nIs there a way I can fix this?",
      "created_at": "2025-11-19T23:49:32Z",
      "updated_at": "2025-11-21T00:28:35Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5S_G",
        "body": "> the browser UI never dimmed to indicate the window wasn't focused\r\n\r\nThe Activated state is purely visual so this is expected. Some clients erroneously rely on it as if it was keyboard focus. Try https://yalter.github.io/niri/Configuration%3A-Debug-Options.html#deactivate-unfocused-windows"
      },
      "user": {
        "login": "hf02",
        "avatar_url": "https://avatars.githubusercontent.com/u/55464333?u=f08f4f762a234715e88d24b06dc8d7a89b3df4bd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiYdF",
      "number": 2583,
      "title": "Allow niri IPC (`niri msg`) to reference workspaces by id instead of by index or name",
      "body": "Due to the volatility of the index I'd like the reference a (unnamed) workspace by its (more stable) id instead of its index.\r\n\r\nAffected `niri msg action` commands:\r\n\r\n+ `focus-workspace`\r\n+ `move-window-to-workspace`\r\n+ `move-column-to-workspace`\r\n+ `move-workspace-to-index`\r\n+ `set-workspace-name`\r\n+ `unset-workspace-name`\r\n+ `move-workspace-to-monitor`\r\n+ maybe more but these are the ones I've found\r\n\r\nThe last command `move-workspace-to-monitor` does currently not support index or name. This should be added too similar to `move-window-to-monitor`.\r\n",
      "created_at": "2025-10-12T08:22:29Z",
      "updated_at": "2025-11-21T00:15:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jarrod574943pharmes",
        "avatar_url": "https://avatars.githubusercontent.com/u/237548532?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab-iE",
      "number": 749,
      "title": "transparent window blur?",
      "body": "hi! I'm curious if there are plans for implementing blur on background behind transparent windows?  - or if there are ways of doing this that I'm unaware of!\r\n\r\nit's probably the only thing I consider missing for niri to be near perfect for my use and look...",
      "created_at": "2024-10-17T22:02:01Z",
      "updated_at": "2025-11-20T19:32:59Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "zydra-zy",
        "avatar_url": "https://avatars.githubusercontent.com/u/41114307?u=41bc75b5d86404dc1474bb42bd60613008a49dae&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai8ZD",
      "number": 2850,
      "title": "`spawn-at-startup` dependencies",
      "body": "Hi!\r\n\r\nI miss some functionality for dependencies for `spawn-at-startup`.\r\nI have the following clauses in config:\r\n```\r\nspawn-at-startup \"awww-daemon\"\r\nspawn-at-startup \"sleep 1 && awww set /home/ancieg/.local/share/backgrounds/8351321.gif\"\r\n```\r\nI think that's not reliable to make `sleep 1` to guarantee running second command after first one.\r\nAnd I didn't found any other simple solution for that.\r\n\r\nI want something like:\r\n```\r\nspawn-at-startup-sync {\r\n    spawn \"awww-daemon\"\r\n    spawn \"awww set /home/ancieg/.local/share/backgrounds/8351321.gif\"\r\n}\r\n```",
      "created_at": "2025-11-20T10:15:09Z",
      "updated_at": "2025-11-20T11:13:02Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ancieg",
        "avatar_url": "https://avatars.githubusercontent.com/u/29044775?u=3954f8aa06326fc6b298614ff67efd6aca6a65dd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai8O7",
      "number": 2849,
      "title": "Cache last working config as fallback",
      "body": "I forgot to fix an error in my config before logging out, and when I logged back in I got a little worried because I was back to the default config with a blank screen. Once I realized the issue, it wasn't that hard to fix since I was able to get to a terminal with Ctrl+Alt+2 (I don't have alacritty), but this would be a nice enhancement to take away this friction, especially since it could potentially confuse someone less experienced.",
      "created_at": "2025-11-20T06:56:25Z",
      "updated_at": "2025-11-20T09:42:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Hikiru",
        "avatar_url": "https://avatars.githubusercontent.com/u/18605854?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai8BK",
      "number": 2847,
      "title": "Unique workspace names/indexes",
      "body": "I've read through the config and don't think that this is an option.\r\n\r\nI'm coming from sway where when you open a new workspace, on any output, it is given a unique ID. On niri, each display has the same IDs for workspaces (each output has a workspace \"1\", for example). The nice thing about the sway version is that to hop to a certain workspace on a certain output, you can keymap directly to it (the equivalent of `focus-workspace 3`) from any workspace on any output. In niri, if you want to go to do that, you have to switch to the correct output and then jump to the correct workspace.\r\n\r\nI know that niri can do custom named workspaces, but I think it would be a good feature to have unique workspace IDs which are independent of the output.",
      "created_at": "2025-11-19T23:34:35Z",
      "updated_at": "2025-11-19T23:34:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nsbruce",
        "avatar_url": "https://avatars.githubusercontent.com/u/28943409?u=c3100c9eed5a5cda07c55518b8c295ea697d07fc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai79a",
      "number": 2846,
      "title": "Is it possible to have \"top\" layer and preserve workspace position?",
      "body": "In my project I need ability to set layer of ui element to top and preserve it in workspace. Is it possible?",
      "created_at": "2025-11-19T21:37:05Z",
      "updated_at": "2025-11-19T21:37:05Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "skelitheprogrammer",
        "avatar_url": "https://avatars.githubusercontent.com/u/47909066?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afrq5",
      "number": 1553,
      "title": "Option to save screenshots to `stdout` instead of a file",
      "body": "Hey @YaLTeR. I recently discovered screenshot annotators (like [swappy](https://github.com/jtheoof/swappy) or [satty](https://github.com/gabm/Satty)) and was trying to use the niri's `screenshot-*` actions with them instead of the suggested `grim`/`slurp` combo since the screenshot commands are faster and have the additional benefit of capturing just the focused window.\r\n\r\nOne way I tried to do this was using the clipboard, like so:\r\n```kdl\r\nbind Print { spawn \"bash\" \"-c\" \"niri msg action screenshot && wl-paste | swappy -f -; }\r\n```\r\n\r\nHowever, it seems that the image takes a bit to appear in the clipboard and `swappy` just uses the previous clipboard entry instead of the latest screenshot.\r\n\r\nSo, I was wondering if it would be possible to send the screenshots to `stdout` instead of a file to allow piping to an annotation program (or any other program for that matter).",
      "created_at": "2025-05-10T15:57:06Z",
      "updated_at": "2025-11-19T19:01:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "leguteape",
        "avatar_url": "https://avatars.githubusercontent.com/u/45424904?u=7511d44480bac0ecd0f941e648d767b236b9c4d7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai7HL",
      "number": 2838,
      "title": "Feature request: Configurable logical vs physical semantics for scrolling layout",
      "body": "Relating to: https://github.com/YaLTeR/niri/issues/861, https://github.com/YaLTeR/niri/pull/2827\r\n\r\nAdd a config option to choose **logical (start/end)** vs **physical (screen left/right)** semantics for scrolling-layout interactions:\r\n\r\n- Column navigation and moves (focus/move/swap between columns)\r\n- DnD edge-based auto-scroll\r\n- Touchpad horizontal view-offset gestures\r\n- Interactive resize handles (leading/trailing vs left/right)\r\n\r\nAnimations and geometry ([column_x](https://github.com/YaLTeR/niri/blob/main/src/layout/scrolling.rs#L2316), `ViewOffset`, tile/column animations) stay **physical and direction-aware** as they are today. The new option only changes how user-facing commands and inputs are mapped into those physical operations, so RTL users can pick the behavior that best matches their mental model.\r\n\r\nRisks: \r\n- Risk of confusing users with contradicting options if both semantic options are mixed in one menu",
      "created_at": "2025-11-19T00:58:10Z",
      "updated_at": "2025-11-19T01:03:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "veighnsche",
        "avatar_url": "https://avatars.githubusercontent.com/u/16469623?u=0f89385be6e7fed40db8ef595fbd3eaf2dd276f5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai6lS",
      "number": 2832,
      "title": "Is there any way to disable vsync?",
      "body": "this might be the dumbest question, but I noticed a lot the feeling of some input lag and capped frame rate despite the app running at 1000fps, I'm using the highest hz of my monitor and this problem wasn't present when i was using KDE plasma on wayland.",
      "created_at": "2025-11-18T12:31:48Z",
      "updated_at": "2025-11-19T06:23:42Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5PgG",
        "body": "https://github.com/YaLTeR/niri/issues/844"
      },
      "user": {
        "login": "MarcelineKena",
        "avatar_url": "https://avatars.githubusercontent.com/u/149466211?u=12c97e4c7475fdd1d931930146ed784dcdd02218&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkLkb",
      "number": 3456,
      "title": "Inconsistent recents behavior in overview",
      "body": "In the overview the most recent window changes depending on whether recents is opened on an empty workspace or not. I hope the video illustrates the issue.\n\nhttps://github.com/user-attachments/assets/3ec467cc-eb14-4c7f-bace-e2d539d3642c\n\n(tbh I find the intended behavior of the recents in overview confusing, to me it would make more sense if would behave like it does outside of overview where the window receives focus)\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri unstable 2025-11-17 (commit 7f19d268b3563e3683eaca02d9665fed66ce862e)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: nixos unstable\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Whatever is in the AMD Ryzen 7 PRO 5850U\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 PRO 5850U\n",
      "created_at": "2025-11-18T17:20:39Z",
      "updated_at": "2026-02-16T04:42:36Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "jeLee6gi",
        "avatar_url": "https://avatars.githubusercontent.com/u/9397810?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai4Qr",
      "number": 2800,
      "title": "fullscreen without telling window",
      "body": "This is useful for chromium browsers because when you fullscreen chromium browser, toolbar disappears.",
      "created_at": "2025-11-15T06:14:14Z",
      "updated_at": "2025-11-18T06:24:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "aljustiet",
        "avatar_url": "https://avatars.githubusercontent.com/u/114720383?u=5191f1ccd27096602fa10f03706ed166067faa79&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai4pR",
      "number": 2810,
      "title": "Volume level not restored on session start — any way to persist audio state?",
      "body": "Hi,\r\nI’m running into an issue where Niri does not restore the previous audio volume level when starting a new session. Upon logging out and logging back in, the volume is reset instead of being restored to its last known state.\r\n\r\nThe volume level is modified through standard PipeWire clients (e.g., pactl, wpctl, or desktop UI).\r\n\r\nRuntime behavior is correct — only session start fails to restore the previous volume.\r\n\r\nI’ve checked WirePlumber’s policy scripts, but I haven’t found anything that explicitly re-applies volume settings on session initialization. I’m not sure whether this is a compositor-side limitation, a WirePlumber policy configuration issue, or something related to how Niri launches its user session.\r\n\r\nQuestions:\r\n\r\nDoes Niri provide any mechanism or hook to restore PipeWire node properties (like volume) after session start?\r\n\r\nShould volume persistence be handled entirely by WirePlumber, and if so, where is this configured?\r\n\r\nIs there any known workaround or script-based approach (login hook, systemd user service, etc.) that reliably restores audio state?\r\n\r\nAny insights from users who have tackled this issue would be greatly appreciated.\r\n\r\nThanks!",
      "created_at": "2025-11-16T00:59:16Z",
      "updated_at": "2025-11-17T19:25:05Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "hertz5688",
        "avatar_url": "https://avatars.githubusercontent.com/u/244114661?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai5oC",
      "number": 2824,
      "title": "One screen workspace overview - Problem with messy workspaces",
      "body": "Hey, \r\nI am long term tiller user (Awesome, Qtile, Sway, Hyprland). What I really like about them (beyond being fully keyboard driven) is that they  control my messiness by allowing me to see all of the windows in a workspace on a one screen. \r\n\r\nSo my workflow usually involves having multiple of windows in a workspace which I maximize while using them. \r\n\r\nI assume I can somehow replicated that using overview (however if I have multiple scrolls in a workspace I still cant easily reach them or notice them) or maybe you have another strategy to eliminate forgetting about not visible windows?.   ",
      "created_at": "2025-11-17T13:11:39Z",
      "updated_at": "2025-11-17T13:32:23Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "AggressiveHayBale",
        "avatar_url": "https://avatars.githubusercontent.com/u/72441834?u=cc627a762497400a51f97ce56157447c6f14efcc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai5JT",
      "number": 2822,
      "title": "Niri and MuseScore",
      "body": "Hi all,\r\n\r\nI've been sing Niri for some weeks and plan to stay to it. Yet I stumbled upon a problem I cannot fix. I use MuseScore as music notation tool. But when I run it under Niri, it often times doesn't show the full content of some dropdown menus. \r\n\r\nHere's a thread I opened in the MuseScore GitHub, but meanwhile I think it doesn't relate to MuseScore, in Gnome and Hyprland dropdown menus [of the instrument pallets] are working properly.\r\n\r\n`https://github.com/orgs/musescore/discussions/31065`\r\n\r\n\r\nAny suggestions about the solution?\r\n\r\n",
      "created_at": "2025-11-16T22:55:42Z",
      "updated_at": "2025-11-17T10:44:49Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "aha917",
        "avatar_url": "https://avatars.githubusercontent.com/u/151477447?u=404231e2013b868d39c0cbf2ce754236afb90a9d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai5BU",
      "number": 2816,
      "title": "Feature request: Run action on window opening (window rules)",
      "body": "I couldn't find a way to run an arbitrary action when a window matching a window-rule opens.\r\n\r\nSpecifically, I always have my music player on its own workspace and would love to automatically name the workspace when I open it. I suppose I could configure a key binding to open it + assign the workspace name instead, but it's an action I do maybe once or twice a day, and there's only so many keyboard bindings I can remember, so I think it makes sense to do it this way.",
      "created_at": "2025-11-16T17:08:43Z",
      "updated_at": "2025-11-17T10:06:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jplatte",
        "avatar_url": "https://avatars.githubusercontent.com/u/951129?u=c865ac569258c762f56304803cd5c6a1978e259b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaO5L",
      "number": 482,
      "title": "Scrollbar",
      "body": "![image](https://github.com/YaLTeR/niri/assets/81568712/ccee3ef0-1034-42c9-8597-8dce07339164)\r\n\r\nI want to add a slider to my bar indicating how wide current workspace(if that makes any sense)\r\njust like a vertical scrollbar \r\n\r\nit would be nice to have some way of getting workspace width and current position through niri msg\r\n\r\n",
      "created_at": "2024-06-29T19:33:07Z",
      "updated_at": "2025-11-17T07:51:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sioodmy",
        "avatar_url": "https://avatars.githubusercontent.com/u/81568712?u=50fc75c5a8c64dd5e30bc2e4e764d4b211707b5f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai49m",
      "number": 2814,
      "title": "Allow adding mouse shortcuts by key code",
      "body": "Some mouse have extra thumb keys, allow mapping them by using the raw input code.\r\nThe reason I need this is because the thumb \"gesture\" key of the Mx Master 3s can't currently mapped independently from the real back button, because Smithay reports both as `MouseBack`. ",
      "created_at": "2025-11-16T15:33:28Z",
      "updated_at": "2025-11-16T15:33:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "leiserfg",
        "avatar_url": "https://avatars.githubusercontent.com/u/2947276?u=bef0300dde7e714eda2556e3078ca4381137eceb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai4n-",
      "number": 2809,
      "title": "What's up with Thunderbird's border?",
      "body": "Somehow, Thunderbird **only** has a thinner border. Every other application I've started so far seems to have the same 4px border, but Thunderbird appears to have only half of that. My screen has a scale factor of 2.\r\n\r\nSee these screenshots of the when Thunderbird (left) or Newsflash (right) is focused:\r\n\r\n<img width=\"268\" height=\"106\" alt=\"tb-focused\" src=\"https://github.com/user-attachments/assets/1e0f2c8a-1136-40d1-842d-3d0ff3e8afcb\" />\r\n<img width=\"268\" height=\"106\" alt=\"newsflash-focused\" src=\"https://github.com/user-attachments/assets/f6a4d517-d273-4ac8-98ca-0f5ef3c8a585\" />\r\n\r\nRelevant bits of config:\r\n\r\n```kdl\r\nlayout {\r\n    gaps 0\r\n    focus-ring { off; }\r\n    border {\r\n        width 2\r\n        active-color \"#f2f2f2\"\r\n        inactive-color \"#505050\"\r\n    }\r\n}\r\n```\r\n\r\nMore context:\r\n\r\n- niri 25.08\r\n- loaded via GDM\r\n- arch linux",
      "created_at": "2025-11-15T23:34:55Z",
      "updated_at": "2025-11-16T09:24:45Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5JLJ",
        "body": "Firefox and Thunderbird have their own 1 px CSD border. You can set [`clip-to-geometry`](https://yalter.github.io/niri/Configuration%3A-Window-Rules.html#clip-to-geometry) on them to get rid of it."
      },
      "user": {
        "login": "jplatte",
        "avatar_url": "https://avatars.githubusercontent.com/u/951129?u=c865ac569258c762f56304803cd5c6a1978e259b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai2-8",
      "number": 2790,
      "title": "Moving tabs in Unity (game engine) not working.",
      "body": "Hi!\r\n\r\nWhenever I'm trying to move tabs in Unity it seems nothing happens. I'm wondering if anyone else is having this problem.\r\n\r\nI tried the same in Hyprland and it works. Please check the videos below.\r\n\r\nNiri:\r\nhttps://github.com/user-attachments/assets/4969cd9a-3bbf-4ce5-a644-2889cf57410b\r\n\r\n\r\nHyprland:\r\nhttps://github.com/user-attachments/assets/d3b67464-d8e1-4ff3-9447-e2cd1bf394f9\r\n\r\n(I couldn't drag and drop from Nautilus so the videos won't play inline, sorry).\r\n\r\nThanks!",
      "created_at": "2025-11-13T16:59:38Z",
      "updated_at": "2025-11-25T01:00:05Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5JKV",
        "body": "That's it exactly !\r\nYou should go make an issue with Xwayland-satellite about this"
      },
      "user": {
        "login": "sommerper",
        "avatar_url": "https://avatars.githubusercontent.com/u/1512048?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiwbB",
      "number": 2756,
      "title": "Feature: Alt + Tab  for window switching & Super + Tab for app switching",
      "body": "Problem: I don't know in which workspace does a app I want exists. Sometimes they get lost.  So adding app switching or window switching will be alot helpful\r\n\r\nCan we get the functionality of \"Alt + Tab\" for window switching in recently used order and \"Super + Tab\" for app switching in recently used order in niri. Further we can even isolate, per workspace or per monitor.\r\n",
      "created_at": "2025-11-06T03:20:00Z",
      "updated_at": "2025-11-16T01:38:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "radiorambo",
        "avatar_url": "https://avatars.githubusercontent.com/u/64721943?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai4eg",
      "number": 2803,
      "title": "Ability to bind and remap keys using window-rule",
      "body": "It would be really great if we could use `window-rule` to create window-specific key bindings/mapping. For instance, something like:\r\n\r\n```\r\nwindow-rule {\r\n    match app-id=\"firefox\"\r\n    binds {\r\n        Shift+Left repeat=false { map \"Ctrl+Shift+Tab\";  }\r\n        Shift+Right repeat=false { map \"Ctrl+Tab\";  }\r\n        \r\n        // or ..\r\n        \r\n        Some+Combo repease=false { // whatever; }\r\n    }\r\n}\r\n```",
      "created_at": "2025-11-15T15:53:01Z",
      "updated_at": "2025-11-15T15:53:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jblyberg",
        "avatar_url": "https://avatars.githubusercontent.com/u/200283?u=7b9206d2694f8231744eb49c22fd1214ab322dd2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai3bl",
      "number": 2793,
      "title": "\"Anchor/Lock/Freeze\" window on a workspace",
      "body": "Hi, Niri is awesome\r\n\r\n_This idea might go against the 'spirit' of a scrolling compositor, but I figure it won't hurt to ask_\r\n\r\nScreenshot for reference\r\n<img width=\"1080\" height=\"608\" alt=\"niri-ss-1080\" src=\"https://github.com/user-attachments/assets/56900eef-abad-4f60-842b-2fec9b6ebb7e\" />\r\n\r\ni like working with the 50/50 split but  I want some ability to swap the left column with its off screen partner, or the right with its off screen partner - but keep the frame in place - if that makes sense.\r\n\r\nE.g., while I'm working in Neovim, i can swap the 2-up column with the outside column, but keep Neovim on my left side. Currently, of course, the workspace 'frame' will just follow the column window when I swap. So what happens is i keep having to return my focus back to Neovim.  Now I feel like I'm asking for the ability to swap non-focused columns...\r\n\r\n...and now that i'm typing this out I realize i can achieve this if I just make either side a tabbed group.\r\n\r\nI'll just post this idea anyway, feel free to close unless it's an idea that has some potential - i think i'll manage w tabbed column for now.",
      "created_at": "2025-11-14T07:29:16Z",
      "updated_at": "2025-11-15T09:39:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "besseddrest",
        "avatar_url": "https://avatars.githubusercontent.com/u/12045101?u=2d912e2eaee5afc92ec2dffe83f1e25e89d0a119&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai4MW",
      "number": 2799,
      "title": "Why -- after `niri msg action spawn` to launch something in the background?",
      "body": "Why can't it be just `niri msg action spawn <command>`? `--` seems extra here\r\nAlso, why should arguments of commands be separate? Is it because of some library/language quirks?",
      "created_at": "2025-11-15T02:03:10Z",
      "updated_at": "2025-11-15T03:08:42Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5H7e",
        "body": "I guess that the reason it is design so is to prevent clashing with other flags introduced in the future.\r\n\r\nAnd the reason for why the command is separated is because it is influenced by Rust's API design. I think it's better this way for clarity and better security. If you dont want to separate the arguments there's `spawn-sh` action."
      },
      "user": {
        "login": "aljustiet",
        "avatar_url": "https://avatars.githubusercontent.com/u/114720383?u=5191f1ccd27096602fa10f03706ed166067faa79&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai3wU",
      "number": 2796,
      "title": "nerd font niri icon?",
      "body": "i see svg icons here https://github.com/YaLTeR/niri/wiki/Name-and-Logo\r\n\r\nIs there a way to convert them into a nerd font so it can be used in a fastfetch?",
      "created_at": "2025-11-14T14:42:21Z",
      "updated_at": "2025-11-15T01:05:16Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "ReLoneR1",
        "avatar_url": "https://avatars.githubusercontent.com/u/157854055?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai218",
      "number": 2788,
      "title": "Shadow clipping",
      "body": "Greetings. I usually use Niri with no gaps, as I cannot replicate Hyprland's `no_gaps_when_only` functionality (I might be stupid, or maybe this is not possible).\r\n\r\nI recently enabled shadows for all windows as well as Waybar, so that when I have a single window on screen, floating windows, or the bar with some wallpaper showing below it, things look nicer.\r\n\r\nHowever, this leads to shadows leaking onto other windows, which I do not want. The only time I ever want shadows from another window to \"leak\" onto another is with floating windows. Ideally, with everything else (all other windows and layers), I want the shadows not to be drawn over existing windows.\r\n\r\nIs there a way to do this in Niri? If yes, I must have missed some documentation in the Wiki, and would appreciate being redirected to the right place. If not, would adding such functionality be something on the radar?",
      "created_at": "2025-11-13T14:06:39Z",
      "updated_at": "2025-11-13T21:31:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Atemo-C",
        "avatar_url": "https://avatars.githubusercontent.com/u/160250128?u=213842e97ddd7389e69df74e93fc36f08cdf0e53&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai2sm",
      "number": 2785,
      "title": "Is it possible to build without Xwayland support?",
      "body": "I want to build a pure Wayland version.",
      "created_at": "2025-11-13T10:45:13Z",
      "updated_at": "2025-11-13T10:58:38Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "fxzxmicah",
        "avatar_url": "https://avatars.githubusercontent.com/u/48860358?u=fcd51c708a09e73c863970a931321b5fc8a1ddd3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahd6z",
      "number": 2274,
      "title": "Full support for static workspaces",
      "body": "I understand that intended workflow relies heavily on dynamic workspaces. However with ability to pre-create named workspaces the only thing left is an option to disable auto-creation of new empty workspace, so it should not be a big change?",
      "created_at": "2025-08-21T14:57:42Z",
      "updated_at": "2025-11-13T10:20:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "artyom-smushkov",
        "avatar_url": "https://avatars.githubusercontent.com/u/9966061?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai1K6",
      "number": 2780,
      "title": "niri-session: Calling import-environment without a list of variable names is deprecated.",
      "body": "when running `niri-session`, I get the warning `Calling import-environment without a list of variable names is deprecated.` It is caused by the deprecated blank call  `systemctl --user import-environment ` (see: https://github.com/systemd/systemd/pull/18137)\r\n\r\nI think it would be safer to replace it with explicit variables to import. ",
      "created_at": "2025-11-11T21:21:41Z",
      "updated_at": "2025-11-12T11:54:35Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A5Aql",
        "body": "See https://github.com/YaLTeR/niri/issues/254"
      },
      "user": {
        "login": "benjaminbauer",
        "avatar_url": "https://avatars.githubusercontent.com/u/1436222?u=313c14b18125f256e0aad4a51585ce8e051e0e1e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai0Tu",
      "number": 2774,
      "title": "Allow specifying a source column for move-column-to-index",
      "body": "Currently move-column-to-index always moves the focused column. It would be great if the column to move could also be specified by ID.\r\n\r\nReasoning: I just switched to niri from a highly customized dwm workflow. It was really enlightening to see how elegantly niri (and scrolling WM in general) solve the space problem. However, I find it more efficient to pull out-of-sight windows towards me rather than jump to them. (Consider writing a script and wanting to look something up on the internet; I find it more convenient to \"pull\" the browser window so that it is next to my editor rather jumping to wherever my browser currently is.)\r\n\r\nWith dwm I used rofi to select a window and changed dwm so that it adds the current tag to the window which essentially makes it visible. Since niri is scriptable, I aim for something like `niri msg action move-column-to-index $COLUMN_WITH_TARGET_WINDOW $CURRENT_COLUMN` so that they are next to each other.\r\n\r\nAs it stands right now, I can do something like:\r\n\r\n```\r\n#!/bin/bash\r\nindex=$(niri msg --json focused-window | jq .layout.pos_in_scrolling_layout[0])\r\nwindows=$(niri msg -j windows)\r\ndesired_index=$(echo \"$windows\" | jq \".[$(echo \"$windows\" | jq -r 'map(\"\\(.title // .app_id)\\u0000icon\\u001f\\(.app_id)\") | .[]' | fuzzel -d --index)].id\")\r\nniri msg action do-screen-transition\r\nniri msg action focus-window --id $desired_index\r\nniri msg action move-column-to-index $index\r\n```\r\n\r\nHowever, this feels like a hack and has unpredictable behavior: depending on whether the desired window/column is left or right of the current one, it ends up right or left of it (at least that's my current observation, I still haven't fully understood it). The bigger problem is that `niri msg` can't seem to tell me the current horizontal position of the view. So after transitioning, there will always be a column starting at the left side of the screen, but this should not happen if I have some odd column widths (like 1/3) and a window was previously sticking out of the left side of the screen.\r\n\r\nSo to sum it up, an optional argument `source column` of move-column-to-index would greatly improve my situation. I hope my reasoning made sense to you, please let me know if something is unclear. And thanks already for opening the world of scrolling window management to me!",
      "created_at": "2025-11-10T22:27:31Z",
      "updated_at": "2025-11-11T13:19:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Lodifice",
        "avatar_url": "https://avatars.githubusercontent.com/u/6838133?u=81ed6270512fb9f4de84ebe682dc92f06dc789cd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ai01G",
      "number": 2777,
      "title": "Custom Animations for layerrule and windowrule",
      "body": "Currently, niri provides flexible control over layout and behavior through these rules, but the animation system remains fairly global. Allowing users to define rule-specific animations would open up a lot of creative and usability possibilities.\r\n\r\nI’m not very familiar with the technical side of niri and rust, so I’m not sure how complex this would be to implement. \r\n\r\n---\r\n\r\nI really appreciate all the work the developers have put into making niri so smooth and innovative. Thank you for all your effort and dedication!",
      "created_at": "2025-11-11T12:49:02Z",
      "updated_at": "2025-11-11T12:49:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SolitaryAnimal",
        "avatar_url": "https://avatars.githubusercontent.com/u/155461314?u=61d7777c65b9af3f1c8b56a2de649d5b6e161e87&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AitIC",
      "number": 2730,
      "title": "Need Help:I can't paste any images to other applications",
      "body": "- Question:\r\nI can copy text and image(via the inner app or flameshot),but i can't paste them to firefox etc.\r\n- Try:\r\nI tried wl-paste and wl-copy, but still cant. \r\nWhen i type ` wl-paste --list-types` in terminal, it shows `image/png`, and if i paste it in terminal , it shows `PNG`. But still not in other app.\r\n- Source:\r\n```\r\n    //Mod+A { spawn \"flameshot\" \"gui\";}\r\n    Mod+A hotkey-overlay-title=\"Screenshot to Clipboard\" {\r\n    spawn-sh \"grim -g $(slurp) - | wl-copy --type image/png\"\r\n}\r\n```\r\nsorry for my poor English, and thanks for every answer !!!",
      "created_at": "2025-11-02T11:55:13Z",
      "updated_at": "2025-11-11T00:38:06Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A4qbH",
        "body": "The problem is Firefox cant paste images, Now I use Edge ……"
      },
      "user": {
        "login": "calendar0917",
        "avatar_url": "https://avatars.githubusercontent.com/u/174724728?u=45d87be590e7cc24c948acd6d104765568ef03ed&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiwIr",
      "number": 2755,
      "title": "Tablet and relative positioning of pen",
      "body": "Hello!\r\n\r\nI'm trying to let my graphical wacom tablet work this way: when I move cursor with pen, it moved. Then I lift the pen for few centimeter up and put it down on tablet again in other place of tablet. But cursor not \"jump\" into new point of the screen, cursors remains stand on the same place as it was before pen lift up.\r\n\r\nI'm talking about this kind of tablets. No screen. Small working area. Nothing more.\r\nhttps://www.wacom-store.ru/wa-data/public/shop/products/74/01/174/images/711/711.750x0.jpg\r\n\r\nI literally can't draw when \"jumps\" happens (because of mapping?).\r\n\r\nMay be I need \"mouse behavior\": mouse is not mapped to monitor and cursor don't instantly jump in the corner of the screen if I lift up and put mouse down in the other place of my table.\r\n\r\nSounds like I want to get rid of \"mapping tablet to monitor\", I'm not sure.\r\n\r\nKDE and X-server has such options to configure and I configured it somehow weeks ago, but don't remember how and I lost the config-file, I'm sorry :sob: (and we are not under X-server anymore).\r\n\r\nHow can I reach this behavior?\r\n\r\nSeems like I want the same as this guy wants: https://github.com/YaLTeR/niri/discussions/1815\r\n\r\nIt is implemented yet?",
      "created_at": "2025-11-05T18:44:04Z",
      "updated_at": "2025-11-10T23:52:00Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "notstronglinuxuser",
        "avatar_url": "https://avatars.githubusercontent.com/u/242163615?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AizZC",
      "number": 2769,
      "title": "Insert workspace before current one",
      "body": "Currently, when I close the last window in a workspace and leave the workspace, I cannot restore the workspaces to the previous state. As in some office suites, I suggest a functionality to insert a workspace before (or after) the current one.",
      "created_at": "2025-11-10T04:39:54Z",
      "updated_at": "2025-11-10T15:46:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "AprilGrimoire",
        "avatar_url": "https://avatars.githubusercontent.com/u/47601131?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aiz6Y",
      "number": 2773,
      "title": "Window rule to \"open-windowed-fullscreen\".",
      "body": "Some apps will still show title bars even with csd disabled but will hide it in fullscreen, so I would like the option to be able to start apps in fullscreen-windowed mode.",
      "created_at": "2025-11-10T14:43:37Z",
      "updated_at": "2025-11-10T14:43:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rdnamil",
        "avatar_url": "https://avatars.githubusercontent.com/u/26946193?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiXjf",
      "number": 2566,
      "title": "Drag-and-Drop Between Wayland and XWayland Applications",
      "body": "Hi everyone,\n\nI’ve noticed that in Niri(with xwayland-satellite), drag-and-drop operations do not work from Wayland applications to XWayland (X11) applications.\n\nFor example, when using Dolphin (Wayland) as the file manager, it’s currently not possible to drag a file into ITK-SNAP or other legacy applications running under XWayland to open it. The operation simply does nothing, suggesting that cross-protocol DnD handling between Wayland and XWayland is not functioning.\n\nI’m wondering whether this is:\n\t•\tA known limitation of Niri’s current Wayland–XWayland integration,\n\t•\tOr an area still under development or discussion.\n\nIt would be great to know if there are plans or possible workarounds for enabling DnD between Wayland and XWayland clients, as this affects workflows that rely on interoperability between modern and legacy applications.\n\nHas anyone else encountered this issue or found any relevant discussions or upstream references related to it? ：）",
      "created_at": "2025-10-10T17:28:54Z",
      "updated_at": "2025-11-10T09:59:07Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "xsxun",
        "avatar_url": "https://avatars.githubusercontent.com/u/36831636?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiuNP",
      "number": 2740,
      "title": "Ideas to make hinting that the focused window isn't at the edge of the workspace prettier and more functional",
      "body": "I often find myself forgetting that a workspace has more windows at its right/left that in that moment aren't visible.\r\nI guess that the overview is a decent fix for this, because one can just open the overview to see whether any workspaces have hidden and forgotten windows, but I want to propose two new  solutions:\r\n\r\n### 1. Making struts more powerful by introducing new `match` options in the config\r\nStruts, theoretically, are the perfect solution to the problem of constantly losing windows, because you're always guaranteed to see whether there's another window at the edge of the visible workspace; this setting is fine, but it has the flaw that (and i couldn't personally find a fix for it) it also calculates struts on edges that are adjacent to the workspace horizontal limit, creating ugly gaps on the left of windows adjacent to the left workspace limit, and gaps on the right of windows adjacent to the right workspace limit, respectively.\r\n\r\nThis could be fixed by introducing a new `match` syntax for `window-rule` in the config.kdl:\r\n```kdl\r\nwindow-rule {\r\n    match window_is_in_column=\"1\"\r\n    struts {\r\n        left = 0;\r\n        right = 16;\r\n    }\r\n}\r\n\r\nwindow-rule {\r\n    match window_is_in_column=\"-1\"\r\n    struts {\r\n        left = 16;\r\n        right = 0;\r\n    }\r\n}\r\n\r\nwindow-rule {\r\n    match window_is_in_column=\"2..=-2\"\r\n    struts {\r\n        left = 16;\r\n        right = 16;\r\n    }\r\n}\r\n// ...\r\n```\r\n\r\nThis would also enable a lot more position-based customization in general.\r\n\r\n### 2. Making a small colored hint at the edge of the screen when the workspace continues\r\n\r\nThis could take the form of a small gradient at the edge of the screen (exaggerated for demonstration purposes):\r\n<img width=\"2256\" height=\"1463\" alt=\"niri_workspace_hint_example\" src=\"https://github.com/user-attachments/assets/d026d0ff-c271-4e46-9cb1-340666dbd6c0\" />\r\n\r\nor something like that.\r\n\r\n\r\n\r\nThoughts?\r\n",
      "created_at": "2025-11-03T20:41:20Z",
      "updated_at": "2025-11-09T22:08:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "confused-ace-noises",
        "avatar_url": "https://avatars.githubusercontent.com/u/167687968?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AizMA",
      "number": 2768,
      "title": "Snap-to/detent regions when resizing windows?",
      "body": "Has there been any notion in Niri of optional/configurable 'snap-to' regions/'detents' to assist with resizing windows? Such as aligned with the default column widths and heights (e.g. 33% and 66% horiz. and 50% vertically)?\r\n\r\nWhen I first log in and am building my workflow for that day/task, it would be great to have some way to reduce the 'bumbling around' (feels like) after I launch something.\r\n\r\nOr, am I missing some core/key aspect of Niri's theory of operation (entirely possible)?\r\n\r\nEDIT: I see now that the binds for 'switch-preset-column-width/height' provide essentially this functionality (so, sorry for the noise). However, there still does seem to be some non-small number of common cases where manual resizing is necessary, no? Are these all meant to be special cased in window-rules (matched vs. an app-id)? I'm talking about things like config. utils (pavucontrol, say, or file managers used as open/save 'dialog boxes' by various gui apps).  These would typically be small (and modal, or at least floating). Are they really meant to open full-height at the default column width?",
      "created_at": "2025-11-09T20:23:56Z",
      "updated_at": "2025-11-09T21:34:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "geoffsmithBK",
        "avatar_url": "https://avatars.githubusercontent.com/u/2380929?u=d8cee8fd8cefd087dcb38218040e8c6b6a18ca5d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aiyx5",
      "number": 2766,
      "title": "Jetbrains ide rubymine blocks what im typing",
      "body": "I dont know if this is jetbrains,niri, or waylands fault. I just want this to get fixed.\r\nEveryones reply are appriciated.Thank you\r\n<img width=\"1448\" height=\"350\" alt=\"Screenshot from 2025-11-09 11-05-22\" src=\"https://github.com/user-attachments/assets/fe4e713c-c195-4d13-8eec-4f2931c88b22\" />\r\n",
      "created_at": "2025-11-09T03:11:55Z",
      "updated_at": "2025-11-09T07:17:50Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A45Gl",
        "body": "So I think you have two separate problems:\r\n1. The reported one with Wayland enabled, that may or may be not be because of Niri (for that matter the only way of knowing if it's a problem in Niri or in the JetBrains platform would be you to seeing if it happens in another compositor with Wayland enabled, specially one that uses Smithay such as cosmic-comp);\r\n2. This one using XToolkit, that then, is an xwayland-satellite issue."
      },
      "user": {
        "login": "Lzycode-byte",
        "avatar_url": "https://avatars.githubusercontent.com/u/212181592?u=e8ee1aff8e162804c32d15d5b32f811ba8e77254&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aiy1c",
      "number": 2767,
      "title": "option to invert 4-finger \"overview zoom\" mouse gesture",
      "body": "Currently, the way this gesture works feels counterintuitive to the 3-finger scrolling (to me- I was an 'inverse mouse' gamer in my teens).\r\n\r\nIt'd be neat if there was a configuration option allowing one to invert it 🙂 ",
      "created_at": "2025-11-09T06:03:21Z",
      "updated_at": "2025-11-09T06:04:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "pospi",
        "avatar_url": "https://avatars.githubusercontent.com/u/437540?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aiu7z",
      "number": 2747,
      "title": "Dynamically hide window borders in normal mode, show in overview mode",
      "body": "**Problem:**\r\nNiri currently allows users to configure window borders and focus rings globally or per-window, but there is no way to have them behave differently based on whether the compositor is in \"normal\" focused mode or \"overview\" mode. I would like the ability to utilize borders in the overview for better visual separation and navigation, but prefer a borderless, cleaner look when in normal, focused use.\r\n\r\n**Proposed Solution:**\r\nAdd a new configuration option or a specific matcher for window rules that can detect the current compositor mode (focused/normal vs. overview). This would allow users to define different border settings for each state.\r\n\r\nFor example, I envision something like this in the configuration:\r\n\r\n```kdl\r\nlayout {\r\n    // Hide borders by default in normal mode\r\n    borders off \r\n\r\n    // A hypothetical new configuration section or rule to apply settings in overview mode\r\n    overview-mode {\r\n        borders on\r\n        border-width 2\r\n        border-color \"...\"\r\n    }\r\n}\r\n",
      "created_at": "2025-11-04T15:52:08Z",
      "updated_at": "2025-11-09T05:33:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tariqueh99",
        "avatar_url": "https://avatars.githubusercontent.com/u/52823477?u=9df90606320b83d8ee727892be16370637e745ab&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhFEi",
      "number": 2178,
      "title": "Vi movement in overview",
      "body": "Currently, in the overview, you can select a window by navigating with the arrow keys and confirming your selection with the Enter key.\r\n\r\nI believe adding navigation using the hjkl keys would be a good addition.\r\n\r\nsimilar to #1743  but simpler. \r\n\r\nAny thoughts?",
      "created_at": "2025-08-03T18:29:41Z",
      "updated_at": "2025-11-08T18:43:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "roterodamus",
        "avatar_url": "https://avatars.githubusercontent.com/u/89250803?u=5f180fca83fc4b940b2466f19825da505d8cfc14&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AitZe",
      "number": 2732,
      "title": "Add ability to choose which way to scroll",
      "body": "Hello, thank you for the great WM,\r\n\r\nI was thinking it would be great to choose whether the windows scroll vertically or horizontally. Scrolling vertically is ideal for vertical monitor setups, where there is more vertical space.\r\n\r\nThanks!",
      "created_at": "2025-11-02T22:30:13Z",
      "updated_at": "2025-11-08T00:28:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rhymeswithocean",
        "avatar_url": "https://avatars.githubusercontent.com/u/157437508?u=d4d172ab66228e8b0639d10d930fb953ad1a8e83&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AixNR",
      "number": 2763,
      "title": "Thunar pop-up windows: any way to exclusivity make floating?",
      "body": "I'm wondering if there's a way to leave thunar as tiled but have its pop-up windows as floating.\r\nThanks.",
      "created_at": "2025-11-06T21:05:21Z",
      "updated_at": "2025-11-07T19:06:59Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A41y5",
        "body": "When it's open, can you run niri msg windows and see if it has a unique name"
      },
      "user": {
        "login": "vaskark",
        "avatar_url": "https://avatars.githubusercontent.com/u/33555080?u=3cb072ea9404e0948cd1615dec3eb8a50733466c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aiv8B",
      "number": 2754,
      "title": "A way to create new windows in the current column",
      "body": "Coming from i3, I was able to tell the system to create teh next window in either a vertical or horizontal split.  If I could tell niri \"create the next window in the current column\" I think this workflow could be replicated.  Is there a way tot do this?",
      "created_at": "2025-11-05T14:29:38Z",
      "updated_at": "2025-11-05T17:18:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "zalegrala",
        "avatar_url": "https://avatars.githubusercontent.com/u/88330524?u=799edc6cec535b70d2ac59dc7cc155159e597192&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AivZS",
      "number": 2750,
      "title": "Title: Can we add some optional functionality to Mod+MouseRight/Left?",
      "body": "I just switched from Hyprland to niri, and everything is great. However, I noticed that currently, in the configuration file, the keybinds for `Mod+MouseRight/Left` are the only ones that have default bindings without explicit declaration. They correspond to operations like `movewindow` and `resizewindow` respectively. But I've encountered some issues while using these two functions, so I hope the author could add configurations similar to the following to make my workflow more convenient:\r\n\r\n```\r\nbinds {\r\n  Mod+MouseRight { resizewindow \"auto/topleft/topright/bottomleft/bottomright\"; }\r\n  Mod+MouseLeft { movewindow/set_float_and_move_window; }\r\n}\r\n```\r\n\r\n**For `Mod+MouseRight`**, I hope to add the ability to resize the window from a fixed corner (for example, when the user presses `Mod+MouseRight`, the cursor could automatically move to the bottom-right corner of the window).\r\n\r\nThe current `Mod+MouseRight` determines which side to resize the window from based on the relative position of the cursor to the window. This seems intelligent, but for me, I often use it on floating windows. If I want to resize a window, I first have to locate my cursor, then move the cursor close to the edge of the window, and only then can I press `Mod+MouseRight` to resize it. This really wastes attention. If I could resize from a fixed corner, I would only need to press `Mod+MouseRight` to start resizing, and then use `Mod+MouseLeft` to slightly adjust the window position afterward.\r\n\r\nFurthermore, there's a behavior that could be considered a bug: when my cursor is in the central area of the window (and this central area is quite large) and I use `Mod+MouseRight`, niri does nothing. In this case, it's no different from just using the right mouse button to interact with the content inside the window. This further increases the burden of using `Mod+MouseRight` for me – I need to \"carefully\" judge whether the cursor is close enough to the border before pressing `Mod+MouseRight`. This behavior is quite unreasonable because when I press `Mod+MouseRight`, it should trigger the window resize operation.\r\n\r\n**For `Mod+MouseLeft`**, I hope to add an option to directly set the window to floating and then move it (for example, when the user presses `Mod+MouseLeft`, the window could automatically be set to floating).\r\n\r\nPersonally, I'm used to using fixed workspaces. I have many workspaces, and on each workspace, I only have a few windows. So I use keyboard shortcuts to move tiled windows and don't use the mouse for that. From dwm to Hyprland, I've always been accustomed to using `Mod+MouseLeft` to \"drag\" a window from tiled layout into a floating one and move it.\r\n\r\nThank you very much for reading this far. I look forward to your thoughts on this suggestion.",
      "created_at": "2025-11-05T04:07:04Z",
      "updated_at": "2025-11-05T04:07:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Norhua",
        "avatar_url": "https://avatars.githubusercontent.com/u/51854433?u=ed13fa175aabc58b6fc52da28d4dd478d8622154&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiuRg",
      "number": 2742,
      "title": "More, smarter placeholder workspaces",
      "body": "1. ~You know how there's always an empty, available workspace *down* that you can move windows to?\r\nI'd like to have the same one *up* as well.\r\nI suppose it's doable, since you can already currently drag a window *up* ouside of the (currently) topmost workspace to create a new workspace there and move your window to it.~\r\nEDIT: This already exists; just add the `empty-workspace-above-first` directive to the `layout` block:\r\n    ```kdl\r\n    layout {\r\n        empty-workspace-above-first\r\n    }\r\n    ```\r\n\r\n2. However, I'd rather not have empty workspaces cluttering the overview... In fact, I don't even really want to see the one at the bottom anymore. Could these tweaks maybe be configurable?\r\nUPDATE: Frankly it's really not too bad of a \"distraction\", actually. But maybe it's not too tedious of a task either. I'll explore a bit and see whether I can contribute something like this to wetten my toes.\r\n\r\n3. Lastly, when you have a single window *alone on its workspace*, it's a bit funky the way it *feels* like you can move it down, but in reality, right after you pushed it below to the new \"placeholder\" workspace, the one you just left would be now empty and is instead discarded. Ideally, it'd be really neat to have the same behaviour then as is currently for any window on the topmost workspace: it just doesn't move anything if the move would result essentially in a contrived no-op (create new workspace, move window there, delete previous workspace).",
      "created_at": "2025-11-03T22:21:20Z",
      "updated_at": "2025-11-04T16:19:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ccjmne",
        "avatar_url": "https://avatars.githubusercontent.com/u/6822545?u=dd881e22a2ac21309ea90301109f75d74658d253&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiuZ8",
      "number": 2743,
      "title": "Add clickthrough parameter to windows to allow for floating windows to behave like true HUDs / overlays",
      "body": "I like to have floating stickies while playing games e.g. Twitch chat, crosshair overlays, etc. But done with native Niri tooling right now, the overlay floating windows will always steal focus from the main game window due to mouse clicks. If we could just allow target windows to ignore mouse clicks and not steal focus, we could make some pretty cool HUDs just with Niri.\r\n\r\nAlternatively we could try wlr-screencopy but that feels like a bandaid and waste of computation if we could have the floating windows natively uninteractable.",
      "created_at": "2025-11-04T03:04:01Z",
      "updated_at": "2025-11-04T15:08:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zitongcharliedeng",
        "avatar_url": "https://avatars.githubusercontent.com/u/108423881?u=2af539aca68f0a532e320254ba73bb3a3350d9f0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiuwJ",
      "number": 2745,
      "title": "Is there a way to resize windows in a fixed direction?",
      "body": "When I use Mod+MouseRight to resize a window in niri, it determines the direction of resizing based on the cursor's position relative to the window edges or corners. If the cursor is near a specific edge or corner, the window can be resized in that direction. Is there a way to resize the window without relying on the cursor's relative position, but instead from a fixed, predetermined position? This would reduce the time spent on judgment and mouse movement.\r\n\r\nHowever, I suspect this might be impossible in niri because it does not support binding multiple actions to the same key.\r\n\r\nIn Hyprland, I can achieve this goal with the following method:\r\n```\r\nbind  = $mainMod, mouse:273, movecursortocorner, 1\r\nbindm = $mainMod, mouse:273, resizewindow\r\n```\r\nWhile reading the wiki, I had a question. The wiki mentions: \"This is one of the few sections that does not get automatically filled with defaults if you omit it, so make sure to copy it from the default config.\" But why are the default actions for Mod+MouseRight/Left not declared?\r\n\r\nAdditionally, there is an important phenomenon I haven’t mentioned before. If the cursor is in the central area of the window (and this central area is quite large), niri does nothing. In this case, it’s no different from using the right mouse button alone to interact with the window content. I find this logic somewhat unreasonable and even consider it a bug, because I have already pressed Mod+MouseRight, which should trigger the window resizing operation.\r\n\r\nIf it’s possible to always resize the window from the bottom-right corner under the current conditions, please let me know—I would greatly appreciate it.\r\n\r\nIf it’s not possible to resolve this, I hope related code can be added to allow users to configure settings similar to the following:\r\n```\r\nbinds {\r\n  Mod+MouseRight { resizewindow “auto/topleft/topright/lowleft/lowright”; }\r\n  Mod+MouseRight { movewindow }\r\n}\r\n```",
      "created_at": "2025-11-04T12:12:36Z",
      "updated_at": "2025-11-04T12:12:36Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Norhua",
        "avatar_url": "https://avatars.githubusercontent.com/u/51854433?u=ed13fa175aabc58b6fc52da28d4dd478d8622154&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaW3z",
      "number": 529,
      "title": "Binding Modes",
      "body": "basically just [this](https://i3wm.org/docs/userguide.html#binding_modes).\r\n\r\nas niri does not have it's own bar, `niri msg get_binding_mode` should exist (or similiar).\r\n\r\nexample of how config would look like:\r\n```kdl\r\n// \"default\" is implied to not break configs\r\nbinds {\r\n    Mod+D { mode \"launch\"; }\r\n    ...\r\n}\r\n\r\nbinds \"launch\" {\r\n    F { spawn firefox; mode \"default\"; }\r\n    ...\r\n    Esc { mode \"default\"; }\r\n}\r\n```",
      "created_at": "2024-07-07T22:55:12Z",
      "updated_at": "2025-11-04T08:14:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {}
    },
    {
      "id": "D_kwDOKFkxdc4AgHc_",
      "number": 1732,
      "title": "Mirroring of a laptop's output sDP1 on HDMI-A-I",
      "body": "First and foremost my deepest respect for such a well-designed Wayland compositor! I'm running it for a week (after 2 years of daily use of first Sway and then Hyprland) and I am extremely impressed.\r\n\r\nAs I regularly use my laptop for teaching, native screen mirroring from the laptop's\r\n`eDP-1: 1920x1080 -> HDMI-A_I:1920x1080`\r\nis essential.  This was the default behavior under X/i3.  After moving to Sway under Wayland, it was painful (had to use 3rd-party wl-mirror), then, further on, switching to Hyprland, it became elementary again, by placing\r\n`monitor =  DP-1,   1920x1080,0x0,1,mirror,HDMI-A-I`\r\nin hyrland.conf.\r\n\r\nA similar configuration option in Niri will be extremely well met and will surely expand the user base.",
      "created_at": "2025-06-05T05:31:59Z",
      "updated_at": "2025-11-03T21:04:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tjavdar",
        "avatar_url": "https://avatars.githubusercontent.com/u/10163826?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiuI8",
      "number": 2739,
      "title": "All possible key bindings",
      "body": "I'm seeing binds in the default config like `focus-window-or-workspace-down` etc.  I'm wondering if there is a full list of all possible actions that can be taken in a bind.  Some of the default behavior I find non-intuitive, but I'm thinking that the behavior I'm looking for is probably possible, but I don't see a list of all the bindings possible.  Does such a list exist?",
      "created_at": "2025-11-03T18:51:45Z",
      "updated_at": "2025-11-03T19:15:18Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A4sX6",
        "body": "``niri msg action``"
      },
      "user": {
        "login": "zalegrala",
        "avatar_url": "https://avatars.githubusercontent.com/u/88330524?u=799edc6cec535b70d2ac59dc7cc155159e597192&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AitpK",
      "number": 2737,
      "title": "Store windows settings",
      "body": "Is there a way to store the current windows that are open such that when rebooting the same windows will open at the same locations they were at?",
      "created_at": "2025-11-03T08:45:30Z",
      "updated_at": "2025-11-03T16:35:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cvanelteren",
        "avatar_url": "https://avatars.githubusercontent.com/u/19485143?u=86bd93ea3ff417092ca3b04370c4b2030b24620c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aio_B",
      "number": 2694,
      "title": "Combine outputs for widescreen?",
      "body": "I have an LG 5k widescreen which is connected through USB-C.  This presents itself as two outputs to the system in both X and Wayland.  Coming from i3, I was able to spread a single workspace across both outputs which made it feel like a single output.  In Niri, I have a split in the of the screen for the left and right half of the two outputs.\r\n```\r\nOutput \"LG Electronics LG HDR 5K 312NTXR20122\" (DP-5)\r\n  Current mode: 2560x2160 @ 59.978 Hz\r\n  Variable refresh rate: not supported\r\n  Physical size: 800x330 mm\r\n  Logical position: 2560, 0\r\n  Logical size: 2560x2160\r\n  Scale: 1\r\n  Transform: normal\r\n  Available modes:\r\n    2560x2160@59.978 (current)\r\n    1024x768@60.004\r\n    800x600@60.317\r\n    640x480@59.940\r\n\r\nOutput \"Lenovo Group Limited 0x403D Unknown\" (eDP-1)\r\n  Disabled\r\n  Variable refresh rate: supported, disabled\r\n  Physical size: 300x190 mm\r\n  Available modes:\r\n    1920x1200@60.026 (preferred)\r\n    1920x1080@60.026\r\n    1600x1200@60.026\r\n    1680x1050@60.026\r\n    1280x1024@60.026\r\n    1440x900@60.026\r\n    1280x800@60.026\r\n    1280x720@60.026\r\n    1024x768@60.026\r\n    800x600@60.026\r\n    640x480@60.026\r\n\r\nOutput \"Unknown Unknown Unknown\" (DP-6)\r\n  Current mode: 2560x2160 @ 59.978 Hz (preferred)\r\n  Variable refresh rate: not supported\r\n  Physical size: 800x330 mm\r\n  Logical position: 0, 0\r\n  Logical size: 2560x2160\r\n  Scale: 1\r\n  Transform: normal\r\n  Available modes:\r\n    2560x2160@59.978 (current, preferred)\r\n    3440x1440@59.973 (preferred)\r\n    3840x2160@59.997\r\n    3840x2160@29.981\r\n    3440x1440@49.987\r\n    1920x1200@59.978\r\n    1920x1080@60.000\r\n    1920x1080@60.000\r\n    1920x1080@59.940\r\n    1600x1200@59.978\r\n    1680x1050@59.978\r\n    1280x1024@59.978\r\n    1440x900@59.978\r\n    1280x800@59.978\r\n    1280x720@60.000\r\n    1280x720@59.940\r\n    1024x768@60.004\r\n    800x600@60.317\r\n    720x480@60.000\r\n    720x480@59.940\r\n    640x480@60.000\r\n    640x480@59.940\r\n    640x480@59.940\r\n```\r\n\r\nI'm wondering if there is a way to allow a single workspace to stretch across both outputs in a way that makes if feel like a single output.  Does anyone know of a solution for this?\r\n\r\nIn the above DP-5 and DP-6 are the same physical monitor.  Occasionally the order is reversed depending on the order of detection I suppose, but I'm looking for a way to use both with the same workspace so I don't have the extra management of monitors when I only have a single physical monitor.",
      "created_at": "2025-10-28T16:19:25Z",
      "updated_at": "2025-11-13T18:53:04Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A4r0E",
        "body": "After you mentioned that you thought the detection of two outputs for a single physical monitor was rare, I took a chance and bought a cable.  Before I was using a USB-c to USB-c cable to connect to the monitor, which was giving the behavior described above.  After connecting a USB-c to DisplayPort (monitor-side) cable to the monitor directly, the issue is resolved, and only one output is presented to the system for the single physical screen.  After this change, it appears to be a non-issue for me.  Thanks for the feedback."
      },
      "user": {
        "login": "zalegrala",
        "avatar_url": "https://avatars.githubusercontent.com/u/88330524?u=799edc6cec535b70d2ac59dc7cc155159e597192&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ainwu",
      "number": 2683,
      "title": "Screencasting breaks after disabling / enabling monitors",
      "body": "Hello around! I didn't want to right away file a new issue, but I do have a weird behaviour on my laptop from time to time where monitors won't show up in the correct resolution / refresh rate and I have to re-attach them, which leads to the Screencasting portal breaking. There are 3 screens active (Laptop + 2x 4K external screens)\r\n\r\n Here's the stack trace of the xdg portal:\r\n\r\n```\r\nOct 27 11:32:06 bigos xdg-desktop-portal-gnome[71310]: Monitor 'Unknown' has no configuration which is-current!\r\nOct 27 11:32:06 bigos xdg-desktop-portal-gnome[71310]: error: **\r\nOct 27 11:32:06 bigos xdg-desktop-portal-gnome[71310]: ERROR:../xdg-desktop-portal-gnome/src/displaystatetracker.c:380:generate_logical_monitors: assertion failed: (monitor)\r\nOct 27 11:32:06 bigos xdg-desktop-portal-gnome[71310]: Bail out! ERROR:../xdg-desktop-portal-gnome/src/displaystatetracker.c:380:generate_logical_monitors: assertion failed: (monitor)\r\nOct 27 11:32:06 bigos systemd-coredump[71323]: [🡕] Process 71310 (xdg-desktop-por) of user 1000 dumped core.\r\n\r\n```\r\n\r\n<details>\r\n<summary>More stack trace</summary>\r\n\r\n```\r\n   Stack trace of thread 71310:\r\n                                               #0  0x00007f73f02ac54b pthread_kill (libc.so.6 + 0xac54b)\r\n                                               #1  0x00007f73f0244968 raise (libc.so.6 + 0x44968)\r\n                                               #2  0x00007f73f022560f abort (libc.so.6 + 0x2560f)\r\n                                               #3  0x00007f73f1a2c111 n/a (libglib-2.0.so.0 + 0x1e111)\r\n                                               #4  0x00007f73f1aa0f19 g_assertion_message_expr (libglib-2.0.so.0 + 0x92f19)\r\n                                               #5  0x00005624ad0a9fac n/a (/usr/lib/xdg-desktop-portal-gnome + 0x40fac)\r\n                                               #6  0x00007f73f18e49cc n/a (libgio-2.0.so.0 + 0xa89cc)\r\n                                               #7  0x00007f73f18ea472 n/a (libgio-2.0.so.0 + 0xae472)\r\n                                               #8  0x00007f73f195e9ce n/a (libgio-2.0.so.0 + 0x1229ce)\r\n                                               #9  0x00007f73f18e49cc n/a (libgio-2.0.so.0 + 0xa89cc)\r\n                                               #10 0x00007f73f18ea472 n/a (libgio-2.0.so.0 + 0xae472)\r\n                                               #11 0x00007f73f19548b3 n/a (libgio-2.0.so.0 + 0x1188b3)\r\n                                               #12 0x00007f73f18e49cc n/a (libgio-2.0.so.0 + 0xa89cc)\r\n                                               #13 0x00007f73f18e4a15 n/a (libgio-2.0.so.0 + 0xa8a15)\r\n                                               #14 0x00007f73f1a6cf8d n/a (libglib-2.0.so.0 + 0x5ef8d)\r\n                                               #15 0x00007f73f1a6e657 n/a (libglib-2.0.so.0 + 0x60657)\r\n                                               #16 0x00007f73f1a6ea17 g_main_loop_run (libglib-2.0.so.0 + 0x60a17)\r\n                                               #17 0x00005624ad079ed2 n/a (/usr/lib/xdg-desktop-portal-gnome + 0x10ed2)\r\n                                               #18 0x00007f73f0227b0b n/a (libc.so.6 + 0x27b0b)\r\n                                               #19 0x00007f73f0227bbb __libc_start_main (libc.so.6 + 0x27bbb)\r\n                                               #20 0x00005624ad07a815 n/a (/usr/lib/xdg-desktop-portal-gnome + 0x11815)\r\n\r\n                                               Stack trace of thread 71311:\r\n                                               #0  0x00007f73f033e45d syscall (libc.so.6 + 0x13e45d)\r\n                                               #1  0x00007f73f1a9d82e g_cond_wait (libglib-2.0.so.0 + 0x8f82e)\r\n                                               #2  0x00007f73f1a341cd n/a (libglib-2.0.so.0 + 0x261cd)\r\n                                               #3  0x00007f73f1aa6487 n/a (libglib-2.0.so.0 + 0x98487)\r\n                                               #4  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #5  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #6  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n\r\n                                               Stack trace of thread 71315:\r\n                                               #0  0x00007f73f02b2e42 n/a (libc.so.6 + 0xb2e42)\r\n                                               #1  0x00007f73f02a64df n/a (libc.so.6 + 0xa64df)\r\n                                               #2  0x00007f73f0333c43 ppoll (libc.so.6 + 0x133c43)\r\n                                               #3  0x00007f73f1a6e784 n/a (libglib-2.0.so.0 + 0x60784)\r\n                                               #4  0x00007f73f1a6e865 g_main_context_iteration (libglib-2.0.so.0 + 0x60865)\r\n                                               #5  0x00007f73f1ccf8ce n/a (libdconfsettings.so + 0x78ce)\r\n                                               #6  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #7  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #8  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n\r\n                                               Stack trace of thread 71313:\r\n                                               #0  0x00007f73f02b2e42 n/a (libc.so.6 + 0xb2e42)\r\n                                               #1  0x00007f73f02a64df n/a (libc.so.6 + 0xa64df)\r\n                                               #2  0x00007f73f0333c43 ppoll (libc.so.6 + 0x133c43)\r\n                                               #3  0x00007f73f1a6e784 n/a (libglib-2.0.so.0 + 0x60784)\r\n                                               #4  0x00007f73f1a6ea17 g_main_loop_run (libglib-2.0.so.0 + 0x60a17)\r\n                                               #5  0x00007f73f1956264 n/a (libgio-2.0.so.0 + 0x11a264)\r\n                                               #6  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #7  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #8  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n\r\n                                               Stack trace of thread 71316:\r\n                                               #0  0x00007f73f033e45d syscall (libc.so.6 + 0x13e45d)\r\n                                               #1  0x00007f73f1a9e7be g_cond_wait_until (libglib-2.0.so.0 + 0x907be)\r\n                                               #2  0x00007f73f1a34197 n/a (libglib-2.0.so.0 + 0x26197)\r\n                                               #3  0x00007f73f1aa72db n/a (libglib-2.0.so.0 + 0x992db)\r\n                                               #4  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #5  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #6  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n\r\n                                               Stack trace of thread 71314:\r\n                                               #0  0x00007f73f033e45d syscall (libc.so.6 + 0x13e45d)\r\n                                               #1  0x00007f73f1a9d82e g_cond_wait (libglib-2.0.so.0 + 0x8f82e)\r\n                                               #2  0x00007f73f1a341cd n/a (libglib-2.0.so.0 + 0x261cd)\r\n                                               #3  0x00007f73f1a3423d g_async_queue_pop (libglib-2.0.so.0 + 0x2623d)\r\n                                               #4  0x00007f73ef9b2868 n/a (libpangoft2-1.0.so.0 + 0xc868)\r\n                                               #5  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #6  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #7  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n\r\n                                               Stack trace of thread 71317:\r\n                                               #0  0x00007f73f033e45d syscall (libc.so.6 + 0x13e45d)\r\n                                               #1  0x00007f73f1a9e7be g_cond_wait_until (libglib-2.0.so.0 + 0x907be)\r\n                                               #2  0x00007f73f1a34197 n/a (libglib-2.0.so.0 + 0x26197)\r\n                                               #3  0x00007f73f1aa72db n/a (libglib-2.0.so.0 + 0x992db)\r\n                                               #4  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #5  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #6  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n\r\n                                               Stack trace of thread 71312:\r\n                                               #0  0x00007f73f02b2e42 n/a (libc.so.6 + 0xb2e42)\r\n                                               #1  0x00007f73f02a64df n/a (libc.so.6 + 0xa64df)\r\n                                               #2  0x00007f73f0333c43 ppoll (libc.so.6 + 0x133c43)\r\n                                               #3  0x00007f73f1a6e784 n/a (libglib-2.0.so.0 + 0x60784)\r\n                                               #4  0x00007f73f1a6e865 g_main_context_iteration (libglib-2.0.so.0 + 0x60865)\r\n                                               #5  0x00007f73f1a6e8b2 n/a (libglib-2.0.so.0 + 0x608b2)\r\n                                               #6  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #7  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #8  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n\r\n                                               Stack trace of thread 71319:\r\n                                               #0  0x00007f73f033e45d syscall (libc.so.6 + 0x13e45d)\r\n                                               #1  0x00007f73f1a9e7be g_cond_wait_until (libglib-2.0.so.0 + 0x907be)\r\n                                               #2  0x00007f73f1a34197 n/a (libglib-2.0.so.0 + 0x26197)\r\n                                               #3  0x00007f73f1aa72db n/a (libglib-2.0.so.0 + 0x992db)\r\n                                               #4  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #5  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #6  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n\r\n                                               Stack trace of thread 71318:\r\n                                               #0  0x00007f73f033e45d syscall (libc.so.6 + 0x13e45d)\r\n                                               #1  0x00007f73f1a9e7be g_cond_wait_until (libglib-2.0.so.0 + 0x907be)\r\n                                               #2  0x00007f73f1a34197 n/a (libglib-2.0.so.0 + 0x26197)\r\n                                               #3  0x00007f73f1aa72db n/a (libglib-2.0.so.0 + 0x992db)\r\n                                               #4  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #5  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #6  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n\r\n                                               Stack trace of thread 71320:\r\n                                               #0  0x00007f73f033e45d syscall (libc.so.6 + 0x13e45d)\r\n                                               #1  0x00007f73f1a9e7be g_cond_wait_until (libglib-2.0.so.0 + 0x907be)\r\n                                               #2  0x00007f73f1a34197 n/a (libglib-2.0.so.0 + 0x26197)\r\n                                               #3  0x00007f73f1aa72db n/a (libglib-2.0.so.0 + 0x992db)\r\n                                               #4  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #5  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #6  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n\r\n                                               Stack trace of thread 71321:\r\n                                               #0  0x00007f73f033e45d syscall (libc.so.6 + 0x13e45d)\r\n                                               #1  0x00007f73f1a9e7be g_cond_wait_until (libglib-2.0.so.0 + 0x907be)\r\n                                               #2  0x00007f73f1a34197 n/a (libglib-2.0.so.0 + 0x26197)\r\n                                               #3  0x00007f73f1aa72db n/a (libglib-2.0.so.0 + 0x992db)\r\n                                               #4  0x00007f73f1aa58bc n/a (libglib-2.0.so.0 + 0x978bc)\r\n                                               #5  0x00007f73f02aa4f8 n/a (libc.so.6 + 0xaa4f8)\r\n                                               #6  0x00007f73f0340fdc n/a (libc.so.6 + 0x140fdc)\r\n                                               ELF object binary architecture: AMD x86-64\r\n```\r\n\r\n</details>\r\n\r\n\r\nSo I checked the current output situation in niri and it looks like it doesn't recognise the monitor at all (even though it's working correctly):\r\n\r\n```\r\n$ niri msg outputs\r\n\r\noutput \"China Star Optoelectronics Technology Co., Ltd MNE007ZA3-2 Unknown\" (eDP-1)\r\n  Current mode: 2880x1800 @ 120.000 Hz (preferred)\r\n  Variable refresh rate: supported, disabled\r\n  Physical size: 300x190 mm\r\n  Logical position: 640, 1069\r\n  Logical size: 1645x1028\r\n  Scale: 1.75\r\n  Transform: normal\r\n  Available modes:\r\n    2880x1800@120.000 (current, preferred)\r\n    2880x1800@60.001 (preferred)\r\n    2880x1800@48.000\r\n    1920x1200@120.000\r\n    1920x1080@120.000\r\n    1600x1200@120.000\r\n    1680x1050@120.000\r\n    1280x1024@120.000\r\n    1440x900@120.000\r\n    1280x800@120.000\r\n    1280x720@120.000\r\n    1024x768@120.000\r\n    800x600@120.000\r\n    640x480@120.000\r\n\r\nOutput \"PNP(AOC) U27G3X ZXKQ4HA006099\" (HDMI-A-1)\r\n  Current mode: 3840x2160 @ 120.000 Hz\r\n  Variable refresh rate: supported, disabled\r\n  Physical size: 600x340 mm\r\n  Logical position: 2286, 1440\r\n  Logical size: 2560x1440\r\n  Scale: 1.5\r\n  Transform: normal\r\n  Available modes:\r\n    3840x2160@59.997 (preferred)\r\n    3840x2160@120.000 (current)\r\n    3840x2160@119.880\r\n    3840x2160@100.000\r\n    3840x2160@60.000\r\n    3840x2160@59.940\r\n    3840x2160@50.000\r\n    3840x2160@30.000\r\n    3840x2160@29.970\r\n    3840x2160@25.000\r\n    3840x2160@24.000\r\n    3840x2160@23.976\r\n    1920x2160@59.988\r\n    2560x1440@119.998\r\n    1920x1200@59.997\r\n    1920x1080@120.000\r\n    1920x1080@119.880\r\n    1920x1080@60.000\r\n    1920x1080@60.000\r\n    1920x1080@59.940\r\n    1920x1080@50.000\r\n    1600x1200@59.997\r\n    1680x1050@59.997\r\n    1280x1024@75.025\r\n    1280x1024@60.020\r\n    1440x900@59.997\r\n    1280x800@59.997\r\n    1280x720@60.000\r\n    1280x720@59.940\r\n    1280x720@50.000\r\n    1024x768@119.989\r\n    1024x768@99.969\r\n    1024x768@75.029\r\n    1024x768@70.069\r\n    1024x768@60.004\r\n    832x624@74.551\r\n    800x600@119.972\r\n    800x600@99.994\r\n    800x600@75.000\r\n    800x600@72.188\r\n    800x600@60.317\r\n    800x600@56.250\r\n    720x576@50.000\r\n    720x480@60.000\r\n    720x480@59.940\r\n    640x480@119.995\r\n    640x480@99.997\r\n    640x480@75.000\r\n    640x480@72.809\r\n    640x480@66.667\r\n    640x480@60.000\r\n    640x480@59.940\r\n    640x480@59.940\r\n    720x400@70.082\r\n\r\nOutput \"Unknown Unknown Unknown\" (DP-7)\r\n  Disabled\r\n  Variable refresh rate: not supported\r\n  Physical size: unknown\r\n  Logical position: 2286, 0\r\n  Logical size: 2560x1440\r\n  Scale: 1.5\r\n  Transform: 180°\r\n  Available modes:\r\n    640x480@59.940 (preferred)\r\n    1024x768@60.004\r\n    800x600@60.317\r\n    800x600@56.250\r\n    848x480@60.000\r\n```\r\n\r\nThis is on Arch / niri-git: `niri 25.08 (v25.08-117-g8c844791)`, Laptop is a `AMD Ryzen 7 8845HS w/ Radeon 780M Graphics`\r\n`OpenGL renderer string: AMD Radeon 780M Graphics (radeonsi, phoenix, LLVM 20.1.8, DRM 3.64, 6.17.3-3-cachyos)`\r\n\r\n---\r\n\r\nAny ideas how I could go about to start properly debugging this?",
      "created_at": "2025-10-27T10:48:43Z",
      "updated_at": "2025-11-03T07:28:39Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "bascht",
        "avatar_url": "https://avatars.githubusercontent.com/u/51264?u=0e008af44dc50163993a7455b682622b8f5989d0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AitlD",
      "number": 2736,
      "title": "Nested Column Inside Row",
      "body": "Sometimes in need to open several console log from several devices, at same time I need to monitor Network Activity\r\n\r\n<img width=\"1920\" height=\"1080\" alt=\"nc-tiling\" src=\"https://github.com/user-attachments/assets/b8200290-c711-4b8e-a834-a646d0247a83\" />\r\n\r\nOf course those screenshot of mine was taken before when I was using PaperWM.\r\nIt would be much better if those two terminal occupies same row side-by-side as log width is not too wide\r\nWill nested column gonna implemented in niri some time in the future?",
      "created_at": "2025-11-03T07:03:03Z",
      "updated_at": "2025-11-03T07:06:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "oisanjaya",
        "avatar_url": "https://avatars.githubusercontent.com/u/26103050?u=da67f971606e867f421982a5048b665a2dfe7cba&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad6pO",
      "number": 1015,
      "title": "Add HOLD key-binding functionality ex. Hold to open overlay",
      "body": "A long time ago I created custom csgo autoexec.cfg configs, I remember having the option to execute a command when a key is pressed and another command when the key is released.\r\n\r\n- The .cfg file looked something like this\r\n```\r\n...\r\nbind +g \"+attack; \"\r\nbind -g \"-attack;+jump\"\r\n...\r\n```\r\nAm I remembering correctly? I was 13 y/o lol. Anyways, you get the idea.\r\n\r\nIf implemented on niri it could make appear an overlay while holding and make it disappear after releasing `Mod+<something>` for example. Or the idea of making the screen completely white with maximum brightness to use it as a temporary [Monitor lamp bar](https://xiaomiperu.com/mi-computer-monitor-light-bar). I remember being pretty ingenious back in my day with that~.\r\n\r\nIt could be added as a parameter like `repeat=<bool>` or `cooldown-ms=<num>`~\r\n\r\nSorry for not having images or videos, sometimes [programmer needs its eye candy](https://github.com/YaLTeR/niri/discussions/352#discussioncomment-10094739). Sowwy, I'm finishing my niri complete rice :D I hope I'll finish soon~",
      "created_at": "2025-01-19T17:15:30Z",
      "updated_at": "2025-11-02T17:21:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "thepragandsensdiary",
        "avatar_url": "https://avatars.githubusercontent.com/u/182240812?u=a93d9c21c0e0c1ce194c2613e992593cb4cd9355&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AidJ1",
      "number": 2607,
      "title": "column direction right to left",
      "body": "Tangentially related, but in a two monitor setup I would like to have the tiling direction flipped for the left monitor only, so that the windows on either side of the vertical split are growing \"outwards\" from the center.\r\n\r\ne.g.\r\n```\r\n[      app3 app2 app1 ][ app1 app2 app3      ]\r\n```\r\n\r\n_Originally posted by @haasn in https://github.com/YaLTeR/niri/discussions/658#discussioncomment-12982615_",
      "created_at": "2025-10-16T05:52:33Z",
      "updated_at": "2025-11-01T22:57:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "funme",
        "avatar_url": "https://avatars.githubusercontent.com/u/44284929?u=ef6d30eae51e9585cf26b72e79dcd15b49169fa5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aissi",
      "number": 2724,
      "title": "Set monitor order for auto layout",
      "body": "I have 3 monitors (eDP-1, DP-6, DP-7) on my desk from left to right. When I have no monitor config, it puts DP-7 in the middle between eDP-1 and DP-6. Is there a way to set the auto layout ordering instead of having to specify positions in terms of logical pixels?",
      "created_at": "2025-11-01T15:26:32Z",
      "updated_at": "2025-11-01T18:00:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Perodactyl",
        "avatar_url": "https://avatars.githubusercontent.com/u/81657800?u=c0712972a5f423c7a9df79f1f30b7129864ecc99&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiskW",
      "number": 2719,
      "title": "Low FPS on niri with OpenGL and good on Vulkan and better on another de with opengl",
      "body": "Idk why but when i play DDRaceNetwork on OpenGL fps 200-300 with Vulkan 700-800 on Hyprland 1000+\r\ndoes anyone know how to fix it",
      "created_at": "2025-11-01T10:09:23Z",
      "updated_at": "2025-11-01T10:09:24Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "rXelelo",
        "avatar_url": "https://avatars.githubusercontent.com/u/160051851?u=4b2ebe252d1926d850c5f3394e5f287131b3b77e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeZ1T",
      "number": 1133,
      "title": "Adding a fixed number of workspaces to all monitors",
      "body": "Hello! I thought someone would have asked about this before, but I couldn't find it, so I'm starting this discussion.\r\n\r\nWhile it is currently possible to have something akin to non-dynamic workspaces (named workspaces), they don't seem to work all that well when using more than one monitor. The reason is rather obvious: They're named, so they're unique, which means that they can only be assigned to a single monitor.\r\n\r\nCurrently, I am using named workspaces, which means that, when I press, for instance, Mod+1, shortcut which is defined as (note that \"1\" is a named workspace):\r\n\r\n```kdl \r\nMod+1 { focus-workspace \"1\"; }\r\n```\r\n\r\nI am automatically moved to the monitor assigned to the workspace with the name \"1\". However, my objective is to have each monitor have a workspace named \"1\", and depending on which monitor is currently in focus, the workspace \"1\" that I go to changes. \r\n\r\nI see two ways of going about this:\r\n\r\n- Use a type of named workspaces that can be assigned to every monitor\r\n- Use a fixed number of dynamic workspaces which, as far as my testing went, seem to display this behavior already\r\n\r\nHowever, since I couldn't find a way to do either, I am asking here.\r\n\r\nThank you!",
      "created_at": "2025-02-15T19:14:16Z",
      "updated_at": "2025-11-01T02:23:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "shnCanos",
        "avatar_url": "https://avatars.githubusercontent.com/u/94013499?u=a8660135ae247a7cabfc720b7b2ecd6f992a3cdf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AisIL",
      "number": 2717,
      "title": "Moving a window to a different workspace without dragging the mouse",
      "body": "Currently I move windows to different workspaces by holding super, then dragging the window slightly so that I am holding it in my hand and then pressing the number of the target workspace. It would be great if \"dragging the window slightly\" wouldn't be necessary. It would make the action faster and simpler.",
      "created_at": "2025-10-31T17:03:10Z",
      "updated_at": "2025-11-01T00:32:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Maxjen",
        "avatar_url": "https://avatars.githubusercontent.com/u/4924380?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AisAA",
      "number": 2716,
      "title": "Nautilus doesn't start on first try",
      "body": "I'm using tofi to launch .desktop apps and when starting nautilus for the first time nothing happens. I get two processes `/usr/bin/nautilus --gapplication-service` and `/usr/bin/gjs /usr/libexec/org.gnome.NautilusPreviewer` but no window and after a couple of seconds the processes die again. If I start nautilus again before that happens then the window shows up, otherwise the processes just get recreated. If I start nautilus from the terminal it always works on the first try.\r\n\r\n",
      "created_at": "2025-10-31T14:23:27Z",
      "updated_at": "2025-11-03T21:26:00Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A4ne_",
        "body": "That got me on the right track. Seems to be a known bug https://github.com/philj56/tofi/issues/151 "
      },
      "user": {
        "login": "kiaraly",
        "avatar_url": "https://avatars.githubusercontent.com/u/29002762?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhEaM",
      "number": 2174,
      "title": "after suspend mode gammastep not working",
      "body": "Hi !\r\n\r\nniri 25.05.1 \r\n\r\nI autostart gammstep with\r\n\r\npkill -f \"gammastep\"; gammastep -O 3500 >/dev/null 2>&1 &\r\n\r\nbut after suspend (systemctl suspend) and wakeup gammastep dont work anymore\r\n\r\non other wm like labwc -> no problem\r\n\r\nthanks\r\n\r\n\r\n",
      "created_at": "2025-08-03T09:59:45Z",
      "updated_at": "2025-10-31T19:48:30Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "kristoferus75",
        "avatar_url": "https://avatars.githubusercontent.com/u/18415083?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AirZy",
      "number": 2714,
      "title": "`always-maximize-single-column` option",
      "body": "I'm looking for an option similar to `always-center-single-column`, but instead of centering, maximizing the single column.\r\nI tried replicating this behavior using a python script, which does somewhat work but has some unwanted side-effects. There are also several hard coded factors and it only works with windows, not columns.\r\n```py\r\n#!/usr/bin/python3\r\n\"\"\"\r\nMaximizes window if there's only a single one.\r\n\"\"\"\r\n\r\nfrom dataclasses import dataclass, field\r\nimport json\r\nimport os\r\nfrom socket import AF_UNIX, SHUT_WR, socket\r\n\r\nniri_socket = socket(AF_UNIX)\r\nniri_socket.connect(os.environ[\"NIRI_SOCKET\"])\r\nfile = niri_socket.makefile(\"rw\")\r\n\r\n_ = file.write('\"EventStream\"')\r\nfile.flush()\r\nniri_socket.shutdown(SHUT_WR)\r\n\r\ndef get_windows() -> list:\r\n    with socket(AF_UNIX) as niri_socket:\r\n        niri_socket.connect(os.environ[\"NIRI_SOCKET\"])\r\n        file = niri_socket.makefile(\"rw\")\r\n        _ = file.write('\"Windows\"')\r\n        file.flush()\r\n        niri_socket.shutdown(SHUT_WR)\r\n        return json.loads(file.read()).get(\"Ok\").get(\"Windows\")\r\n\r\ndef get_windows_in_workspace(workspace: int):\r\n    return [window for window in get_windows() if window[\"workspace_id\"] == workspace]\r\n\r\ndef is_maximized(window):\r\n    return window[\"layout\"][\"window_size\"][0] >= 1900 # yuck\r\n\r\ndef send(request):\r\n    with socket(AF_UNIX) as niri_socket:\r\n        niri_socket.connect(os.environ[\"NIRI_SOCKET\"])\r\n        file = niri_socket.makefile(\"rw\")\r\n        _ = file.write(json.dumps(request))\r\n        file.flush()\r\n\r\ndef set_window_width(window: int, proportion: float):\r\n    send({\"Action\": {\"SetWindowWidth\": {\"id\": window, \"change\": {\"SetProportion\": proportion}}}})\r\n\r\nmaximized_windows = []\r\nlast_workspace = -1\r\n\r\nfor line in file:\r\n    event = json.loads(line)\r\n\r\n    print(event)\r\n\r\n    if changed := event.get(\"WindowOpenedOrChanged\"):\r\n        windows = get_windows_in_workspace(changed[\"window\"][\"workspace_id\"])\r\n        window_id = changed[\"window\"][\"id\"]\r\n\r\n        # if this was the first window maximize it\r\n        if len(windows) == 1 and not is_maximized(changed[\"window\"]):\r\n            maximized_windows.append(window_id)\r\n            set_window_width(window_id, 100.0)\r\n\r\n        # if this is the second window, make sure the first one is set back to the original proportion\r\n        elif len(windows) == 2:\r\n            for w in windows:\r\n                w_id = w[\"id\"]\r\n                if w_id == window_id:\r\n                    continue\r\n\r\n                if w_id in maximized_windows:\r\n                    set_window_width(w_id, 50.0)\r\n                    maximized_windows.remove(w_id)\r\n\r\n    elif workspace := event.get(\"WorkspaceActiveWindowChanged\"):\r\n        last_workspace = workspace[\"workspace_id\"]\r\n\r\n    elif closed := event.get(\"WindowClosed\"):\r\n        if last_workspace != -1:\r\n            windows = get_windows_in_workspace(last_workspace)\r\n\r\n            # if we closed all other windows, maximize this one\r\n            if len(windows) == 1 and not is_maximized(windows[0]):\r\n                window_id = windows[0][\"id\"]\r\n                maximized_windows.append(window_id)\r\n                set_window_width(window_id, 100.0)\r\n```\r\n\r\nHere's a video of the behavior I'm looking for:\r\n\r\nhttps://github.com/user-attachments/assets/90114645-4cb8-470b-9ce1-b045fe8da6f5\r\n\r\n",
      "created_at": "2025-10-30T23:16:47Z",
      "updated_at": "2025-10-31T17:26:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "DerEchteJoghurt",
        "avatar_url": "https://avatars.githubusercontent.com/u/69429360?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af8fE",
      "number": 1676,
      "title": "Pen tablet area incorrect in Krita (60% area + upside down direction)",
      "body": "I'm having two problems with my pen tablet in Krita:\r\n\r\nOnly 60% of the drawing area works (edges are unusable)\r\nPen movement direction is upside down\r\n\r\nI tired Adjusted calibration-matrix values in tablet section, but nothing change. (it works correctly on other wm)\r\n\r\nniri version: 25.05.1\r\npen tablet: Huion L610",
      "created_at": "2025-05-26T12:41:41Z",
      "updated_at": "2025-10-31T17:21:09Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "DENG-XC",
        "avatar_url": "https://avatars.githubusercontent.com/u/153186602?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AifIr",
      "number": 2626,
      "title": "Move window left/right OR to next monitor",
      "body": "Does anyone know how I could set up a keybind that e.g. moves the window right, unless it is the last window in the row, in which case it moves to the monitor on the right?",
      "created_at": "2025-10-18T11:15:25Z",
      "updated_at": "2025-10-31T12:40:18Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "zoenetic",
        "avatar_url": "https://avatars.githubusercontent.com/u/56755170?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhmSx",
      "number": 2308,
      "title": "gamescope on niri",
      "body": "when I first started using niri, games I played on steam through gamescope would encounter this weird problem where around 30 minutes - 1 hour into the game, I'd get massive frame drops out of nowhere. Adding `--backend sdl` helped solve this problem. But now that gamescope no longer has sdl as a backend, how would I fix this problem, which still happens for me. Any ideas?",
      "created_at": "2025-08-27T16:42:41Z",
      "updated_at": "2025-11-07T10:36:37Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A2X6N",
        "body": "That may not be an issue related to either Niri or Gamescope. It's often caused by the Steam overlay. You can turn it off in the Steam UI (Properties -> General for individual games, or globally in Settings -> In Game). Sometimes setting `LD_PRELOAD=\"\"` also helps."
      },
      "user": {
        "login": "rindotsh",
        "avatar_url": "https://avatars.githubusercontent.com/u/142712029?u=c58eee36a18a2e2f3ac1a23c012e5d7cceb52aa8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aipbf",
      "number": 2697,
      "title": "help me acheive a 3-way key remap",
      "body": "i want  to achieve the following key remaps:\r\nLeft Ctrl\t-> Caps Lock\r\nLeft Alt -> Ctrl\r\nCaps Lock -> Alt\r\n\r\nI've swapped ctrl and caps lock by\r\noptions \"caps:ctrl_modifier,ctrl:swapcaps\"\r\n\r\nbut i can't find any resource that help me achieve my request.\r\nxkeyboard-config(7) manual is exhaustive, but i'm having trouble finding my desired options",
      "created_at": "2025-10-29T02:56:23Z",
      "updated_at": "2025-10-31T08:02:36Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Anandhu-X8",
        "avatar_url": "https://avatars.githubusercontent.com/u/109350330?u=f59fc981e41b8298acdf7c81f59c4545d164e834&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Airfg",
      "number": 2715,
      "title": "Gif / Animated webp support to screenshot tool",
      "body": "Coming from KDE Plasma and Spectacle, i loved being able to just open the screenshot dialog and record something quick.\r\n\r\nAn advantage Niri could have on this is that since the screenshot tool is integrated into the environment, the overhead of opening a separate program is negated (Spectacle takes like 2 whole seconds to open in my machine).\r\n\r\nThis could require a bit of a ui however, or at least some config, as well as window block out rules applying, which could be a bit of work, but it would be a really nice feature to have.",
      "created_at": "2025-10-31T02:57:48Z",
      "updated_at": "2025-10-31T02:58:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mineland-2048",
        "avatar_url": "https://avatars.githubusercontent.com/u/159833296?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgK8I",
      "number": 1756,
      "title": "Gamepad Binds",
      "body": "Use cases I can think of:\r\n- Switching between applications, changing volume, etc. while playing a game \r\n- Using niri with a remote for a tv pc setup\r\n- Accessibility(?)\r\n\r\nIn terms on implementation [`gilrs`](https://crates.io/crates/gilrs) seems like a good choice, I assume smithay will implement gamepad input if/when a protocol like [`gamepad-v1`](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/244) is merged (and it shouldn't be a breaking change to swap it out).\r\n\r\nI'm not sure how joysticks binds should be handled, restricting to 8 directions (or 2 directions to single axes) as desecrate actions seems the most reasonable.\r\n\r\nNames should be logical (e.g. `South` not `A`) and we should match the [sdl names](https://github.com/libsdl-org/SDL/blob/main/include/SDL3/SDL_gamepad.h) if there's no good reason to diverge, with a `Gamepad` prefix like `Mouse`.\r\n\r\nFor this to be useful it needs non-xkb modifiers (e.g. `GamepadHome+GamepadLeftStickRight`), I think it should be easier to support only for gamepads because we don't have to worry about suppressing input (ideally we would but it's not technically feasible without `gamepad-v1`).\r\n\r\nEdit: I guess inputs not going through the compositor means this can also be done with an external utility and use the ipc for actions instead of bring in niri, suppressing inputs is kind of the point of binds.",
      "created_at": "2025-06-09T14:47:26Z",
      "updated_at": "2025-10-31T02:00:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bbb651",
        "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aip4X",
      "number": 2700,
      "title": "Animation for tab switching",
      "body": "Hi !\r\n\r\nI recently got into Niri and after reading [the animation documentation](https://github.com/YaLTeR/niri/wiki/Configuration:-Animations), I realized that switch windows within a tab (up and down) has no animation and is actually quite violent (not even a fade by default). \r\nSo I maybe it already is in the docs and I didn't see it. But if not, I was wondering if it would be possible to have this feature added to an upcoming version of Niri. I think that would be a nice addition to Niri, as tabs are a very cool feature.\r\n\r\nAlso, speaking about tabs, it took me some time to understand how it worked, even reading the documentation. I think a demo video in the documentation would be much easier to understand.\r\n\r\nI hope you will find those recommendations useful ",
      "created_at": "2025-10-29T11:07:29Z",
      "updated_at": "2025-10-30T22:16:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "EvanKoe",
        "avatar_url": "https://avatars.githubusercontent.com/u/72010109?u=bdf8a9736f0cfd4af4d23a2d231ba76b890b0dcf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiqTM",
      "number": 2704,
      "title": "Option to disable moving cursor to different monitor",
      "body": "Hey, I just started using niri and I really like it!\r\nOne option I'm missing is disabling the automatic movement of the cursor when switching to a different monitor.\r\nWhen using `focus-monitor-left` or `focus-workspace 1` (if the workspace is on another monitor) the mouse cursor jumps to the center of this monitor. I sometimes quickly switch to a workspace on another monitor and do something there without needing the cursor. Upon switching back to the other workspace where I'm using the cursor, my cursor is now in the center of the screen.\r\nI would like to fully disable cursor movement, even when switching monitors.",
      "created_at": "2025-10-29T19:02:36Z",
      "updated_at": "2025-10-30T20:43:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "DerEchteJoghurt",
        "avatar_url": "https://avatars.githubusercontent.com/u/69429360?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AirMW",
      "number": 2710,
      "title": "turning off animations for a specific window",
      "body": "so i went through the documentation for animations and window-rule but i couldnt find anything that would let me disable all the animations for a specific window (like window-open window-close etc). did i miss something or is it not possible to do please let me know",
      "created_at": "2025-10-30T17:22:06Z",
      "updated_at": "2025-10-30T20:10:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "cxlvnn",
        "avatar_url": "https://avatars.githubusercontent.com/u/189771014?u=1d3d7ecc15a57eb97235d915206b7e59be506745&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZkZQ",
      "number": 364,
      "title": "Recommendations for a Brightness/Backlight laptop application Niri style?",
      "body": "What laptop brightness control application do you recommend? One that works Rootless and with support for multiple packaging distros?\r\nI'll be making binds for it and posting it here.\r\n> (Opening and closing issue for documentation purposes)",
      "created_at": "2024-05-20T23:28:38Z",
      "updated_at": "2025-10-30T17:46:05Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "thepragmaticmero",
        "avatar_url": "https://avatars.githubusercontent.com/u/169491353?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aiq_B",
      "number": 2709,
      "title": "Window rule to close a window",
      "body": "My issue is that KeePassXC is configured with my nixos home-manager config, which causes it to display the following error every time it starts.\r\n\r\n> Could not save the native messaging script file for firefox.\r\n\r\nThis doesn't cause any issues since it's only complaining that it can't write a file, not read, but I couldn't find how to disable this error from showing. Perhaps this is an [XY problem](https://en.wikipedia.org/wiki/XY_problem), but it'd be cool if niri could automatically close a window based on a window rule, so this error isn't displayed to me.",
      "created_at": "2025-10-30T13:31:00Z",
      "updated_at": "2025-10-30T13:31:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sophuric",
        "avatar_url": "https://avatars.githubusercontent.com/u/48314599?u=633dcef56a7df2d567b023cc04b1e30302462e37&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AimEf",
      "number": 2678,
      "title": "Using krunner in niri",
      "body": "I want to use krunner as my launcher in niri.\r\n\r\nWhen I use \r\n\r\n``` kdl\r\nbinds {\r\n    Mod+Space { spawn \"krunner\"; }\r\n}\r\n```\r\n\r\nkrunner doesn't show any .desktop results in `/usr/share/applications` or `~/.local/share/applications`.\r\n\r\nI haven't been able to find anything to point me in the right direction.\r\n",
      "created_at": "2025-10-25T05:20:22Z",
      "updated_at": "2025-10-30T09:27:55Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A4a4A",
        "body": "I've had the same issue with krunner, but I was able to solve it. It was related with dolphin asking every time which app to use for opening a file.\r\n\r\nIf I remember correctly, I've made a symlink to plasma-applications.menu in /etc/xdg/menus:\r\n```\r\nsudo ln -s /etc/xdg/menus/plasma-applications.menu /etc/xdg/menus/applications.menu\r\n```\r\nwhich resolved both issues.\r\n\r\nOne more annoyance that you will encounter while using krunner, is that it only spawns on the main monitor, which means that if you press the hotkey on one of your other monitors, you won't be able to type. Right now I'm on a PC without niri, so I'm writing from memory, but you need to bind it to:\r\n```\r\nspawn-sh \"niri msg action focus-monior DP-1 && krunner\"\r\n```\r\nwhere DP-1 is your primary monitor.\r\n\r\n"
      },
      "user": {
        "login": "donniebreve",
        "avatar_url": "https://avatars.githubusercontent.com/u/23609591?u=c5016d7060558c512d945a878f9f2225e516de8d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aipkn",
      "number": 2698,
      "title": "new action: move-exact-window-to-workspace",
      "body": "Hi,\r\n\r\nthere's currently no action to move a specific window (by id i guess) to a workspace. Use Case:\r\n\r\none pain-point people have is apps always opening on the current workspace, despite being started on a different workspace, cuz they take ages to open.\r\n\r\nWith Walker, i want to simply move a window to the workspace, where the opening was triggered on.\r\n\r\nOf course an integrated solution in Niri itself would be even, something like a temporary window rule to place the matching window on workspace $index.\r\n\r\nRegards",
      "created_at": "2025-10-29T05:43:55Z",
      "updated_at": "2025-10-29T18:38:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "abenz1267",
        "avatar_url": "https://avatars.githubusercontent.com/u/7055955?u=1122f8f2eca984676225a9b9600d2568bff89d57&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiqMl",
      "number": 2703,
      "title": "How do you work with multiple setups?",
      "body": "Hi,\r\n\r\nI'm wondering how people are handling their Niri config in respect to multiple setups with different monitors. My dotfiles are synced using `git` to my different machines so that I can have the same configuration everywhere, though I've yet to determine the best solution for a dynamic Niri configuration that takes into account multiple setups with differing monitors.\r\n\r\nAs for now, I think my best bet is to use `include outputs.kdl` and then symlink `outputs.kdl` to `outputs_home.kdl` or `outputs_office.kdl` depending on if I'm at home or at the office. This isn't very convenient and was looking for how people normally solve this?",
      "created_at": "2025-10-29T16:39:19Z",
      "updated_at": "2025-10-29T17:26:50Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "avesst",
        "avatar_url": "https://avatars.githubusercontent.com/u/810218?u=af96b682a4409c976b16d08b3d1c4854928958f5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiqAh",
      "number": 2702,
      "title": "Support virtual displays",
      "body": "A feature where niri can create virtual displays (like hyprland and most DMs), would be really great.\r\nThis would allow people to use iPads or similar as secondary displays. ",
      "created_at": "2025-10-29T13:29:19Z",
      "updated_at": "2025-10-29T13:29:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "gro-david",
        "avatar_url": "https://avatars.githubusercontent.com/u/99834433?u=b5c808570d075c40266c9c9173cf32d0ac02b236&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aip8i",
      "number": 2701,
      "title": "Re-focus window under cursor after switching workspace",
      "body": "After switching to a new workspace (with focus workspace down/up), the focused window remains unchanged until the mouse is moved out and then into the current window. This results in situations when a mouse is over a window, but the window is not focused.\r\n\r\nWhen switching to a workspace, I have thought on multiple occasions that my window was focused (because my mouse was over it), started typing or applying keyboard shortcuts, just to realise a wrong window is focused.\r\n\r\nThis also applies to similar actions related to the overview.\r\n\r\nIs this behaviour intentional? Is there a way to force a window re-focus when switching between workspaces?",
      "created_at": "2025-10-29T12:24:11Z",
      "updated_at": "2025-10-29T12:24:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rizo",
        "avatar_url": "https://avatars.githubusercontent.com/u/308413?u=8458ff79b4960e150747402567626778707bb360&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AihuS",
      "number": 2641,
      "title": "Switch to the Telegram workspace with super+t.",
      "body": "In Hyprland, there are things called special workspaces. And I used them to create special workspaces for apps and switched to them quickly with super+t for Telegram or super+d for Discord, etc. Is it possible to make the same thing for Niri?",
      "created_at": "2025-10-20T12:32:57Z",
      "updated_at": "2025-10-28T19:30:35Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "aljustiet",
        "avatar_url": "https://avatars.githubusercontent.com/u/114720383?u=5191f1ccd27096602fa10f03706ed166067faa79&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae8xo",
      "number": 1315,
      "title": "Threw together a quick automatic workspace renamer, replacement for i3-wsr.",
      "body": "There's no configuration at the moment, just `spawn-at-startup` the binary and you're set.\r\n\r\n[niri-wsr](https://github.com/JohnDowson/niri-wsr)",
      "created_at": "2025-03-21T10:21:07Z",
      "updated_at": "2025-10-28T15:59:12Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "JohnDowson",
        "avatar_url": "https://avatars.githubusercontent.com/u/40003182?u=ef68b18acd7ad69c688c30b8a19e18b623413e9f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AioZz",
      "number": 2690,
      "title": "`layout.center-focused-column` need a new option `visible`",
      "body": "When a window is focused, some windows scroll outside the screen and others don't. Can you automatically center those windows that are still visible in the screen?\r\n\r\nFor example, all window width is 40%, just center the two windows that are still in the screen.",
      "created_at": "2025-10-28T02:11:25Z",
      "updated_at": "2025-10-30T03:07:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sunn4room",
        "avatar_url": "https://avatars.githubusercontent.com/u/49748547?u=aaa4298708aec8e33aa325dcc23bfff7213e2a3a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AioI0",
      "number": 2688,
      "title": "Add the option to allow for a minimum amount of workspaces.",
      "body": "Currently, it is impossible to have more than 1 empty workspace because Niri destroys any workspace that doesn't contain a window. This feature proposes to add a configuration  \"min-workspaces\" that would have always have that amount of workspaces available irrespective of whether they are empty or not. I have a branch working for this and can send a PR in the coming days.",
      "created_at": "2025-10-27T18:23:54Z",
      "updated_at": "2025-10-27T18:27:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "whiskeyPeak",
        "avatar_url": "https://avatars.githubusercontent.com/u/73116038?u=4f376c12b34d8a93b5aa34a7207d9836adc1f71a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ain7N",
      "number": 2685,
      "title": "What is the current state of HDR?",
      "body": "I am thinking of switching to Niri from Hyprland, as I really enjoy the scrolling concept. I am using Hyprscrolling, but it's not as smooth and nice as Niri.\r\n\r\nI have an HDR monitor, and it would be sad losing support for that. How far along is HDR support on Niri as of now? And what are the current plans?",
      "created_at": "2025-10-27T14:07:17Z",
      "updated_at": "2025-10-27T15:13:55Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "KneeCapStealer",
        "avatar_url": "https://avatars.githubusercontent.com/u/87864377?u=74cbc0ac65292fa78ccc550db70c0c1e9a265c2c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiBBK",
      "number": 2411,
      "title": "How to get niri working on kubuntu 24.04 LTS?",
      "body": "I've watched a few videos about niri and am intrigued enough to try it out. My workstation is Kubuntu 24.04 LTS, and my current understanding is that it is possible to either set things up so that niri can run as a separate window, or to choose between KDE and niri at login.\r\n\r\nI had no issues compiling it from the Getting Started page, but I don't really understand how to install and/or get it working. I don't generally mess with my install at this level, so I'm not familiar enough to know what is required that I'm missing.\r\n\r\nFor example, under the [Manual Instructions](https://yalter.github.io/niri/Getting-Started.html#manual-installation) section, I presume I need to install either (not both) the dinit or systemd files, so I only copied the systemd files. However, my install doesn't have a `/usr/local/share/wayland-sessions/` or `/usr/local/share/xdg-desktop-portal/` directory, so I can't install the niri.desktop or niri-portals.conf files, and I don't know if they are important.\r\n\r\nCan I get this working without a fresh install? Any idea about what steps to take after compiling if I'm missing directories?\r\n\r\nThanks in advance for taking the time to read this and help!",
      "created_at": "2025-09-18T18:30:29Z",
      "updated_at": "2025-10-27T05:00:12Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3HVA",
        "body": "I've installed and am using Niri on Ubuntu Desktop (GNOME) 25.04 and Questing (will be 25.10). I log in through GDM, GNOME's display manager. Here's how I install it, based on the instructions from the wiki:\r\n\r\n```\r\n# cd to your niri directory\r\n\r\nsudo cp target/release/niri /usr/local/bin/\r\nsudo cp resources/niri-session /usr/local/bin/\r\nsudo mkdir -p /usr/local/share/wayland-sessions/\r\nsudo cp resources/niri.desktop /usr/local/share/wayland-sessions/\r\nsudo mkdir -p /usr/local/share/xdg-desktop-portal/\r\nsudo cp resources/niri-portals.conf /usr/local/share/xdg-desktop-portal/\r\nsudo cp resources/niri.service /etc/systemd/user/\r\nsudo cp resources/niri-shutdown.target /etc/systemd/user/\r\n\r\n# This lets the session work from the login manager with niri installed in /usr/local\r\nsudo ln -s /usr/local/bin/niri /usr/bin/niri\r\n\r\n# bash completions\r\nmkdir -p \"$HOME\"/.local/share/bash-completion/completions\r\nniri completions bash > \"$HOME\"/.local/share/bash-completion/completions/niri.bash\r\n```"
      },
      "user": {
        "login": "skjbulcher",
        "avatar_url": "https://avatars.githubusercontent.com/u/16672299?u=3e2c6b48779bd9e5fa214d483c11d3cc9c07452e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aimdz",
      "number": 2680,
      "title": "Extend move-column-to-workspace-up possibility (move a window above the current first workspace)",
      "body": "In overview mode, I can move a window with the mouse (or the touchpad) above the first workspace, and by releasing it, create a new workspace above it (and which becomes the new first workspace). But I can't do it with the keyboard: I can move a window to a workspace below or above if that workspace already exists, but not to this workspace above the first  which doesn’t yet exist.\r\n\r\nThe keyboard/touchpad context switches are quite inexpensive for me on my laptop, but the same is not the case on my desktop computer to switch from my Ferris to my trackball, and vice versa. That’s why I would appreciate it if this action could also be performed from the keyboard, so as not to have to leave it if I am using it. It's a small detail, but all small improvements are good to take, , aren't they?",
      "created_at": "2025-10-25T12:28:11Z",
      "updated_at": "2025-10-26T21:21:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "idoric",
        "avatar_url": "https://avatars.githubusercontent.com/u/1472992?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afxzb",
      "number": 1578,
      "title": "Add columns property for important hotkeys menu",
      "body": "As mentioned in #173, the list of hotkey labels can quickly get too long. While automatic splitting is helpful for keeping everything on-screen, it's not visually pleasant, nor is a list that *almost* requires it. I propose the following:\n\n```kdl\nhotkey-overlay {\n    columns 2 // default: 1\n}\n```\n\nBetter yet would be the ability to choose which column a command goes into (and perhaps grouping behaviors), but that's a separate matter.",
      "created_at": "2025-05-15T14:48:27Z",
      "updated_at": "2025-10-25T13:34:45Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "asleeves",
        "avatar_url": "https://avatars.githubusercontent.com/u/111448395?u=748d2d2e5823e3a8abd6b7780ced69fa582c4754&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aid1Z",
      "number": 2615,
      "title": "Treat tabbed columns as a single window",
      "body": "Currently, tabbed columns treat the windows within them the same as a split column. \r\nThis is probably a fine and valid model for some, but to me the UX feels a little awkward.\r\n\r\nWhen I see a column in split mode, it makes sense that I could switch focus with Mod+<Up/Down>. But when a column is in tabbed mode, this makes less intuitive sense (*especially* if you opt to have tab indicators shown on the top or bottom of a window).\r\n\r\nI would instead prefer if tabbed windows were treated as a single unit, so that `focus-window-*` and `move-window-*` actions treated the whole column like a single window, and instead an additional set of binds could be used to switch between them: `focus-tab-*` and `move-tab-*` (see below)\r\n\r\nThere is already some precedent for treating tabbed columns differently: Currently, doing `fullscreen-window` will move a window out of a stacked column, but will keep tabbed columns together. (This is good behavior, although I am not sure if it is intentional)\r\n\r\n### Other actions\r\n\r\nThis does raise some questions about how to treat windows when performing other window-specific actions:\r\n- Close: No change, I think this should still apply to the specific focused window, and not the whole group.\r\n- Consume/Expel: No change, allow windows to be consumed/expelled as normal.\r\n  - However, this should *not* allow tabbed columns to nest within other columns.\r\n- Swap: Instead swap the tabbed column with the column to the left/right, effectively behaves like `move-column-<left/right>` but only for tabbed columns.\r\n- Floating: The current behavior of breaking the window out of the column is ok, however I think the behavior I'm proposing makes #1809 make a lot of sense.\r\n- Mouse Gestures: (I don't use these much myself, so I don't have super strong opinions on this)\r\n  - Drag out of tabbed column: Currently, this pulls the focused window out of the column, this might be fine, but if I used mouse controls more I'd probably also like being able to drag the whole column. Maybe an additional modifier (Mod+Ctrl+Drag) could operate on the whole column instead of the window. (I could see this being useful for stacked columns too)\r\n  - Drag into tabbed column: The current behavior requires you to drop the window onto either the top or bottom. This doesn't make a lot of sense in a tabbed context, I'd rather be able to drag to the middle of a tabbed column and just have it added to the end of the list. But that's maybe a nitpick with the current behavior.\r\n\r\n### Configuration\r\n\r\n(This naming might need work)\r\n\r\n```kdl\r\nlayout {\r\n   // Treat tabs as a single window when changing focus or moving\r\n   unified-tabbed-columns\r\n}\r\n```\r\n\r\n```kdl\r\nbinds {\r\n  Mod+Tab { focus-tab-next-or-first; }\r\n  Mod+Shift+Tab { focus-tab-previous-or-last; }\r\n\r\n  Mod+Ctrl+Tab { move-tab-next-or-first; }\r\n  Mod+Ctrl+Shift+Tab { move-tab-previous-or-last; }\r\n}\r\n\r\n// Alternate actions that don't loop around:\r\n// focus-tab-next\r\n// focus-tab-previous\r\n// move-tab-next\r\n// move-tab-previous\r\n```\r\n\r\nI am proposing this as a non-default option, even though I feel it makes more sense than the current behavior, but that might be just me and I don't know if we would want to break the existing expectations.\r\n\r\nI think I will try hacking the keyboard behavior together with IPC, but this seems like it makes enough sense that it could be built in.",
      "created_at": "2025-10-16T18:36:04Z",
      "updated_at": "2025-10-24T22:04:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "katedickey",
        "avatar_url": "https://avatars.githubusercontent.com/u/5097527?u=9ece77e76ae923563f3b87de07f8d7086c155b4c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aiku6",
      "number": 2669,
      "title": "Add an IPC action to change the mapped output for the tablet and the touchscreen",
      "body": "I'd like to see a simple IPC action to change the mapped output for the touchscreen or tablet. See I have a Lenovo laptop with a tablet screen but when I'm home I prefer drawing on my Wacom tablet, yet it would be cool to be able to change the mapped output without having to change the configuration.\r\n\r\nI'm not sure if a lot of people would be interested in that feature, as it is really specific, but I don't think it would add too much of a maintenance overhead (I hope). ",
      "created_at": "2025-10-23T15:27:22Z",
      "updated_at": "2025-10-24T19:50:55Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Zhaith-Izaliel",
        "avatar_url": "https://avatars.githubusercontent.com/u/39216756?u=f8807f686c2d58ded944e907bc67dfcdb426a102&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiltA",
      "number": 2676,
      "title": "screenshot - to stdout",
      "body": "Hi,\r\n\r\ni'm using tesseract for OCR and previously i had this in a script:\r\n```\r\nwayfreeze --hide-cursor --after-freeze-cmd 'grim -g \\\"$(slurp)\\\" - | tesseract stdin stdout -l deu+eng | wl-copy; killall wayfreeze'\r\n```\r\n\r\nI'm trying to replicate this with `niri msg action screenshot`, but:\r\n1. `write-to-disk=false` is not a flag\r\n2. an option to just output the img to stdout instead of even copying to clipboard would be better, thats what `grim -g \\\"$(slurp)\\\" - ` does.\r\n\r\nOr did i miss something?",
      "created_at": "2025-10-24T15:19:25Z",
      "updated_at": "2025-10-24T18:41:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "abenz1267",
        "avatar_url": "https://avatars.githubusercontent.com/u/7055955?u=1122f8f2eca984676225a9b9600d2568bff89d57&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aik2v",
      "number": 2670,
      "title": "Toggle (show/hide) statusbar?",
      "body": "Hey,\r\n\r\nI was wondering if there is a keybind to allow me to toggle (show/hide) that statusbar in niri?\r\nI looked through the actions and didn't find anything that would allow that - maybe I missed it?\r\nI am using waybar, and it would be cool to set a keybind to show/hide the statusbar when needed.\r\n(Otherwise I would have to work around it with a script that kills/restarts it, which isnt ideal).\r\n\r\n",
      "created_at": "2025-10-23T18:04:47Z",
      "updated_at": "2025-10-24T18:19:05Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "766F6964",
        "avatar_url": "https://avatars.githubusercontent.com/u/34845270?u=93d2efed816eb89dffd1989c0376ca51e1abd7bf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahk8-",
      "number": 2300,
      "title": "Will Niri ever land in Debian?",
      "body": "Really great project, I do wish that it supports Debian, but sadly I don't see it in Sid nor Experimental. Will we ever get to see it soon on  Debian at least?",
      "created_at": "2025-08-26T09:28:31Z",
      "updated_at": "2025-10-31T14:16:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A2Tjf",
        "body": "Niri is listed in Debian's [packages being worked on](https://www.debian.org/devel/wnpp/itp.en.html), but it looks very stale.\r\n\r\nYou can make a niri .deb package if you wish, though doing so requires cloning and compiling niri, so it's not much different than compiling and manually installing.\r\n\r\n1. Install [cargo-deb](https://github.com/kornelski/cargo-deb)\r\n    - niri's Cargo.toml has the necessary `[package.metadata.deb]` section already\r\n2. run `cargo deb` in your cloned niri repository"
      },
      "user": {
        "login": "jgz365",
        "avatar_url": "https://avatars.githubusercontent.com/u/146121298?u=2bb772ad70c050d4924f2e648a55bd84f7c419ef&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiUyU",
      "number": 2547,
      "title": "When opacity is set under window rules, add an option for whether or not to start the window with that opacity.",
      "body": "I have an application where one my use-cases requires it to to have an opacity of 0.2. However, most of the time it is not needed. Instead of having to toggle the opacity off every time I start the application, it would be nice if there was an option to start with it disabled. Also on the same topic (not sure if it has been brought up already), it would be nice if there was a way to change opacity levels with a bind (e.g., Mod+ScrollDown -> Decrease Opacity by x%) as well as have focus-rings and borders be affected by the opacity as well.",
      "created_at": "2025-10-07T23:45:26Z",
      "updated_at": "2025-10-24T01:30:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ASong5",
        "avatar_url": "https://avatars.githubusercontent.com/u/44077969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aik4E",
      "number": 2671,
      "title": "Additions to screenshot feature",
      "body": "I like that niri has a clean, built-in screenshot functionality. \r\n\r\nHowever, one of the thing i miss from sway's manual command approach is the ability to run commands on the screenshotted file afterwards. In my case, I use a tool to add the screenshot to \"recently used\" such that I can quickly upload it.\r\n\r\nIt would be nice to be able to either run commands on screenshots post-hoc or have a built-in feature to add screenshots to \"recently used\".",
      "created_at": "2025-10-23T18:35:26Z",
      "updated_at": "2025-10-23T18:36:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "witchof0x20",
        "avatar_url": "https://avatars.githubusercontent.com/u/36118348?u=b9f31cdd29b9e2d7a1671e14fd0301aa79a5e845&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aika8",
      "number": 2667,
      "title": "[Doc request] Default configuration",
      "body": "I understand that the Configuration sections in the docs are at least partially generated automatically (at least the badges?).\r\n\r\nSome documentation sections mention the defaults for values, others just mention examples.\r\n\r\nOne example are [Switch events](https://yalter.github.io/niri/Configuration%3A-Switch-Events.html): It's not entirely clear to me whether the box at the beginning is just an example or the default. One can kinda guess that it's probably an example but it'd be nice to spell it out.\r\n\r\nOther sections seem to mix defaults with examples: https://yalter.github.io/niri/Configuration%3A-Miscellaneous.html\r\n\r\nPersonally I think it'd be great if the docs could always explicitly mention the defaults.\r\n\r\nIt's been a while since I coded Rust but I guess this could probably be automated _somewhat_ using macros or other solutions.\r\n\r\n",
      "created_at": "2025-10-23T09:24:15Z",
      "updated_at": "2025-10-23T14:33:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "lfrancke",
        "avatar_url": "https://avatars.githubusercontent.com/u/122850?u=553b678c209d0ba83f5e5978b70adedefe30f0bd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWOTN",
      "number": 79,
      "title": "Allow to always create workspace above",
      "body": "I don't see why not, I feel like the way they're only bottom is a bit weird.\r\n\r\nThe only issue is absolute indexing to get into workspace, but we can sort of shift forward until we reach the limit?",
      "created_at": "2023-11-08T01:41:05Z",
      "updated_at": "2025-10-23T14:31:35Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kchibisov",
        "avatar_url": "https://avatars.githubusercontent.com/u/27620401?u=e171ccf7497d1f3d23451abe7eb2a8463effb6b6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfpQw",
      "number": 1545,
      "title": "New msg action for selecting screen coordinates",
      "body": "Since the screenshot tool already has a screen region selector, I wonder if it is possible to have a command that invokes the region selector and output the screen coordinates instead of taking a screenshot, essentially replacing something like [slurp](https://github.com/emersion/slurp).\r\n\r\nPerhaps something like `niri msg action select-region`.\r\n\r\nI just thought the screen region selector in the screenshot tool is much better than slurp since you can adjust the selection before confirmation.\r\nAnd I would prefer if my screen recording tool (which uses slurp) can look and feel the same as my screenshot tool.",
      "created_at": "2025-05-08T15:07:28Z",
      "updated_at": "2025-10-23T14:07:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "matchatealeaf",
        "avatar_url": "https://avatars.githubusercontent.com/u/51747904?u=703d676f3b1023a19f0198f2342e41ce507969e8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfGln",
      "number": 1376,
      "title": "Pipe screenshots to external tools",
      "body": "Hi,\r\n\r\nWould like to quickly edit a screenshot made in Niri without having the intermediate file. Both options below are valid but ⚖️ \r\n\r\n####  Option 1: bind a key in the screenshot UI\r\n\r\nWhen pressed, I can pipe the `stdout` to a custom tool (e.g., `[swappy](https://github.com/jtheoof/swappy)`). This way, I can quickly annotate the region and share it without a temporary file. This can be sort of confusing as we have `screenshot-screen` and `screenshot` commands.\r\n\r\n#### Option 2: add actions to notification\r\n\r\nOne of the possible actions is pipe it to a configured program. This might be more intuitive and less intrusive. Moreover it follows the same UX as macOS. This would require a configuration, perhaps:\r\n```\r\nscreenshot-edit-action \"swappy -f -\"\r\n```\r\n\r\nBut I am not aware of the internals (not sure if this would require a `spawn`).\r\n\r\n#### What I currently do\r\n\r\nMy current solution is to have a custom binding that runs `grim -g \"$(slurp)\" - | swappy -f -` which is good enough and not a problem. Made this suggestion to keep the number of dependencies I have in my system _smaller_ if I can leverage Niri for this. Doesn't _feeL_ right using a different  UI when picking regions of the screens.\r\n",
      "created_at": "2025-04-01T10:59:42Z",
      "updated_at": "2025-10-23T12:19:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bphenriques",
        "avatar_url": "https://avatars.githubusercontent.com/u/4727729?u=902e82f8f52481fffdd804d4424f274c16d196e6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aikfb",
      "number": 2668,
      "title": "Allow piping the output of screenshot action",
      "body": "I love Niri's screenshot action and find it immensely useful, but I want to be able to annotate screenshots right after taking them.  `niri msg action screenshot` should be usable in some way (maybe a `--raw` argument?) so that its output can be piped to an application like satty without the unannotated screenshot being saved by Niri.\r\n\r\nOops, turns out I searched for duplicates in Issues instead of Discussions and realized that there is a discussion for this already. My bad, closing this as duplicate",
      "created_at": "2025-10-23T10:49:26Z",
      "updated_at": "2025-10-23T10:51:02Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "famiu",
        "avatar_url": "https://avatars.githubusercontent.com/u/29580810?u=5303c879e3bbb5094e3aa9ff13ac30ba9b692654&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgQWy",
      "number": 1809,
      "title": "Tabs for floating windows",
      "body": "I love tabs, and use them a lot. However, coming from Hyprland, I am disappointed to see that I cannot toggle tabs on floating windows, especially since this is where I use them the most.\r\n\r\nIs there a plan to add this feature at some point in the future? It could use the same keybind as `toggle-column-tabbed-display` _(in which case it would be more appropriate to call it `toggle-tabbed-display`)_, or have its own for floating windows.\r\n\r\n_(On a side-note, I also like to have tabs on quarter-tilled windows, without them swallowing the entire column, but I suppose such a thing is not a feature that would \"fit\" Niri's designed workflow.)_",
      "created_at": "2025-06-15T19:47:42Z",
      "updated_at": "2025-10-23T09:37:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Atemo-C",
        "avatar_url": "https://avatars.githubusercontent.com/u/160250128?u=213842e97ddd7389e69df74e93fc36f08cdf0e53&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aij6-",
      "number": 2661,
      "title": "What do you lose when you switch from Gnome to Niri (without knowing about it)?",
      "body": "With default distro setups, such as Fedora Workstation with Gnome, your PC is auto-configured with optimal settings, around energy use, laptop battery, lid closing, auto sleep, etc. (what else?)\r\nWhich of those settings do you lose when you switch to Niri? And how to regain them?",
      "created_at": "2025-10-22T19:11:35Z",
      "updated_at": "2025-10-23T08:17:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aifai",
      "number": 2630,
      "title": "Scrolling Wallpaper",
      "body": "I'm enjoying niri very much. Thanks, devs.\r\n\r\nIs there some way to scroll a width-oversized wallpaper image along with columns, as you might see in android? ",
      "created_at": "2025-10-19T00:00:57Z",
      "updated_at": "2025-10-23T08:07:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "ktnlikeasmallcat",
        "avatar_url": "https://avatars.githubusercontent.com/u/75060689?u=646ddca52a0b6563f4de3d0d0d5dabaecf92fe71&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AikD5",
      "number": 2662,
      "title": "[Feat request] Multi-key keybind",
      "body": "Hello! I don't know if this is technically supported by the current keyboard handling stack, and if it is I don't know if it's a good idea to implement it, but I have some keyboard shortcuts that use keys, that aren't normally modifiers, as modifiers. For example, I'd like to set Mod+A+Up to turn up the volume of my system, where A is of course not a modifier. If I try to do it in Niri version 25.08, I get the error \"invalid keybind, invalid mdifier: A\", which is true I guess, but I think the feature would be cool. Thank you!",
      "created_at": "2025-10-22T23:19:50Z",
      "updated_at": "2025-10-22T23:19:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "EzeKoren",
        "avatar_url": "https://avatars.githubusercontent.com/u/20794153?u=4970d8a6ae2ca1e4c026caa9aa3b5057ddca646d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aij6m",
      "number": 2660,
      "title": "Animate rings and various window properties",
      "body": "Right now, when you switch between windows, activity ring just disappear from one window, and appears on another. It'd be nice to have hyprland-like smooth transition from one window to another.\r\nSimilar treatment could be applied to the `opacity` and `shadow` settings of window-layer.",
      "created_at": "2025-10-22T19:01:34Z",
      "updated_at": "2025-10-22T19:01:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aiiun",
      "number": 2647,
      "title": "Gap only on horizontal axis",
      "body": "Is it possible to have gaps between columns only on the horizontal axis?\r\n\r\nWhen doing:\r\n\r\n```\r\nlayout {\r\n  gaps 12\r\n}\r\n```\r\n\r\nwe have gaps left, right but also top and bottom. It would be nice to have a configuration to set them separately.\r\nI like to have big gaps on the horizontal but this shrinks my windows also vertically so I loose screen estate :(.\r\n\r\nMaybe something like:\r\n\r\n```\r\nlayout {\r\n  gaps_horizontal 12\r\n  gaps_vertical 0 # 0 is default so we could ommit this line\r\n}\r\n```\r\n\r\nand `gaps` remains its functionality to set both with the same value.",
      "created_at": "2025-10-21T14:53:10Z",
      "updated_at": "2025-10-22T11:26:48Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A4P5f",
        "body": "Have you tried using negative struts\r\nhttps://yalter.github.io/niri/Configuration%3A-Layout.html#struts"
      },
      "user": {
        "login": "marekzan",
        "avatar_url": "https://avatars.githubusercontent.com/u/5881806?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aii37",
      "number": 2649,
      "title": "Going all-in with a screenshot tool to make it the best experience you can have?",
      "body": "Having created hundreds of screenshots over the years with Flameshot, I'd say these concepts are really important IMO and the current screenshot solution we have today does not handle them. Niri does so many things _amazingly_ well and I wonder if there's an opportunity to beef up the screenshot utility to be best in class without compromises.\r\n\r\nWhile moving away from Flameshot, I ended up in a situation of cobbling together custom scripts and tools to try and get them captured in a few different ways but it's a frankenstein shell script approach of grim, slurp, the niri screenshot tool and satty. The end result is it's worse than Flameshot due to limitations of these tools individually.\r\n\r\n**Capture modes:**\r\n\r\n- Ability to drag a rectangle to capture a region\r\n- Ability to screenshot a specific window\r\n- Ability to screenshot 1 screen\r\n- Ability to screenshot all screens (not as important IMO)\r\n\r\n**Saving:**\r\n\r\n- Any of the capturing mechanisms write to the clipboard\r\n  - This is extremely useful for quickly pasting the screenshot to another app or website's form, I do this 90% of the time\r\n- Any of the capturing mechanisms write to a file\r\n\r\n**Annotating:**\r\n\r\n- Ability to quickly annotate (add text, lines, shapes, free hand drawing, etc.) a screenshot before it's written anywhere\r\n  - The annotation tool's toolbar and features are never hidden if the captured region is too small\r\n- Ability to quickly adjust the size of a region during annotation time\r\n  - This means maybe not having a dedicated capturing tool that's piped into the annotator\r\n\r\n**Ease of use:**\r\n\r\n- Wanting to do this with the least amount of key binds possible while being intuitive as possible\r\n  - You could have 3 binds (region, window and current screen) and let the annotation tool figure out copying or writing to disk\r\n  - *vs.*\r\n  - 1 bind that tries to be smart at capture time which lets you select a region, click a specific window or grab your current screen if you're at the 0-10 X coordinate range or more specifically an area that might have your bar",
      "created_at": "2025-10-21T17:44:10Z",
      "updated_at": "2025-10-22T09:53:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nickjj",
        "avatar_url": "https://avatars.githubusercontent.com/u/813219?u=4071d58beb4b2fd0f75b47a1653ee5ea9b4a6261&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AijMn",
      "number": 2654,
      "title": "Autofocus not triggering for windows spawned in named workspace via window-rule",
      "body": "I have created some workspace rules in my niri config but I am having issue with autofocus on newly spawned windows in named workspaces. Here are my current rules:\r\n\r\n```\r\nworkspace \"dev\" {\r\n  open-on-output \"eDP-1\"\r\n}\r\n\r\nworkspace \"web\" {\r\n  open-on-output \"HDMI-A-1\"\r\n}\r\n\r\nwindow-rule {\r\n    match app-id=r#\"firefox$\"#\r\n    match app-id=\"firefox-developer-edition\"\r\n\r\n    open-on-workspace \"web\"\r\n    open-maximized true\r\n}\r\n\r\nwindow-rule {\r\n    match app-id=\"^code$\"\r\n    match app-id=\"^dev.zed.Zed$\"\r\n\r\n    open-on-workspace \"dev\"\r\n    open-maximized true\r\n}\r\n```\r\n\r\nThe issue I am having is with \"dev\" workspace I think. \r\n- When I launch Firefox from any workspace, it opens on the `web` workspace and Niri automatically switches focus to that workspace.\r\n- When I launch Zed or VS Code, they correctly open in the `dev` workspace, but Niri does not switch focus to that workspace. The window spawns in the background while I remain on my previous workspace.\r\n\r\nIt's my first time using workspace rules. In hyprland, I didn't have any rules but with Niri's scrolling and dynamic workspace behavior, workspace rule made sense that fit nicely into my workflow. The only issue is the autofocus behavior on the `dev` workspace, which I can’t figure out. I noticed this behavior when I don't have my second monitor connected to my laptop. \r\n\r\nis it a bug or am I missing something?\r\n\r\n",
      "created_at": "2025-10-22T03:15:11Z",
      "updated_at": "2025-10-23T01:31:45Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A4QTt",
        "body": "\"Autofocus\" in this case would be clients using xdg-activation to focus themselves at startup. Zed / VS Code don't activate themselves (which they should do). So they don't get focused when opening on another workspace."
      },
      "user": {
        "login": "auralisx",
        "avatar_url": "https://avatars.githubusercontent.com/u/55076779?u=4580ac7b5d266797a0c2ec2d87625dca3c8fa3ff&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aigaz",
      "number": 2637,
      "title": "Using the copy buttons in Bitwarden not working",
      "body": "Hi,\r\n\r\nwhen clicking on the Copy-Buttons in Bitwarden the content is actually not copied into the clipboard.\r\nThe app shows in the top/right corner that the content was copied, but the clipboard remains empty.\r\n\r\nRunning on the same computer with a Gnome desktop I had no issues and I can manually select the field content and hit ctrl-c. Than I get my copy in the clipboard.\r\n\r\nI'm quite new into the Linuxworld. I guess I'm using it wrong ;) maybe some configuration is missing?",
      "created_at": "2025-10-19T20:29:36Z",
      "updated_at": "2025-10-21T23:49:03Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "jc-design",
        "avatar_url": "https://avatars.githubusercontent.com/u/25851962?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aiexx",
      "number": 2622,
      "title": "Crop And Lock (Reparent mode) style vertical viewport for each window/column",
      "body": "**This is not a feature request** (although it _vaguely_ suggests one). More like an **experience story**, to see if anyone in the community shares the same feeling with me. Very likely I got terribly wrong ideas / It's indeed my skill issue / I'm complaining about the wrong thing. If that is the case, I'd be thankful if people could point to me where I've been doing the dumb thing/not completing my due work.\r\n\r\n----------\r\n\r\n_Crop And Lock_ is a PowerToys utility that helps you focus on specific parts of your applications by creating smaller, cropped windows.\r\nSee Microsoft's [demo animation](https://learn.microsoft.com/en-us/windows/powertoys/crop-and-lock).\r\n\r\n### In a word, their reparent mode carves out an \"interactable\"/input-passthrough thumbnail, which can be used afterward as a compact _inplace replacement_ for its source window.\r\n\r\nBefore the long rant, I feel obliged to make it clear that the thread is _**not**_ about adding _general thumbnail creation_ feature to niri. That would better be left to some independent Wayland utilities. Rather, it's more of a **question/discussion** regarding (1) the general usefulness of a \"**vertical clipped view**\" for potentially enabling flexible/opportunistic/less disruptive layout, (2) how it can be achieved/utilized in niri, and (3) if it's a good idea overall to build it into niri. \"_Crop And Lock_\" in the title is only used as a keyword for other users to locate this thread, because I feel \"_vertical viewport_\" alone isn't very helpful to see the crux. But it should be noted that the feature proposed here is in large part unrelated to the thumbnail functionality found in the Microsoft tool, apart from the fact that both of them do the cropping.\r\n\r\n-----------\r\n\r\n### Here begins the story.\r\n\r\nMany users, me included, base their workflow on niri's _best practice_ recommendation: 1-2 columns for \"major work\" in each workspace's \"main\" view, info/temporary windows going offscreen to the left/right end of the scroll. This flow works smoothly for many sessiones. And if you decide halfway you want switch/create \"major work\" column, you don't need too many keystrokes to transform into your new desired layout, provided you have proper `default-column-width` & `preset-column-widths` options in place.\r\n\r\nThis is the best way to get the most out of niri's toolset, and I'd love to follow it whenever applicable. But occasionally situations come up that I _find it hard to adapt_:\r\n\r\n1. Normal column(s) A next to a _fullscreen_ window (maybe a vertical 2-pane vim), where crossediting _in quick succession_ between _fullscreen_ window's right pane and normal column(s) A is needed. But switching into/out of _fullscreen_ window **each time** triggers a whole screen slide animation (due to repetitive snapping), making it tiring to regain context;\r\n\r\n2. \"Interactable peekable window\", like a music player sits across the right edge of screen, just sticks out long enough to let user _see part of_ the playlist view. Now whenever user tries to **interact** with the \"peekable window\" (jump to another track for example), a workspace shift happen, defeating the purpose of a \"peekable window\";\r\n\r\n3. Juxtaposing multiple windows of _different width_ into one column for quick compare/back-and-forth using `focus-window-up/down`. When forming column, Niri reasonably stretch/shrink every other window to the width of _first window_ in the column. This could be undesirable. Sometimes one of those windows would be better served if it takes a different width from others. Sometimes all of these windows have slightly different width for their \"best\" layouts. The behavior that window's _width may change after being consumed_ also sort of goes against niri's \"window size invariance\" goal imo.\r\n\r\n### All of the above are in one way or the other revolved around the theme of \"_switching to a predefined width is not the best option, but not switching works against niri's model leading to viewport shifting/jumping around_\".\r\nI have to agree they are probably **misusing** niri to force-adapt to their niche use case. For **case 1**, rather than editing in a _half visible_ vim window (prone to making unexpected user interaction), it's better to use a vim script to turn the 2 panes _in vim_ into 2 columns _in niri_ so that the right column can now be properly _fit in a screen_ together with A column; For **case 2**, media control/track name preview/switch should ideally be served with a shell component/a vertical scrolling ui music app, not the edge case of a window manager; For **case 3**, float every window and position them onto the same coordination should work for overlay comparison.\r\n\r\nBut I want to point out that most of these use cases have a _transient_ nature. It means users bumping into them **don't expect them** and most likely would want it to be dealt with on an _ad-hoc, get-it-done_ basis. Users don't plan a scenario of fullscreen window right beside a normal one, they encounter it. And while splitting fullscreen window into its proper column is the correct way going forward if you are going to start a _long_ editing session, for quick dirty editing this is just extra management steps/change in navigation paradigm that delays the workflow. Not changing viewport to accommodate the focues window fully into view is definitely an _anti-pattern_, but here users wanting this behavior is (hopefully!) _well aware_ of the caveat, and they are willing to _consciously_ exchange safety for **viewport stablility** for this particular case involved. Similar considerations for the other two cases. Users wanting a sticky peekout window knows their music player UI is unlikely to give any surprise even if interacting with a largely hidden one. And user wanting overlay comparison is deliberately asking for it, and should be responsible for reversing the justapostion after the comparison is done.\r\n\r\n-----------\r\n\r\nThere have been various requests here trying to solve the _surprise/unwanted_ viewport jumping problem, of which I like the most are \"disable snapping and fix the workspace viewport\" and \"sticky column\", though it does not seem that either one  are going to see big progress in near future, as there're still undecided design choices, and they lack a straight way to incorpate into niri's codebase.\r\n\r\n### So here is my two cents to further muddy the waters :).\r\nI've been casually considering a set of niri actions to turn any window/column into a _viewport of itself_. By viewport I mean shrinking the width of that window/column _no longer_ changes the window width and instructs it to recalculate its layout. Instead, part of the window shrunk out of the borders is simply _hidden_, while the window itself, completely _unware_ of the shrinking, doesn't have to do any reflow or even rendering, because conceptually the shrinking here _only_ affects the window/column's viewport, not the window/column that viewport is currently \"casting\".\r\n\r\n**Below is a concept demo.** The right \"nest\" window is a (wide enough) floating window running inside a nested niri session window which is itself tiled on the host niri session, to emulate a window that has been turned into its own vertical clipped viewport as described above. The left \"host\" window is just a normal tiled window on the host. You can see the viewport window don't have to recalculate its layout as its frame gets resize. It's because what I'm resizing is just a viewport, and the underlying window is untouched at all.\r\n\r\nhttps://github.com/user-attachments/assets/a1b36a78-8949-42e5-9072-8ae9c9248c2f\r\n\r\nI believe these \"viewportify\" actions have the potential to fit cleanly within the niri model because:\r\n- Currently only workspace can have a viewport, and this \"_viewport for window/column_\" thing adds a new dimension, orthogonal to other layout concerns, which means it _shouldn't_ be interfering with any exsiting assumption baked into the niri codebase, particularly the \"_snapping/scroll into view_\" bit;\r\n\r\n- The \"_window itselt not knowing border change, thinking it's still using the previous width_\" part feels like a natural extention along the line of niri's existing \"_windowed fullscreen_\" idea, where \"_window itself doesn't know the real window state, believing it's fullscreening within its border_\";\r\n\r\n- This doesn't conflict and perhaps interacts well with other proposals fixing the same problem. Could be implemented as a _first step_ towards more layout control approaches. From a philosophical perspective, when _compared to a traditional tiler_, Niri preserves auto-tiling convenience, and tries to trade **workspace compactness** (ws potentially spanning a long scroll) for **window size stability** (no auto resize), while this \"viewport for window/column\" proposal preserves window size stability (still no resize) and tries to trade **window visibility** (partially hidden window UI anti-pattern) for **viewport stability** (cropping helps avoid _unnecessary_ workspace shift and makes shorter scroll possible);\r\n\r\n- With the help of (yet another) indicator bar, it can hint to the user if the current window/column is being _clipped/displayed partially_, and if it is then the bar can function as a real scroll bar which user can control manually to show other part of the window/column, which might help mitigate the window visibility issue above;\r\n\r\n- This is fully backward-compatible. For users averse to the \"_scrolling for individual window/column_\" idea, they can simply choose **not** to use any of these actions, so cropped window/column won't come up as an accidental complexity to them.\r\n\r\nIt would enable more use cases if a niri action exists to crop the **hovered** window/column _along the monitor edge_ (should be strut edge, to be precise). This action can be seen as an _inversed version_ of `expand-column-to-available-width`, except that it shrinks _viewport_ instead of expanding _column_. After cropping, targeted window/column will become eligible for auto focus switch with `focus-follows-mouse max-scroll-amount=\"0%\"`, since the window/column is now _fully contained_ inside the screen.\r\n\r\n**Below is purely for explaining the idea of how such an action would work in practice**, as I haven't found a way to extract precise scroll location from niri ipc (Well, what is really needed is a tiled window's absolute location, like `tile_pos_in_workspace_view` but for tiled window).  You can see that workspace stop shifting and autofocus starts to work after cropping is done, and that cropping doesn't change its target's layout.\r\n\r\nhttps://github.com/user-attachments/assets/bec12db8-c907-4858-bcb0-89b1ff42e12f\r\n\r\nBoth of above two demo videos build upon nested niri session. The one level of indirection is giving me two cursors and breaking clipboard sharing. I've also not thought about a good way to emulate shrinking the viewport _from the left_. (While niri IPC provide stream data of resizing, it's too discrete to allow a smooth mirroring from the nested session) So ideally this would look better if built into the compositor.\r\n\r\n----------\r\n\r\nThanks for reading this and bearing with my bad wording and messy style. I strive to maintain a clear intention, but I'm not so sure if I've been able to picture the full landscape of this problem in mind. There are possibly many glaring factual errors and horrible misunderstandings. Like I say in the beginning, this thread is more about sharing vague _experience_ and collecing _thoughts_. (I should really have done more research/experiments to see how it goes for myself!) So what do you think about this feature? Is it convenient/awkward? If you like it, what kind of usage for it do you have in mind? And are there any possiblilities to do it outside the compositor? If you hate it, is it fixable (like limiting its scope to certain use case), or is it fundamentally broken and not gonna work out at all?",
      "created_at": "2025-10-17T19:03:01Z",
      "updated_at": "2025-10-21T18:48:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Jarvvay",
        "avatar_url": "https://avatars.githubusercontent.com/u/235649630?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgXBx",
      "number": 1885,
      "title": "[Screenshot] Inconsistent screenshot commands and behaviour.",
      "body": "_Note: Since this issue is not hardware or software-version/compatibility-specific, these details will be omitted as they are useless. However, it is to note that the latest version of Niri is being used for this, on NixOS 25.11._\n\n---\n\n## Issue: Screenshot arguments\nThe arguments for **`niri msg action screenshot(*)`** are very inconsistent and thus confusing, sometimes being applicable, sometimes not, and with no explanation as to why.\n\n### The simplest example that explains it all:\n![Image](https://github.com/user-attachments/assets/91490904-c9f8-46a1-9100-98b3ffde5aa0)\n\n---\n\n## Expected behaviour: Consistent handling of arguments\nThe **`-p`** and **`write-to-disk`** arguments should be handled for all types of screenshots *(**`screenshot`**, **`screenshot-window`**, **`screenshot-screen`**)*.\n\n### Examples:\n- **`niri msg action screenshot`**\n Take a screenshot of any area on the monitor.\n\n- **`niri msg action screenshot -p=false`**\n Take a screenshot of any area on the monitor, but hide the cursor by default.\n\n- **`niri msg action screenshot --write-to-disk=false`**\n Take a screenshot of any area on the monitor, but do not save to the disk when pressing  `Space` or `Enter` *(additionally, the message shown when taking such a screenshot should reflect that change by saying \"to copy the screenshot\" instead of \"to save the screenshot\", and that without having to do `Ctrl+C`)*.\n\n- **`niri msg action screenshot-window -p=true --write-to-disk=false`**\n Take a screenshot of the currently focused window whilst keeping the cursor visible, and do not save to the disk.\n\n---\n\n## Why?\n- More consistent usage of arguments\n- More user-friendly\n- More intuitive and logical\n- Makes scripting around Niri's built-in screenshot utility easier",
      "created_at": "2025-06-21T19:15:52Z",
      "updated_at": "2025-10-21T17:52:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Atemo-C",
        "avatar_url": "https://avatars.githubusercontent.com/u/160250128?u=213842e97ddd7389e69df74e93fc36f08cdf0e53&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aetxb",
      "number": 1223,
      "title": "Allow modifying config with niri IPC",
      "body": "Hello! \r\n\r\nNiri supports live reloading of config, while it is useful it has a few annoying things if you don't edit the file yourself, for example make use of external code/scripts to modify the file, in the easier case you need to do a regex to change the file or on the most complex side of things you've to parse the kdl file and serialize a new one with those changes\r\n\r\nThen you have Nix were is you create your niri config with nix the resulting file is a read-only file, you could make it mutable but it's another rabbithole and a significant amount of work\r\n\r\nSince Niri support live reloading of config, wouldn't it be good for the IPC (or even the CLI) side to support it as well? we could add an event to change certain parts of the config without having to change the config file at all \r\n\r\nThis use case is only for things that are usually changed dynamically at runtime and are not required for the config file itself to change, such for example changing the focus ring color based on the wallpaper colors you're setting ",
      "created_at": "2025-03-07T16:41:21Z",
      "updated_at": "2025-10-21T17:03:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "WolfDan",
        "avatar_url": "https://avatars.githubusercontent.com/u/5377526?u=918ba4d2169226b8515f2740355cc8ab62fbe49e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiiR9",
      "number": 2645,
      "title": "Can I bind a single mod key?",
      "body": "I tried to bind a single mod key to an app launcher, but it seems that it won't work.\r\nI used kde plasma, and can do this.\r\nI wonder if it is available on Niri.",
      "created_at": "2025-10-21T04:52:16Z",
      "updated_at": "2025-10-21T04:52:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "kamikaze211",
        "avatar_url": "https://avatars.githubusercontent.com/u/16874290?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adciu",
      "number": 883,
      "title": "A missing layout option: split-empty-space-evenly ?",
      "body": "I tried out niri a few months ago, but didn't make the switch. Now I've come back and found the option `always-center-single-columns`. I'm using it together with `center-focus-column \"never\"` and liking it... though I've realised I don't _love_ it. I think the current behaviour favours leaving windows where they are, and I can appreciate that's something some people like, but personally I'd like a behaviour that favours distributing empty space evenly on both edges of the screen (which will make all columns visible when possible). I'll try to illustrate what I mean.\r\n\r\n## Setup\r\n\r\nI have a config where I cycle between column widths of 1/3, 1/2, and 2/3s of my screen. My layout contains\r\n\r\n```\r\nlayout {\r\n    center-focused-column \"never\"\r\n    always-center-single-column\r\n    ...\r\n}\r\n```\r\n\r\n## Scenario α\r\n\r\n1. open 1st window\r\n2. open 2nd window\r\n\r\n### Current behaviour\r\n\r\n```\r\n---------------------------------------------\r\n|              | window0      |             |\r\n|              |              |             |\r\n|   empty      |              |   empty     |\r\n|              |              |             |\r\n|   1/3        |    1/3       |   1/3       |\r\n|              |              |             |\r\n---------------------------------------------\r\n```\r\n\r\n```\r\n---------------------------------------------\r\n|              | window0      | window1     |\r\n|              |              |             |\r\n|   empty      |              |             |\r\n|              |              |             |\r\n|   1/3        |    1/3       |     1/3     |\r\n|              |              |             |\r\n---------------------------------------------\r\n```\r\n\r\nAll the empty space is on the left.\r\n\r\n### Suggested behaviour\r\n\r\n```\r\n---------------------------------------------\r\n|              | window0      |             |\r\n|              |              |             |\r\n|   empty      |              |   empty     |\r\n|              |              |             |\r\n|   1/3        |    1/3       |   1/3       |\r\n|              |              |             |\r\n---------------------------------------------\r\n```\r\n\r\n```\r\n---------------------------------------------\r\n|  e   | window0      | window1      |  e   |\r\n|  m   |              |              |  m   |\r\n|  p   |    1/3       |    1/3       |  p   |\r\n|  t   |              |              |  t   |\r\n|  y   |              |              |  y   |\r\n| 1/6  |              |              | 1/6  |\r\n---------------------------------------------\r\n```\r\n\r\nThere's equal amounts of empty space outside the columns.\r\n\r\n## Scenario β\r\n\r\n1. open 1st window\r\n2. open 2nd window\r\n3. open 3rd window\r\n4. resize 3rd window to 2/3 size\r\n5. close 3rd window\r\n\r\n### Current behaviour\r\n\r\n```\r\n---------------------------------------------\r\n|              | window0      |             |\r\n|              |              |             |\r\n|   empty      |              |   empty     |\r\n|              |              |             |\r\n|   1/3        |    1/3       |   1/3       |\r\n|              |              |             |\r\n---------------------------------------------\r\n```\r\n\r\n```\r\n---------------------------------------------\r\n|              | window0      | window1     |\r\n|              |              |             |\r\n|   empty      |              |             |\r\n|              |              |             |\r\n|   1/3        |    1/3       |     1/3     |\r\n|              |              |             |\r\n---------------------------------------------\r\n```\r\n\r\nAll the empty space is on the left.\r\n\r\n```\r\n---------------------------------------------\r\n| window0      | window1      | window2     |\r\n|              |              |             |\r\n|              |              |             |\r\n|              |              |             |\r\n|   1/3        |    1/3       |     1/3     |\r\n|              |              |             |\r\n---------------------------------------------\r\n```\r\n\r\n```\r\n---------------------------------------------\r\n| window1      | window2                    |\r\n|              |                            |\r\n|              |                            |\r\n|              |                            |\r\n|   1/3        |    2/3                     |\r\n|              |                            |\r\n---------------------------------------------\r\n```\r\n\r\n```\r\n---------------------------------------------\r\n| window1      |                            |\r\n|              |                            |\r\n|              |    empty                   |\r\n|              |                            |\r\n|   1/3        |    2/3                     |\r\n|              |                            |\r\n---------------------------------------------\r\n```\r\n\r\nThe column with window0 is outside the screen, and all the empty space is on the right.\r\n\r\n### Suggested behaviour\r\n\r\n```\r\n---------------------------------------------\r\n|              | window0      |             |\r\n|              |              |             |\r\n|   empty      |              |   empty     |\r\n|              |              |             |\r\n|   1/3        |    1/3       |   1/3       |\r\n|              |              |             |\r\n---------------------------------------------\r\n```\r\n\r\n```\r\n---------------------------------------------\r\n|  e   | window0      | window1      |  e   |\r\n|  m   |              |              |  m   |\r\n|  p   |    1/3       |    1/3       |  p   |\r\n|  t   |              |              |  t   |\r\n|  y   |              |              |  y   |\r\n| 1/6  |              |              | 1/6  |\r\n---------------------------------------------\r\n```\r\n\r\nThere's equal amounts of empty space outside the columns.\r\n\r\n```\r\n---------------------------------------------\r\n| window0      | window1      | window2     |\r\n|              |              |             |\r\n|              |              |             |\r\n|              |              |             |\r\n|   1/3        |    1/3       |     1/3     |\r\n|              |              |             |\r\n---------------------------------------------\r\n```\r\n\r\n```\r\n---------------------------------------------\r\n| window1      | window2                    |\r\n|              |                            |\r\n|              |                            |\r\n|              |                            |\r\n|   1/3        |    2/3                     |\r\n|              |                            |\r\n---------------------------------------------\r\n```\r\n\r\n```\r\n---------------------------------------------\r\n|  e   | window0      | window1      |  e   |\r\n|  m   |              |              |  m   |\r\n|  p   |    1/3       |    1/3       |  p   |\r\n|  t   |              |              |  t   |\r\n|  y   |              |              |  y   |\r\n| 1/6  |              |              | 1/6  |\r\n---------------------------------------------\r\n```\r\n\r\nThere's equal amounts of empty space outside the columns, and both columns are visible.\r\n\r\n## Consequences\r\n\r\n- Centring the focused column doesn't always have any effect as there has to be enough non-empty space on both sides.",
      "created_at": "2024-12-20T09:27:37Z",
      "updated_at": "2025-10-20T20:36:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "magthe",
        "avatar_url": "https://avatars.githubusercontent.com/u/327270?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aih7X",
      "number": 2642,
      "title": "Dim inactive windows",
      "body": "It would be useful to be able to dim inactive windows by a factor. This could be used as an alternative to or in conjunction with border/focus ring to have the focused window \"pop\" out more.\r\n\r\n*edit: Sorry I only searched issues before adding this. I can see that there is a similar discussion already. Feel free to close.",
      "created_at": "2025-10-20T17:01:51Z",
      "updated_at": "2025-10-20T19:17:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "avesst",
        "avatar_url": "https://avatars.githubusercontent.com/u/810218?u=af96b682a4409c976b16d08b3d1c4854928958f5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiiAJ",
      "number": 2643,
      "title": "place-within-backdrop for full interactive widgets",
      "body": "Currently `layer-rule` `place-within-backdrop` \"will only work for background layer surfaces that ignore exclusive zones [.. and they] will ignore all input\".\r\n\r\nIt would be a lot cooler if full-on interactive panels could also be placed within the backdrop, with exclusive zones pushing away the actual workspace area in the overview. This would allow for things like basically GNOME-like activities view! :D",
      "created_at": "2025-10-20T19:10:00Z",
      "updated_at": "2025-10-20T19:10:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "valpackett",
        "avatar_url": "https://avatars.githubusercontent.com/u/208340?u=a5a2ee57f0c23adce1a94a9382da988626b0b9a1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aihmv",
      "number": 2640,
      "title": "Adding constants in config",
      "body": "It would be nice to have the ability to add constants to the configuration file. In my config I have hardcoded a scripts directory that is referenced all over the place in my binds config, it would be nice if I could just add a constant and reference that instead so that I won't have to change the directory everywhere in the event that I choose to move the directory.\r\n\r\nSo having:\r\n```kdl\r\nconst my-variable \"some-string\"\r\n```\r\nwould be nice.\r\n\r\nI am aware that variables are not going to be supported, but I think constants should...",
      "created_at": "2025-10-20T09:47:51Z",
      "updated_at": "2025-10-20T14:05:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "samuelskovbakke",
        "avatar_url": "https://avatars.githubusercontent.com/u/25748723?u=6e03917227ce2b3f4fec0e3da4913db6477465c2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0jb",
      "number": 1596,
      "title": "A way to launch fuzzel while typing in overview",
      "body": "The new overview mode is a great addition to the experience. Personally, I like the minimalism of Gnome where they actually merged the Overview and Launcher experience into one.\r\nWhat do you think about allowing `fuzzel` (or another launcher`) to be invoked when one starts typing in the Overview?\r\nIf not something provided by Niri, what would be the easiest way to implement it? The only way coming to my mind would be some background script constantly running, checking if overview is enabled, and launching fuzzel for any key press other than niri command. It seems a bit too hacky, and I feel like Niri should allow to bind some action for typing in Overview.",
      "created_at": "2025-05-18T10:03:15Z",
      "updated_at": "2025-10-20T12:36:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AkLk8",
      "number": 3458,
      "title": "Ignore touchpad DWT while taking screenshot",
      "body": "Enabling touchpad DWT interferes when interactively moving the screenshot selection area with touchpad. Instead of the intended behaviour, the DWT setting disables the touchpad when spacebar is pressed and hence the screenshot is snapped. Fix is to ignore DWT when using niri's screenshot action.\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri unstable 2025-10-19 (commit c8eea8ee9ddf795da8cb356599f17e2dc7cfea20)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: NixOS Unstable (25.11)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Iris Xe (iGPU)\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel Core i5-12500H \n",
      "created_at": "2025-10-19T17:38:10Z",
      "updated_at": "2026-02-16T04:58:35Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Vortriz",
        "avatar_url": "https://avatars.githubusercontent.com/u/97402159?u=a8017dbc1a7a830afc9a862c91cdc22c9451ec42&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AibrL",
      "number": 2595,
      "title": "Configurable behaviour of focus",
      "body": "# Problem\r\nWhen using the mouse to focus a column, the first click actually works in the window you are trying to go to\r\n\r\n# Why is it bad\r\nFocusing a window and actually using it can be a separate action in users' minds. Especially for those who use `center-focused-column \"always\"` and have big columns. In that case, you can only see a thin slice of the neighbouring column, **and if using the mouse for changing focus is what you want to do**, you would not expect the first click to work in that window. Since you cant even properly see the window, there is almost no chance that the **click** intentional\r\n\r\nFor example: If you had a playing video (that stretches over the whole window) in the neighbouring column, clicking on it **just to focus on it**, would pause the video, which is quite annoying\r\n\r\n(Or even in more general cases, wanting to focus a neighbouring column fast, **that being the only thing you want to do**, if you have chosen to use the mouse for that, you can really easily click on a random button on a website completely unintentionally)\r\n\r\n# Solution\r\nHave a config option to not send the first click to a window, if it was unfocused\r\n",
      "created_at": "2025-10-14T14:19:55Z",
      "updated_at": "2025-10-19T06:36:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mochou-p",
        "avatar_url": "https://avatars.githubusercontent.com/u/66534926?u=b8c8371df7774f703a385cb84552d0a28a5c4dbb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AifUV",
      "number": 2628,
      "title": "Overview per monitor",
      "body": "I would like to have the ability to toggle overview for each output separately.\r\n\r\nref: https://github.com/YaLTeR/niri/pull/1440#issuecomment-2830911339",
      "created_at": "2025-10-18T19:00:57Z",
      "updated_at": "2025-10-18T19:00:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "edpyt",
        "avatar_url": "https://avatars.githubusercontent.com/u/125578104?u=98e351ffdd27f53822300fb96a1612df321d2ae7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aie6a",
      "number": 2624,
      "title": "niri launch behavior \"run-or-raise\"",
      "body": "I’d like to request a configurable compositor-wide option or per-action flag that changes the default behavior when launching applications.\r\n\r\nCurrently, whenever I launch an app (via spawn, a launcher, or keybind), niri always creates a new instance — even if that app already has an existing window. Many compositors and panels (like Hyprland, i3, GNOME Shell, etc.) support “run-or-raise” behavior, where launching an app instead focuses its existing window rather than starting a duplicate instance.\r\n",
      "created_at": "2025-10-18T00:59:58Z",
      "updated_at": "2025-10-18T01:06:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jgarza9788",
        "avatar_url": "https://avatars.githubusercontent.com/u/8079550?u=e6626a0dc9645d4660cfafadd9e8a44a3c7d4b4d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcjSi",
      "number": 805,
      "title": "Allow giving named workspaces a fixed index, or not giving them an index entirely",
      "body": "Hi!\r\n\r\nI've switched to Niri a little while ago, and started tinkering with an Astal (formerly Ags) config for it. One of the workflows I'm trying to create is the following:\r\n\r\nPin some programs, such as my browser, slack, spotify, etc... to some keybinds (say Mod+8, Mod+9, Mod+0). I can do this by creating named workspaces, assign above keybinds to focus these workspaces, and call it a day. Everytime I press those keybinds I want to focus the correct workspace on the correct monitor, without having to navigate to that monitor beforehand (named workspaces solve this).\r\n\r\nI've noticed that these named workspaces occupy some index in Niri's layout. What I want to achieve is that the first half of my number row (1-5) maps to a dynamic workspace (per monitor) and the second half of my number row (6-0) to \"fixed\" workspaces, which will live on a specific monitor, so that when I want to navigate to one of these windows I do not have to first navigate to the correct monitor.\r\n\r\nI'm not sure if this can already be done. The problem that I ran into is, when creating named workspaces they occupy an index (starting from 1) on the monitor they are created on. This means that my dynamic workspace indices start after my named workspace index, on a fairly arbitrary number. This becomes worse when moving my named workspaces around, changing the index of all of my dynamic workspaces.\r\n\r\nA fairly neat way (configuration wise, probably not implementation wise) is if we can set an index for named workspaces:\r\n\r\n```kdl\r\nworkspace \"browser\" {\r\n    open-on-output \"DP-1\"\r\n    index 10 # hotkey 0\r\n}\r\n```\r\n\r\nI'm not entirely sure what the behaviour is when moving this workspace to other monitors (where a workspace on index 10 might already exist), or how this affects moving to the next (index 11) and previous (first index lower than 10?) workspace.\r\n\r\nA more constrained way is probably to allow workspaces to not have an index at all, and have them not interfere with any sort of index (not sure on the configuration syntax here)\r\n\r\n```kdl\r\nworkspace \"browser\" {\r\n    open-on-output \"DP-1\"\r\n    index false\r\n}\r\n```\r\n\r\nmaking it so that this workspace can only be reached through `Action::FocusWorkspace(Name(\"browser\"))` keybinds. Again, not exactly sure what the behaviour is regarding the relation to previous/next workspaces. Maybe they do not exist relative to this workspace (similar to how there is no workspace above index 0).\r\n\r\nWhat are your thoughts on this? If it reasonably fits in the architecture of Niri's layout code I am willing to give the implementation a shot myself.\r\n\r\nDo you think the workflow I describe is already possible to implement somehow? If so I would really like to know :sweat_smile: \r\n\r\nCheers!",
      "created_at": "2024-11-14T19:46:19Z",
      "updated_at": "2025-10-17T19:11:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "maxverbeek",
        "avatar_url": "https://avatars.githubusercontent.com/u/8481950?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aieiz",
      "number": 2620,
      "title": "Use case for the right focused, left cut-off layout",
      "body": "Hi! I'm trialing a macOS tiling window manager, because it seems like it should work intuitively, but I have some questions. I thought I'd ask them here because there are a ton more people with experience with this (and I don't get to use Niri currently).\r\n\r\nI'm zipping around fine etc, but then I get into this layout:\r\n\r\n<img width=\"3024\" height=\"1964\" alt=\"niri\" src=\"https://github.com/user-attachments/assets/c74a872a-4bd3-4315-a1fb-d9514d5e597b\" />\r\n\r\n* My browser is on the right-hand of the screen\r\n* The screen to the left of my browser is cut-off\r\n\r\nMy issues with this:\r\n\r\n1. Having my focused window on the right of the screen feels off-putting to me\r\n2. The screen to the left of my focused window is cut off in a way that makes it entirely useless.\r\n\r\nSo my question is: \r\n\r\nCan this layout be prevented entirely? Or should I be thinking about this differently?\r\n\r\nI'm new to this so really mostly eager to learn.",
      "created_at": "2025-10-17T13:44:22Z",
      "updated_at": "2025-10-17T14:31:33Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "alper",
        "avatar_url": "https://avatars.githubusercontent.com/u/72429?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AidjB",
      "number": 2610,
      "title": "Fetch Window Feature",
      "body": "The way I use workspaces it is very handy to have a \"Fetch Window\" functionality. Basically, I want to call my menu of choice (`tofi`) and search for all open windows and move it to the current workspace. \r\n\r\nThere's no built-in functionality for this so I started writing a custom script to do that. It works, even with multi-monitor setups and dynamic workspaces. niri's \"monitor-first\" approach made that a bit more complicated than I'd preferred, but from what I saw there's a lot of effort done on other fronts to improve index / id handling.\r\n\r\nFor those that want to copy the functionality, feel free to copy my script and adjust where needed. Pay attention to the hardcoded screens and the usage of `tofi`, and it has not been extensively tested. \r\n\r\nNow my question is, would this be a feature that would make sense to be added to niri natively? \r\nIf so, I'd probably have a go at it in the next weeks. \r\n\r\n```bash\r\n#!/bin/bash\r\n\r\nWINDOWS=$(niri msg -j windows)\r\nWORKSPACES=$(niri msg -j workspaces)\r\nDP1_WORKSPACE=$(echo \"$WORKSPACES\" | jq \".[] | select(.is_active == true and .output == \\\"DP-1\\\") | .idx\")\r\nDP2_WORKSPACE=$(echo \"$WORKSPACES\" | jq \".[] | select(.is_active == true and .output == \\\"DP-2\\\") | .idx\")\r\nWORKSPACE_FOCUSED_IDX=$(echo \"$WORKSPACES\" | jq \".[] | select(.is_focused == true) | .idx\")\r\nWORKSPACE_FOCUSED_DISPLAY=$(echo \"$WORKSPACES\" | jq -r \".[] | select(.is_focused == true) | .output\")\r\nWINDOW_TO_FETCH=$(echo \"$WINDOWS\" | jq -r 'map(\"\\(.title) - \\(.app_id) - \\(.id)\") | .[]' | tofi | awk -F- '{print $NF}' | xargs)\r\n\r\nif [[ -n \"$WINDOW_TO_FETCH\" ]] ; then\r\n\r\n    WINDOW_TO_FETCH_WORKSPACE=$(echo \"$WINDOWS\" | jq --argjson window_id $WINDOW_TO_FETCH '.[] | select(.id == $window_id) | .workspace_id')\r\n    WINDOW_TO_FETCH_DISPLAY=$(echo \"$WORKSPACES\" | jq -r --argjson workspace_id $WINDOW_TO_FETCH_WORKSPACE '.[] | select(.id == $workspace_id) | .output')\r\n\r\n    if [[ $WINDOW_TO_FETCH_DISPLAY == $WORKSPACE_FOCUSED_DISPLAY ]] ; then\r\n\r\n        niri msg action focus-window --id $WINDOW_TO_FETCH\r\n        niri msg action move-window-to-workspace $WORKSPACE_FOCUSED_IDX\r\n\r\n    else\r\n\r\n        niri msg action focus-window --id $WINDOW_TO_FETCH\r\n\r\n        [[ \"$WINDOW_TO_FETCH_DISPLAY\" == \"DP-1\" ]] && \\\r\n            niri msg action move-window-to-monitor-left && \\\r\n            [[ \"$WINDOW_TO_FETCH_WORKSPACE\" != \"$DP1_WORKSPACE\" ]] && \\\r\n            niri msg action focus-monitor \"DP-1\" && \\\r\n            niri msg action focus-workspace $DP1_WORKSPACE\r\n\r\n        [[ \"$WINDOW_TO_FETCH_DISPLAY\" == \"DP-2\" ]] && \\\r\n            niri msg action move-window-to-monitor-right && \\\r\n            [[ \"$WINDOW_TO_FETCH_WORKSPACE\" != \"$DP2_WORKSPACE\" ]] && \\\r\n            niri msg action focus-monitor \"DP-2\" && \\\r\n            niri msg action focus-workspace $DP2_WORKSPACE\r\n\r\n        niri msg action focus-window --id $WINDOW_TO_FETCH\r\n\r\n    fi\r\n\r\nfi\r\n```",
      "created_at": "2025-10-16T13:12:26Z",
      "updated_at": "2025-10-16T13:12:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "appleseedexm",
        "avatar_url": "https://avatars.githubusercontent.com/u/11321388?u=50f41339b9e32ca20c757765e75f3e2647c2b0c4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AidYL",
      "number": 2608,
      "title": "Limit amount of windows in workspace",
      "body": "I don't know if this idea works with what Niri is trying to do, but figured I would put it out there anyway. \r\nThe thinking is to be able to limit how many open windows can be on a specific workspace, and when that limit is hit either start spawning windows one workspace down, or if that workspace is full, create a new workspace and start filling that one.\r\n\r\nSomething like:\r\nWorkspace A - limit 5\r\n1 - 2 - 3 - 4 - 5 - (user spawns new window) -> |\r\nWorkspace B\r\n| -> 6 (now 1 on the new workspace) - 2 - etc.\r\n\r\nWould maybe strike a compromise between the dynamic nature of Niri and the \"I lose track of my windows on an infinite plane\" camps.",
      "created_at": "2025-10-16T09:49:37Z",
      "updated_at": "2025-10-16T09:49:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "corepop",
        "avatar_url": "https://avatars.githubusercontent.com/u/214348338?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aic0m",
      "number": 2604,
      "title": "maybe CoC soon",
      "body": "maybe CoC soon :3",
      "created_at": "2025-10-15T18:24:26Z",
      "updated_at": "2025-10-15T18:24:27Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "lesbiannix",
        "avatar_url": "https://avatars.githubusercontent.com/u/229589941?u=5675a77a4d82fc0bfb63b22fb600c30194132675&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJZs",
      "number": 2458,
      "title": "Adding .icc profiles and 10 bit depth",
      "body": "I need correct colors on my monitor for work, thus I calibrated my monitor with expensive tools. \r\nNow I have a .icc file which I cant use in niri.\r\nAlso, it's 10 bit depth instead of basic 8 bit. Which niri also doesnt support. A 10-bit depth allows for the display of over 1 billion colors, compared to the 16.7 million colors of an 8-bit display.",
      "created_at": "2025-09-27T08:43:53Z",
      "updated_at": "2025-10-15T17:53:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "quadans",
        "avatar_url": "https://avatars.githubusercontent.com/u/47493031?u=c8cf8b76dac5baa3087890eb1541a7b6527ddf28&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af2eq",
      "number": 1620,
      "title": "Implement different screen transition effects",
      "body": "Currently I am using [swww](https://github.com/LGFae/swww) for changing wallpaper with animations and [wallust](https://codeberg.org/explosion-mental/wallust) to change the colorscheme. The problem is that the wallpaper is always drawn behind everything like this:\r\n\r\n![image](https://github.com/LGFae/swww/raw/demos/assets/grow.gif)\r\n\r\nIt would be cool if transition could affect the whole screen.\r\nI had a look at the code of ScreenTransition and I think it could be done by drawing a \"transparent hole\" in the from_textures[idx] based on the clock, but I don't know if it's possible",
      "created_at": "2025-05-20T11:40:04Z",
      "updated_at": "2025-10-15T10:28:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "eric-marin",
        "avatar_url": "https://avatars.githubusercontent.com/u/144999446?u=415ea8207f2048dff695b8cd8ad47d443e7d960e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aibxb",
      "number": 2596,
      "title": "Window matching by output? Window rules per output?",
      "body": "Wondering if this is something that's been raised before? Couldn't find anything in issues or discussions.\r\n\r\nLayouts per output were added recently, but I would either need window rules per output or the ability to have window rules match a specific output. For instance, I have the following window rule for spotify:\r\n\r\n```kdl\r\nwindow-rule {\r\n    match app-id=\"spotify\"\r\n    default-column-width { fixed 1596; }\r\n    default-window-height { fixed 1240; }\r\n}\r\n```\r\n\r\nThis applies to my main external monitor. However, on my laptop I want this window to be smaller.",
      "created_at": "2025-10-14T16:31:45Z",
      "updated_at": "2025-10-15T10:00:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A4BRi",
        "body": "Brought this up on the Matrix channel and agreed on raising an issue. Please follow up here: https://github.com/YaLTeR/niri/issues/2600"
      },
      "user": {
        "login": "gvolpe",
        "avatar_url": "https://avatars.githubusercontent.com/u/443978?u=d9845904b6660ab20563d305d83e60a178506f9b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AibTC",
      "number": 2594,
      "title": "Feature request: Allow renaming workspaces over ipc (i.e. via `niri msg`)",
      "body": "I saw https://github.com/YaLTeR/niri/pull/904, which added the ability to dynamically rename workspaces, but AFAICT this isn't exposed in the ipc interface. I think usage would look something like `niri msg 'rename workspace 1 to \"my project\"`.\r\n\r\nMy goal is to write a script that automatically renames workspaces to include icons for each program contained in that workspace. I did a similar thing for i3 here: https://github.com/justbuchanan/i3scripts?tab=readme-ov-file#autorename_workspacespy.\r\n\r\nIf workspace renaming via `niri msg` is something you'd be interested in incorporating into the project, I'd be happy to try and implement it and send a PR.",
      "created_at": "2025-10-14T06:35:21Z",
      "updated_at": "2025-10-14T07:10:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "justbuchanan",
        "avatar_url": "https://avatars.githubusercontent.com/u/115131?u=71a4f16d6a5b057b632c9cc4d390ea9ebc057f13&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag8uE",
      "number": 2134,
      "title": "How to implement resolving a key binding",
      "body": "# Prelude and Terminology\r\n\r\nI'd like to discuss an overhaul on how keybindings are resolved by niri especially with respect to different keyboard layouts.\r\nThis issue is not about how or what actions to bind.\r\n\r\n## Terminology\r\n\r\nA bit of terminology as used throught this post and some background:\r\n\r\nA *keycode* is a the id of the \"physical key\" pressed (note: not quiet true but close enough for our purpose). This is similar to scancode but in the context of xkb. The *keycode* produced by pressing a key is independent of the keyboard layout, e.g. the key usually labelled `Q` on a QWERTY layout has keycode 24 (decimal).\r\nxkb also has a name for a keycode of the form `AE01`  (\"first key in row E\")\r\nSee https://xkbcommon.org/doc/current/keymap-text-format-v1.html#the-xkb_keycodes-section\r\n\r\nA *modifier* is a key like Shift, Ctrl, Alt, Super, Numlock, ...\r\nThere might be different keys producing the same modifier, e.g. left shift key and right shift key both act as shift modifiers.\r\nThe a modifier key itself depends on the keyboard layout, e.g. the right Alt key has keycode 108 and produces the keysym `Alt_R` on `us` layout but `ISO_Level3_Shift` on `fr` layout.\r\n\r\nA *keysymbol* or *keysym* is essential a (Unicode) letter e.g. `a`, `ü`, `α` or a symbol `!`, `@`. The symbol produced by a key press depends on the layout used and additionally on modifiers, e.g. pressing the key corresponding to `Q` on QWERTY produces a `q` on `us` layout but an `a` on `fr`. Additionally, the symbol might depend on the modifiers pressed, e.g. \"Shift+q\" produces an capital `Q`, while \"Shift+1\" produces `!`.\r\n\r\nBe aware that the \"keysymbol change\" of a modifier also depends on the layout (especially true for non-letter keysymbols). Additionally, while shift is the most common modifier changing the keysymbol, other layouts might have more modifiers, e.g. `de(neo)` has 6 layers and three \"shift like\" modifiers.\r\n\r\nExamples:\r\n * While a bind like \"Shift+@\" might require two key presses on `us` namely `Shift`+`2` it requires three `Shift`+`ISO_Level3_Shift`+`0` on `fr`.\r\n * Likewise, while \"1\" requires a single key press on `us`, namely `1`, it requires two on `fr`, namely `Shift`+`1` (numbers and symbols are \"swapped\")\r\n\r\nThe lookup from a keycode + modifiers + layout into a keysymbol is called *translation*. During the translation some modifiers might be *consumed*, e.g. if `Ctrl+Shift+/` is pressed on `us`, then `Shift` would be consumed in the translation to `?` and the *unconsumed modifiers* would be `Ctrl`.\r\n \r\n# The Issues\r\n\r\nThere are currently multiple issues related to keyboard bindings:\r\n\r\n+ \"non-ASCII\" keysyms\r\n  * https://github.com/YaLTeR/niri/issues/283\r\n  * https://github.com/YaLTeR/niri/issues/1225\r\n+ unreachable combinations and bindings on \"non-us\" layouts\r\n  * https://github.com/YaLTeR/niri/issues/2390\r\n  * https://github.com/YaLTeR/niri/discussions/2577\r\n+ binding by keycode\r\n  * https://github.com/YaLTeR/niri/discussions/1330\r\n  * https://github.com/YaLTeR/niri/discussions/1919\r\n  * https://github.com/YaLTeR/niri/issues/1913\r\n  * https://github.com/YaLTeR/niri/pull/1920\r\n+ Bind modifiers\r\n  * https://github.com/YaLTeR/niri/discussions/1016\r\n  * https://github.com/YaLTeR/niri/discussions/1492\r\n+ Bind  modifiers keysyms, e.g. LeftShift and RightShift differently\r\n  * https://github.com/YaLTeR/niri/discussions/1215\r\n  * https://github.com/YaLTeR/niri/discussions/1735\r\n+ multiple keyboards\r\n  * https://github.com/YaLTeR/niri/pull/417\r\n  * https://github.com/YaLTeR/niri/discussions/1504\r\n  * https://github.com/YaLTeR/niri/issues/371#issuecomment-2571594735\r\n  * https://github.com/YaLTeR/niri/discussions/1590\r\n  * https://github.com/YaLTeR/niri/discussions/355\r\n\r\n(maybe more which I haven't found)\r\n\r\n# What users might want\r\n\r\n+ keybindings which respect their current layout, e.g. pressing the key labelled `f` should make the app fullscreen whether this is on `fr` or on `us` layout.\r\n+ keybindings which are \"fixed\"/\"independent\" of the layout, e.g. WASD or HJKL should be these \"physical keys\" because of their positioning not because of their labeling.\r\n+ some might want a fallback between layouts, e.g. `ru` to `us`.\r\n\r\n# Incomplete survey on what other programs do to resolve keybindings\r\n\r\n## labwc\r\n\r\nhttps://labwc.github.io/\r\n\r\n@stefanarch pointed labwc out:\r\n\r\n```\r\n  When matching against keybinds, input keys are processed in the following order of precedence:\r\n           o   Keycodes of physical keys (except if keybind is layoutDependent)\r\n           o   Translated keysyms taking into account modifiers (so if Shift+1 were pressed on a  us  keyboard,\r\n               the keysym would be '!')\r\n           o   Raw  keysyms  ignoring modifiers such as shift (so in the above example the keysym would just be\r\n               '1')\r\n\r\n           The reasons for this approach are:\r\n           o   To make keybinds keyboard-layout agnostic (by checking keycodes before keysyms). This means that\r\n               in a multi-layout situation, keybinds work regardless of which layout is active at the  time  of\r\n               the key-press.\r\n           o   To  support keybinds relating to keysyms that are only available in a particular layout, for ex-\r\n               ample a, a and o.\r\n           o   To support keybinds that are only valid with a modifier, for example the numpad keys  with  Num-\r\n               Lock enabled: KP_x. These would only be matched by the translated keysyms.\r\n           o   To support keybinds such as `S-1` (by checking raw keysyms).\r\n\r\n           layoutDependent  [yes|no] Make this specific keybind depend on the currently active keyboard layout.\r\n           If enabled, a keybind using a key which does not exist in the currently active layout  will  not  be\r\n           executed. The physical key to trigger a keybind may also change along with the active layout. If set\r\n           to \"no\" (or is absent) the keybind will be layout agnostic. Default is no.\r\n```\r\n\r\nI looked at the code and if I understand it correctly, what they actually do for a config of `Shift+f` is\r\n+ resolve the keysym `f` with respect to the first layout with that symbol to obtain the keycode.\r\n   (unless its configured as layoutDependent)\r\n+ then do the above.\r\n    The bindings are always checked against modifiers and not unconsumed modifiers.\r\n\r\n## sway\r\n\r\nhttps://swaywm.org/\r\n\r\nSway allows using keysyms and keycods\r\n```\r\nbindsym Mod+f action\r\nbindsym --to-code Mod+f action  # Always resolve f with respect to the first layout\r\nbindcode Mod+54 action\r\nbindsym Group2+Mod+f action # only trigger Mod+f for layout 2\r\n```\r\n\r\nIf I understand sways sway/input/keyboard.c correctly, then the resolve order is\r\n\r\n1. keycode with modifiers\r\n2. exact match of \"unshifted\" keysym with modifiers (i.e. \"Shift+1\" over \"!\")\r\n3. exact match of translated keysym with unconsumed modifiers (i.e. \"!\")\r\n\r\nNo fallback to other layouts.\r\n\r\n## foot\r\n\r\nhttps://codeberg.org/dnkl/foot\r\n\r\nMatch priority for a binding like \"Ctrl+Shift+U\" is\r\n1. \"unshifted\" keysym with modifiers (i.e. \"Shift + 1\" over \"!\")\r\n2. translated keysym (i.e. \"!\") with unconsumed modifiers\r\n3. keysym of default layout (This is a layout fallback but without using translated symbols)\r\n\r\nFoot does a repair step to convert \"unreachable\" bindings, e.g. on `us` the binding \"shift+bar\" becomes \"shift+slash\".\r\nHowever, it seems that this is only done with respect to the first layout.\r\n\r\n# Proposed Resolving Algorithm\r\n\r\nGuiding principles:\r\n+ no keysym is special.  (The violation of this lead to the \"non-ASCII\" issues mentioned above)\r\n+ no keyboard layout is special (though the order a user configured might matter)\r\n\r\n## The Algorithm\r\n\r\nSo, given a key press and its keycode, we do:\r\n\r\n1. If there is a binding for that keycode, use that. Goto End.  \r\n2. Translate keycode into a keysymbol and unconsumed modifiers\r\n\r\n   ```\r\n   (keycode, layout, modifiers) → keysym, unconsumed-modifiers\r\n   ```\r\n\r\n   This involves the modifiers and the current layout (xkbcommon calls a layout a group).\r\n   E.g. Pressing QWERTY Ctrl+Shift+1 with `us` layout results in `Ctrl+!`.\r\n\r\n   Note that only pressing a modifier also produces a keysym, e.g. Shift_L.\r\n   \r\n3. If there is a binding with that keysym and exact unconsumed-modifiers, use that. Goto End.\r\n\r\n   For `us` a binding \"?\" would match pressing the \"shift\" and \"/\" QWERTY-key, but a binding \"Shift+/\" and \"Shift+?\" would *not* match.\r\n\r\n4. Get the \"unshifted\"/\"base\" keysym\r\n\r\n    (keycode, layout, no-modifiers) -> keysym\r\n\r\n    E.g. for `us` what previously was `Shift+!` becomes `Shift+1`\r\n \r\n    (optional step 4.5, see remarks below)\r\n\r\n5. If there is a binding with that keysym and exact modifiers (not unconsumed modifiers), use that. Goto End.\r\n\r\n6. If the user configured layout fallbacks, then redo Steps 2. to 5. for each in order of the  configured layouts starting with the first layout.\r\n\r\nThis is all done on a per keyboard-device basis.\r\nIn particular layouts configured for another device are not used as fallback.\r\n\r\n## Explanation and Remarks\r\n\r\n * Point 1. allows layout independent bindings, e.g. WASD, HJKL.\r\n * Point 3 and 4 will also work for modifiers like \"Shift_R\" as these are also keysymbols (Remark: Not tested so I don't know whether the Shift modifier is already set when processing the keypress of Shift_L, if that is set, then step 4 succeeds, if not then step 3 does.)\r\n * Point 4 and 5 allows bindings such as \"Shift+1\" on `us` to match.\r\n * On `us` a binding \"Shift+?\" would *never* match as it must be \"?\" for point 3 or \"Shift+/\" for point 4.\r\n * Because of that maybe we want to insert a second step between 4 and 5 which matches the original modifier and translated keysym against a keybinding, i.e. bindng \"Shift+?\" would now match pressing `Shift+/` on `us`.\r\n * Point 6 allows `us,ru` to match bindings such as `a` even when the current layout is `ru`\r\n * Be aware that the above algorithm does not treat any symbol special so letters like `a` will also have a fallback.\r\n\r\n# User perspective of the configuration\r\n\r\n## Layout fallback\r\n\r\nThe layout fallback should be per-device.\r\n\r\n```\r\ninputs {\r\n    keyboard {\r\n        xkb {\r\n            use-layout-fallback true/false\r\n        }\r\n    }\r\n}\r\n```\r\n\r\nI would argue that the layout fallback should be disabled by default as it might lead to surprising behaviors for users where a letter/symbol is present on different keys on multiple layouts, which is essential *almost all* layouts as layouts shuffle at least some symbols like `!`, `#`, ...\r\n\r\nE.g. for`us,fr` and the config\r\n```\r\n//layout \"us,fr\"\r\nbind {\r\n   Mod+q { close-window; }\r\n}\r\n```\r\nIf the current layout is `fr`, then pressing the key labelled \"a\" (the key next to Tab) would trigger the `close-window` action as `a` is not bound and the same keycode is `q` on `us`.\r\n\r\nSimilarly for \"se,us\" (Swedish, US) pressing `å` or `+` would trigger the `[` or `-` binding, respectively.\r\n\r\n## Key bindings\r\n\r\nThe bindings configuration must distinguish between keycode and keysymbol as `1` can be either the symbol or the keycode.\r\nTo differentiate we could use one of:\r\n\r\n```\r\nbinds {\r\n   // Variant 1:\r\n   Mod+108 keycode { action }\r\n   Mod+f keysym { action }\r\n   Mod+f to-keycode layout=2 { action } // resolve f wrt layout 2 then bind the resulting keycode\r\n\r\n   // Variant 2:\r\n   Mod+108 as-keycode { action }\r\n   Mod+f as-keysym { action }\r\n   Mod+f to-keycode layout=2 { action } // resolve f wrt layout 2 then bind the resulting keycode\r\n\r\n   // Variant 3: sway style\r\n   keycode Mod+18 { action }\r\n   keysym Mod+f { action }\r\n   keysym Mod+f to-keycode layout=2 { action } // resolve f wrt layout 2 then bind the resulting keycode\r\n   Mod+f { action } // synonym to keysym Mod+f { action }\r\n}\r\n```\r\n\r\nPersonally I don't have a preference here.\r\nPoints to consider are: 1) backwards compatibility 2) future extensibility\r\n\r\n\r\n# Closing\r\n\r\nAssuming we find a consensus on this, I would (if my time permits) take a stab on implementing it.\r\n\r\n## pings\r\n\r\n@YaLTeR  @kchibisov",
      "created_at": "2025-07-27T10:47:34Z",
      "updated_at": "2025-10-13T20:25:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sbroglie",
        "avatar_url": "https://avatars.githubusercontent.com/u/218117192?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aia5U",
      "number": 2593,
      "title": "How does Niri handle missing outputs in configuration?",
      "body": "Hi,\r\n\r\nI just found Niri a couple of days ago and it looks amazing! Have been playing around in a VM for some hours and seriously contemplating moving from Debian to Arch just because of it. However, there is a slight concern I have.\r\n\r\nI sync my dotfiles to Git, and I use them both for home and at work to have a near identical setup for home and work, though the monitor setup is a bit different.\r\n\r\nWhat I'm wondering is basically if I will be able to configure all my outputs across both my setups, and Niri will be smart enough to just skip over the ones which are not available?\r\n\r\nThank you in advance",
      "created_at": "2025-10-13T17:54:23Z",
      "updated_at": "2025-10-13T19:14:43Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "avesst",
        "avatar_url": "https://avatars.githubusercontent.com/u/810218?u=af96b682a4409c976b16d08b3d1c4854928958f5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiYEh",
      "number": 2577,
      "title": "Be able to use the AltGr key to activate a key binding",
      "body": "Unlike the [Shift key which causes non-trivial problems](https://github.com/YaLTeR/niri/issues/2390), the [AltGr key](https://en.wikipedia.org/wiki/AltGr_key) has the sole role of allowing additional characters to be typed. I would like that in the interpretation of key bindings, the AltGr key and the non-modifier key are combined according to the active keyboard layout, before the application of the modifier keys (Super, Ctrl, Alt, and [possibly Shift](https://github.com/YaLTeR/niri/issues/2390#issuecomment-3393375547)).\r\n\r\nConcrete use case: with the French layout Ergo-L, `AltGr`+`r` = `+` and `AltGr`+`t` = `-`, and this is the only way to get these two characters on a 50% (or less) keyboard. It would therefore be very appreciated if `Super`+`AltGr`+`t` were interpreted as `Super`+(`AltGr`+`t`) = `Super`+`-` (_set-column-width \"-10%\"_ by default). It would even be possible to adopt for consistency the `Super`+`+` shortcut for _set-column-width \"+10%\"_, especially since the character r and t (and therefore + and - with AltGr) are side by side on Ergo‑L.\r\n\r\nNote that the COSMIC applications don’t do this, but the GNOME and KDE applications do. Firefox also does this, but Discord doesn’t.",
      "created_at": "2025-10-11T14:22:57Z",
      "updated_at": "2025-10-13T18:48:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "idoric",
        "avatar_url": "https://avatars.githubusercontent.com/u/1472992?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiZbk",
      "number": 2588,
      "title": "Ability to map cursor position to window coordinates",
      "body": "When an application is in full-screen mode, I can move my cursor all the way to the top or side of the display to select a tab or interact with the scroll bar. But in windowed mode with gaps on, much more precision is required for such interactions due to the cursor ending up outside the window.\r\n\r\nI would love an option that would \"fake\" the cursor position a window receives by mapping the actual cursor position to the closest point in the focused window.",
      "created_at": "2025-10-12T21:56:38Z",
      "updated_at": "2025-10-13T15:32:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mario-holubar",
        "avatar_url": "https://avatars.githubusercontent.com/u/34423543?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiYQp",
      "number": 2580,
      "title": "Funcionality to make Desktop Pets work (Shijima)",
      "body": "I dont know if this fits into bug or feature Request, but I really would love to have the ability to add Desktop Pets to Niri. For example the ones for [Shijima](https://getshijima.app/).\r\n\r\nThe Issue primarily that I am facing currently when trying to run the Application, is that The Desktop Pet exists only in a black box On the Screen. And that while character is doing his Animations the Window isn't moving Accordingly.",
      "created_at": "2025-10-11T21:15:35Z",
      "updated_at": "2025-10-13T15:06:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Crazyroostereye1",
        "avatar_url": "https://avatars.githubusercontent.com/u/63781667?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiZK0",
      "number": 2586,
      "title": "How to make some (but not all windows) as prefer-no-csd?",
      "body": "I want to make something like this:\r\n```\r\nwindow-rule {\r\n    match app-id=\"(QQ|discord|telegram)\"\r\n    open-on-workspace \"chat\"\r\n    open-focused true\r\n    prefer-no-csd\r\n}\r\n```",
      "created_at": "2025-10-12T18:41:36Z",
      "updated_at": "2025-10-13T05:23:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kamikaze211",
        "avatar_url": "https://avatars.githubusercontent.com/u/16874290?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYJpx",
      "number": 248,
      "title": "allow specifying where to `spawn`",
      "body": "we are now able to bind spawn commands to keybinds, trigger them on login, or script them thru `niri msg action`.\r\nhowever, the current mechanics have new windows spawn in a location depending on the focus workspace and window, while one might imagine wanting to script this otherwise, e.g. to have applications spawned in a specific workspace.\r\nit would be nice if such an option were exposed, if maybe not the highest priority. :)\r\n",
      "created_at": "2024-03-06T11:48:29Z",
      "updated_at": "2025-10-13T05:22:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiUKa",
      "number": 2538,
      "title": "Option to disable focusing windows on click",
      "body": "Hi,\r\n\r\nI'm trying to make Niri work for my ultrawide setup. The option `center-focused-column \"always\"` got me very far, I love how my focus is always in the center in front of me and other windows surround my focus. \r\n\r\nThe only problem that occurs when clicking on a \"secondary\" window, for example when copying text or clicking a button, the focus changes to that other window. That of course is the intended behavior and it makes sense most of the time but in that moment I don't want the focus to change.\r\n\r\nIf there was an option to disable the focus change on click, I could center my focus with the keyboard, click a button on a \"secondary\" window and the focus wouldn't change automatically. Could this be an option in Niri?\r\n\r\nThank you very much!",
      "created_at": "2025-10-07T10:21:00Z",
      "updated_at": "2025-10-12T23:06:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kpko",
        "avatar_url": "https://avatars.githubusercontent.com/u/835010?u=0ba937a3b3936dc9c1f88e3b019d294442d4c257&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiYo6",
      "number": 2585,
      "title": "Tiny nitpick about focus changes across monitors",
      "body": "I have a bit of an odd monitor setup, since my main monitor is a laptop which sits centrally below my two external monitors, which are horizontally adjacent to one another.\r\n\r\nUnfortunately niri does not remember where my focus came from when I move between one of the external monitors and the laptop monitor, and it always moves up to the left monitor when I move focus up from the laptop monitor, even when the focus was previously on the right. I'm guessing I could change this to the right one by default by aligning the monitors differently in config. But it would be great if the focus \"remembered\" where it came from and went back there when switching back up to the external monitors.\r\n\r\nIs there any way to do this? Or would it require a new feature\r\n\r\nEdit: This feature does exist, when I move horizontally between the monitors and the focus has to go between two windows in a column. It just doesn't apply to the separate monitors",
      "created_at": "2025-10-12T13:07:27Z",
      "updated_at": "2025-10-12T17:07:54Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "gabbieblue",
        "avatar_url": "https://avatars.githubusercontent.com/u/93213509?u=99747d291fefd708f92bb561ae8a934636100a1d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiT6S",
      "number": 2537,
      "title": "Animate application launchers and overlays",
      "body": "## The Problem\r\n\r\nNiri's animations look great for regular windows (Firefox, terminals, file managers), but app launchers and overlay components just pop in and out instantly with no animation at all.\r\n\r\nI have smooth animations configured in my config, but when I open Walker, fuzzel, or any other launcher, they just appear immediately. No fade-in, no smooth transition. Same thing when closing them - they just vanish.\r\n\r\n## What Works vs What Doesn't\r\n\r\n**Gets smooth animations:**\r\n- Regular app windows (Firefox, terminals, file managers, etc.)\r\n\r\n**No animations at all:**\r\n- App launchers (Walker, fuzzel, tofi, rofi-wayland)\r\n- Bars and panels\r\n- Notification popups\r\n- Overlay menus\r\n\r\nHere's my current config:\r\n\r\n```kdl\r\nanimations {\r\n    window-open {\r\n        duration-ms 150\r\n        curve \"ease-out-expo\"\r\n    }\r\n\r\n    window-close {\r\n        duration-ms 150\r\n        curve \"ease-out-expo\"\r\n    }\r\n}\r\n```\r\n\r\nWhat actually happens:\r\n- Open Firefox → smooth fade-in animation ✅\r\n- Open Walker launcher → instantly pops in, no animation ❌\r\n- Open foot terminal → smooth fade-in animation ✅\r\n- Open fuzzel launcher → instantly pops in, no animation ❌\r\n\r\n## Why This Happens\r\n\r\nLaunchers and overlays use a different type of window system in Wayland called \"layer-shell\". It's the right way to build these components because it lets them:\r\n- Position themselves anywhere (center, edges, corners)\r\n- Appear on top of fullscreen windows\r\n- Not interfere with your tiling layout\r\n\r\nAll modern launchers use this approach:\r\n- **Walker** - uses gtk4-layer-shell\r\n- **Fuzzel** - recommended in Niri's own docs, uses layer-shell\r\n- **Tofi** - uses layer-shell\r\n- **Rofi-wayland** - uses layer-shell\r\n\r\nThe issue is that Niri's current animation system only animates regular windows, not these layer-shell components.\r\n\r\nYou can verify this yourself - if you run `niri msg windows` while a launcher is open, it won't appear in the list. That's because it's not a regular window, it's a layer-shell surface.\r\n\r\n## What I'd Like to See\r\n\r\nIt would be great if launchers and overlays could fade in and out smoothly, just like regular windows do.\r\n\r\nMaybe something like this in the config:\r\n\r\n```kdl\r\nanimations {\r\n    // For regular windows (already works)\r\n    window-open {\r\n        duration-ms 150\r\n        curve \"ease-out-expo\"\r\n    }\r\n\r\n    // For launchers and overlays (new feature)\r\n    layer-surface-open {\r\n        duration-ms 150\r\n        curve \"ease-out-expo\"\r\n    }\r\n\r\n    layer-surface-close {\r\n        duration-ms 150\r\n        curve \"ease-out-expo\"\r\n    }\r\n}\r\n```\r\n\r\nOr even simpler, just make `window-open`/`window-close` work for launchers too.\r\n\r\n## Why This Matters\r\n\r\n**Launchers are used constantly.** You open and close them dozens of times per day, so the instant pop-in/pop-out really stands out. It feels jarring compared to the smooth animations everywhere else.\r\n\r\nThis affects everything that uses layer-shell:\r\n- App launchers (biggest issue)\r\n- Notification popups\r\n- Status bars and panels\r\n- Any overlay menus\r\n\r\nFor context, GNOME's compositor (Mutter) does animate these components, so users coming from GNOME notice this immediately.\r\n\r\n## Possible Solutions\r\n\r\nA few ways this could work:\r\n\r\n**Option 1: Separate config for overlays**\r\n```kdl\r\nlayer-surface-open { ... }\r\nlayer-surface-close { ... }\r\n```\r\nThis lets you set different animations for overlays vs regular windows.\r\n\r\n**Option 2: Make existing animations work for everything**\r\nJust extend `window-open`/`window-close` to also animate launchers. Simpler config, everything animates the same way.\r\n\r\n**Option 3: Add it to layer-rules**\r\nAdd animation settings to the existing `layer-rule` blocks, so you can control animations per-app.\r\n\r\n## Current Workarounds\r\n\r\nThere aren't any. I tried:\r\n- Changing layer-shell anchor settings → doesn't help, still no animation\r\n- Using `layer-rule` properties → only has opacity/shadow/corners, no animations\r\n- Switching to different launchers → they all use layer-shell, same problem\r\n\r\n## My Setup\r\n\r\n- **Niri version**: 25.08\r\n- **OS**: Manjaro Linux\r\n- **Launchers tested**: Walker 1.2.1, fuzzel, tofi\r\n\r\n## More Info\r\n\r\nSome helpful links if you want to dig deeper:\r\n- [Layer-shell protocol docs](https://wayland.app/protocols/wlr-layer-shell-unstable-v1)\r\n- [Niri animations wiki](https://github.com/YaLTeR/niri/wiki/Configuration:-Animations)\r\n- [Niri layer-rules wiki](https://github.com/YaLTeR/niri/wiki/Configuration:-Layer-Rules)\r\n\r\n---\r\n\r\nJust to be clear: this isn't a bug! Niri works great and implements everything correctly. This is just a feature request to bring the same beautiful animations that regular windows have to launchers and overlays.\r\n\r\nI love Niri's animation system - it's one of the main reasons I use it. Having launcher animations would make the whole experience feel even more polished and consistent.\r\n\r\nThanks for considering this! 🚀",
      "created_at": "2025-10-07T04:59:03Z",
      "updated_at": "2025-10-12T16:08:35Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "callmehanu",
        "avatar_url": "https://avatars.githubusercontent.com/u/13230502?u=4e7fef4f897060dc7abcd3d6e09e4b0d918eb747&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiYFB",
      "number": 2578,
      "title": "Vertical Window Positioning/Focus",
      "body": "I have two different questions, both related to window movement and positioning.\r\n\r\n1. **Vertical Workspace Navigation in Overview Mode**\r\nIn overview mode, I can focus and move windows horizontally within the same workspace using `Super+h/l` and `Super+Ctrl+h/l`.\r\nHowever, to switch between workspaces vertically, I currently need to use `Super+1/2/3...` or the arrow keys.\r\nI’d prefer to navigate vertically with `Super+k/j`, so all keybindings follow the vim-style layout. (While still keeping the option of switching to a specific workspace with `Super+1/2/3...`)\r\nCurrently, `Super+k/j` only works for focusing windows in the same workspace, not for switching workspaces.\r\n\r\n2. **Vertical Window Movement Across Workspaces**\r\nI can focus and move windows horizontally within the same workspace using `Super+h/l` and `Super+Ctrl+h/l`, and swap vertically-aligned windows.\r\nBut moving windows between workspaces vertically (up/down) isn’t possible.\r\nI’d like the ability to move windows to the next/previous workspace using `Super+Ctrl+j/k`.\r\n\r\nThe following screenshots illustrates this. The red arrows indicate how I can currently focus or move windows using vim-style keybinds, the green arrows indicate that I cant jump to the next or previous workspace or move a window to the next or previous workspace using vim-style keybinds.\r\n\r\n<img width=\"2603\" height=\"1518\" alt=\"Window Movement\" src=\"https://github.com/user-attachments/assets/7d8fd314-a133-4181-a9a3-bf1c3b8a220d\" />\r\n\r\nCurrently, my niri config looks like this:\r\n\r\n```kdl\r\n// This config is in the KDL format: https://kdl.dev\r\n// \"/-\" comments out the following node.\r\n// Check the wiki for a full description of the configuration:\r\n// https://yalter.github.io/niri/Configuration:-Introduction\r\n\r\noverview {\r\n    zoom 0.35    \r\n}\r\n// Input device configuration.\r\n// Find the full list of options on the wiki:\r\n// https://yalter.github.io/niri/Configuration:-Input\r\ninput {\r\n    keyboard {\r\n        xkb {\r\n            // You can set rules, model, layout, variant and options.\r\n            // For more information, see xkeyboard-config(7).\r\n\r\n            // For example:\r\n            layout \"eu\"\r\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\r\n\r\n            // If this section is empty, niri will fetch xkb settings\r\n            // from org.freedesktop.locale1. You can control these using\r\n            // localectl set-x11-keymap.\r\n        }\r\n        // Keyboard repeat rate and delay\r\n        repeat-delay 200\r\n        repeat-rate 35\r\n        // Enable numlock on startup, omitting this setting disables it.\r\n        numlock\r\n    }\r\n\r\n    // Next sections include libinput settings.\r\n    // Omitting settings disables them, or leaves them at their default values.\r\n    // All commented-out settings here are examples, not defaults.\r\n    touchpad {\r\n        // off\r\n        tap\r\n        // dwt\r\n        // dwtp\r\n        // drag false\r\n        // drag-lock\r\n        // natural-scroll \r\n        // accel-speed 0.2\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"two-finger\"\r\n        // disabled-on-external-mouse\r\n    }\r\n\r\n    mouse {\r\n        // off\r\n        // natural-scroll\r\n        // accel-speed 0.2\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"no-scroll\"\r\n    }\r\n\r\n    trackpoint {\r\n        // off\r\n        // natural-scroll\r\n        // accel-speed 0.2\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"on-button-down\"\r\n        // scroll-button 273\r\n        // scroll-button-lock\r\n        // middle-emulation\r\n    }\r\n\r\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\r\n    // warp-mouse-to-focus\r\n\r\n    // Focus windows and outputs automatically when moving the mouse into them.\r\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\r\n    // focus-follows-mouse max-scroll-amount=\"0%\"\r\n}\r\n\r\n// You can configure outputs by their name, which you can find\r\n// by running `niri msg outputs` while inside a niri instance.\r\n// The built-in laptop monitor is usually called \"eDP-1\".\r\n// Find more information on the wiki:\r\n// https://yalter.github.io/niri/Configuration:-Outputs\r\n// Remember to uncomment the node by removing \"/-\"!\r\n/-output \"eDP-1\" {\r\n    // Uncomment this line to disable this output.\r\n    // off\r\n\r\n    // Resolution and, optionally, refresh rate of the output.\r\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\r\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\r\n    // for the resolution.\r\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\r\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\r\n    mode \"1920x1080@120.030\"\r\n\r\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\r\n    scale 2\r\n\r\n    // Transform allows to rotate the output counter-clockwise, valid values are:\r\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\r\n    transform \"normal\"\r\n\r\n    // Position of the output in the global coordinate space.\r\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\r\n    // The cursor can only move between directly adjacent outputs.\r\n    // Output scale and rotation has to be taken into account for positioning:\r\n    // outputs are sized in logical, or scaled, pixels.\r\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\r\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\r\n    // If the position is unset or results in an overlap, the output is instead placed\r\n    // automatically.\r\n    position x=1280 y=0\r\n}\r\n\r\n// Settings that influence how windows are positioned and sized.\r\n// Find more information on the wiki:\r\n// https://yalter.github.io/niri/Configuration:-Layout\r\nlayout {\r\n    // Set gaps around windows in logical pixels.\r\n    gaps 16\r\n\r\n    // When to center a column when changing focus, options are:\r\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\r\n    //   or right edge of the screen.\r\n    // - \"always\", the focused column will always be centered.\r\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\r\n    //   together with the previously focused column.\r\n    center-focused-column \"never\"\r\n\r\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\r\n    preset-column-widths {\r\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\r\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\r\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\r\n        proportion 0.33333\r\n        proportion 0.5\r\n        proportion 0.66667\r\n\r\n        // Fixed sets the width in logical pixels exactly.\r\n        // fixed 1920\r\n    }\r\n\r\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\r\n    // preset-window-heights { }\r\n\r\n    // You can change the default width of the new windows.\r\n    default-column-width { proportion 0.5; }\r\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\r\n    // default-column-width {}\r\n\r\n    // By default focus ring and border are rendered as a solid background rectangle\r\n    // behind windows. That is, they will show up through semitransparent windows.\r\n    // This is because windows using client-side decorations can have an arbitrary shape.\r\n    //\r\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\r\n    // Niri will draw focus ring and border *around* windows that agree to omit their\r\n    // client-side decorations.\r\n    //\r\n    // Alternatively, you can override it with a window rule called\r\n    // `draw-border-with-background`.\r\n\r\n    // You can change how the focus ring looks.\r\n    focus-ring {\r\n        // Uncomment this line to disable the focus ring.\r\n        // off\r\n\r\n        // How many logical pixels the ring extends out from the windows.\r\n        width 4\r\n\r\n        // Colors can be set in a variety of ways:\r\n        // - CSS named colors: \"red\"\r\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\r\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\r\n\r\n        // Color of the ring on the active monitor.\r\n        active-color \"#7fc8ff\"\r\n\r\n        // Color of the ring on inactive monitors.\r\n        //\r\n        // The focus ring only draws around the active window, so the only place\r\n        // where you can see its inactive-color is on other monitors.\r\n        inactive-color \"#505050\"\r\n\r\n        // You can also use gradients. They take precedence over solid colors.\r\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\r\n        // The angle is the same as in linear-gradient, and is optional,\r\n        // defaulting to 180 (top-to-bottom gradient).\r\n        // You can use any CSS linear-gradient tool on the web to set these up.\r\n        // Changing the color space is also supported, check the wiki for more info.\r\n        //\r\n        // active-gradient from=\"#80c8ff\" to=\"#c7ff7f\" angle=45\r\n\r\n        // You can also color the gradient relative to the entire view\r\n        // of the workspace, rather than relative to just the window itself.\r\n        // To do that, set relative-to=\"workspace-view\".\r\n        //\r\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\r\n    }\r\n\r\n    // You can also add a border. It's similar to the focus ring, but always visible.\r\n    border {\r\n        // The settings are the same as for the focus ring.\r\n        // If you enable the border, you probably want to disable the focus ring.\r\n        off\r\n\r\n        width 4\r\n        active-color \"#ffc87f\"\r\n        inactive-color \"#505050\"\r\n\r\n        // Color of the border around windows that request your attention.\r\n        urgent-color \"#9b0000\"\r\n\r\n        // Gradients can use a few different interpolation color spaces.\r\n        // For example, this is a pastel rainbow gradient via in=\"oklch longer hue\".\r\n        //\r\n        // active-gradient from=\"#e5989b\" to=\"#ffb4a2\" angle=45 relative-to=\"workspace-view\" in=\"oklch longer hue\"\r\n\r\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\r\n    }\r\n\r\n    // You can enable drop shadows for windows.\r\n    shadow {\r\n        // Uncomment the next line to enable shadows.\r\n        // on\r\n\r\n        // By default, the shadow draws only around its window, and not behind it.\r\n        // Uncomment this setting to make the shadow draw behind its window.\r\n        //\r\n        // Note that niri has no way of knowing about the CSD window corner\r\n        // radius. It has to assume that windows have square corners, leading to\r\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\r\n        // those artifacts.\r\n        //\r\n        // However, instead you may want to set prefer-no-csd and/or\r\n        // geometry-corner-radius. Then, niri will know the corner radius and\r\n        // draw the shadow correctly, without having to draw it behind the\r\n        // window. These will also remove client-side shadows if the window\r\n        // draws any.\r\n        //\r\n        // draw-behind-window true\r\n\r\n        // You can change how shadows look. The values below are in logical\r\n        // pixels and match the CSS box-shadow properties.\r\n\r\n        // Softness controls the shadow blur radius.\r\n        softness 30\r\n\r\n        // Spread expands the shadow.\r\n        spread 5\r\n\r\n        // Offset moves the shadow relative to the window.\r\n        offset x=0 y=5\r\n\r\n        // You can also change the shadow color and opacity.\r\n        color \"#0007\"\r\n    }\r\n\r\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\r\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\r\n    // Left and right struts will cause the next window to the side to always be visible.\r\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\r\n    // layer-shell panels and regular gaps.\r\n    struts {\r\n        // left 64\r\n        // right 64\r\n        // top 64\r\n        // bottom 64\r\n    }\r\n}\r\n\r\n// Add lines like this to spawn processes at startup.\r\n// Note that running niri as a session supports xdg-desktop-autostart,\r\n// which may be more convenient to use.\r\n// See the binds section below for more spawn examples.\r\n\r\n// This line starts waybar, a commonly used bar for Wayland compositors.\r\nspawn-at-startup \"swaybg -m fill -i /home/void/Pictures/Wallpapers/pluto.jpg\"\r\nspawn-at-startup \"waybar\"\r\n\r\n// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:\r\n// spawn-sh-at-startup \"qs -c ~/source/qs/MyAwesomeShell\"\r\n\r\nhotkey-overlay {\r\n    // Uncomment this line to disable the \"Important Hotkeys\" pop-up at startup.\r\n    // skip-at-startup\r\n}\r\n\r\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\r\n// If the client will specifically ask for CSD, the request will be honored.\r\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\r\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\r\n// After enabling or disabling this, you need to restart the apps for this to take effect.\r\n// prefer-no-csd\r\n\r\n// You can change the path where screenshots are saved.\r\n// A ~ at the front will be expanded to the home directory.\r\n// The path is formatted with strftime(3) to give you the screenshot date and time.\r\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\r\n\r\n// You can also set this to null to disable saving screenshots to disk.\r\n// screenshot-path null\r\n\r\n// Animation settings.\r\n// The wiki explains how to configure individual animations:\r\n// https://yalter.github.io/niri/Configuration:-Animations\r\nanimations {\r\n    // Uncomment to turn off all animations.\r\n    // off\r\n\r\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\r\n    // slowdown 3.0\r\n}\r\n\r\n// Window rules let you adjust behavior for individual windows.\r\n// Find more information on the wiki:\r\n// https://yalter.github.io/niri/Configuration:-Window-Rules\r\n\r\n// Work around WezTerm's initial configure bug\r\n// by setting an empty default-column-width.\r\nwindow-rule {\r\n    // This regular expression is intentionally made as specific as possible,\r\n    // since this is the default config, and we want no false positives.\r\n    // You can get away with just app-id=\"wezterm\" if you want.\r\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\r\n    default-column-width {}\r\n}\r\n\r\n// Open the Firefox picture-in-picture player as floating by default.\r\nwindow-rule {\r\n    // This app-id regular expression will work for both:\r\n    // - host Firefox (app-id is \"firefox\")\r\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\r\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\r\n    open-floating true\r\n}\r\n\r\nwindow-rule {\r\n    match app-id=r#\"ghostty\\.wiremix$\"#\r\n    open-floating true\r\n    default-column-width { fixed 800; }\r\n    default-window-height { fixed 600; }\r\n}\r\n\r\nwindow-rule {\r\n    match app-id=r#\"ghostty\\.impala$\"#\r\n    open-floating true\r\n    default-column-width { fixed 800; }\r\n    default-window-height { fixed 600; }\r\n}\r\n\r\nwindow-rule {\r\n    match app-id=r#\"ghostty\\.bluetui$\"#\r\n    open-floating true\r\n    default-column-width { fixed 800; }\r\n    default-window-height { fixed 600; }\r\n}\r\n\r\n\r\n// Example: block out two password managers from screen capture.\r\n// (This example rule is commented out with a \"/-\" in front.)\r\n/-window-rule {\r\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\r\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\r\n\r\n    block-out-from \"screen-capture\"\r\n\r\n    // Use this instead if you want them visible on third-party screenshot tools.\r\n    // block-out-from \"screencast\"\r\n}\r\n\r\n// Example: enable rounded corners for all windows.\r\n// (This example rule is commented out with a \"/-\" in front.)\r\n// /-window-rule {\r\n    // geometry-corner-radius 12\r\n    // clip-to-geometry true\r\n// }\r\n\r\nbinds {\r\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\r\n    // in the end. To find an XKB name for a particular key, you may use a program\r\n    // like wev.\r\n    //\r\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\r\n    // when running as a winit window.\r\n    //\r\n    // Most actions that you can bind here can also be invoked programmatically with\r\n    // `niri msg action do-something`.\r\n\r\n    // Mod-Shift-/, which is usually the same as Mod-?,\r\n    // shows a list of important hotkeys.\r\n    Mod+Shift+Slash { show-hotkey-overlay; }\r\n\r\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\r\n    Mod+Return hotkey-overlay-title=\"Open a Terminal: ghostty\" { spawn \"ghostty\"; }\r\n    Mod+Space hotkey-overlay-title=\"Run an Application: fuzzel\" { spawn \"fuzzel\"; }\r\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\r\n\r\n    // Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.\r\n    // Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.\r\n    // For example, this is a standard bind to toggle the screen reader (orca).\r\n    Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh \"pkill orca || exec orca\"; }\r\n\r\n    // Example volume keys mappings for PipeWire & WirePlumber.\r\n    // The allow-when-locked=true property makes them work even when the session is locked.\r\n    // Using spawn-sh allows to pass multiple arguments together with the command.\r\n    XF86AudioRaiseVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+\"; }\r\n    XF86AudioLowerVolume allow-when-locked=true { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-\"; }\r\n    XF86AudioMute        allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\"; }\r\n    XF86AudioMicMute     allow-when-locked=true { spawn-sh \"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\"; }\r\n\r\n    // Example brightness key mappings for brightnessctl.\r\n    // You can use regular spawn with multiple arguments too (to avoid going through \"sh\"),\r\n    // but you need to manually put each argument in separate \"\" quotes.\r\n    XF86MonBrightnessUp allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"+10%\"; }\r\n    XF86MonBrightnessDown allow-when-locked=true { spawn \"brightnessctl\" \"--class=backlight\" \"set\" \"10%-\"; }\r\n\r\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\r\n    // You can also move the mouse into the top-left hot corner,\r\n    // or do a four-finger swipe up on a touchpad.\r\n    Mod+O repeat=false { toggle-overview; }\r\n\r\n    Mod+Q repeat=false { close-window; }\r\n\r\n    Mod+Left  { focus-column-left; }\r\n    Mod+Down  { focus-window-down; }\r\n    Mod+Up    { focus-window-up; }\r\n    Mod+Right { focus-column-right; }\r\n    Mod+H     { focus-column-left; }\r\n    Mod+J     { focus-window-down; }\r\n    Mod+K     { focus-window-up; }\r\n    Mod+L     { focus-column-right; }\r\n\r\n    Mod+Ctrl+Left  { move-column-left; }\r\n    Mod+Ctrl+Down  { move-window-down; }\r\n    Mod+Ctrl+Up    { move-window-up; }\r\n    Mod+Ctrl+Right { move-column-right; }\r\n    Mod+Ctrl+H     { move-column-left; }\r\n    Mod+Ctrl+J     { move-window-down; }\r\n    Mod+Ctrl+K     { move-window-up; }\r\n    Mod+Ctrl+L     { move-column-right; }\r\n\r\n    // Alternative commands that move across workspaces when reaching\r\n    // the first or last window in a column.\r\n    // Mod+J     { focus-window-or-workspace-down; }\r\n    // Mod+K     { focus-window-or-workspace-up; }\r\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\r\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\r\n\r\n    Mod+Home { focus-column-first; }\r\n    Mod+End  { focus-column-last; }\r\n    Mod+Ctrl+Home { move-column-to-first; }\r\n    Mod+Ctrl+End  { move-column-to-last; }\r\n\r\n    Mod+Shift+Left  { focus-monitor-left; }\r\n    Mod+Shift+Down  { focus-monitor-down; }\r\n    Mod+Shift+Up    { focus-monitor-up; }\r\n    Mod+Shift+Right { focus-monitor-right; }\r\n    Mod+Shift+H     { focus-monitor-left; }\r\n    Mod+Shift+J     { focus-monitor-down; }\r\n    Mod+Shift+K     { focus-monitor-up; }\r\n    Mod+Shift+L     { focus-monitor-right; }\r\n\r\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\r\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\r\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\r\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\r\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\r\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\r\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\r\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\r\n\r\n    // Alternatively, there are commands to move just a single window:\r\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\r\n    // ...\r\n\r\n    // And you can also move a whole workspace to another monitor:\r\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\r\n    // ...\r\n\r\n    Mod+Page_Down      { focus-workspace-down; }\r\n    Mod+Page_Up        { focus-workspace-up; }\r\n    Mod+U              { focus-workspace-down; }\r\n    Mod+I              { focus-workspace-up; }\r\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\r\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\r\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\r\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\r\n\r\n    // Alternatively, there are commands to move just a single window:\r\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\r\n    // ...\r\n\r\n    Mod+Shift+Page_Down { move-workspace-down; }\r\n    Mod+Shift+Page_Up   { move-workspace-up; }\r\n    Mod+Shift+U         { move-workspace-down; }\r\n    Mod+Shift+I         { move-workspace-up; }\r\n\r\n    // You can bind mouse wheel scroll ticks using the following syntax.\r\n    // These binds will change direction based on the natural-scroll setting.\r\n    //\r\n    // To avoid scrolling through workspaces really fast, you can use\r\n    // the cooldown-ms property. The bind will be rate-limited to this value.\r\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\r\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\r\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\r\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\r\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\r\n\r\n    Mod+WheelScrollRight      { focus-column-right; }\r\n    Mod+WheelScrollLeft       { focus-column-left; }\r\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\r\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\r\n\r\n    // Usually scrolling up and down with Shift in applications results in\r\n    // horizontal scrolling; these binds replicate that.\r\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\r\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\r\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\r\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\r\n\r\n    // Similarly, you can bind touchpad scroll \"ticks\".\r\n    // Touchpad scrolling is continuous, so for these binds it is split into\r\n    // discrete intervals.\r\n    // These binds are also affected by touchpad's natural-scroll, so these\r\n    // example binds are \"inverted\", since we have natural-scroll enabled for\r\n    // touchpads by default.\r\n    // Mod+TouchpadScrollDown { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+\"; }\r\n    // Mod+TouchpadScrollUp   { spawn-sh \"wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-\"; }\r\n\r\n    // You can refer to workspaces by index. However, keep in mind that\r\n    // niri is a dynamic workspace system, so these commands are kind of\r\n    // \"best effort\". Trying to refer to a workspace index bigger than\r\n    // the current workspace count will instead refer to the bottommost\r\n    // (empty) workspace.\r\n    //\r\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\r\n    // will all refer to the 3rd workspace.\r\n    Mod+1 { focus-workspace 1; }\r\n    Mod+2 { focus-workspace 2; }\r\n    Mod+3 { focus-workspace 3; }\r\n    Mod+4 { focus-workspace 4; }\r\n    Mod+5 { focus-workspace 5; }\r\n    Mod+6 { focus-workspace 6; }\r\n    Mod+7 { focus-workspace 7; }\r\n    Mod+8 { focus-workspace 8; }\r\n    Mod+9 { focus-workspace 9; }\r\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\r\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\r\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\r\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\r\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\r\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\r\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\r\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\r\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\r\n\r\n    // Alternatively, there are commands to move just a single window:\r\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\r\n\r\n    // Switches focus between the current and the previous workspace.\r\n    // Mod+Tab { focus-workspace-previous; }\r\n\r\n    // The following binds move the focused window in and out of a column.\r\n    // If the window is alone, they will consume it into the nearby column to the side.\r\n    // If the window is already in a column, they will expel it out.\r\n    Mod+BracketLeft  { consume-or-expel-window-left; }\r\n    Mod+BracketRight { consume-or-expel-window-right; }\r\n\r\n    // Consume one window from the right to the bottom of the focused column.\r\n    Mod+Comma  { consume-window-into-column; }\r\n    // Expel the bottom window from the focused column to the right.\r\n    Mod+Period { expel-window-from-column; }\r\n\r\n    Mod+R { switch-preset-column-width; }\r\n    // Cycling through the presets in reverse order is also possible.\r\n    // Mod+R { switch-preset-column-width-back; }\r\n    Mod+Shift+R { switch-preset-window-height; }\r\n    Mod+Ctrl+R { reset-window-height; }\r\n    Mod+F { maximize-column; }\r\n    Mod+Shift+F { fullscreen-window; }\r\n\r\n    // Expand the focused column to space not taken up by other fully visible columns.\r\n    // Makes the column \"fill the rest of the space\".\r\n    Mod+Ctrl+F { expand-column-to-available-width; }\r\n\r\n    Mod+C { center-column; }\r\n\r\n    // Center all fully visible columns on screen.\r\n    Mod+Ctrl+C { center-visible-columns; }\r\n\r\n    // Finer width adjustments.\r\n    // This command can also:\r\n    // * set width in pixels: \"1000\"\r\n    // * adjust width in pixels: \"-5\" or \"+5\"\r\n    // * set width as a percentage of screen width: \"25%\"\r\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\r\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\r\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\r\n    Mod+Minus { set-column-width \"-10%\"; }\r\n    Mod+Equal { set-column-width \"+10%\"; }\r\n\r\n    // Finer height adjustments when in column with other windows.\r\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\r\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\r\n\r\n    // Move the focused window between the floating and the tiling layout.\r\n    Mod+V       { toggle-window-floating; }\r\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\r\n\r\n    // Toggle tabbed column display mode.\r\n    // Windows in this column will appear as vertical tabs,\r\n    // rather than stacked on top of each other.\r\n    Mod+W { toggle-column-tabbed-display; }\r\n\r\n    // Actions to switch layouts.\r\n    // Note: if you uncomment these, make sure you do NOT have\r\n    // a matching layout switch hotkey configured in xkb options above.\r\n    // Having both at once on the same hotkey will break the switching,\r\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\r\n    // Mod+Space       { switch-layout \"next\"; }\r\n    // Mod+Shift+Space { switch-layout \"prev\"; }\r\n\r\n    Print { screenshot; }\r\n    Ctrl+Print { screenshot-screen; }\r\n    Alt+Print { screenshot-window; }\r\n\r\n    // Applications such as remote-desktop clients and software KVM switches may\r\n    // request that niri stops processing the keyboard shortcuts defined here\r\n    // so they may, for example, forward the key presses as-is to a remote machine.\r\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\r\n    // so a buggy application can't hold your session hostage.\r\n    //\r\n    // The allow-inhibiting=false property can be applied to other binds as well,\r\n    // which ensures niri always processes them, even when an inhibitor is active.\r\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\r\n\r\n    // The quit action will show a confirmation dialog to avoid accidental exits.\r\n    Mod+Shift+E { quit; }\r\n    Ctrl+Alt+Delete { quit; }\r\n\r\n    // Powers off the monitors. To turn them back on, do any input like\r\n    // moving the mouse or pressing any other key.\r\n    Mod+Shift+P { power-off-monitors; }\r\n}\r\n```",
      "created_at": "2025-10-11T14:38:44Z",
      "updated_at": "2025-10-12T13:59:59Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3528",
        "body": "For (1) I think what you're looking for is replacing\r\n`focus-window-down` -> `focus-window-or-workspace-down`\r\n`focus-window-up` -> `focus-window-or-workspace-up`\r\n\r\nFor (2) you can replace\r\n`move-window-down` -> `move-window-down-or-to-workspace-down`\r\n`move-window-up` -> `move-window-up-or-to-workspace-up`\r\n\r\nPersonally, I think it's similarly worth replacing the `move-window-left/right` with `consume-or-expel-window-left/right` since it covers more use cases but ymmv.\r\n"
      },
      "user": {
        "login": "766F6964",
        "avatar_url": "https://avatars.githubusercontent.com/u/34845270?u=93d2efed816eb89dffd1989c0376ca51e1abd7bf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeP8B",
      "number": 1096,
      "title": "window picker script!",
      "body": "hi! ive been looking  around for a  script that would do menu-based window picking, and couldnt find anything, so i made it myself!!\r\n\r\nheres my solution, if anyone ends up needing something like this ^^\r\n\r\n```bash\r\n#!/bin/sh\r\n\r\nwindow_list=$(niri msg --json windows)\r\nname=$(echo $window_list | jq -r '.[] | .\"title\"' | fuzzel --dmenu)\r\nid=$(echo $window_list | jq -r '.[] | .\"title\", .\"id\"' | grep \"$name\" -x -A 1 | grep \"$name\" -vx)\r\n\r\necho $id\r\necho $name\r\n\r\nniri msg action focus-window --id $id\r\n```\r\n\r\nit uses fuzzel but of course it can be  changed to any  menu ^^",
      "created_at": "2025-02-07T21:06:37Z",
      "updated_at": "2025-10-12T12:44:33Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "not-fiore",
        "avatar_url": "https://avatars.githubusercontent.com/u/174471448?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgJ1H",
      "number": 1744,
      "title": "New movement commands: `move-window-or-monitor{up,down}`",
      "body": "Profusely sorry if you already have this. I combed through the `niri msg action` and documentation and couldn't find them.\r\n\r\nYou already have some commands similar to this, `focus-{window}-or-monitor-{up,down}`. I'd like something like this for moving as well. It would simplify my keybinds a lot. Looks like you do already have `move-column-{left,right}-or-to-monitor-{left,right}`, but my monitors are vertically stacked so these don't help me much.",
      "created_at": "2025-06-08T02:02:27Z",
      "updated_at": "2025-10-12T10:32:59Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "deadbody13",
        "avatar_url": "https://avatars.githubusercontent.com/u/57448148?u=24378a66eb085665f17964aba26e46f962d4b3e0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiXtj",
      "number": 2568,
      "title": "Previous Window Switch",
      "body": "is there some kind of alt+tab thing for niri to switch to the previous window?",
      "created_at": "2025-10-10T22:09:35Z",
      "updated_at": "2025-10-12T02:03:27Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "jgarte",
        "avatar_url": "https://avatars.githubusercontent.com/u/47760695?u=bc9ed47f1342d713d4456dd7635e79456d26eb2f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag4hW",
      "number": 2107,
      "title": "FullScreen Overview",
      "body": "Hi. Sorry if this is a duplicate idea...\r\n\r\nWhen I looked at Niri as a non-Niri user, I thought I could set up the overview so that I could see every window in every workspace.\r\nFor example, if I had 100 windows open, they would take up the entire screen and I could navigate through them like a map XD.\r\n\r\nMy idea: add a feature that would allow you to enter the overview mode at a \"zoom\" so that the user could see every window (even if it would look weird and the windows would be too small).\r\n\r\nI believe its possible with scripting and making zoom adjusted by calculated value?",
      "created_at": "2025-07-22T11:55:19Z",
      "updated_at": "2025-10-11T16:21:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "skelitheprogrammer",
        "avatar_url": "https://avatars.githubusercontent.com/u/47909066?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiW9r",
      "number": 2561,
      "title": "Add deadzone to focus-follows-mouse",
      "body": "Hello!\r\n\r\nI like the focus-follows-mouse feature but not the max-scroll-amount sub-feature.\r\nIn addition to the max-scroll-amount, I'd like a deadzone specified by either pixels or percentage by which the user can move the mouse up to the deadzone amount into the neighboring window without triggering a change of focus and thus no scroll either.\r\n\r\nThe mouse can interact with the neighboring window while it is within the deadzone, so the deadzone is only for the focus-follows-mouse feature. For example, let's say the deadzone is 20px. and you move the mouse past the currently-focused window into the neighboring window to the left by 10px. You can use gestures to scroll the window to the left up and down but the window to the left still does not gain focus from the focus-follows-mouse feature. You can click on the window to the left while in the deadzone, which forces it to gain focus.\r\n\r\nBasically, the deadzone allows a bit of overshoot past the edge of a window.\r\n\r\nThanks!\r\n",
      "created_at": "2025-10-10T04:27:04Z",
      "updated_at": "2025-10-10T04:27:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dchang0",
        "avatar_url": "https://avatars.githubusercontent.com/u/8884074?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiWdi",
      "number": 2558,
      "title": "power settings - no icons, no function",
      "body": "The three power buttons in the ControlCenter popup are not properly displayed. They also have no function, nothing happens.\r\nWhat package might be missing?\r\n[openSUSE Tumbleweed on Dell XPS 13]",
      "created_at": "2025-10-09T15:03:13Z",
      "updated_at": "2025-10-10T02:56:30Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "bobblkabb",
        "avatar_url": "https://avatars.githubusercontent.com/u/7815101?u=30f6d40c7d0361f14b6b239e13a9a72a18d59972&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgXlT",
      "number": 1894,
      "title": "Add window-rule matcher is-fullscreen",
      "body": "Currently all supported matchers for window-rules are the following (according to the wiki):\r\n```kdl\r\nwindow-rule {\r\n    match title=\"Firefox\"\r\n    match app-id=\"Alacritty\"\r\n    match is-active=true\r\n    match is-focused=false\r\n    match is-active-in-column=true\r\n    match is-floating=true\r\n    match is-window-cast-target=true\r\n    match is-urgent=true\r\n    match at-startup=true\r\n}\r\n```\r\n\r\nI am missing a boolean matcher is-fullscreen here. I think there should also be an indicator which windows are currently fullscreen when requesting windows via `niri msg windows`",
      "created_at": "2025-06-23T16:04:00Z",
      "updated_at": "2025-10-09T19:21:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Tordarus",
        "avatar_url": "https://avatars.githubusercontent.com/u/1444581?u=69a3821f3709bb939bb746fb78e5828ff7bf3df9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiWbg",
      "number": 2556,
      "title": "Планы по развитию проекта",
      "body": "Привет, в первую очередь хотел выказать благодарность и уважение твоему проекту. \r\nИ хотел поинтересоваться  о дальнейшем развитии проекта. Планируешь ли создавать экосистему как у Hyprland или Sway? Если да, то какие утилиты будут в приоритете? Заранее спасибо",
      "created_at": "2025-10-09T14:30:45Z",
      "updated_at": "2025-10-09T16:03:58Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "c0nsent",
        "avatar_url": "https://avatars.githubusercontent.com/u/154588218?u=04dc79062a81807b0ff36b094bae7a25329a6310&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgrbI",
      "number": 2002,
      "title": "Block Mod-bindings from being delivered to certain clients (by a window rule)",
      "body": "During my day job, I have to visit several Windows machines using RDP (I use remina as RDP client).  My problem is that all niri key bindings (`Mod+<whatever>`) are also (or sometimes only?) received by the Windows host if the remmina RDP window has focus and cause trouble there.  In the best case, the Windows start menu pops up but what's really annoying to me is that my `focus-column-or-monitor-right` binding `Mod+N` triggers locking the Windows machine (at least on some systems).  And given the fact that copy&pasting passwords into the Windows lock screen doesn't work, I find myself typing longish, cryptic strings every so often.\r\n\r\nSo for the time being, I have to be extremely careful that when the RDP window is focused, I need to use the mouse to focus some other window before invoking any niri key binding.\r\n\r\nIt would be awesome if I could use a window rule targeting remmina RDP windows to somehow block them from receiving any Mod-binding.  Or actually, if feasible, it would be best if I could block all niri bindings from being delivered.  For example, it seems that I also cannot invoke the niri screenshot tool with `Print` when the RDP window has focus (again, at least with RDP to some Windows machines).",
      "created_at": "2025-07-11T04:54:32Z",
      "updated_at": "2025-10-09T11:31:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tsdh",
        "avatar_url": "https://avatars.githubusercontent.com/u/103854?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiVnk",
      "number": 2554,
      "title": "[Feature Request] - Window Fullscreen Requested",
      "body": "While working on a script to solve https://github.com/YaLTeR/niri/issues/426, I've reached a blocker. The script aims to keep correct track of window positions across columns and workspaces by consuming the niri event stream. \r\n\r\nHowever, an \"intentional move right\" of a window executed by the user is indistinguishable from a \"window expelled right\" by niri before it goes fullscreen, when the layout has more than one window and there's no other window to the right. In other cases, I've managed to compare the windows that were in place before and which ones are not, and I could draw a conclusion, but it's still far from efficient.\r\n\r\nWould you consider introducing a new event to make this possible? It would be triggered right before a `WindowsLayoutChanged`.\r\n\r\n---\r\n\r\nN.B. in the meantime, I'll try a different approach: the same script will still consume the event stream to keep track of window positions, but another process will listen to user inputs that will intercept fullscreen requests and persist all the required info before invoking `niri msg action fullscreen-window --id <ID>`. It's still far from ideal, but it's the best idea I've got for now.",
      "created_at": "2025-10-08T19:59:20Z",
      "updated_at": "2025-10-09T10:38:56Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "gvolpe",
        "avatar_url": "https://avatars.githubusercontent.com/u/443978?u=d9845904b6660ab20563d305d83e60a178506f9b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiU-d",
      "number": 2549,
      "title": "portals confusion",
      "body": "Got this in my config.kdl:\r\n```\r\nspawn-at-startup \"/usr/libexec/xdg-desktop-portal-gtk\"\r\nspawn-at-startup \"/usr/libexec/xdg-desktop-portal-gnome\"\r\n```\r\n\r\nAnd this is my niri-portals.conf:\r\n```\r\n[preferred]\r\ndefault=gtk;\r\norg.freedesktop.impl.portal.Access=gtk;\r\norg.freedesktop.impl.portal.Notification=gtk;\r\norg.freedesktop.impl.portal.Secret=gnome-keyring;\r\norg.freedesktop.impl.portal.ScreenCast\r\n```\r\n\r\nSeems to work, I can copy and it appears in cliphist and file dialog in firefox works (used to have problems at the beginning).\r\nStill I can't use screenrecording in noctalia-shell. There's no error message when I hit the screenrecord button. \r\nWhat am I doing wrong? What can I check?\r\n\r\nUsing latest niri version and latest noctalia shell version.",
      "created_at": "2025-10-08T06:55:16Z",
      "updated_at": "2025-10-09T05:44:12Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "bobblkabb",
        "avatar_url": "https://avatars.githubusercontent.com/u/7815101?u=30f6d40c7d0361f14b6b239e13a9a72a18d59972&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aeelz",
      "number": 1148,
      "title": "Allow binding to key release",
      "body": "Key bindings currently take action once a key is pressed down. This is a sensible default for the overwhelming amount of cases, however there are use cases for binding to when keys are released as well, and I currently find myself wishing I could mute my microphone by holding down a key and unmute it when the key is released.\r\n\r\nRough idea:\r\n```\r\nbinds {\r\n  M repeat=false { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"true\" }\r\n  M release=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"false\" }\r\n}\r\n```\r\n\r\nBinding to M is obviously silly, but it should demonstrate the idea. The fact that repeat=true is the default for keybindings does throw a wrinkle in here, though.",
      "created_at": "2025-02-19T12:50:38Z",
      "updated_at": "2025-10-09T05:02:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Toesmasher",
        "avatar_url": "https://avatars.githubusercontent.com/u/39797590?u=4727cb067664996b82f8f4839645b9075761670c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiVQV",
      "number": 2553,
      "title": "Configurable startup length for window-rules",
      "body": "The duration for the at-startup window rule matcher is hardcoded to 60 seconds.\r\n\r\nhttps://github.com/YaLTeR/niri/blob/ba6e5e082a79901dc89b0d49c5da1b769d652aec/src/niri.rs#L2564\r\n\r\nWhen using the matcher to open and position for example Firefox to a workspace, this feels way too long.\r\n\r\nAn alternative would be to allow the timer to be configurable.\r\n\r\nI did a small and dirty implementation and can share it, if it is a wanted feature.",
      "created_at": "2025-10-08T12:49:32Z",
      "updated_at": "2025-10-08T12:50:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ni2scmn",
        "avatar_url": "https://avatars.githubusercontent.com/u/52465077?u=6d31de8e2127d5bd2e26e76ffbba438e59325cd5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiUVa",
      "number": 2542,
      "title": "Identify X windows",
      "body": "In sway I have:\r\n\r\n`for_window [shell=\"xwayland\"] title_format \"[XWayland] %title\"`\r\n\r\nWhich let me identify the windows that are using X protocol.\r\n\r\nIs there a way to do this in niri or waybar?",
      "created_at": "2025-10-07T13:31:37Z",
      "updated_at": "2025-10-07T17:38:43Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "kuon",
        "avatar_url": "https://avatars.githubusercontent.com/u/160200?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiTTa",
      "number": 2531,
      "title": "Map drawing tablet buttons to keyboard shortcuts",
      "body": "#### Disclaimer\r\n\r\nI don't know if this is already possible in niri, but I couldn't find anything about this in the [key bindings](https://github.com/YaLTeR/niri/wiki/Configuration:-Key-Bindings) section of the wiki.\r\n\r\n#### Feature\r\n\r\nI want to map a drawing tablet button to a keyboard shortcut. For example, I want the first tablet button to be mapped to `Ctrl+Z`.\r\n\r\n#### Example Configuration Syntax\r\n\r\n```kdl\r\nbinds {\r\n    DrawingTabletButton1 { map Ctrl+Z; }\r\n}\r\n```\r\n\r\n#### Workarounds\r\n\r\nIndividual applications can probably be configured to listen to drawing tablet buttons, but having the mapping functionality would be more convenient, because:\r\n- Applications often have the same default keyboard shortcuts for certain actions - `Ctrl+Z` is always undo. By having just one mapping in the niri configuration, it could immediately affect all such applications and configuring the applications separately won't be needed.\r\n- If an application doesn't support multiple shortcuts to an action, you cannot have `Ctrl+Z` and a tablet button doing the same thing.",
      "created_at": "2025-10-06T12:57:59Z",
      "updated_at": "2025-10-07T15:18:01Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3u4P",
        "body": "https://github.com/YaLTeR/niri/pull/2536 @lotusprey please mark as answer thanks :)"
      },
      "user": {
        "login": "lotusprey",
        "avatar_url": "https://avatars.githubusercontent.com/u/35681808?u=ddfb2a5be4ee383b122013015265135fb85b072e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahgah",
      "number": 2279,
      "title": "layout.focus-ring.urgent-color setting",
      "body": "Trying to understand this setting. As far as I can tell, focused windows automatically de-active the urgency, and unfocused windows don't get the focus-ring.\r\n\r\nSo what is the point of this setting? It never seems to be used?\r\n\r\nJust wondering if I have not understood something here.",
      "created_at": "2025-08-23T08:35:52Z",
      "updated_at": "2025-10-07T14:31:42Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "brianmay",
        "avatar_url": "https://avatars.githubusercontent.com/u/112729?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiUO6",
      "number": 2539,
      "title": "connecting screencast with pipewire",
      "body": "edit: solved by setting the modifier's value to `DrmModifier::Linear`. would niri consider add a fallback option with shm, to improve compatibility?\r\n\r\nI'm trying to connect niri's screencast portal with pipewire. I'm getting the \"no more input formats\" error now,  I've read part of the code in https://github.com/YaLTeR/niri/blob/ba6e5e082a79901dc89b0d49c5da1b769d652aec/src/pw_utils.rs to try to determine the correct video formats, but facing some difficulties.\r\n\r\nhttps://github.com/YaLTeR/niri/blob/ba6e5e082a79901dc89b0d49c5da1b769d652aec/src/pw_utils.rs#L1112\r\ndoes niri only support DMA type(no SHM) according to code here? and it provides `BGRA` and/or `BGRx` only. I've tried to connect with both SHM style and DMA style, but both didn't work.\r\n\r\nalso what value should the ChoiceEnum field in modifier property be? I've tried 0, and raw values from https://docs.rs/smithay/0.7.0/smithay/backend/allocator/enum.Fourcc.html, both didn't work.\r\n\r\nmy format setting is\r\n```rust\r\n    let size_min = pw::spa::utils::Rectangle {\r\n        width: 1,\r\n        height: 1,\r\n    };\r\n    let size_def = pw::spa::utils::Rectangle {\r\n        width: 1280,\r\n        height: 720,\r\n    };\r\n    let size_max = pw::spa::utils::Rectangle {\r\n        width: 4096,\r\n        height: 4096,\r\n    };\r\n    let fps_min = pw::spa::utils::Fraction { num: 0, denom: 1 };\r\n    let fps_def = pw::spa::utils::Fraction { num: 30, denom: 1 };\r\n    let fps_max = pw::spa::utils::Fraction {\r\n        num: 1000,\r\n        denom: 1,\r\n    };\r\n   // dma format, with modifier list\r\n    let dma_obj = pod::object!(\r\n        SpaTypes::ObjectParamFormat,\r\n        ParamType::EnumFormat,\r\n        pod::property!(FormatProperties::MediaType, Id, MediaType::Video),\r\n        pod::property!(FormatProperties::MediaSubtype, Id, MediaSubtype::Raw),\r\n        pod::property!(\r\n            FormatProperties::VideoFormat,\r\n            Choice,\r\n            Enum,\r\n            Id,\r\n            VideoFormat::BGRA,\r\n            VideoFormat::BGRA,\r\n            VideoFormat::BGRx,\r\n        ),\r\n        pod::Property {\r\n            key: FormatProperties::VideoModifier.as_raw(),\r\n            flags: pod::PropertyFlags::MANDATORY | pod::PropertyFlags::DONT_FIXATE,\r\n            value: pod::Value::Choice(pod::ChoiceValue::Long(utils::Choice(\r\n                utils::ChoiceFlags::empty(),\r\n                utils::ChoiceEnum::Enum {\r\n                    default: 0,\r\n                    alternatives: [0].to_vec(),\r\n                }\r\n            )))\r\n        },\r\n        pod::property!(\r\n            FormatProperties::VideoSize,\r\n            Choice,\r\n            Range,\r\n            Rectangle,\r\n            size_def,\r\n            size_min,\r\n            size_max\r\n        ),\r\n        pod::property!(\r\n            FormatProperties::VideoFramerate,\r\n            Choice,\r\n            Range,\r\n            Fraction,\r\n            fps_def,\r\n            fps_min,\r\n            fps_max\r\n        ),\r\n    );\r\n   // shm format, without modifier list\r\n    let shm_obj = pod::object!(\r\n        SpaTypes::ObjectParamFormat,\r\n        ParamType::EnumFormat,\r\n        pod::property!(FormatProperties::MediaType, Id, MediaType::Video),\r\n        pod::property!(FormatProperties::MediaSubtype, Id, MediaSubtype::Raw),\r\n        pod::property!(\r\n            FormatProperties::VideoFormat,\r\n            Choice,\r\n            Enum,\r\n            Id,\r\n            VideoFormat::BGRA,\r\n            VideoFormat::BGRA,\r\n            VideoFormat::BGRx,\r\n        ),\r\n        pod::property!(\r\n            FormatProperties::VideoSize,\r\n            Choice,\r\n            Range,\r\n            Rectangle,\r\n            size_def,\r\n            size_min,\r\n            size_max\r\n        ),\r\n        pod::property!(\r\n            FormatProperties::VideoFramerate,\r\n            Choice,\r\n            Range,\r\n            Fraction,\r\n            fps_def,\r\n            fps_min,\r\n            fps_max\r\n        ),\r\n    );\r\n\r\n    let mut dma_buffer = Vec::new();\r\n    let mut shm_buffer = Vec::new();\r\n\r\n    let dma_pod = make_pod(&mut dma_buffer, dma_obj);\r\n    let shm_pod = make_pod(&mut shm_buffer, shm_obj);\r\n    let mut params = [dma_pod, shm_pod];\r\n\r\n    stream.connect(\r\n        pw::spa::utils::Direction::Input,\r\n        Some(node_id),\r\n        stream::StreamFlags::AUTOCONNECT\r\n            | stream::StreamFlags::MAP_BUFFERS\r\n            | stream::StreamFlags::RT_PROCESS,\r\n        &mut params,\r\n    )?;\r\n\r\n```\r\n\r\n\r\nfull log for `journalctl --user -f` in case needed:\r\n```log\r\nOct 07 19:49:56 galaxy xdg-desktop-portal-gnome[1591]: Failed to associate portal window with parent window\r\nOct 07 19:49:56 galaxy xdg-desktop-portal-gnome[1591]: vkAcquireNextImageKHR(): A surface has changed in such a way that it is no longer compatible with the swapchain. (VK_ERROR_OUT_OF_DATE_KHR) (-1000001004)\r\nOct 07 19:49:57 galaxy niri[1294]: 2025-10-07T11:49:57.986296Z DEBUG niri::dbus::mutter_screen_cast: record_monitor connector=\"DP-3\" properties=RecordMonitorProperties { cursor_mode: Some(Embedded), _is_recording: None }\r\nOct 07 19:49:57 galaxy niri[1294]: 2025-10-07T11:49:57.988146Z DEBUG niri::dbus::mutter_screen_cast: start\r\nOct 07 19:49:57 galaxy niri[1294]: 2025-10-07T11:49:57.988830Z DEBUG niri::niri: StartCast session_id=64 stream_id=62\r\nOct 07 19:49:57 galaxy niri[1294]: 2025-10-07T11:49:57.988924Z DEBUG niri::pw_utils: pw stream: state changed: Unconnected -> Connecting stream_id=62\r\nOct 07 19:49:57 galaxy niri[1294]: 2025-10-07T11:49:57.993779Z DEBUG niri::pw_utils: pw stream: state changed: Connecting -> Paused stream_id=62\r\nOct 07 19:49:57 galaxy niri[1294]: 2025-10-07T11:49:57.993816Z DEBUG niri::pw_utils: pw stream: sending signal with 103 stream_id=62\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context: params Spa:Enum:ParamId:EnumFormat: 0:0 Invalid argument (input format (no more input formats))\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context: Object: size 288, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\r\nOct 07 19:49:58 galaxy niri[1294]: 2025-10-07T11:49:58.011183Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Error(\"no more input formats\") stream_id=62\r\nOct 07 19:49:58 galaxy niri[1294]: 2025-10-07T11:49:58.011192Z  WARN niri::pw_utils: pw error id=3 seq=734 res=-32 no more input formats\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Choice: type Spa:Enum:Choice:Enum, flags 00000000 28 4\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Id 12       (Spa:Enum:VideoFormat:BGRA)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Id 12       (Spa:Enum:VideoFormat:BGRA)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Id 8        (Spa:Enum:VideoFormat:BGRx)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:modifier (131074), flags 00000018\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Choice: type Spa:Enum:Choice:Enum, flags 00000000 56 8\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 875713089\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 875713089\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 875708993\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 875713112\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 875709016\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Rectangle 1280x720\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Rectangle 1x1\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Rectangle 4096x4096\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Fraction 30/1\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Fraction 0/1\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Fraction 1000/1\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context: Object: size 216, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Choice: type Spa:Enum:Choice:Enum, flags 00000000 28 4\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Id 12       (Spa:Enum:VideoFormat:BGRA)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Id 12       (Spa:Enum:VideoFormat:BGRA)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Id 8        (Spa:Enum:VideoFormat:BGRx)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Rectangle 1280x720\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Rectangle 1x1\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Rectangle 4096x4096\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Fraction 30/1\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Fraction 0/1\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Fraction 1000/1\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context: params Spa:Enum:ParamId:EnumFormat: 1:0 Invalid argument (output format (no more input formats))\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context: Object: size 328, type Spa:Pod:Object:Param:Format (262147), id Spa:Enum:ParamId:EnumFormat (3)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaType (1), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Id 2        (Spa:Enum:MediaType:video)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:mediaSubtype (2), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Id 1        (Spa:Enum:MediaSubtype:raw)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:format (131073), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Id 8        (Spa:Enum:VideoFormat:BGRx)\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:modifier (131074), flags 00000018\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Choice: type Spa:Enum:Choice:Enum, flags 00000000 128 8\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782120099856\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782120099856\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782120099857\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782120099858\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782120099859\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782120099860\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782120099861\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782128496656\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782128496657\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782128496658\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782128496659\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782128496660\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 216172782128496661\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Long 72057594037927935\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:size (131075), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Rectangle 2560x1440\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:framerate (131076), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Fraction 0/1\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:   Prop: key Spa:Pod:Object:Param:Format:Video:maxFramerate (131077), flags 00000000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:     Choice: type Spa:Enum:Choice:Range, flags 00000000 40 8\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Fraction 74968/1000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Fraction 1/1\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.context:       Fraction 74968/1000\r\nOct 07 19:49:58 galaxy pipewire[1204]: pw.link: (103.0.0 -> 98.0.0) negotiating -> error (no more input formats) (configure-configure)\r\nOct 07 19:49:59 galaxy niri[1294]: 2025-10-07T11:49:59.420575Z DEBUG niri::dbus::mutter_screen_cast: stop\r\nOct 07 19:49:59 galaxy niri[1294]: 2025-10-07T11:49:59.420982Z DEBUG niri::niri: StopCast session_id=64\r\nOct 07 19:49:59 galaxy niri[1294]: 2025-10-07T11:49:59.421122Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Unconnected stream_id=62\r\n```",
      "created_at": "2025-10-07T11:57:26Z",
      "updated_at": "2025-10-07T14:14:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "dwuggh",
        "avatar_url": "https://avatars.githubusercontent.com/u/22413202?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXjYM",
      "number": 163,
      "title": "Color Inversion",
      "body": "Searching didn't return any results, so I thought I would create this feature request me and others can subscribe to.\r\n\r\nColor inversion, preferably customizable  picom/compton-style color inversion, is the primary reason why I'm still on X11.\r\n\r\n(Anyone considering mentioning gamma control shall slap themselves before doing so.)",
      "created_at": "2024-02-03T16:04:59Z",
      "updated_at": "2025-10-07T02:15:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "AppleSheeple",
        "avatar_url": "https://avatars.githubusercontent.com/u/68065381?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiToQ",
      "number": 2534,
      "title": "Animations for specific window rules",
      "body": "It would be nice to specify specific window open/window close animations for specific window rules, such as for floating-only windows, certain apps, etc",
      "created_at": "2025-10-06T19:23:22Z",
      "updated_at": "2025-10-06T19:23:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ThatOneCalculator",
        "avatar_url": "https://avatars.githubusercontent.com/u/44733677?u=a15c7592804dbcdf5f7690b8e95fcfde3ce3f5a3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiTmK",
      "number": 2532,
      "title": "focus-follow-mouse: allow focusing off-screen window without moving it",
      "body": "Currently, if focus-follows-mouse is enabled, it can be configured to focus only on windows entirely on the screen, or, if moved into a window that is partially off-screen, to move that window onto the screen and then focus it.\r\n\r\nI was thinking it would be nice to have another mode that would put the focus on windows that are partially off-screen without moving them onto the screen.\r\n\r\nConsider the use case of a screen that has a window on 2/3 of the left side of the screen, and then remaining 1/3 of the screen is another window that is partially off screen. If I want to copy and paste information from the left window into the right window, it would be nice if the right window would not move while I am doing it.\r\n\r\nIn this new mode, I envision that one would need to click inside a window that is partially off screen in order to bring it onto the screen fully. But simply moving the mouse into it would only give it the focus.",
      "created_at": "2025-10-06T18:37:59Z",
      "updated_at": "2025-10-06T18:38:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "presto8",
        "avatar_url": "https://avatars.githubusercontent.com/u/246631?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiQAA",
      "number": 2512,
      "title": "Window does not return to its original placement when exiting fullscreen",
      "body": "The window doesn't go back to its original placement upon exiting fullscreen. Feature 🚀  or bug 🐞? \r\n\r\nhttps://github.com/user-attachments/assets/6bce65aa-2c90-4fea-914e-1e765a42a736\r\n\r\n---\r\n\r\nIf this is the intended behavior, I would like to submit a feature request to support it, e.g.\r\n\r\n```kdl\r\nswith-events {\r\n    fullscreen-off { spawn-sh \"niri msg action consume-or-expel-window-left\"; }\r\n}\r\n```\r\n\r\nThough, this won't cover all scenarios, only the one shown in the video. Needs more thought.\r\n\r\nI tried automating this via the IPC event stream, but this is all I see in this scenario:\r\n\r\n```console\r\nWorkspace 1: active window changed to Some(80)\r\nWindow focus changed: Some(80)\r\nWindow layouts changed: [(80, WindowLayout { pos_in_scrolling_layout: Some((3, 1)), tile_size: (831.0, 664.0), window_size: (831, 664), tile_pos_in_workspace_view: None, window_offset_in_tile: (0.0, 0.0) })]\r\nWindow layouts changed: [(79, WindowLayout { pos_in_scrolling_layout: Some((2, 1)), tile_size: (831.0, 1344.0), window_size: (831, 1344), tile_pos_in_workspace_view: None, window_offset_in_tile: (0.0, 0.0) })]\r\nWindow layouts changed: [(80, WindowLayout { pos_in_scrolling_layout: Some((3, 1)), tile_size: (2560.0, 1440.0), window_size: (2560, 1440), tile_pos_in_workspace_view: None, window_offset_in_tile: (0.0, 0.0) })]\r\nWindow layouts changed: [(80, WindowLayout { pos_in_scrolling_layout: Some((3, 1)), tile_size: (831.0, 1344.0), window_size: (831, 1344), tile_pos_in_workspace_view: None, window_offset_in_tile: (0.0, 0.0) })]\r\nWorkspace 1: active window changed to Some(79)\r\n```\r\n\r\nDoesn't seem to mention fullscreen at all.\r\n",
      "created_at": "2025-10-03T16:50:12Z",
      "updated_at": "2025-10-06T13:15:50Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3pIr",
        "body": "Related https://github.com/YaLTeR/niri/issues/426"
      },
      "user": {
        "login": "gvolpe",
        "avatar_url": "https://avatars.githubusercontent.com/u/443978?u=d9845904b6660ab20563d305d83e60a178506f9b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiSBc",
      "number": 2526,
      "title": "Why is the gnome portal required for screencasting in niri?",
      "body": "Forgive my ignorance, as I only have a rudimentary understanding of Linux at this point in time. \r\n\r\nI know that the wlr portal also has support for screencasting and many other wayland compositors use it. What exactly is the bottleneck/limitation that requires niri to rely on the gnome portal for screencasting specifically? Are there certain things that need to be implemented by the compositor itself to make use of certain portal backends, and niri just happens to use the gnome portal's implementation? Or is there some sort of conflict with the other portals when it comes to screencasting? \r\n\r\nJust asking out of curiosity and for sake of learning. Hopefully the question makes sense?\r\n\r\nThanks.",
      "created_at": "2025-10-05T21:37:49Z",
      "updated_at": "2025-10-06T13:09:26Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "ASong5",
        "avatar_url": "https://avatars.githubusercontent.com/u/44077969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiR7c",
      "number": 2524,
      "title": "Dynamic default-column-width?",
      "body": "Can niri be configured that when I have only one app opened, it is filling whole workspace (default-column-width 1), but when I open second app it splits workspace in half (default-column-width 0.5) and all windows after that will have column width 0.5?",
      "created_at": "2025-10-05T20:33:28Z",
      "updated_at": "2025-10-06T07:19:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3sSP",
        "body": "One of the design principles of the niri project is that opening a new window should never affect the sizes of other windows (https://yalter.github.io/niri/Development%3A-Design-Principles.html#opening-a-new-window-should-not-affect-the-sizes-of-any-existing-windows). As such, this functionality is not currently available and I doubt that it ever will be. I suspect it wouldn't be too hard to script it yourself though"
      },
      "user": {
        "login": "wooque",
        "avatar_url": "https://avatars.githubusercontent.com/u/1936195?u=f1f5a1df92aeb6abfd296932c42de6b6804271ab&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiR-Z",
      "number": 2525,
      "title": "Feature Request: Add focus-window-or-workspace-down/up commands",
      "body": "### Problem\r\n\r\nThe horizontal navigation commands (`focus-column-or-monitor-left/right`) work great because they overflow intelligently. I can navigate between columns in my workspace, and when I reach the edge, it naturally continues to the adjacent monitor. This makes my vim-like bindings of `h`/`l` feel really seamless.\r\n\r\nBut the vertical commands (`focus-window-down/up`) only move between windows in the current column. If I want to switch workspaces, I have to use completely different keys (Page_Up/Down or number keys). This breaks the flow since I'm constantly switching between spatial navigation for windows and explicit workspace commands.\r\n\r\n### What I'd like\r\n\r\nIt would be great to have vertical navigation commands that work like the horizontal ones:\r\n- `focus-window-or-workspace-down`\r\n- `focus-window-or-workspace-up`\r\n\r\nIf I'm in a column with multiple windows, `j`/`k` would move between them like normal. But when I'm at the bottom or top window and press `j` or `k`, it would switch to the next/previous workspace instead of just stopping.\r\n\r\nFor single-window columns, it would go straight to workspace navigation.\r\n\r\n### Why this would be useful\r\n\r\nRight now I have:\r\n- **Horizontal:** columns → monitors\r\n- **Vertical:** windows only \r\n\r\nWith this feature it would be:\r\n- **Horizontal:** columns → monitors\r\n- **Vertical:** windows → workspaces\r\n\r\nEverything would just flow naturally in both directions without needing to think about which navigation mode I'm in.\r\n\r\n### Example\r\n\r\n```kdl\r\nbinds {\r\n    Mod+H { focus-column-or-monitor-left; }\r\n    Mod+L { focus-column-or-monitor-right; }\r\n    Mod+J { focus-window-or-workspace-down; }   \r\n    Mod+K { focus-window-or-workspace-up; }     \r\n}\r\n```\r\n\r\nThis would make navigation feel consistent across both axes.\r\n\r\nThank you for creating Niri, I love it!\r\n",
      "created_at": "2025-10-05T21:10:04Z",
      "updated_at": "2025-10-05T22:59:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mmcdole",
        "avatar_url": "https://avatars.githubusercontent.com/u/3767096?u=b048b9305c1f3d4c614991439b498e400a98a2e0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiQCx",
      "number": 2513,
      "title": "issue with mako after replacing hyprland with niri",
      "body": "I had no startup setup for mako, it just started automatically with hyprland and worked, now I switched to niri and there's a small problem, it still starts automatically but in a state in which notifications stay up forever (not timing out) and I can't dismiss/activate them by clicking them with mouse, to fix it I have to restart mako.service or run `makoctl reload` every time I start niri session. I tried `systemctl --user add-wants niri.service mako.service` end enabling the user mako.service but nothing changed on following sessions. \r\n\r\nArch Linux\r\n```\r\nOptional Deps   : alacritty: a suggested GPU-accelerated terminal emulator\r\n                  bash: for niri-session script [installed]\r\n                  fuzzel: a suggested Wayland application launcher [installed]\r\n                  mako: a suggested Wayland notification daemon [installed]\r\n                  org.freedesktop.secrets: for apps to rely on secrets portal [installed]\r\n                  swaybg: a suggested Wayland wallpaper tool [installed]\r\n                  swaylock: a suggested Wayland screen locker\r\n                  waybar: a suggested Wayland customizable desktop bar [installed]\r\n                  xwayland-satellite: for running X11 apps in XWayland [installed]\r\n                  xdg-desktop-portal-gtk: a suggested XDG desktop portal [installed]\r\n                  xdg-desktop-portal-gnome: a XDG desktop portal required for screencasting [installed]\r\n````\r\n\r\n`journalctl -b -1 -p err`\r\n```Oct 02 19:49:45  kernel: hub 8-0:1.0: config failed, hub doesn't have any ports! (err -19)\r\nOct 02 19:49:58  dbus-broker-launch[718]: Ignoring duplicate name 'org.freedesktop.FileManager1' in service file '/usr/share//dbus-1/services/org.xfce.Thunar.FileManager1.service'\r\nOct 03 02:04:26  dbus-broker-launch[718]: Activation request for 'org.freedesktop.Notifications' failed.\r\nOct 03 02:04:26  dbus-broker-launch[718]: Activation request for 'org.freedesktop.Notifications' failed.\r\nOct 03 02:04:26  dbus-broker-launch[718]: Activation request for 'org.freedesktop.portal.Desktop' failed.\r\nOct 03 02:04:26  dbus-broker-launch[718]: Activation request for 'org.freedesktop.portal.Desktop' failed.\r\nOct 03 02:04:26  systemd-coredump[88564]: Failed to send coredump datagram: Broken pipe\r\n```\r\n\r\n`journalctl --user -u mako.service`\r\n```\r\n-- Boot 1145b984ffa14cff9726191158884c81 --\r\nOct 03 19:31:39 woopyo systemd[629]: Starting Lightweight Wayland notification daemon...\r\nOct 03 19:31:39 woopyo systemd[629]: Started Lightweight Wayland notification daemon.\r\n```\r\n\r\nthat's when I power off my PC, no errors when I turn it on and log in\r\nHow do I even debug this, I'd like mako to just start up and work right away without requiring the restart after.",
      "created_at": "2025-10-03T18:05:38Z",
      "updated_at": "2025-10-05T17:44:24Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "stradus64",
        "avatar_url": "https://avatars.githubusercontent.com/u/10760147?u=b52f7280c0c5742a180632d1899c138da65d875c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AX1MW",
      "number": 219,
      "title": "Option to disable config live-reloading",
      "body": "The config live-reloading feature is nice for debugging and exploring. However, I'm afraid it is not very useful for daily use, especially considering that it is implemented by polling the file metadata every 500 ms.\r\n\r\nIs it a good idea to add an option allowing user to disable this feature? Maybe it can be called `live_config_reload`, just like what is done in Alacritty.",
      "created_at": "2024-02-21T05:46:17Z",
      "updated_at": "2025-10-04T21:49:33Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "HardGraphite",
        "avatar_url": "https://avatars.githubusercontent.com/u/64914256?u=ee41ff2c2fc0af923f2081d6ce2e4d2cbfdda6d6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiQoD",
      "number": 2518,
      "title": "Alternate bindings for a second keyboard",
      "body": "Not sure if this is a feature request or if I just can't work it out.\r\n\r\nI have a laptop which I have my niri keybinding set-up for. This keyboard has discrete cursor keys / function keys / etc. I also have a compact ten-less USB keyboard which I frequently use that has shared cursor and function keys (i.e. I have to press a \"fn\" key to access the key-code). I can find that when I'm trying to use the keybindings for the laptop keyboard on the USB keyboard I can be having to press 4 or 5 keys to get something quite common (e.g. Move window to other monitor becomes Super+Ctrl+Shift+Fn+Left). \r\n\r\nI'd like to have different bindings for different keyboards whilst both are attached and active. Is this possible?",
      "created_at": "2025-10-04T15:56:04Z",
      "updated_at": "2025-10-04T15:56:04Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "WeeBull",
        "avatar_url": "https://avatars.githubusercontent.com/u/326175?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiQmv",
      "number": 2517,
      "title": "dose this support macos？",
      "body": "dose this support macos？",
      "created_at": "2025-10-04T15:08:29Z",
      "updated_at": "2025-10-04T15:32:33Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "yulianggan",
        "avatar_url": "https://avatars.githubusercontent.com/u/161193979?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiQbr",
      "number": 2515,
      "title": "Allow `switch-layout` when screen is locked",
      "body": "Would it be possible to make `switch-layout` work with the `allow-when-locked=true` flag? Would be very useful if you don't like having a cursor on your lockscreen but need a specific layout for your password",
      "created_at": "2025-10-04T10:37:32Z",
      "updated_at": "2025-10-04T14:14:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "winkelnp",
        "avatar_url": "https://avatars.githubusercontent.com/u/68015877?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiPqN",
      "number": 2510,
      "title": "window matcher that matches output",
      "body": "I have two monitors and one of them is placed vertically, because the space on my desktop is limited, and vertical output is good for reading documents\r\n\r\nI use default-column-width to 50%, it's good on my main monitor, but...\r\n<img width=\"400\" height=\"640\" alt=\"图片\" src=\"https://github.com/user-attachments/assets/e7a94109-01fb-4d38-b4b3-241b2767ecf6\"\r\n\r\nIt's a problem easy to solve if I have a matcher that matches monitors, isn't it?\r\nthat's all, thank you for your work on Niri and your patient to listen to my problem ♥️",
      "created_at": "2025-10-03T09:28:55Z",
      "updated_at": "2025-10-04T06:54:59Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Lingshinx",
        "avatar_url": "https://avatars.githubusercontent.com/u/157816708?u=9e001177bb921a853d32288ae96aed0c6450afb8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgM8W",
      "number": 1773,
      "title": "How to mark clients as restricted?",
      "body": "Hi,\r\n\r\nContext: I started using wl-copy with the `--paste-once` switch recently, and it took me time to figure out what was reading the clipboard despite having no focus; I just found out about `ext_data_control_device_v1` after noticing mpv uses it to read clipboard (... still not sure why exactly, but that's another issue for them)\r\n\r\nThat leads to questions:\r\n- Looking at src/niri.rs I assume that ext_data_control_device_v1 can be forbidden for clients where `client_is_unrestricted()` is false, but that controls quite a lot of protocols -- would it make sense to split a bit at some point?\r\n- OTOH there's nothing in there that I'd want mpv to use, so I'd be more than happy to add a window-rule saying mpv is restricted, but that doesn't look possible?\r\n- Thinking further, I think it'd make more sense to do it the other way around and say e.g. waybar/swaylock/fcitx5/etc are privileged and forbid all the rest, perhaps having a notification like when config is invalid when something is blocked?\r\n\r\nThanks!",
      "created_at": "2025-06-11T12:52:06Z",
      "updated_at": "2025-10-04T05:27:45Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzP3_",
        "body": "The restricted check only applies for sandboxed clients, indicated by sandbox engines (i.e. flatpak) using the security-context Wayland protocol. So everything potentially sensitive is restricted. This does not apply to (and doesn't make sense for) anything running on the host without a sandbox."
      },
      "user": {
        "login": "martinetd",
        "avatar_url": "https://avatars.githubusercontent.com/u/1729331?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiPkj",
      "number": 2507,
      "title": "How can I disable eDP-1 only when there are no other displays on?",
      "body": "I have a laptop that uses niri. I want the builtin display disabled only when there are no external displays on, is it possible to achieve that? Everytime I disconnect the HDMI cable, I cannot use the laptop because the builtin screen is off!",
      "created_at": "2025-10-03T07:16:42Z",
      "updated_at": "2025-10-03T17:51:07Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "xcpky",
        "avatar_url": "https://avatars.githubusercontent.com/u/52552971?u=37e934a43a67a383788700c30b4d2c1f12ad7113&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiPuv",
      "number": 2511,
      "title": "Edge case: Moving between windows with focus-follows-mouse",
      "body": "From what I can tell, focus-follows-mouse works by transferring focus once it crosses a window border which is unfocused.\r\nHowever, this means that if your cursor is inside the borders of an unfocused window, it will focus onto it when you try to move it to a different window. \r\nI don't have any ideas on how to mitigate this issue, but I thought it would be good to bring it up.\r\nI stumble on it quite frequently since I scroll with my mouse to transfer focus across the workspace in a broad manner and then I move my mouse to more precisely go to the window that I want to be focused on.\r\n\r\nhttps://github.com/user-attachments/assets/edf79377-5ed8-4f56-835c-c02fd74a8b30\r\n\r\n",
      "created_at": "2025-10-03T11:08:52Z",
      "updated_at": "2025-10-03T11:08:54Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nishiiko",
        "avatar_url": "https://avatars.githubusercontent.com/u/142626254?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiPIR",
      "number": 2505,
      "title": "remove swaylock default keybindings",
      "body": "in my niri installation, super-alt-l is default to spawn swaylock. but it would let one accidental lock the screen without knowing how to recover from it.\n\nand I still don't know how to unlock. switch to other tty then pkill makes the graphics tty black screen, then I have to reboot.",
      "created_at": "2025-10-02T18:26:12Z",
      "updated_at": "2025-10-07T10:55:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dwuggh",
        "avatar_url": "https://avatars.githubusercontent.com/u/22413202?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiPBR",
      "number": 2503,
      "title": "Clipboard & multiple encodings -- What's expected behaviour ?",
      "body": "TLDR: Who is responsible for ordering the offered mime-types when copying/pasting? Is the client pasting the content responsible to pick the *best* encoding for the context? Or simply the first one it may think matches? \r\n\r\nAnnoying bug happening on niri+emacs+chromium _does not happen_ under gnome...\r\n\r\n-----\r\n\r\nSo, I had a weird, annoying bug happening to me where I'd copy text from emacs and paste it in chromium-based applications (google-chrome, chromium, anything build with electron such as the official slack app...) and the encoding would be wrong. \r\n\r\n<img width=\"1508\" height=\"1036\" alt=\"image\" src=\"https://github.com/user-attachments/assets/f3a596b2-bac9-4af6-b184-c540a32a3824\" />\r\n\r\nUsing copyq and removing the `text/plain` offer (via the `Show Contents` popup menu item) and then pasting it again in the offending apps would fix the issue -- i.e. chromium was expecting utf-8 data, but somehow was picking `text/plain` (encoded in `latin1`) instead.\r\n\r\nPasting the text copied from emacs anywhere else (terminal apps, firefox, gtk3-, gtk4-, qt-based applications) would work as expected. Copying this pasted text and then would paste without problem in chromium.\r\n\r\nInspecting the data offered via `wl-paste`, it appears that emacs would offer `text/plain` *before* `text/plain;charset=utf-8`. \r\n\r\n<details><summary> <code class=\"notranslate\">wl-paste -l</code> output</summary>\r\n<p>\r\n<pre>\r\nTIMESTAMP\r\nMULTIPLE\r\nTEXT\r\nCOMPOUND_TEXT\r\ntext/plain\r\nSTRING\r\ntext/plain;charset=utf-8\r\nUTF8_STRING\r\ntext/plain\r\ntext/plain;charset=utf-8\r\nTARGETS\r\nLENGTH\r\nDELETE\r\nFILE_NAME\r\nCHARACTER_POSITION\r\nLINE_NUMBER\r\nCOLUMN_NUMBER\r\nOWNER_OS\r\nHOST_NAME\r\nUSER\r\nCLASS\r\nNAME\r\nATOM\r\nINTEGER\r\nSAVE_TARGETS\r\n</pre>\r\n</p>\r\n\r\ntext/plain and text/plain;charset=utf8 appear multiple times because [gdk_wayland_selection_add_targets](https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-3-24/gdk/wayland/gdkselection-wayland.c?ref_type=heads#L1787)  offer them when it sees STRING and UTF8_STRING.\r\n\r\n</details> \r\n\r\n-----\r\n\r\nOther applications (gedit with gtk3 for example, but also qt-based apps, gtk4 ones...) would offer `text/plain;charset=utf-8` before `text/plain` and I had no problem copying from them and pasting in chromium-based apps. \r\n\r\nBy applying a emacs-specific kludge I was able to force `text/plain;charset=utf-8` to be offered first, and then chromium would pick that and the issue was fixed for me.\r\n\r\nhttps://github.com/user-attachments/assets/78293f21-b671-4677-b1e9-55e7cb5b3d32\r\n\r\n-----\r\n\r\nThing is, *the issue does not happen under Gnome* -- i.e. vanilla emacs, without the kludge, pastes without issue to chromium:\r\n\r\n<table>\r\n<tr>\r\n<th>When copying, the list of mime-types offered is still the same (top line in the bottom-half of emacs window)</th>\r\n<th>wl-paste shows the utf-8 version before text/plain, despite emacs offering in the same order. Pasting works. The selection_converter_alist is unchanged./th>\r\n</tr>\r\n<tr>\r\n<td><img width=\"1616\" height=\"1350\" alt=\"Captura de tela de 2025-10-02 10-55-55\" src=\"https://github.com/user-attachments/assets/f71d449b-3b99-4f47-a59b-e4a9132f0e1c\" /></td>\r\n<td><img width=\"3208\" height=\"1350\" alt=\"Captura de tela de 2025-10-02 10-58-28\" src=\"https://github.com/user-attachments/assets/9423b0a0-c525-424e-8f34-dfec819d6680\" /></td>\r\n<tr>\r\n</table>\r\n\r\nAlso, notice that the mime-types offered under gnome appear under a completely different order then running under niri !!!\r\n\r\n-----\r\n\r\nEmacs itself does not seem to do any reordeing after calling `xselect-convert-to-targets` -- see\r\nhttps://github.com/emacs-mirror/emacs/blob/emacs-30/src/pgtkselect.c#L198 . Neither do [gtk_selection_add_target](https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-3-24/gtk/gtkselection.c#L959) nor [gdk_wayland_selection_add_targets](https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-3-24/gdk/wayland/gdkselection-wayland.c?ref_type=heads#L1787)  -- except for also offering `text/plain` and `text/plain;charset=utf-8` for `STRING` and `UTF8_STRING` , which explain the duplication when running without my kludge -- `... text/plain STRING \\n UTF8_STRING \\n text/plain;charset=utf-8 \\n text/plain \\n text/plain;charset=utf-8 ...`.\r\n\r\nSo, is Gnome reordering the mime-types somehow? If so, is that the expected behavior, documented somehow (and niri is not following this standard)? Should Chromium be doing its due diligence and prioritizing the current app encoding instead of picking the first one that maybe has compatible data -- or is it right in accepting the first maybe-compatible type it sees? \r\n\r\nI tried to check if the wayland protocol said anything about that, but it seemed a bit vague on the subject.",
      "created_at": "2025-10-02T16:03:53Z",
      "updated_at": "2025-10-02T18:19:39Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3mmc",
        "body": "OH, duh!\r\nI had not realized that the mutter offered me the mimetypes in the *reverse order*!!!\r\n\r\nSo it looks like\r\n\r\n1. By sheer luck, under mutter, chromium picks the first maybe-compatible mime-type, which happens to be utf-8 in the reverse order that mutter offered it. Under niri, the list is presented in the same order as the selection-owning client offered them, which then has `text/plain` before\r\n2. Chromium has a bug -- it should be prioritizing the available mimetypes\r\n3. Other libs do a better job of handling these multiple available mimetypes ..."
      },
      "user": {
        "login": "kassick",
        "avatar_url": "https://avatars.githubusercontent.com/u/21071?u=233dbe240db32b4dc2cceeacb149aabfbe21ef95&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbbhO",
      "number": 674,
      "title": "How to create varibles for use in kdl config file",
      "body": "I like to create templates that hold color information that I include into config files to be used in place of hard coded colors. \r\n\r\nThis lets me more easily change or tweak themes with out having to use a dotfile manager that templates letting me more easily use stow to mange my dotfiles. \r\n\r\nI have looked though the wiki, open issues, and discussions, but I can't see how to do something like this, or even a way to support \"includes\" at all. \r\n\r\nAre either of these things supported and I've simply missed it, or have these features not been implemented? If not are there any future plans to implement these? ",
      "created_at": "2024-09-16T01:35:02Z",
      "updated_at": "2025-10-02T15:33:29Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "chrishoage",
        "avatar_url": "https://avatars.githubusercontent.com/u/1056886?u=3043b48f33a2cdc801d49f91bea922d996fac9e6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AV2os",
      "number": 45,
      "title": "Infinite \"Carousel\"",
      "body": "I find it \"natural\" that by pressing **alt+L** on the last window the focus should move \"forward\" towards the first window. \r\nWhat do you think?\r\nTwo shortcuts for teleporting to the beginning and end would be also useful.",
      "created_at": "2023-10-11T12:29:48Z",
      "updated_at": "2025-10-02T06:06:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "wesbluemarine",
        "avatar_url": "https://avatars.githubusercontent.com/u/14043560?u=64d0fed553e233986596dcf1219889f91c89e636&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiLYA",
      "number": 2472,
      "title": "Issues with Pika Backup not authenticating",
      "body": "Hi,\r\n\r\nDoes anyone using niri also use PikaBackup, and if so, has anyone run into issues with backing up to a local server connected to via SSH with key-only auth? Pika Backup works just fine when I log into a GNOME session, but launching it in niri and trying to back up results in the following error:\r\n\r\n```\r\nConnection closed by remote host: \"Remote: user@192.168.0.100: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).\"\r\n\r\nWarning: Remote: user@192.168.0.100: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).\r\nError: Connection closed by remote host. - Connection closed by remote host. Is borg working on the server?\r\n```\r\n\r\nI thought maybe this could be a portals issue, but that doesn't make much sense since niri uses the same xdg-desktop portal as GNOME. Any idea what might be going on here?",
      "created_at": "2025-09-29T03:50:39Z",
      "updated_at": "2025-10-02T02:22:53Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3k4-",
        "body": "Update: I was able to get things working correctly! I knew I was missing something, god bless the Arch docs.\r\n\r\nFor anyone finding this in the future, what worked for me was using the Gnome Keyring SSH agent (`gcr-ssh-agent`). While I'm pretty sure there was an OpenSSH agent process running, it likely wasn't making any env variables stick.\r\n\r\nTo set up the ssh agent, I enabled the systemd socket with `systemctl --user enable gcr-ssh-agent.socket` and started it with `systemctl --user start gcr-ssh-agent.socket`. After that, I logged out and back in again to get the environment variable to stick. It should be possible to do this in the niri config, I just prefer leaving that up to my init system. Thanks for guiding me in the right direction!"
      },
      "user": {
        "login": "kmandarin-orange",
        "avatar_url": "https://avatars.githubusercontent.com/u/55755379?u=8d9dcc3cc7efc9fdb7171b5403f14d6010233190&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiOaV",
      "number": 2500,
      "title": "Focusing windows via ```focus-column-left/right``` is a little bit unintuitive",
      "body": "It might just be a me thing, but when I have, for example, 2 columns ```x``` and ```y``` each with 2 windows ```x1```/```x2``` and ```y1```/```y2```:\r\n\r\n```x1 | y1```\r\n```x2 | y2```\r\n\r\nI would expect to be able to call ```focus-column-right``` in order to get from, for example, ```x2``` to ```y2```. However, as far as I can tell, it currently focuses the most recently focused window in column ```y``` instead.\r\n\r\nI think it would be nice to have a separate keybind that operates in the more intuitive way (subjective) that I have outlined above, where the positional index of the newly focused window tries to match the positional index of the previously focused window. In the case where there are an uneven number of windows and the current window does not share a corresponding index with a window in the adjacent column, it could default to focusing the top or bottom window or even revert back to the present functionality of focusing the last focused window in that column.\r\n\r\nIf this already exists, please let me know - there were quite a lot of key-binds to parse through.\r\n\r\nThanks. ",
      "created_at": "2025-10-02T01:54:15Z",
      "updated_at": "2025-10-02T02:03:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ASong5",
        "avatar_url": "https://avatars.githubusercontent.com/u/44077969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiNlr",
      "number": 2491,
      "title": "Not sure how to use ```niri msg focused-window```",
      "body": "I may be doing something wrong but I'm not sure how to use ```niri msg focused-window``` to get the focused window's properties when I need to focus my terminal to type the command. Are people binding that command to a key and directing the output to a file or something? I'm sure that I'm missing something, but I suppose I'm a bit slow... I feel like it would be a lot nicer if I could just click on the window with my cursor kind of like how ```xprop``` works.\r\n\r\nHelp appreciated. Thanks",
      "created_at": "2025-10-01T05:57:50Z",
      "updated_at": "2025-10-01T20:57:15Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3jRA",
        "body": "https://github.com/YaLTeR/niri/pull/2495"
      },
      "user": {
        "login": "ASong5",
        "avatar_url": "https://avatars.githubusercontent.com/u/44077969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah_Qp",
      "number": 2405,
      "title": "Idleness inhibit behavior mistery",
      "body": "I always thought it was a Firefox issue/regression, not inhibiting the idleness watcher (of `lxqt-powermanagement` but it's the same with `swayidle`).\r\n\r\n* On an LXQt session with niri `mpv` inhibits fine, but Firefox not\r\n* Using `niri-session` (with any of the above idleness watchers) playing just a video in Firefox inhibiting works fine\r\n* Using LXQt session with any other compositor:  Firefox inhibits fine too.\r\n\r\nI've no clue where to lock at, where this difference could originate from.",
      "created_at": "2025-09-17T08:12:47Z",
      "updated_at": "2025-10-01T15:49:01Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3CBB",
        "body": "Firefox inhibits via the freedesktop d-bus interface, and niri only listens to it when running as a session (because it's a global interface, so that there are no conflicts)"
      },
      "user": {
        "login": "stefonarch",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?u=a2928499988ebbb05ef99547bd768ab7bbcf2fd2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiN5A",
      "number": 2497,
      "title": "Add a window rule to put a window to a layer",
      "body": "I'm using [SafeEyes](https://slgobinath.github.io/SafeEyes/) to manage my ADHD. It works by periodically opening a full-screen window. The issue is that this window is regular, and I can easily switch to another window. It would be great if this window could be set to overlay or top layer to make it permanent.\r\n\r\nRelevant discussions: #2358 #932",
      "created_at": "2025-10-01T12:32:47Z",
      "updated_at": "2025-10-01T15:37:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "akhilman",
        "avatar_url": "https://avatars.githubusercontent.com/u/180812?u=9e3d3a225993524be8a8dc72c00d67f21017d24b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiNvN",
      "number": 2494,
      "title": "Match popups?",
      "body": "I have this in my config:\r\n\r\n```\r\nwindow-rule {\r\n    match app-id=r#\"firefox$\"#\r\n    open-maximized true\r\n}\r\n```\r\n\r\nBut now popups for the master password are maximized. Is there a way to exclude popups generally? Of course, I can add `exclude title=r#\"Password\"#` but matching on niri's popup detection logic could be useful, I think.\r\n",
      "created_at": "2025-10-01T09:03:44Z",
      "updated_at": "2025-10-01T09:03:45Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "real-or-random",
        "avatar_url": "https://avatars.githubusercontent.com/u/1071625?u=f19e921ec34fc145d2b0b05f6cdd3472240c885b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiKlX",
      "number": 2468,
      "title": "customize UIs",
      "body": "for screenshot ui, messages etc.\r\nstuff like rounded corners, colors.",
      "created_at": "2025-09-28T18:25:52Z",
      "updated_at": "2025-10-01T08:36:01Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiNUK",
      "number": 2487,
      "title": "\"is-maximized\" window rule for VRR",
      "body": "This would be very nice for on demand variable refresh rate.\r\n\r\nI recently moved over to niri from KDE and wanted to enable VRR again, my monitor has a brightness flicker issue if VRR is enabled and the window isn't being directly scanned out; I fixed it by using the \"Automatic\" mode which effectively only enables VRR for fullscreen windows, I would replicate this on niri using\r\n```\r\nwindow-rule {\r\n    match is-maximized=true\r\n    variable-refresh-rate\r\n}\r\n```",
      "created_at": "2025-09-30T19:12:38Z",
      "updated_at": "2025-10-01T01:21:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "maximumpower55",
        "avatar_url": "https://avatars.githubusercontent.com/u/62370320?u=6cbb377cb5678bef11c77bd167f08566d7ae3c6c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhSUv",
      "number": 2231,
      "title": "Option to allow move-window-up-or-to-workspace-up  to move a window up even if at workspace with index 1",
      "body": "Very often I find myself moving my browser (Usually on workspace 1, left monitor) to my main monitor for whatever reason. After I'm done with it, I move it back to my left monitor then I have to move all other windows down from the 1st workspace, besides my browser.\r\n\r\nIt would be nice if the 'move-window-up-or-to-workspace-up' would work the following way:\r\n\r\nIf the current selected window is already on the first workspace, pressing the keybind for this command would make the selected window the only window on the first workspace, all other windows that were previously on the first workspace would be moved down to the second. This wouldn't affect the windows on the 2nd workspace as they would essentially be pushed down to the 3rd.\r\n\r\nI'm not sure if this is viable, or even something you're looking to implement. Also if there is a better way to do what i'm trying to, or a new way to adapt my workflow, I'm completely open to it.",
      "created_at": "2025-08-13T21:30:22Z",
      "updated_at": "2025-09-30T21:33:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rpop0",
        "avatar_url": "https://avatars.githubusercontent.com/u/38384209?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiNNX",
      "number": 2486,
      "title": "tab-indicator length per segment",
      "body": "I would like to have the option to set the tab-indicator `length` property such that the length applies separately to each indicator segment rather than the bar as a whole, so I can make styling where each tab always has a consistent size no matter how many are in the column. Alongside this I would also like to be able to set this length to an absolute value rather than a proportion for greater control.\r\n\r\nAn idea I had that could be implemented using these changes and the existing settings would be having the tab indicators be little circles, which to me would be a lot more readable than what the current set of options allows me to make.",
      "created_at": "2025-09-30T16:22:54Z",
      "updated_at": "2025-09-30T16:22:55Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "stella-sf",
        "avatar_url": "https://avatars.githubusercontent.com/u/119541172?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgsUA",
      "number": 2013,
      "title": "Add redshift functionality",
      "body": "Hi,\r\n\r\nI'm really liking Niri so far. Would it be possible to add [Redshift](https://wiki.archlinux.org/title/Redshift) functionality to Niri? For those unfamiliar, Redshift is a utility that changes the color temperature of the monitor based on the time of day. This results in a warmer, redder image at night, reducing blue light exposure and (theoretically) being less disruptive to your circadian rhythm.\r\n\r\nIn Xorg, using Redshift was as easy as installing Redshift and running the daemon: it seems to work with any Xorg WM/DE. In Wayland, it seems it's the compositor's job to handle this functionality. Gnome and KDE have their own versions of Redshift functionality built in, and wlroots compositors can use Redshift forks. Per the [Arch Wiki](https://wiki.archlinux.org/title/Backlight#Wayland), there seem to be some hacks you can use to get this functionality regardless of what compositor you're using, but having this functionality built into Niri would be really nice.\r\n\r\nSome points to consider:\r\n* Preferably, the blue light filter could be triggered either by a schedule (cooler during the day, warmer at night) or manually with a keybinding. I suppose the schedule functionality wouldn't be strictly necessary: users could get similar results with a cronjob or systemD timer, but being able to configure this directly in the Niri configuration would be convenient.\r\n* Instead of hard coding color temperatures directly into the source, it'd probably be better to make them configurable, so the user can decide how red or how blue they want their screen. A GUI to configure this would be nice but shouldn't be necessary as long as everything's configurable in the config file.\r\n* Would it be possible to automatically disable the filter when the user is screencasting/screenshotting? I'm not sure how difficult this would be to implement, but if it is possible, it'd be nice to automatically disable the filter so the screencast doesn't look unusually red. This could possibly also be implemented as an option so users can configure it one way or the other.\r\n\r\nThanks for the hard work on Niri. This isn't a high-priority feature request, but if someone has time to implement it, it would be a very welcome addition. If I'm feeling adventurous, I might try and add this myself, but I'm a complete noob when it comes to Rust, so no promises lol. Let me know what you guys think. Thanks!",
      "created_at": "2025-07-12T04:05:47Z",
      "updated_at": "2025-09-30T15:38:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jdobelmann",
        "avatar_url": "https://avatars.githubusercontent.com/u/19046572?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiMzs",
      "number": 2483,
      "title": "Operating on/focusing a window without changing the viewport",
      "body": "I usually have a workspace where the first two columns are two windows which are both a bit wider than half of the output width, i.e., when I have the second window focused, I can see a good part of the right side of the first window.  In that situation, I frequently want to quickly operate on the left window (press a button, paste some text in it) and then go on working in the right window.\r\n\r\nRight now, when I do that, e..g. click in the left window, the viewport scrolls horizontally so that the left window becomes completely visible which is a bit distracting in my use-case where I immediately go on working on the right window, possibly repeatedly, like copy & pasting many chunks of text from the right to the left window.\r\n\r\nI wonder if there was some way to focus a window without scrolling the viewport to make it completely visible (or center it, depending on `layout#center-focused-column`).  For example, clicking with the mouse while holding `Shift` could set the input focus to the clicked window without scrolling the viewport.",
      "created_at": "2025-09-30T08:18:27Z",
      "updated_at": "2025-09-30T08:18:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tsdh",
        "avatar_url": "https://avatars.githubusercontent.com/u/103854?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiMuE",
      "number": 2481,
      "title": "Ability to toggle certain settings with a keymap",
      "body": "It would be nice to toggle some settings like `input.touchpad.dwt` with a keypress or using a command-line tool so it can be triggered with a keypress or as part of a script",
      "created_at": "2025-09-30T06:19:00Z",
      "updated_at": "2025-09-30T06:19:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Cae-lim",
        "avatar_url": "https://avatars.githubusercontent.com/u/56897435?u=883af6b39a010fd42ec5d0bf409214e2797067a2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgjjA",
      "number": 1958,
      "title": "Provide some hook options before and after xwayland-satellite started",
      "body": "It is mentioned in the [wiki](https://github.com/YaLTeR/niri/wiki/Xwayland#using-xwayland-satellite): \r\n\r\n> In the next release, niri will have [built-in xwayland-satellite integration](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#xwayland-satellite). You can try it by installing git versions of both niri and xwayland-satellite. With no further configuration, niri will create X11 sockets, then when an X11 client connects, automatically start xwayland-satellite.\r\n\r\nNow I want to execute some commands after xwayland-satellite started, but currently I can only configure the `spawn-at-startup` option, and this option does not have any additional parameters to determine its execution time.\r\n\r\nMaybe I should use a script to detect whether the process exists and then execute some additional commands, but the best solution is to provide some options for configuration.\r\n\r\nRelated discussion in xwayland-satellite: https://github.com/Supreeeme/xwayland-satellite/discussions/195",
      "created_at": "2025-07-04T17:57:29Z",
      "updated_at": "2025-09-29T07:00:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "GoodbyeNJN",
        "avatar_url": "https://avatars.githubusercontent.com/u/6856639?u=366da162683e8bd29fdbb04f1073a7f8a0ba3a89&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiKh8",
      "number": 2467,
      "title": "Default Shaders location",
      "body": "Hey, where can i find the default glsl shaders for the included animations?\r\n\r\ni found `src/render_helpers/shaders`, but it seems like there are a bunch missing.\r\n\r\ni would be particularly interested in the ones for overview and workspace-switching.\r\n\r\nthanks already :)",
      "created_at": "2025-09-28T18:05:28Z",
      "updated_at": "2025-09-29T06:56:16Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3czx",
        "body": "They aren't shaders. Just simple geometric transformations"
      },
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiLkk",
      "number": 2473,
      "title": "Screen-coordinate information in custom_shader?",
      "body": "IMO screen-coordinate information in window-open/close custom_shader is quite useful, we could implement maximize/minimize animation using it (like KDE's 'jelly' animation).",
      "created_at": "2025-09-29T05:52:27Z",
      "updated_at": "2025-09-29T05:54:43Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "So1aric",
        "avatar_url": "https://avatars.githubusercontent.com/u/51471119?u=e938ae858cf00773b31dc0d6744da4a93c3d91ab&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiKmV",
      "number": 2470,
      "title": "Lock mouse to screen",
      "body": "option to lock the mouse in a single screen, so you cant move it to somewhere else.\r\n\r\ni dont switch monitors using my mouse, i only use keybinds. so the mouse not stopping on some monitor edges but instead going to another one is just annoying.\r\n\r\nmaybe just a simple config option that sets wheather you can switch moitors with mouse?",
      "created_at": "2025-09-28T18:33:02Z",
      "updated_at": "2025-09-28T20:18:59Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahj41",
      "number": 2294,
      "title": "Can the vertical gaps between workspaces be customised?",
      "body": "I'd like to customise the gap visible between workspaces when I use the 3 finger scroll on my touchpad.\r\nIt seems that this is the same gap as the one visible between workspaces in the overview.\r\n\r\nIs there any way to configure this? I couldn't find anything in the documentation. ",
      "created_at": "2025-08-25T08:36:15Z",
      "updated_at": "2025-09-28T18:56:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A2M3x",
        "body": "It's hardcoded"
      },
      "user": {
        "login": "dr-carlos",
        "avatar_url": "https://avatars.githubusercontent.com/u/77367421?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiKl9",
      "number": 2469,
      "title": "re-use notifications for actual notifications",
      "body": "there is this message that comes up when the config could not be found etc.\r\n\r\nhow practical would it be to use them for regular notifications (e.g. emails, screenshots taken, low battery etc.)?",
      "created_at": "2025-09-28T18:28:57Z",
      "updated_at": "2025-09-28T18:51:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJ5D",
      "number": 2466,
      "title": "Is something similar to MacOS's mission control possible?",
      "body": "Hello,\r\n\r\nI am wondering if spreading floating windows while in overview mode is somehow possible to achieve\r\n\r\n<img width=\"752\" height=\"474\" alt=\"image\" src=\"https://github.com/user-attachments/assets/5229a0d5-87e9-4c30-89af-2df4cedde08b\" />\r\n",
      "created_at": "2025-09-28T07:46:56Z",
      "updated_at": "2025-09-28T18:43:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "wSzki",
        "avatar_url": "https://avatars.githubusercontent.com/u/59784520?u=c25c44ad1c878231ba53a7f388c5b463d787865a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJeR",
      "number": 2460,
      "title": "support import external kdl",
      "body": "otherwise\r\nthe config will messy\r\nand nwg display not work",
      "created_at": "2025-09-27T12:14:59Z",
      "updated_at": "2025-09-28T18:20:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Boom-Hacker",
        "avatar_url": "https://avatars.githubusercontent.com/u/95948654?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJ5B",
      "number": 2465,
      "title": "Blur like in hyprland",
      "body": "What about add blur for windows like in hyprland",
      "created_at": "2025-09-28T07:44:58Z",
      "updated_at": "2025-09-28T07:46:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "akuraneee",
        "avatar_url": "https://avatars.githubusercontent.com/u/84019866?u=d564e79a008af0bc17f9d39a7987cc7e8650278e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgQwc",
      "number": 1815,
      "title": "focus follows tablet/touch",
      "body": "I'm not sure whether this is a feature request or a bug, or more of a question. I have read the Wiki and help pages (and a bit of the source code), but I haven't found the exact way to make focus follow pen tablet/touch cursors. `focus-follows-mouse` only works on mouse (haven't tried trackball or trackpad)",
      "created_at": "2025-06-16T08:30:22Z",
      "updated_at": "2025-09-28T03:54:00Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nimaaskarian",
        "avatar_url": "https://avatars.githubusercontent.com/u/88832088?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahoxu",
      "number": 2317,
      "title": "v25.08",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nA month ago, on July 31st, we hit 10,000 stars on GitHub! Thanks everyone for your support. 😄 Also, on August 10, niri turned two years old since the [initial commit](https://github.com/YaLTeR/niri/commit/ad3c3f8cefd38d2bf26b466d8e34eccde3bca443).\r\n\r\nWith introductions out of the way, here are the improvements from the last release.\r\n\r\n> [!NOTE]\r\n> Packagers:\r\n>\r\n> - Niri still requires libdisplay-info 0.2 (not 0.3). When libdisplay-info-rs [updates its requirement](https://github.com/Smithay/libdisplay-info-rs/issues/15), you will likely be able to bump it in niri with no other changes.\r\n> - Some tests now require surfaceless EGL to be available at test time. If this is problematic, you can ignore them with `cargo test -- --skip=::egl`.\r\n> - The wiki contents have moved from `wiki/` to `docs/wiki/`.\r\n> - We have a new [Integrating niri](https://yalter.github.io/niri/Integrating-niri.html) wiki page with information on integrating niri into distributions, which you may find helpful.\r\n\r\n## A logo\r\n\r\nAfter many, *many* ideas and discussions (first on Matrix, then [on GitHub](https://github.com/YaLTeR/niri/discussions/1605)), and several cool design proposals, niri now has logo!\r\n\r\n![niri logo](https://github.com/user-attachments/assets/07d05cd0-d5dc-4a28-9a35-51bae8f119a0)\r\n\r\nIt's a candle! The logo comes in four versions: full-sized, simple full-sized, icon, and simple icon. The simple versions are single-color and suitable for smaller sizes.\r\n\r\n| | full-sized | icon |\r\n|---|:---:|:---:|\r\n| normal | ![](https://github.com/user-attachments/assets/07d05cd0-d5dc-4a28-9a35-51bae8f119a0) | ![](https://github.com/user-attachments/assets/8891e257-05d1-4e49-965d-906ecdc37fdc) |\r\n| simple | ![](https://github.com/user-attachments/assets/4b972b50-e539-4955-a73c-8113de9a78a5) | ![](https://github.com/user-attachments/assets/f616db56-aa73-47da-b8ed-1e882fc65e32) |\r\n\r\nThe logo is intentionally recolorable, and you might've already seen several versions across our wiki, Matrix, and Discord. In fact, there's [a webpage](https://nirilogo.raurutuchr.ink) that lets you quickly adjust the color and download an SVG.\r\n\r\nBig thanks to @ixxie, @bluelinden, and @HumpityDumpityDumber for creating and iterating on this design.\r\n\r\n## New wiki\r\n\r\nThanks to @chinatsu, we have a new interface to browse our wiki! Check it out: https://yalter.github.io/niri/\r\n\r\nThe main improvement over GitHub Wiki is the interactive full-text search.\r\n\r\n![Screenshot of the search in the new wiki.](https://github.com/user-attachments/assets/86a40066-c79d-4eaf-a2c0-b58ede8d34b2)\r\n\r\nThe site uses [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/), and we retained full compatibility with GitHub Wiki, meaning all existing links keep working. All wiki pages will continue to be deployed to both the new site and the GitHub Wiki.\r\n\r\nThe new site allows us to make various customizations. For example, @chinatsu made all of our \"Since: version\" annotations render as badges and link to the corresponding release notes.\r\n\r\n![Screenshot of a Since badge.](https://github.com/user-attachments/assets/531c6439-a30c-4e12-a67c-3980b0afa34f)\r\n\r\nAlso, thanks everyone for several suggestions and test wikis in the [GitHub discussion](https://github.com/YaLTeR/niri/discussions/1830)!\r\n\r\n## xwayland-satellite integration\r\n\r\nThere are still plenty of apps, and notably games, that use X11 and thus require Xwayland to work. Setting this up has been a common stumbling block for new niri users, because unlike most other compositors, [we don't integrate Xwayland](https://yalter.github.io/niri/FAQ.html#why-doesnt-niri-integrate-xwayland-like-other-compositors).\r\n\r\nThis niri release solves that problem by integrating [xwayland-satellite](https://github.com/Supreeeme/xwayland-satellite). Make sure xwayland-satellite >= 0.7 is installed, remove any manual `$DISPLAY` configuration you may have had, and Xwayland will just work. If your xwayland-satellite binary is in a non-standard location, you can configure it with [a new option](https://yalter.github.io/niri/Configuration%3A-Miscellaneous#xwayland-satellite).\r\n\r\nFor all intents and purposes, this integration works the same way as Xwayland integration in other compositors. Niri will create X11 sockets on disk, export `$DISPLAY`, and spawn xwayland-satellite on-demand when an X11 client connects. If xwayland-satellite dies, niri will automatically restart it.\r\n\r\nThis integration also removes the startup race condition, meaning you can put X11 apps into [`spawn-at-startup`](https://yalter.github.io/niri/Configuration%3A-Miscellaneous#spawn-at-startup) and systemd autostart.\r\n\r\nWe're using xwayland-satellite rather than Xwayland directly because [those same reasons](https://yalter.github.io/niri/FAQ.html#why-doesnt-niri-integrate-xwayland-like-other-compositors) for avoiding Xwayland still apply. xwayland-satellite takes on the bulk of the work of dealing with the X11 peculiarities, giving niri normal Wayland windows to manage.\r\n\r\nAs a reminder, xwayland-satellite can perfectly run Steam, games, Proton, JetBrains IDEs, Ghidra, Electron apps, and most other X11 clients. But, applications that try to position windows and bars at specific screen coordinates will likely break and [need a nested compositor](https://yalter.github.io/niri/Xwayland.html#using-the-labwc-wayland-compositor) to run.\r\n\r\nHuge thanks to @Supreeeme for all the continued development on xwayland-satellite, and making it work as well as it does!\r\n\r\n## Screen reader support\r\n\r\nA [series of posts](https://fireborn.mataroa.blog/blog/i-want-to-love-linux-it-doesnt-love-me-back-post-1-built-for-control-but-not-for-people/) by fireborn earlier this year on the screen reader situation in Linux got me curious: how *does* one support screen readers in a Wayland compositor? The documentation is unfortunately scarce and difficult to find. Thankfully, @DataTriny from the [AccessKit](https://accesskit.dev) project came across [my issue](https://github.com/YaLTeR/niri/issues/1904), pointed me at the right protocols, and answered a lot of my questions.\r\n\r\nSo, as of this release, niri has basic support for screen readers! We implement the `org.freedesktop.a11y.KeyboardMonitor` D-Bus interface for [Orca](https://orca.gnome.org) to listen and grab keyboard keys, and we expose the main niri UI elements via AccessKit. Specifically, niri will announce:\r\n\r\n- workspace switching, for example it'll say \"Workspace 2\";\r\n- the exit confirmation dialog;\r\n- entering the screenshot UI and the overview;\r\n- whenever a config parse error occurs;\r\n- the important hotkeys list.\r\n\r\nHere's a demo video, watch with sound on.\r\n\r\nhttps://github.com/user-attachments/assets/afceba6f-79f1-47ec-b859-a0fcb7f8eae3\r\n\r\nI also added a default config binding <kbd>Super</kbd><kbd>Alt</kbd><kbd>S</kbd> to toggle Orca, which is the standard key binding for this. Orca still requires an X11 socket, so the new xwayland-satellite integration really helps here too.\r\n\r\nThe current screen reader support and further considerations are documented on the new [Accessibility](https://yalter.github.io/niri/Accessibility.html) wiki page.\r\n\r\nI also want to thank @tyrylu for his [talk](https://www.youtube.com/watch?v=-xEhHObnCug&t=170s) at this year's GUADEC that sheds some light on the current developments in Linux accessibility, and for answering a slew of my questions when I caught him afterward.\r\n\r\n## Modal exit confirmation\r\n\r\nThe screen reader integration necessitated making our exit confirmation dialog a proper modal dialog that takes full keyboard focus. A natural extension of this was to add full-screen dimming, emphasizing that you're about to log out of the entire session, and a nice open/close animation (which you can of course [disable](https://yalter.github.io/niri/Configuration%3A-Animations#exit-confirmation-open-close) if you want).\r\n\r\nHopefully, this will mark the end of me accidentally logging out instead of closing the nested development niri window. *(It didn't. Mere dimming is no match for the speed of a well-practiced <kbd>Super</kbd><kbd>Shift</kbd><kbd>E</kbd> ⇒ <kbd>Enter</kbd> motion.)*\r\n\r\nhttps://github.com/user-attachments/assets/10eaa5d9-3476-4a0f-90e9-46cf2ae39bb9\r\n\r\n## Screenshot UI improvements\r\n\r\nIn the last release, the screenshot UI learned to respond to some keyboard window movement bindings by moving the screenshot selection. Now, @iostapyshyn made the screenshot UI also handle the `move-column-left-or-to-monitor-left/right` and `move-window-up-or-to-workspace-up/down` actions, while I implemented `move-column/window-to-monitor` that moves the selection across monitors.\r\n\r\nThis works similarly to a floating window: the selection origin is preserved relatively, and the size is adjusted by the monitor scale difference. Under the right conditions, it'll match a floating window exactly.\r\n\r\nAlso, holding <kbd>Space</kbd> while dragging out a selection with the mouse will now let you move the selection!\r\n\r\nhttps://github.com/user-attachments/assets/f5c896ea-390d-4ca1-907b-60667c7324a7\r\n\r\nI made it work with a second touch on a touchscreen too. This was inspired by how in [osu!](https://osu.ppy.sh/) you can drag the cursor with one finger and touch with a second/third to \"click\".\r\n\r\nhttps://github.com/user-attachments/assets/9c6b3574-4c35-48d1-bef3-d311a6dc2c33\r\n\r\n## Keyboard layout from systemd-localed\r\n\r\nTo aid distribution integration, niri learned to read the keyboard layout from systemd-localed at `org.freedesktop.locale1` over D-Bus. This is now the default behavior when there's no [explicit XKB layout configuration](https://yalter.github.io/niri/Configuration%3A-Input#layout), so it should \"just work\" for distribution installers that set the layout via localed.\r\n\r\n## Screencasting fixes\r\n\r\nSome NVIDIA users saw flickering when screencasting in Discord or OBS. Last release added a `wait-for-frame-completion-in-pipewire` debug flag to work around the problem.\r\n\r\nIn this release, I fixed the problem properly (by delaying sending screencast frames over PipeWire until they finished rendering) and removed the debug flag. As a reminder, debug flags are not covered by our [config breaking change policy](https://yalter.github.io/niri/Configuration%3A-Introduction#breaking-change-policy).\r\n\r\nI also corrected the app IDs that niri communicates to xdg-desktop-portal-gnome, making it correctly show the icons for most applications in the window picker.\r\n\r\n![Screencast window selection dialog showing windows with icons.](https://github.com/user-attachments/assets/5ae8527c-a312-4586-8853-f76a8dc87926)\r\n\r\n## ext-workspace protocol\r\n\r\nI implemented the [ext-workspace](https://wayland.app/protocols/ext-workspace-v1) Wayland protocol in niri. It gives desktop components information about workspaces, so bars can use it to make a workspace indicator compatible with different compositors.\r\n\r\nAlong the way, I found a number of bugs in the ext-workspace code in various bars. All those bugs are now fixed, so you can use the `ext/workspaces` module in [Waybar 0.14](https://github.com/Alexays/Waybar/releases), and in upcoming versions of [sfwbar](https://github.com/LBCrion/sfwbar) and [xfce4-panel](https://docs.xfce.org/xfce/xfce4-panel/start). Work is ongoing to implement ext-workspace in [lxqt-panel](https://github.com/lxqt/lxqt-panel/pull/2323) and [Quickshell](https://github.com/quickshell-mirror/quickshell/tree/wip-ext-workspace).\r\n\r\n## Window positions and sizes in the IPC\r\n\r\nAfter consuming several people (thanks @calops and @aeghn for the intermediate discussions and PRs), the challenge of adding window sizes and positions to the niri IPC was finally bested by @yrkv. Windows returned by `niri msg windows` and the event stream now provide the following layout information:\r\n\r\n- for windows in the scrolling layout: index of the window's column on the workspace, and index of the window inside that column;\r\n- for floating windows: position on screen;\r\n- for all windows: size of the tile (including borders) and of the underlying Wayland window, and the Wayland window's offset inside the tile.\r\n\r\nYou can find [the detailed documentation](https://yalter.github.io/niri/niri_ipc/struct.WindowLayout.html) in niri-ipc.\r\n\r\nThis data already lets you order your window lists to match the workspace, make visual displays for floating windows, or keep track of how many columns are to the left/right of a given window. Here's a quick demo I put together in quickshell which tracks floating windows on the current workspace.\r\n\r\nhttps://github.com/user-attachments/assets/57903ed8-272f-44b4-a945-0ac8b9074db8\r\n\r\nSome things are still missing, like the current \"scroll position\" or floating window stacking order. They will be added later, when we figure out the best way to expose them (there's a tricky trade-off between ease of use and spamming the IPC too much).\r\n\r\nAs another small IPC improvement, @HigherOrderLogic added the [`ConfigLoaded`](https://yalter.github.io/niri/niri_ipc/enum.Event.html#variant.ConfigLoaded) event and a [`disable-failed`](https://yalter.github.io/niri/Configuration%3A-Miscellaneous#config-notification) option for the built-in niri config notification. Together, these let desktop shells implement this notification in a custom manner.\r\n\r\n## Config additions and fixes\r\n\r\nOne common source of confusion about the niri config is the [`spawn`](https://yalter.github.io/niri/Configuration%3A-Key-Bindings#spawn) command used for running programs. Unlike similar commands in other compositors, niri's `spawn` runs the given binary directly, without going through the shell, meaning that you have to manually split arguments and cannot use shell expansions or pipelines.\r\n\r\nIn this release, I added [`spawn-sh`](https://yalter.github.io/niri/Configuration%3A-Key-Bindings#spawn) and [`spawn-sh-at-startup`](https://yalter.github.io/niri/Configuration%3A-Miscellaneous#spawn-sh-at-startup) that accept a single argument—the command to run—and run it through the shell. With `spawn-sh`, all complex commands work as expected:\r\n\r\n```kdl\r\nbinds {\r\n    // Works with spawn-sh: all arguments in the same string.\r\n    Mod+D { spawn-sh \"alacritty -e /usr/bin/fish\"; }\r\n\r\n    // Works with spawn-sh: shell variable ($MAIN_OUTPUT), ~ expansion.\r\n    Mod+T { spawn-sh \"grim -o $MAIN_OUTPUT ~/screenshot.png\"; }\r\n\r\n    // Works with spawn-sh: process substitution.\r\n    Mod+Q { spawn-sh \"notify-send clipboard \\\"$(wl-paste)\\\"\"; }\r\n\r\n    // Works with spawn-sh: multiple commands.\r\n    Super+Alt+S { spawn-sh \"pkill orca || exec orca\"; }\r\n}\r\n```\r\n\r\nUnder the hood, `spawn-sh \"some command\"` is equivalent to `spawn \"sh\" \"-c\" \"some command\"`—it's just a less confusing shorthand.\r\n\r\nNow, on to the rest of the config additions and improvements in this release:\r\n\r\n- @two-horned implemented the `switch-preset-column-width-back` and `switch-preset-window-height-back` actions that reverse the existing preset-switching ones.\r\n- @HigherOrderLogic added the `cubic-bezier` [animation easing type](https://yalter.github.io/niri/Configuration%3A-Animations#easing) that lets you use a custom cubic Bézier curve with the same parameters as in CSS.\r\n- @chinatsu added the [`hide-not-bound`](https://yalter.github.io/niri/Configuration%3A-Miscellaneous#hide-not-bound) hotkey-overlay setting that prevents the Important Hotkeys dialog from showing `(not bound)` hotkeys.\r\n- The pointing device [`accel-speed`](https://yalter.github.io/niri/Configuration%3A-Input#pointing-devices) and animation [`slowdown`](https://yalter.github.io/niri/Configuration%253A-Animations.html) were changed to accept integer values without having to spell out the floating point `.0`. This also added parsing-time limits to the values: [-1; 1] to `accel-speed` and [0; 2<sup>31</sup>) to `slowdown`. While this is technically a config breaking change, the values outside that range weren't valid either way.\r\n- @lierdakil added the `scroll-button-lock` option for [pointing devices](https://yalter.github.io/niri/Configuration%3A-Input.html#pointing-devices).\r\n- @bkuri, after some struggling against Claude Code, implemented separate vertical and horizontal `scroll-factor` options for [pointing devices](https://yalter.github.io/niri/Configuration%3A-Input#pointing-devices).\r\n- Fixed hot reloading for trackball, tablet, and touch libinput settings.\r\n- @abdavis added clamping to configured color values after color space conversion, fixing a rendering difference between solid colors and gradients.\r\n- @Gwenodai added the [`skip-cursor-only-updates-during-vrr`](https://yalter.github.io/niri/Configuration%3A-Debug-Options#skip-cursor-only-updates-during-vrr) debug flag that prevents cursor movement from redrawing the screen when variable refresh rate is on. This is useful for games where the cursor isn't drawn internally to prevent erratic VRR shifts in response to cursor movement.\r\n- @sashomasho added the [`deactivate-unfocused-windows`](https://yalter.github.io/niri/Configuration%3A-Debug-Options#deactivate-unfocused-windows) debug flag that works around incorrect keyboard focus tracking from various Chromium- and Electron-based applications. If your chat window thinks it's focused, and doesn't show message notifications, despite being on a different workspace, then this debug flag might help.\r\n- @bbedward added the [`keep-max-bpc-unchanged`](https://yalter.github.io/niri/Configuration%3A-Debug-Options.html#keep-max-bpc-unchanged) debug flag as a workaround for [a bug](https://gitlab.freedesktop.org/drm/amd/-/issues/4487) with AMDGPU and some OLED panels that causes niri to fail to turn them on.\r\n- Clarified and improved the example values for some options in the default config. @schuelermine set the `close-window` bind as `repeat=false`. @dev-nicolaos added backlight adjustment binds using `brightnessctl`.\r\n- Num Lock state is now preserved across [XKB config](https://yalter.github.io/niri/Configuration%3A-Input#layout) changes.\r\n- @sodiboo made config hot reloading work for `/etc/niri/config.kdl`.\r\n\r\n## Other improvements in this release\r\n\r\n- @HigherOrderLogic made our FreeDesktop idle inhibitor also register its D-Bus service at `/ScreenSaver`, making it work with more apps, like VLC.\r\n- @my4ng made niri turn off HDR. We don't support HDR yet, so enabled HDR carried over from other compositors would just result in broken colors.\r\n- @zgibberish fixed `--focus=false` not working when using `move-column-to-workspace-up/down` on a floating window.\r\n- Added `--focus=false` argument to `move-window-to-workspace-up/down`.\r\n- @artrixdotdev added Nushell completion support: `niri completions nushell`.\r\n- Fixed tiled window popup menus sometimes appearing underneath exclusive-zone layer-shell components (the unconstraining logic wasn't taking these exclusive zones into account).\r\n- Changed the ext-session-lock surface size to round rather than floor, which removes a 1 px \"border\" on some fractional scales.\r\n- Fixed ext-session-lock clients that got denied the lock being able to create and show a lock surface. In particular, this fixes extra gtklock instances being able to destroy the active lock client, leaving you with an empty red locked session screen.\r\n- @notpeelz made niri set the logind LockedHint when the screen is locked through ext-session-lock. This for example enables idle daemons to only put the computer to sleep when it is locked.\r\n- @sodiboo added SIGINT, SIGTERM and SIGHUP handling to niri: these will now exit niri properly, cleaning up the Wayland sockets and other resources.\r\n- @Vladimir-csp added a check that makes `uwsm start niri.desktop` work for those who use [UWSM](https://github.com/Vladimir-csp/uwsm).\r\n- @vanderlokken added `niri msg action load-config-file` to force-reload the config file without waiting for hot reloading.\r\n- Fixed [a small animation bug](https://mastodon.online/@YaLTeR/115027325285939855) when quickly resizing tiled windows back and forth. This problem was fairly difficult to trigger by accident (unless you're specifically trying to reproduce it), but it caused further problems \"downstream\" for combined window actions.\r\n- Removed redundant \"device is inactive\" warning spam when switching to a different TTY.\r\n- Fixed changing floating window height resetting the preset *width* index rather than the preset height index.\r\n- Thanks to @zimward and @matejc for adding Alpine/musl and FreeBSD CI jobs respectively, ensuring that niri keeps building on those systems.\r\n- Updated Smithay:\r\n    - Added support for version 2 of the cursor-shape protocol.\r\n    - Fixed the keymap sent to clients, making [wvkbd](https://github.com/jjsullivan5196/wvkbd) work.\r\n    - Fixed integer overflows from layer surfaces setting extremely high margin values.\r\n    - Fixed an issue where a clipboard client that terminates unexpectedly did not cause an immediate empty clipboard event.\r\n    - Fixed mouse input to the bottommost and rightmost edges of a surface sometimes getting missed.\r\n\r\n## Funding\r\n\r\nI work on niri in the spare time that I have from my university studies. If you like what I do, you can support my work on [GitHub Sponsors](https://github.com/sponsors/YaLTeR). Big thanks to all current and past sponsors!\n\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v25.08'>v25.08</a>.</em>",
      "created_at": "2025-08-30T13:38:24Z",
      "updated_at": "2025-09-28T03:39:45Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJpZ",
      "number": 2462,
      "title": "Lock aspect ratio for floating windows",
      "body": "Just set up Niri and I'm loving it, but I have an idea for a window rule property: locking the aspect ratio. This would be a nice quality-of-life feature, since some floating windows are meant to maintain a constant aspect ratio when resized, such as picture-in-picture modes. I'm willing to take a swing at implementing this, as I have prior experience with Rust, but it would be my first Niri contribution, so I may need help with figuring out where things are in the codebase. I've done a search through current features and feature requests for this, so I'm fairly sure this hasn't been implemented or requested yet, but if I'm mistaken, I apologize. Thanks for the awesome work so far!",
      "created_at": "2025-09-27T18:35:32Z",
      "updated_at": "2025-09-27T20:28:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "colin-heffernan",
        "avatar_url": "https://avatars.githubusercontent.com/u/92215668?u=f33990f5db32b02d6f82b80b8c56726b7d0f7317&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJZu",
      "number": 2459,
      "title": "Focus follows pen functionality for switching between outputs",
      "body": "This discussion is a duplicate of #1815. \r\nTo keep the conversation in one place, please close this thread. Thank you.",
      "created_at": "2025-09-27T08:45:17Z",
      "updated_at": "2025-09-27T09:14:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Unk-now",
        "avatar_url": "https://avatars.githubusercontent.com/u/203313900?u=93eff4bb4bba3a58be5af6afa0b72240bb400cf6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJJS",
      "number": 2453,
      "title": "More `move-workspace` commands (move to certain index, move to first/last)",
      "body": "There's some similar logic in the `move-column-to-workspace *`  that could be useful for reshuffling workspaces, inserting them before/after a workspace at a given index instead of moving the workspace up or down in the stack one space at a time. There are a few ways these could be implemented, but here's what I had in mind:\r\n\r\n## Proposed Design\r\n\r\nTwo new config options taking an integer argument:\r\n\r\n- `move-workspace-before` (or `-above`)\r\n- `move-workspace-after` (or `-below`)\r\n- Possible additional options taking no arguments:\r\n  - `move-workspace-to-start` & `move-workspace-to-end`\r\n\r\nWith both options, people would have lots of flexibility in moving around workspaces however feels natural to them. \r\n\r\nFor me, it would fill a gap in my workflow that I miss from GNOME: arbitrarily moving windows to a new workspace in any direction, usually to a new workspace to the left.\r\n\r\nIn practice, people could then use these options like so:\r\n\r\n```kdl\r\nbinds {\r\n  Mod+Ctrl+Shift+1    { move-workspace-before 1; }\r\n  Mod+Ctrl+Shift+2    { move-workspace-before 2; }\r\n  Mod+Ctrl+Shift+3    { move-workspace-before 3; }\r\n  // ..... continued .....\r\n  Mod+Ctrl+Shift+0    { move-workspace-after 9; }\r\n}\r\n```\r\n\r\n## Possible Side Effects/Drawbacks\r\n\r\nWhile there should be minimal drawbacks both in terms of fitting in with other config options and not requiring any changes to existing options, here are some possible issues I could think of:\r\n\r\n- If someone for some reason wanted to have binds for both before & after options, they'd run out of keys. This seems low-risk, since I think most people would pick one that made sense to them. \r\n- Should using `move-workspace-after [index >= last-index]` place the workspace after the last empty one (preserving it until it's focused `->` unfocused), or should it functionally do the same thing as `move-workspace-before [last-index]`?\r\n- Possible issues with implementation, depending on how the workspace layout logic is written. I have no clue here!\r\n\r\nIf there's enough interest in this or it seems like it could be useful to more than a few people, it'd be an awesome new feature. @ YaLTeR & contributors, thanks for all the hard work on a great window manager, it's starting to feel like home now :)",
      "created_at": "2025-09-26T19:07:25Z",
      "updated_at": "2025-09-26T19:51:56Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kmandarin-orange",
        "avatar_url": "https://avatars.githubusercontent.com/u/55755379?u=8d9dcc3cc7efc9fdb7171b5403f14d6010233190&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af5oy",
      "number": 1652,
      "title": "Niri Overview blur backdrop",
      "body": "Blurred backdrop overview doesn't work on my end? Am I missing config?\r\n![image](https://github.com/user-attachments/assets/cb0777f2-5a4b-4edb-93ab-1d96961494b9)\r\n",
      "created_at": "2025-05-23T03:33:41Z",
      "updated_at": "2025-09-26T17:40:05Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "horhenaniB55",
        "avatar_url": "https://avatars.githubusercontent.com/u/200414334?u=f9cfddeea9371a64a480f363cd8a568fe4ccc406&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiJFc",
      "number": 2451,
      "title": "[Feature Request] Set delay of drag-and-drop through Overview",
      "body": "I would like to suggest to be able to set the delay amount of drag-and-drop files through overview. I feel like the default delay is quite large to wait for the current hovered window/workspace.",
      "created_at": "2025-09-26T17:21:02Z",
      "updated_at": "2025-09-26T17:21:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Cloudwolf-dev",
        "avatar_url": "https://avatars.githubusercontent.com/u/13559182?u=fec833653c8c80ce8ce39cd0f9ffc38ae143b664&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiHpq",
      "number": 2445,
      "title": "Does niri expose Wacom tablet buttons to aplications (e.g., rnote)?",
      "body": "First and foremost, cudos for this excellent compositrer! So well planned and realized, hats down!\r\n\r\nNow to my question, which I didn't seem to find answered as of now:\r\n \r\nSome Wayland applications can re-program Wacom tablet's buttons, notably rnote. These from rnote re-programmed buttons work flawlessly in Hyprland (v. 0.51.1-1, as of now).\r\n\r\nStylus buttons function under niri (both in xournalpp and rnote), but tablet buttons do not. It seems that niri does not expose these to applications.\r\n\r\nNevertheless,\r\n```libinput debug-events```\r\nreport all buttons under niri (exactly as it does in hyprland, by the way):\r\n```\r\n event9   TABLET_PAD_BUTTON              0 released (mode 0)\r\n event9   TABLET_PAD_BUTTON              2 pressed (mode 0)\r\n event9   TABLET_PAD_BUTTON              2 released (mode 0)\r\n event9   TABLET_PAD_BUTTON              1 pressed (mode 0)\r\n event9   TABLET_PAD_BUTTON              1 released (mode 0)\r\n event9   TABLET_PAD_BUTTON              3 pressed (mode 0)\r\n event9   TABLET_PAD_BUTTON              3 released (mode 0)\r\n event9   TABLET_PAD_BUTTON              3 pressed (mode 0)\r\n event9   TABLET_PAD_BUTTON              3 released (mode 0)\r\n event9   TABLET_PAD_BUTTON              4 pressed (mode 0)\r\n event9   TABLET_PAD_BUTTON              4 released (mode 0)\r\n event9   TABLET_PAD_BUTTON              6 pressed (mode 0)\r\n event9   TABLET_PAD_BUTTON              6 released (mode 0)\r\n event9   TABLET_PAD_BUTTON              5 pressed (mode 0)\r\n event9   TABLET_PAD_BUTTON              5 released (mode 0)\r\n event9   TABLET_PAD_BUTTON              7 pressed (mode 0)\r\n event9   TABLET_PAD_BUTTON              7 released (mode 0)\r\n```\r\nCan this be fixed?\r\n",
      "created_at": "2025-09-25T08:15:25Z",
      "updated_at": "2025-09-25T08:15:26Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "tjavdar",
        "avatar_url": "https://avatars.githubusercontent.com/u/10163826?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiHju",
      "number": 2443,
      "title": "[Feature Request] option to make unfocused windows not respond to mouse clicks and focus to them instead",
      "body": "Basically the following use case,\r\n\r\nhttps://github.com/YaLTeR/niri/discussions/984\r\n\r\nIt'll help the strut on left-right use case",
      "created_at": "2025-09-25T06:15:12Z",
      "updated_at": "2025-09-25T06:15:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Aman9das",
        "avatar_url": "https://avatars.githubusercontent.com/u/39594914?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiHiV",
      "number": 2442,
      "title": "maybe we can warp mouse to focus window （ when moving mouse causing focus moving）",
      "body": "current behavior(with focus-follows-mouse)\r\n<img width=\"824\" height=\"836\" alt=\"image\" src=\"https://github.com/user-attachments/assets/df7869f7-76ee-4221-a620-9b7c8bd2cdc3\" />\r\n<img width=\"820\" height=\"808\" alt=\"image\" src=\"https://github.com/user-attachments/assets/b58bf7c2-485e-4417-9a5f-d9d94afd8271\" />\r\n<img width=\"811\" height=\"836\" alt=\"image\" src=\"https://github.com/user-attachments/assets/c69bf635-ab2f-42dc-9c5f-f1c696c66a7f\" />\r\n\r\nthoughts：\r\n<img width=\"809\" height=\"814\" alt=\"image\" src=\"https://github.com/user-attachments/assets/5cc60255-333e-4c70-a633-00933fa9fcfc\" />\r\n\r\nmouse move as the windows moves ( for it fall out of the windows……\r\n\r\nthis will make it more like an canvas\r\n",
      "created_at": "2025-09-25T05:40:20Z",
      "updated_at": "2025-09-25T05:41:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "stevessr",
        "avatar_url": "https://avatars.githubusercontent.com/u/89645372?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afk0I",
      "number": 1518,
      "title": "Get current cursor position?",
      "body": "I have this little script in Hyprland which utilizes [wl-kbptr](https://github.com/moverest/wl-kbptr/):\r\n\r\n```sh\r\n#! /usr/bin/env sh\r\n# click with wl-kbptr floating mode and bring back cursor to where it was originally\r\ncursorPos=$(hyprctl cursorpos)\r\nwl-kbptr -o modes=floating,click -o mode_floating.source=detect\r\nhyprctl dispatch movecursor ${cursorPos/,/}\r\n```\r\n\r\n[The lack of `movecursor`](https://github.com/YaLTeR/niri/discussions/778) is no big deal, it can be done with dotool. But I couldn't find a way to query current cursor position.",
      "created_at": "2025-05-03T21:41:57Z",
      "updated_at": "2025-09-24T05:23:48Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "postsolar",
        "avatar_url": "https://avatars.githubusercontent.com/u/120750161?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiGQj",
      "number": 2433,
      "title": "Add `scroll-factor` attribute to Layer Rules (e.g. fuzzel and waybar) for mice with \"high resolution\" scroll wheels",
      "body": "I have a Logitech MX Master 2 and the scroll wheel is of the \"high resolution\" type where the scroll wheel acts more like a touch pad (sending multiple events per detent) than a classic ratchet scroll where each detent acts as a single event. This \"feature\" makes fuzzel scroll too fast and waybar scroll events adjust too quickly since multiple events are sent per detent (aka ratchet \"click\") making the selection hard to control without significant effort on slowly moving the scroll wheel. And I mean sloooowly moving the scroll wheel! Often a tiny fraction of a detent.\r\n\r\nIf Niri allowed setting the `scroll-factor` attribute for layers (like it can for windows) users can work around this issue uniformly (both layers and windows) for overly sensitive input devices.\r\n\r\nAre there any technical reasons why we can't do this?",
      "created_at": "2025-09-23T20:43:38Z",
      "updated_at": "2025-09-23T21:11:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "the-burrito-triangle",
        "avatar_url": "https://avatars.githubusercontent.com/u/168497498?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiF8l",
      "number": 2432,
      "title": "Spawn into the column of existing window with same app id – IPC daemon",
      "body": "Here is a small script to do what the title says. It will only move the new window if the existing instance is in the same workspace. Also, it listens for `.WindowOpenedOrChanged` events, which means that windows that change their own title or move between workspaces will be affected as well.\r\n\r\n\r\n```bash\r\n#!/usr/bin/env bash\r\n\r\napp_id=\"foot\"\r\n\r\nniri msg --json event-stream |\r\n    jq -c --unbuffered --arg aid \"$app_id\" \\\r\n       '.WindowOpenedOrChanged.window | select(.app_id == $aid)' |\r\n    while read window; do\r\n        anchor=$(niri msg --json windows |\r\n                     jq --arg aid \"$app_id\" --argjson win \"$window\" \\\r\n                        'first(.[] | select(.app_id == $aid)\r\n                                   | select(.workspace_id == $win.workspace_id)\r\n                                   | select(.id != $win.id))')\r\n        acol=$(jq '.layout.pos_in_scrolling_layout[0]' <<< \"$anchor\")\r\n        wcol=$(jq '.layout.pos_in_scrolling_layout[0]' <<< \"$window\")\r\n        if [ -n \"$acol\" ] && [ \"$acol\" != \"$wcol\" ]; then\r\n            niri msg action focus-window --id $(jq '.id' <<< \"$window\")\r\n            if ((wcol > acol)); then\r\n                niri msg action move-column-to-index $acol\r\n            else\r\n                niri msg action move-column-to-index $((acol - 1))\r\n            fi\r\n            niri msg action consume-or-expel-window-right\r\n        fi\r\n    done\r\n```",
      "created_at": "2025-09-23T13:59:07Z",
      "updated_at": "2025-09-23T15:21:25Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "lua-vr",
        "avatar_url": "https://avatars.githubusercontent.com/u/4229115?u=fc798fe464f8a670dd3901c8b0b68a89d4966fbc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiF5V",
      "number": 2431,
      "title": "Temporarily disable key bindings?",
      "body": "This probably isn't possible but I thought I'd ask anyway.\r\n\r\nI would like to use `rofi` as an `alt-tab` replacment and have it execute like this in the Niri config:\r\n\r\n```\r\nSuper+tab { spawn \"/home/ps/.config/niri/alttab.sh\"; }\r\n```\r\n\r\nThe script the executes:\r\n```\r\nrofi -modi window -show window -hide-scrollbar -padding 50 -line-padding 4 -auto-select \\\r\n-kb-cancel \"Super+Escape,Escape\" \\\r\n-kb-row-down \"Super+Tab\" \\\r\n-kb-row-up \"Super+Shift+Tab\" \\\r\n-selected-row 1\r\n```\r\n\r\nBut `Super+Tab` is obviously caught by Niri before rofi gets it so, as I see it, I would need to disable keybindings while rofi is shown.\r\n\r\nIf anyone has a workaround for that I would be much obliged!",
      "created_at": "2025-09-23T13:07:56Z",
      "updated_at": "2025-09-23T13:13:15Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "sommerper",
        "avatar_url": "https://avatars.githubusercontent.com/u/1512048?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah_iW",
      "number": 2406,
      "title": "How to provide xscreensaver with coordinates to draw on that cover the visible screen(s)?",
      "body": "Hi, having tested xscreensaver after it gained initial Wayland support recently, I noticed it doesn't fill the screen as expected, but only covers the part of the screen with the active application. It appears niri would need to provide the correct size and position of the visible screen to ensure the screensaver knows what to cover. It would appear /usr/bin/xrandr doesn't provide that insight in what the actual position on the scroll is that is visible.\r\n\r\nAny thoughts on how that could be provided?",
      "created_at": "2025-09-17T13:15:28Z",
      "updated_at": "2025-09-23T10:36:42Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "fvanrenterghem",
        "avatar_url": "https://avatars.githubusercontent.com/u/6618468?u=f87ef217858d2ea6dd20dfeb9fbe7843108abed8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiFdh",
      "number": 2429,
      "title": "Move window to workspace -1",
      "body": "Hey!\r\n\r\nSorry if this is already covered, I have searched and read what I could find on it. My thing is that when I am on workspace 0, and want to move a window UP one workspace, my intuition is that it would create a new workspace (and push the stack) at 0, kind of how it would behave in the \"bottom-most\" workspace. I do like that I cannot scroll over workspace 0 though, this proposed quality of life logic would only apply to the command \"move-column-to-workspace-up\"\r\n\r\nThanks!",
      "created_at": "2025-09-23T01:26:00Z",
      "updated_at": "2025-09-23T01:26:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Osten",
        "avatar_url": "https://avatars.githubusercontent.com/u/1721821?u=6730cffcb58f5d78b3a2582285b16f41c0618571&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiCnS",
      "number": 2419,
      "title": "Configureable screen-wakeup conditions",
      "body": "Hi!\r\n\r\nI live like a hobo and have my desktop next to my bed with my fancy 9001 DPI mouse. If i as much as think about the mouse my displays wake up(in the middle of the night). I could just turn them off, but I've got a phobia for physical buttons / forget and have to get up to do it :)\r\n\r\nIt'd be really nice if my screens were only woken up when receiving input from the keyboard, I searched around and got the understanding that the Wayland compositor is responsible for this.\r\n\r\nIs this niris responsibility? Would you consider this? 😄 \r\n\r\nI'm thinking default \"wake from both\", alternative \"wake from keyboard\", \"don't wake at all\" (leave to user scripting :))",
      "created_at": "2025-09-20T20:18:02Z",
      "updated_at": "2025-09-22T17:21:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Lillecarl",
        "avatar_url": "https://avatars.githubusercontent.com/u/207073?u=7510ffab06b25afb4fb4a7d5c414558724a76142&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiE4l",
      "number": 2426,
      "title": "MacOS touch gestures",
      "body": "I have noticed that macos users have that touch gestures where they can right click by using two finger and the other finger clicks and a right click action is made. Is this already supported in niri? If not, I would like it to be added and the other gestures macos have :>",
      "created_at": "2025-09-22T10:27:22Z",
      "updated_at": "2025-09-22T12:43:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Chipichipi123",
        "avatar_url": "https://avatars.githubusercontent.com/u/206407694?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiCqC",
      "number": 2420,
      "title": "Does Niri have focus_on_activate from Hyprland or can unfocused windows get clipboard access?",
      "body": "See this issue: https://github.com/obsidianmd/obsidian-clipper/issues/299\r\n\r\nThe Obsidian browser plugin tries to paste in the Obsidian app and can't by default. Is it possible to focus the window when its activated by the plugin so it will get clipboard access, or allow specific programs to use the clipboard while unfocused?",
      "created_at": "2025-09-20T22:46:10Z",
      "updated_at": "2025-09-20T23:06:32Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "robbins",
        "avatar_url": "https://avatars.githubusercontent.com/u/31457698?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiBVP",
      "number": 2413,
      "title": "broken visual in java application",
      "body": "how to fix that? broken horizontal lines, icons and etc.\r\n<img width=\"3840\" height=\"2160\" alt=\"Screenshot from 2025-09-19 06-18-40\" src=\"https://github.com/user-attachments/assets/ba530a81-ad82-49e1-a864-fef0d50ee601\" />\r\n",
      "created_at": "2025-09-19T03:24:45Z",
      "updated_at": "2025-09-20T14:33:26Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3LWW",
        "body": "Installing the NVIDIA drivers helped, but for some reason Niri stopped launching properly. I have to log in via another tty and launch Niri manually."
      },
      "user": {
        "login": "medasta",
        "avatar_url": "https://avatars.githubusercontent.com/u/63973222?u=d2bb971ed036ed8fc366bbfca8ae948eed1f4ea2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiCHL",
      "number": 2417,
      "title": "Drag gaps to resize",
      "body": "While meta + right click drag resizing works well, it would be nice to have a way to resize windows without having a hand on the keyboard. \r\n\r\nOne feature i miss from hyprland is the ability to drag within window gaps (left or right click) to resize without pressing any keys. Resizing tiled windows like this can also be done on windows and macos, so it's a fairly intuitive gesture that feels missing from such an otherwise intuitive WM :)\r\n\r\nThis is a similar feature request to #868, but slightly different. I would be happy if the resize worked the exact same way as normal interactive resizing, but worked without a keypress, and _when CSD is disabled_.",
      "created_at": "2025-09-19T20:09:53Z",
      "updated_at": "2025-09-19T20:09:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Smona",
        "avatar_url": "https://avatars.githubusercontent.com/u/7091399?u=6afba100c670f7f8e43950bbc78a584c2f7f3202&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiBF4",
      "number": 2412,
      "title": "Labwc with niri 25.08 and xwayland-satellite?",
      "body": "First off, to prevent X-Y problems. I'm running Autodesk Fusion 360 through wine on linux (using [this](https://github.com/cryinkfly/Autodesk-Fusion-360-for-Linux)), which works well enough on XFCE X11. On niri it doesn't work well, as the application renders several modal windows that get stuck in position where they shouldn't be.\r\n\r\nSo for the longest time I've logged out of niri and into XFCE for using it, which while annoying, is ok.\r\n\r\nSo for the actual problem:\r\nThrough the niri 25.08 release notes I stumbled on the XWayland wiki page for niri and thought running it through labwc could be an option. I'm on niri 25.08 with xwayland-satellite, which works great for all other X11 things, just not for fusion.\r\n\r\nBut when running labwc, I get\r\n```\r\n$ labwc\r\nFontconfig warning: using without calling FcInit()\r\n00:00:00.166 [xwayland/sockets.c:64] Failed to bind socket @/tmp/.X11-unix/X1: Address already in use\r\n```\r\nwhich I assume is because niri is already reserving the X11 socket through xwayland-satellite?\r\n\r\nThis is the relevant niri log:\r\n```\r\nSep 18 20:46:47 pc niri[10557]: 2025-09-18T18:46:47.598571Z  INFO niri: listening on Wayland socket: wayland-1\r\nSep 18 20:46:47 pc niri[10557]: 2025-09-18T18:46:47.598576Z  INFO niri: IPC listening on: /run/user/1000/niri.wayland-1.10557.sock\r\nSep 18 20:46:47 pc niri[10557]: 2025-09-18T18:46:47.626360Z  INFO niri: listening on X11 socket: :0\r\nSep 18 20:46:47 pc systemd[10362]: Started A scrollable-tiling Wayland compositor.\r\nSep 18 20:47:59 pc niri[10557]: 2025-09-18T18:47:59.873387Z DEBUG niri::utils::xwayland::satellite: connection to X11 abstract socket; spawning xwayland-satellite\r\n```\r\n\r\nSo is it actually possible to use labwc for specific applications alongside xwayland-satellite in niri? Maybe it could use another X11 socket? I didn't find an option for that in labwc documentation.\r\n\r\nFor reference, on niri with just xwayland-satellite it looks like this\r\n<img width=\"2247\" height=\"1388\" alt=\"image\" src=\"https://github.com/user-attachments/assets/0ff47789-c484-416e-bb14-e1ce57fe9e01\" />\r\nThe \"browser\" window is supposed to be pinned on the left, but gets stuck in the middle of the screen (it looking black usually goes away after some clicks, it also does that on XFCE), that pretty much makes it unusable since it covers the main working area. \r\n\r\nI was hoping to fix this with labwc, having to switch to XFCE is pretty jarring with all the muscle memory I have for niri :slightly_smiling_face: ",
      "created_at": "2025-09-18T19:38:10Z",
      "updated_at": "2025-09-19T06:10:47Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3IGz",
        "body": "Just `labwc` works here on my system\r\n\r\n> which I assume is because niri is already reserving the X11 socket through xwayland-satellite?\r\n\r\nAnything creating X11 displays is supposed to try a few display numbers to find one that is not taken"
      },
      "user": {
        "login": "Panaetius",
        "avatar_url": "https://avatars.githubusercontent.com/u/664486?u=1e18204737aaa08852a0c6af3c047d5c116d60da&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AiAfL",
      "number": 2409,
      "title": "shared workspaces and swap-workspace-to-monitor-*",
      "body": "From my understanding Niri gives each monitor it's set of workspaces, for example this is what I get from `niri msg workspaces`\r\n```\r\nOutput \"HDMI-A-1\":\r\n * 1\r\n   2\r\n\r\nOutput \"eDP-1\":\r\n * 1\r\n   2\r\n```\r\n\r\nBut I would like to know if it's possible to enable \"shared workspaces between monitors\", like it is right now on PaperWM, where there's a pool of workspaces independent of monitors.\r\n\r\nAnd another feature I think would be nice is the option to swap the workspaces from monitors. Right now there's only the option to move workspaces to another monitor, leaving the previous monitor blank.\r\n\r\nHere's an explanation of my use case on PaperWM: \r\n\r\nI have a big monitor right in front of me, and my laptop to my right, and I like to think that the big monitor is my \"focus\" monitor, and my laptop screen as a place for secondary stuff I'd like to keep an eye on, but are not my main focus right now. I also like to separate stuff in workspaces, where one workspace has my browser, my terminal, steam, etc, and another workspace just for communication apps, such as chatterino, discord, and ferdium.\r\n\r\nThroughout my day I keep swapping between those two workspaces. For example, I'm watching a video on youtube, then someone messages me asking for help on something. The video is on my \"main\" screen, and the chatting app on my \"secondary\", so I swap them to have the chatting app on my main screen, and the video goes into the secondary screen. This allows me to still have the video playing (maybe it's a stream) but still fully focused on the chat. Once I'm done chatting I swap them back to have the video on my main, and the chatting app on my secondary.\r\n\r\nAdditionally, at work I use 3 workspaces, one for work stuff, one for chatting stuff + email, and one for personal stuff like video or music app. I do the exact same thing as the paragraph above, but with a third workspace always hidden (cause I don't have a third monitor), but in PaperWM when I change workspaces on any screen I can always access that third hidden workspace.\r\n\r\nI'm not sure if this was a good explanation of the features I'd want, but I can probably record some videos as examples if necessary. I also understand that making workspaces shared between monitors might not be very straight forward to implement, so I'd be happy if only the swap function were implemented instead.",
      "created_at": "2025-09-18T10:05:12Z",
      "updated_at": "2025-09-18T11:34:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "CyberDruga",
        "avatar_url": "https://avatars.githubusercontent.com/u/22626848?u=2f22e8a58abdede697f62a30ef84ef901cb43f4f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah0qJ",
      "number": 2355,
      "title": "How to figure out if a screen recording is in progress",
      "body": "I am coming from GNOME and on there it was nice to see a blinking red dot in the status bar when I was screen sharing or recording my screen. I looked around and it doesn't seem like niri offers something that could give me the information that screen sharing is in progress, am I missing something? I know that there are multiple screen recording methods, but niri should be able to know about all of them if I understand it correctly.",
      "created_at": "2025-09-08T18:23:36Z",
      "updated_at": "2025-09-17T22:25:10Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "paper42",
        "avatar_url": "https://avatars.githubusercontent.com/u/23639164?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah_0u",
      "number": 2407,
      "title": "VRR enabled with consistent refresh rate on the desktop.",
      "body": "The on-demand VRR rule works great in most cases, but I recently (and unknowingly lol) bought a monitor that modesets every single time VRR is enabled or disabled. Unfortunately the OLED brightness flicker with VRR makes the desktop unusable with the refresh rate changing so rapidly too.\r\n\r\nIs there any way to stay at full refresh rate on the desktop with VRR still on while retaining the on-demand VRR functionality with the current window rules?",
      "created_at": "2025-09-17T17:36:56Z",
      "updated_at": "2025-09-17T18:41:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cself99",
        "avatar_url": "https://avatars.githubusercontent.com/u/62233925?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgkjZ",
      "number": 1963,
      "title": "Niri 25.05.1 seems to ignore keyboard layouts in my NixOS setup",
      "body": "I’m having some issues with switching keyboard layouts in Niri. I can’t tell if this is a Niri bug, or something else on my system is messed up.\r\n\r\nMy input block is reasonably straightforward in the config, having 2 layouts, and Niri seems to acknowledge and change which layout is selected, however the actual keyboard still uses the default layout. I can't get it to behave as if it changed.\r\n\r\n```\r\ninput {\r\n  keyboard {\r\n    xkb {\r\n      layout \"us,ro\"\r\n      options \"grp:win_space_toggle\"\r\n    }\r\n    numlock\r\n  }\r\n}\r\n```\r\n\r\nSo, niri still prints me that Romanian is selected, but the keyboard behaves as English (US).\r\n\r\n```\r\n$ niri msg keyboard-layouts\r\nKeyboard layouts:\r\n   0 English (US)\r\n * 1 Romanian\r\n```\r\n\r\nHere's a link to my config, specifically a commit with the closest I got to getting this to work: https://github.com/laserbeam3/nixos-configs/commit/f0660c176e9e96f52016fdf9d4b394310fef49af\r\n\r\nI've also opened up a related thread on the nixos discussion boards https://discourse.nixos.org/t/keyboard-layout-switching-in-niri-does-nothing/66401 to try and figure this out and will summarize the outcome/solution in both places.\r\n",
      "created_at": "2025-07-05T06:03:38Z",
      "updated_at": "2025-09-17T13:20:29Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A0sxm",
        "body": "Dumb user error.\r\n\r\nTurns out the `ro` layout looks exactly like `us` except it adds Romanian characters on AltGr. That made it feel like the layout was not changing. Tested with an obviously different layout (like `fr`) and then determined that I was really looking for `ro(std)`.\r\n\r\nNiri is working as expected.\r\n\r\nNixOS specific: keyboard layout should be done in ~/.config/niri/config.kdl, not via `services.xserver.xkb` for niri 25.05.1."
      },
      "user": {
        "login": "laserbeam3",
        "avatar_url": "https://avatars.githubusercontent.com/u/25619671?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah_Nu",
      "number": 2404,
      "title": "What's the opposite of `toggle-window-fullscreen`?",
      "body": "How to go fullscreen but not tell the application?",
      "created_at": "2025-09-17T07:18:11Z",
      "updated_at": "2025-09-17T11:32:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "aljustiet",
        "avatar_url": "https://avatars.githubusercontent.com/u/114720383?u=5191f1ccd27096602fa10f03706ed166067faa79&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah_Et",
      "number": 2402,
      "title": "```column-num``` window match?",
      "body": "IMO sth like ```column-num``` might be helpful, it enables us to maximize & center single column (which replace always-center-single-column in a more generic way) and might enables us to fit columns into one screen when there's only 2 columns.\r\nAFAIK it isn't easy to implement tho. I read some code and it seems like only ```Scrolling``` know how many columns are there, where ```window-matches``` cannot access to. ```at-startup``` and ```always-center-single-column``` are specially treated.\r\n🤔",
      "created_at": "2025-09-17T02:55:44Z",
      "updated_at": "2025-09-17T02:56:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "So1aric",
        "avatar_url": "https://avatars.githubusercontent.com/u/51471119?u=e938ae858cf00773b31dc0d6744da4a93c3d91ab&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah-pa",
      "number": 2397,
      "title": "IPC command to switch keyboard layout?",
      "body": "The [wiki](https://github.com/YaLTeR/niri/wiki/Configuration:-Input) states that if `input.xkb` is left empty, users can configure layouts via `localectl`. However, this is not an option on NixOS.\r\n\r\n```console\r\n$ localectl set-keymap es_AR                                                                                   \r\nFailed to set keymap: Changing system settings via systemd is not supported on NixOS.\r\n```\r\n\r\nAt the moment, this is what I have configured:\r\n\r\n```kdl\r\ninput {\r\n    keyboard {\r\n        xkb {\r\n            layout \"us,pl,es\"\r\n            options \"grp:win_space_toggle,ctrl:nocaps\"\r\n        }\r\n    } \r\n}\r\n```\r\n\r\nThe `grp:win_space_toggle` option allows me to switch between layouts with `Mod+Space` in my case, so that's good enough, but I would also like the option to do this from a shell script. This is useful when we have widgets that can be clicked and execute a command, like those in Waybar.\r\n\r\nSince keyboard layouts are usually managed by the compositor on Wayland, can we have an IPC command to switch between layouts in Niri? Hyprland has `hyprctl switchxkblayout keyboard-name next`.\r\n\r\nWe already have `niri msg keyboard-layouts`, just need one to switch 😃 ",
      "created_at": "2025-09-16T16:00:28Z",
      "updated_at": "2025-09-16T16:11:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A3AGr",
        "body": "`niri msg action switch-layout next`"
      },
      "user": {
        "login": "gvolpe",
        "avatar_url": "https://avatars.githubusercontent.com/u/443978?u=d9845904b6660ab20563d305d83e60a178506f9b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah9dA",
      "number": 2391,
      "title": "Cycle back to first workspace when the current is the last active and the next workspace is requested",
      "body": "I don't know if this can be done through the configuration, I haven't found anything, but please correct me if I'm wrong.\r\n\r\nImagine that I have 3 active workspaces: 1, 2, 3, and 4. (4 is an empty workspace). It would be nice if, when I'm on 4 and press the shortcut to go to the next workspace (Super+PgDown), it would return to workspace 1. That way, if I have many workspaces and need to return to the first one, I don't have to go back one by one. \r\n",
      "created_at": "2025-09-15T12:46:03Z",
      "updated_at": "2025-09-15T22:04:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "joaodanilo123",
        "avatar_url": "https://avatars.githubusercontent.com/u/43294091?u=3a1d6e6c81edc33a66e9202a07f9ec3cbd845a1e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah9zo",
      "number": 2394,
      "title": "Setup of keyboard media keys",
      "body": "Some media keys are already set up in the default config, so why not set up all the common ones?\r\n\r\nAfter installing Niri, I was confused because some media keys worked and some did not. Then I realized I had to set up then myself in the config.  Only four lines more would prevent this initial confusion:\r\n\r\n```\r\n    xF86AudioPlay        allow-when-locked=true { spawn-sh \"playerctl play-pause\"; }\r\n    xF86AudioStop        allow-when-locked=true { spawn-sh \"playerctl stop\"; }\r\n    xF86AudioPrev        allow-when-locked=true { spawn-sh \"playerctl previous\"; }\r\n    xF86AudioNext        allow-when-locked=true { spawn-sh \"playerctl next\"; }\r\n```\r\n\r\n\r\n\r\n",
      "created_at": "2025-09-15T20:06:35Z",
      "updated_at": "2025-09-15T21:15:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A29pp",
        "body": "Haven't seen playerctl before but it's installed on my fedora so sure I guess, want to make a PR? Just use consistent capitalization with other binds"
      },
      "user": {
        "login": "anagram3k",
        "avatar_url": "https://avatars.githubusercontent.com/u/76353?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgJ7F",
      "number": 1746,
      "title": "Few screenshot improvements",
      "body": "While current screenshot implementation is great and minimal and fast, but may better for some improvements\r\n\r\nAs a previous windows os user, I usually used ShareX for capture screens.\r\n- It would be nice to switch full/window(or layer)/selection mode while in screenshot UI, like gnome. Currently it's differed keybinds(each normal, screen, window...) and I only used `PrintSc` key before. The selection button group may built in below the screenshot description(like `Press P to hide the pointer`).\r\n\r\n- would be nice to create option to toggle `do not save screenshot` alternatively. It current does by `Ctrl+C` by hardcoded, and wont work with `screenshot write-to-disk=true` binding.\r\n\r\n  It made me confused at first glance while i always saves screenshot every time. I mean, I don't need to not saving a screenshot feature. https://github.com/YaLTeR/niri/blob/main/src/ui/screenshot_ui.rs#L894-L904\r\n\r\n",
      "created_at": "2025-06-08T06:33:30Z",
      "updated_at": "2025-09-15T13:35:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ilsubyeega",
        "avatar_url": "https://avatars.githubusercontent.com/u/37479424?u=a78295ff0f39d8044cc562ea08012d667773462a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah7ME",
      "number": 2383,
      "title": "Add mouse buttons actions to bindings",
      "body": "Add these options based on the already existing code:\r\n- [scroll-window-with-mouse](https://github.com/YaLTeR/niri/blob/b7909dbf61c7c1511b9a51ef46e1d503d5ba3d05/src/input/mod.rs#L2528)\r\n- [move-window-with-mouse](https://github.com/YaLTeR/niri/blob/b7909dbf61c7c1511b9a51ef46e1d503d5ba3d05/src/input/mod.rs#L2569)\r\n- [resize-window-with-mouse](https://github.com/YaLTeR/niri/blob/b7909dbf61c7c1511b9a51ef46e1d503d5ba3d05/src/input/mod.rs#L2452)\r\n\r\nThat would allow to setup mouse clicks with different modifiers for these actions as well as keyboard keys.",
      "created_at": "2025-09-14T08:47:49Z",
      "updated_at": "2025-09-15T05:24:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Ratakor",
        "avatar_url": "https://avatars.githubusercontent.com/u/45130910?u=98d12d5c1a112c02784ea30ddb734d1a6d109213&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah7wc",
      "number": 2385,
      "title": "action for scrolling without changing focus",
      "body": "It would be nice if I could scroll through a workspace without changing the focused window (as long as that window remains visible of course). \r\n\r\nJust to clarify I don't want the position of any of the windows to change relative to eachother.",
      "created_at": "2025-09-14T16:27:15Z",
      "updated_at": "2025-09-14T16:27:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Saatvik-Lochan",
        "avatar_url": "https://avatars.githubusercontent.com/u/67321822?u=970e180115bc161cc636ae202e83b63b4a854c30&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah7Z-",
      "number": 2384,
      "title": "Allow `screenshot-screen` to work when screen is locked",
      "body": "Is this a planned feature or something that's supposed to work? Couldn't get it to work with either `swaylock` or `hyprlock`.",
      "created_at": "2025-09-14T12:54:08Z",
      "updated_at": "2025-09-14T14:09:22Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "gvolpe",
        "avatar_url": "https://avatars.githubusercontent.com/u/443978?u=d9845904b6660ab20563d305d83e60a178506f9b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgTCK",
      "number": 1835,
      "title": "change save screenshot key",
      "body": "it would be nice if you could change the key thats used to save the screenshot (space). i use a split keyboard and i have space on the right side, so i have to take my hand off the mouse to save it",
      "created_at": "2025-06-18T06:00:23Z",
      "updated_at": "2025-09-14T12:56:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nyxmeowmeow",
        "avatar_url": "https://avatars.githubusercontent.com/u/180290547?u=698207273a2fbf23b425d9a03f243ddbcf3cb8f0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah6UH",
      "number": 2378,
      "title": "Keybind via repeated presses of the same key.",
      "body": "I would like it to be able to do a keybind for let's say `Mod+MouseMiddle++MouseMiddle`, where the stuff after `++` is to be pressed withing a given timeframe. I also thought `Mod+(MouseMiddle++MouseMiddle)` would mean that `Mod` needs to be pressed, while double pressing `MouseMiddle`, but this can be discussed later.\r\n\r\nWould it be difficult to implement, or not planned for any reason?",
      "created_at": "2025-09-13T09:07:51Z",
      "updated_at": "2025-09-14T10:10:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "lnk3",
        "avatar_url": "https://avatars.githubusercontent.com/u/23727619?u=7cfb53df6ec4efd41e614041ad319d9f082f5d3d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhWGL",
      "number": 2247,
      "title": "Enabling GPU hot-plugging in niri",
      "body": "The idea of adding and removing GPUs without restarting niri is surely interesting. \r\n\r\nFor systems where two GPUs are present and niri is already running, enabling the second GPU causes niri to add the device and enable its outputs which is a perfect and normal thing to do. However, there are scenarios where the user doesn't need the second GPU anymore and they would like niri to detach from it:\r\n> In an Optimus enabled laptop, the user which already has niri running on the Intel GPU, initiates a gaming session on the Nvidia. After quitting Steam, they would like to completely power down the Nvidia graphics card.\r\n\r\nI went ahead and wrote a patch which blocks niri from adding a device through a config option:\r\n\r\n```\r\ndiff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs\r\nindex 44aeffe..f9cea44 100644\r\n--- a/niri-config/src/lib.rs\r\n+++ b/niri-config/src/lib.rs\r\n@@ -2313,6 +2313,8 @@ pub struct DebugConfig {\r\n     pub restrict_primary_scanout_to_matching_format: bool,\r\n     #[knuffel(child, unwrap(argument))]\r\n     pub render_drm_device: Option<PathBuf>,\r\n+    #[knuffel(children(name = \"block-drm-device\"), unwrap(argument))]\r\n+    pub block_drm_device: Vec<Option<PathBuf>>,\r\n     #[knuffel(child)]\r\n     pub force_pipewire_invalid_modifier: bool,\r\n     #[knuffel(child)]\r\ndiff --git a/src/backend/tty.rs b/src/backend/tty.rs\r\nindex 363526d..45bb2cf 100644\r\n--- a/src/backend/tty.rs\r\n+++ b/src/backend/tty.rs\r\n@@ -348,14 +348,26 @@ impl Tty {\r\n \r\n     fn on_udev_event(&mut self, niri: &mut Niri, event: UdevEvent) {\r\n         let _span = tracy_client::span!(\"Tty::on_udev_event\");\r\n-\r\n         match event {\r\n             UdevEvent::Added { device_id, path } => {\r\n                 if !self.session.is_active() {\r\n                     debug!(\"skipping UdevEvent::Added as session is inactive\");\r\n                     return;\r\n                 }\r\n-\r\n+                {\r\n+                    if self\r\n+                        .config\r\n+                        .borrow()\r\n+                        .debug\r\n+                        .block_drm_device\r\n+                        .iter()\r\n+                        .filter_map(|p| p.as_ref())\r\n+                        .any(|blocked_path| blocked_path == &path)\r\n+                    {\r\n+                        debug!(\"skipping {path:?} as it is a blocked drm node\");\r\n+                        return;\r\n+                    }\r\n+                }\r\n                 if let Err(err) = self.device_added(device_id, &path, niri) {\r\n                     warn!(\"error adding device: {err:?}\");\r\n                 }\r\n```\r\nHowever, disabling a card from being added in niri won't enable DRM and therefore it's unusable for a gaming session. I haven't tested this patch for compute-only tasks though.\r\n\r\n> So what should be done to be able to manually program a `niri msg action` command to manually unbind Nvidia and detach it from niri without restarting it?\r\n\r\nI should add that, obviously, unbinding through `/sys/bus/pci/drivers/nvidia/unbind` and creating a remove trigger via `udevadm trigger --action=remove /dev/dri/renderD129` don't work.",
      "created_at": "2025-08-16T07:40:42Z",
      "updated_at": "2025-09-14T06:15:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ketetefid",
        "avatar_url": "https://avatars.githubusercontent.com/u/3512312?u=2b0978c896752263e4b59fe43e8d79ec5644bdd6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah6qE",
      "number": 2380,
      "title": "Add method to check if niri is being idle inhbiited",
      "body": "Right now there doesn't seem to be a way to check if Niri is being idle inhbited (correct me if I'm wrong). This feature would be cool since you could have a button or label change state depending on whenether idle inhibiting is on or not. ",
      "created_at": "2025-09-13T16:53:50Z",
      "updated_at": "2025-09-13T16:54:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "64-bitman",
        "avatar_url": "https://avatars.githubusercontent.com/u/60551350?u=cd14c4af9a4f97bb3abefd27463216400caff03a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdKxm",
      "number": 854,
      "title": "Idle protocols: Successsful audio idle inhibit anyone?",
      "body": "\r\nI'm lookng for a successful strategy to inihibit idle whilst playing audio, and if you have one please do tell. Below, I detail my  unsuccessful attempts, and what I understand.\r\n\r\nI am using swayidle which determines idle timeout before dpms off, and suspend; In order to inhibit swayidle when playing audio I tried two alternative scripts, _sway-audio-inhibit_ and _waylpand-pipewire-audio-idle-inhibit_, \r\n\r\nAudio plays through pipewire. I have pipewire-pulse and pipewire-alsa service files enabled.\r\n\r\nI  read that Niri, \r\n> \"implements the ext-idle-notify and idle-inhibit pair of Wayland protocols. This allows tools like swayidle to work, and clients like mpv to pause them from working while you're watching videos\".\r\n> \" has \"implemented the org.freedesktop.ScreenSaver D-Bus interface for idle inhibiting, used by xdg-desktop-portal-gtk\"\r\n\r\n \r\nAnd yes, to confirm,   I find idle is nicely inhibited as desired and expected when playing videos in browsers ( qutebrowser, brave) and, also mpv.\r\n\r\nI'm wondering if ext-idle-notify and idle-inhibit Wayland protocols include zwp_idle_inhibit_manager_v1 :\r\n\r\nFrom the README, of Sway-audio -idle-inhibit \r\n\r\n> \"Prevents swayidle from sleeping while any application is outputting or receiving audio. Should work with all Wayland desktops that support the zwp_idle_inhibit_manager_v1 protocol but only tested in Sway\"\r\n\r\n\r\nFrom Wayland PipeWire Idle Inhibit:\r\n\r\n> \"Description\r\n> Suspends automatic idling when media is being played through Pipewire.\r\n> \r\n> For detecting media being played, it depends on PipeWire.\r\n> \r\n> For inhibiting idle, it depends, either on:\r\n> \r\n> Wayland compositors implementing the experimental protocol idle-inhibit-unstable-v1\r\n> Daemons implementing the D-Bus org.freedesktop.ScreenSaver service\"\r\n\r\n\r\nI haven't installed (available in  arch user reporitory ) the xscreensaver-dbus-screenlock package, which perhaps could help there, but I doubt it; I'm running niri-session with  the xdg-desktop-portal-gtk.service running.\r\n\r\nCheers, John\r\n\r\n",
      "created_at": "2024-12-10T01:40:41Z",
      "updated_at": "2025-09-13T12:08:32Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "plum",
        "avatar_url": "https://avatars.githubusercontent.com/u/47397?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4ActkG",
      "number": 820,
      "title": "Enhance `maximize-column`",
      "body": "When using the mod+F shortcut on a window that doesn’t occupy the full width and height of the screen, only the width is maximized, not the height.\r\n\r\nIf a window is nested within a column, it would make sense for the first use of the shortcut to expel the window and make it single column / full height. If the shortcut is triggered again, the window should re-consume into its initial state.",
      "created_at": "2024-11-21T12:40:03Z",
      "updated_at": "2025-09-12T13:49:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Paul-Eau",
        "avatar_url": "https://avatars.githubusercontent.com/u/52856465?u=72317359a3acdf6d87179a24574debff8aabbea9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhQKa",
      "number": 2216,
      "title": "Any plans to implement window maximization feature?",
      "body": "Hi! First, thanks for developing niri – it works great with Waybar on my Arch Linux setup.\r\n\r\nWhile using Waybar's taskbar, I noticed it doesn't support window `maximized` . From briefly looking at the source code, I see many interfaces for this feature (e.g., parts of zwlr protocol and xdg_shell) seem to be reserved but not fully implemented.\r\n\r\nI made a simple local patch to temporarily enable basic full-screen maximization, which works fine for my needs.\r\n\r\nSo I wanted to ask:\r\n\r\n* Is the lack of this implementation due to certain considerations (e.g., design direction)?\r\n\r\n* Are there plans to complete these maximization features that appear \"nearly finished\" in the future?",
      "created_at": "2025-08-11T16:47:15Z",
      "updated_at": "2025-09-12T13:48:33Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "LaoQi",
        "avatar_url": "https://avatars.githubusercontent.com/u/4121543?u=5ca3a67c82b11eb4428b7927bef3e9cdec54068a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AY1t-",
      "number": 293,
      "title": "Bind window maximization request",
      "body": "Nowadays apps have client side window decorations and it's common to have the maximize button. It'd be nice to be able to bind that app event to a compositor action like `maximize-column`. Is it trappable?\r\n",
      "created_at": "2024-04-15T20:11:15Z",
      "updated_at": "2025-09-12T13:48:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "megatux",
        "avatar_url": "https://avatars.githubusercontent.com/u/850020?u=0973020b5f49284386d63c2529405cb565bb5a69&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah287",
      "number": 2360,
      "title": "Customizing animations based on whether they are triggered by Gestures or not",
      "body": "## Summary\r\n\r\nExtend `animations` setting or similar to allow to separately customize animations that are triggered by normal binds and those that are triggered by gestures.\r\n\r\n## Reasoning\r\n\r\nWith gestures, the movement of windows / workspaces on the screen is synced to the movement of the fingers on the touchpad. When the gesture is completed (i.e. the fingers are lifted off the touchpad), niri performs the rest of the motion as an animation. Essentially, you manually animate the beginning of the motion and niri takes over after the gesture has been registered.\r\n\r\nAs a result, the whole motion can look jarring and unnatural if it does not match the manually performed motion. For normal binds, this is not an issue since all of the motion is controlled by the animation.\r\n\r\nFor example, I use `animations { off }` which is very nice with the keyboard binds. Since my workflow involves opening a lot of windows in quick succession, the lack of animations makes this feel snappy and it is less taxing on the eyes in my experience. However, using gestures which I occasionally do, feels very unpleasant since I get a gradual motion (as long as my fingers are on the touchpad) which then *instantly* snaps into place as soon as I lift my fingers from the touchpad. This is usually just before the halfway point of the theoretical full motion. The result basically [looks like this](https://github.com/YaLTeR/niri/issues/1100), but for every (uncanceled) motion.\r\n\r\n## Related Issues\r\n\r\n- It seems like this could/should be implemented as part of a system to customize what gestures do, as discussed in https://github.com/YaLTeR/niri/issues/372. However, I've decided to raise this separately as well since it is an issue that exists regardless of whether customizable gesture binds are implemented or not.\r\n- https://github.com/YaLTeR/niri/issues/1100 shows the suboptimal outcome of a gesture combined with no animation for the subsequent motion.",
      "created_at": "2025-09-10T11:13:31Z",
      "updated_at": "2025-09-12T09:11:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sternenseemann",
        "avatar_url": "https://avatars.githubusercontent.com/u/3154475?u=2361ab7ee3f009aa65aa78e8041a2f9d93daa070&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah5I_",
      "number": 2374,
      "title": "niri msg outputs cannot find all monitor modes",
      "body": "(the post is generated by AI from my talks with AI, though the final solution is found by myself)\r\n\r\nI encountered an issue where my monitor's 2560x1440 modes weren't detected over HDMI, even though the EDID clearly advertised them. Since niri doesn't support custom modelines yet, I wanted to share my solution for anyone facing similar issues.\r\n\r\n### My Setup\r\n- **System:** NixOS with niri compositor\r\n- **GPU:** Intel integrated graphics\r\n- **Monitor:** SKYDATA F27B23Q Pro (supports 2560x1440@60/75/100Hz)\r\n- **Connection:** Direct HDMI\r\n\r\n### The Problem\r\n```bash\r\n# niri msg outputs only showed 1920x1080 max\r\n# But edid-decode confirmed 2560x1440 support:\r\nfind /sys/devices -name edid -exec sh -c 'cat {} | edid-decode' \\; | grep \"2560x1440\"\r\n  # DTD 1:  2560x1440   60.000000 Hz\r\n  # DTD 2:  2560x1440  100.000000 Hz\r\n  # DTD 3:  2560x1440   75.000000 Hz\r\n```\r\n\r\nInterestingly, the same monitor worked at 2K when connected through a USB-C dock (using DisplayPort), and Windows detected 2K properly on direct HDMI.\r\n\r\n### The Solution\r\n**Updating the kernel from 6.12 to 6.16 fixed it completely:**\r\n\r\n```bash\r\n# Before (kernel 6.12.45): Max 1920x1080\r\n# After (kernel 6.16.5): All 2560x1440 modes available\r\n```\r\n\r\nThis was an Intel i915 driver bug that got fixed between these kernel versions.\r\n\r\n### Other Workarounds to Try\r\nIf kernel update isn't an option:\r\n1. **Use a USB-C/Thunderbolt dock** - Often uses DisplayPort protocol which may work better\r\n2. **Try kernel EDID override** - Force kernel to use a known-good EDID\r\n3. **Check your cable** - Ensure it's HDMI 2.0+ certified\r\n\r\nHope this helps someone! While custom modeline support would be great, sometimes the issue is deeper in the driver stack.\r\n\r\n---\r\n\r\nFeel free to adjust it based on what details you want to emphasize!",
      "created_at": "2025-09-12T08:02:31Z",
      "updated_at": "2025-09-12T08:02:35Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "Ziqi-Yang",
        "avatar_url": "https://avatars.githubusercontent.com/u/87977742?u=8df08ee51d4ad9e8cd37de8ae17f521b2b22aa3d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab8qJ",
      "number": 742,
      "title": "Window Rule for blocking idle requests when full screen",
      "body": "Currently, if I'm watching a video on fullscreen in Niri, swayidle will trigger as normal. It would be nice to be able to set a window rule that inhibits swayidle and any other idle/ screensaver processes when the window is in fullscreen mode. As it is, I need to regularly jiggle the mouse to stop this happening. Sway and Hyprland seem to deal with this with their implementations of window rules.\r\n\r\nThank you for your work on this project by the way! This is a gorgeous compositor with a really intuitive workflow.",
      "created_at": "2024-10-16T12:14:58Z",
      "updated_at": "2025-09-12T06:46:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "squishram",
        "avatar_url": "https://avatars.githubusercontent.com/u/77433667?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah4qT",
      "number": 2370,
      "title": "Adding extra modifiers to keybinds shouldn't prevent them from running",
      "body": "So, weird example, but I have Mod+T set to open a terminal. On a previous setup, I had it set to Mod+Shift+T, and when trying that, nothing happened, and I was very confused.\r\n\r\nEssentially, because Mod+Shift+T looks like a totally separate keybind to niri, it does nothing. However, it would make sense that Mod+Shift+T should also trigger Mod+T if Mod+Shfit+T is not bound to anything.\r\n\r\nMaybe this could be gated behind a setting, but it feels reasonable to do.",
      "created_at": "2025-09-11T20:34:17Z",
      "updated_at": "2025-09-12T04:45:59Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "clarfonthey",
        "avatar_url": "https://avatars.githubusercontent.com/u/15850505?u=064c10efd2d57ae0bb9d53c6d97ea0a8e550c2a6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZhW-",
      "number": 356,
      "title": "Poor man's workspace indicator for Waybar",
      "body": "Now that v0.1.6 is out with `niri msg workspaces`, we have the tools to write a (somewhat hacky) workspace indicator! I'll share how I implemented a simple indicator for Waybar.\r\n\r\nFirst and foremost, this is how it turned out (see top-left):\r\n\r\n![Screenshot from 2024-05-18 20-18-47](https://github.com/YaLTeR/niri/assets/48367298/58e6982c-b038-477d-9490-f35ea8e71c89)\r\n\r\nFirst, we will need a script that parses the output of msg workspaces. Save it somewhere inside your home dir (e.g. `~/niri-workspaces.sh`):\r\n```bash\r\n#!/bin/bash\r\n\r\nset -e\r\n\r\nactive=\"\"\r\ninactive=\"\"\r\n\r\nworkspace_str=\"\"\r\n\r\nmonitor=$1\r\n\r\nreading_output=0\r\nwhile read -r line; do\r\n\tif [ $reading_output -eq 0 ] && [ \"$(echo \"$line\" | cut -d ' ' -f 2)\" = \"\\\"$monitor\\\":\" ]; then\r\n\t\treading_output=1\r\n\t\tcontinue\r\n\telif [ $reading_output -eq 1 ]; then\r\n\t\tif [ -z \"$line\" ]; then\r\n\t\t\tprintf \"%s\" \"$workspace_str\"\r\n\t\t\texit\r\n\t\tfi\r\n\r\n\t\tif [ \"$(echo \"$line\" | head -c 1)\" = '*' ]; then\r\n\t\t\tworkspace_str=\"${workspace_str}${active}  \"\r\n\t\telse\r\n\t\t\tworkspace_str=\"${workspace_str}${inactive}  \"\r\n\t\tfi\r\n\tfi\r\ndone <<<\"$(niri msg workspaces)\"\r\n\r\nprintf \"%s\" \"$workspace_str\"\r\n```\r\n\r\nSince we're not fancy enough to write a custom module, we also need a script to wrap niri actions and call `pkill` on waybar with a signal (I saved in myhome dir as `~/exec_and_signal.sh`):\r\n\r\n```bash\r\n#!/bin/sh\r\n\r\nniri msg action $1\r\npkill -SIGRTMIN+8 waybar\r\n``` \r\n\r\nNow, it's time to configure waybar:\r\n```jsonc\r\n...\r\n    \"modules-left\": [\r\n        \"custom/workspaces\",\r\n        ...\r\n    ],\r\n...\r\n    \"custom/workspaces\": {\r\n        \"exec\": \"~/niri-workspaces.sh \\\"$WAYBAR_OUTPUT_NAME\\\"\",\r\n        \"signal\": 8\r\n    },\r\n```\r\n\r\nDon't forget to restart waybar: `systemctl --user restart waybar.service`\r\n\r\nLastly, open your niri config and replace all workspace-related binds with our wrapper:\r\n\r\n```kdl\r\n    Mod+1 { spawn \"~/exec_and_signal.sh\" \"focus-workspace 1\"; }\r\n    Mod+2 { spawn \"~/exec_and_signal.sh\" \"focus-workspace 2\"; }\r\n    Mod+3 { spawn \"~/exec_and_signal.sh\" \"focus-workspace 3\"; }\r\n    Mod+4 { spawn \"~/exec_and_signal.sh\" \"focus-workspace 4\"; }\r\n    Mod+5 { spawn \"~/exec_and_signal.sh\" \"focus-workspace 5\"; }\r\n    Mod+6 { spawn \"~/exec_and_signal.sh\" \"focus-workspace 6\"; }\r\n    Mod+7 { spawn \"~/exec_and_signal.sh\" \"focus-workspace 7\"; }\r\n    Mod+8 { spawn \"~/exec_and_signal.sh\" \"focus-workspace 8\"; }\r\n    Mod+9 { spawn \"~/exec_and_signal.sh\" \"focus-workspace 9\"; }\r\n```\r\n\r\nAaaaand now you should have a (very, very hacky) workspace switcher! :)",
      "created_at": "2024-05-18T23:28:52Z",
      "updated_at": "2025-09-11T17:33:23Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "matbme",
        "avatar_url": "https://avatars.githubusercontent.com/u/48367298?u=22d21444e512b45a7e2305dd0ecf569755ded08f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahy2S",
      "number": 2348,
      "title": "Add a fit-to-screen action to \"tile\" all windows from a workspace",
      "body": "Sometimes I have two maximized windows in my workspace that I want to resize to two equal columns on the view-port. This means resizing one window, switching to the other, then resizing it too.\r\n\r\nA fit-to-screen action to automatically resize all windows in a workspace to fully appear on the screen could be useful here. If there is too many windows, these could be stacked in 2 or 3 columns for example.\r\n\r\nThe feature would basically rearrange the windows as regular tiling managers do.",
      "created_at": "2025-09-08T00:12:01Z",
      "updated_at": "2025-09-11T15:31:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "louis-thevenet",
        "avatar_url": "https://avatars.githubusercontent.com/u/55986107?u=9a1a78d194d6f15ff7377c92ff5edf7ab7c2bf50&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah3wy",
      "number": 2366,
      "title": "action to send shortcut to certain clients",
      "body": "thank you for developing such a special compositor that solves some of my sore points and attracted me to switch from Hyprland\r\n\r\nI dont know if it's greedy to require feats same with hyprland,\r\nlike this dispatcher to send shortcut to certain windows\r\n\r\n<img width=\"1177\" height=\"108\" alt=\"图片\" src=\"https://github.com/user-attachments/assets/a316a2ad-c55d-4b61-b59f-ef3720bbbc7c\" />\r\n\r\nI previously use the config below\r\njust remap `super + c/v` to `ctrl/shift + insert`\r\nto achieve consistent experience of copy and paste in browser, terminal and neovim like MacOS\r\n\r\n<img width=\"924\" height=\"129\" alt=\"图片\" src=\"https://github.com/user-attachments/assets/e8403f9c-9bac-4afa-a94d-0d3bd511917b\" />\r\n\r\n`ctrl/shift + insert` are so hard to press\r\nand I think copy and paste should act like global shorcut controlled by desktop environment\r\n\r\nI'll appreciate it if you consider to implement this feature, plus, it will also be convenient for writing scripts to automatically control windows unfocused",
      "created_at": "2025-09-11T01:19:38Z",
      "updated_at": "2025-09-11T11:08:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Lingshinx",
        "avatar_url": "https://avatars.githubusercontent.com/u/157816708?u=9e001177bb921a853d32288ae96aed0c6450afb8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah2jE",
      "number": 2359,
      "title": "Allow border and focus ring offsets",
      "body": "Instead of always being right at the edge of a window, it would be nice if the offset of the borders could be configured.\n\nSomething similar can already be done with the focus ring (fully transparent border that acts as the gap), but the corners aren't anti-aliased from inside and so it only really works when windows aren't rounded.\n\n```kdl\n// Inset border.\nborder {\n  width 1\n  offset -1\n}\n\nfocus-ring {\n  width 1\n  offset 2\n}\n```\n\nShadows could also have a `cutoff` offset parameter that works the same.\n\n```kdl\nshadow {\n  offset x=0 y=0 cutoff=4\n}\n```",
      "created_at": "2025-09-10T05:10:41Z",
      "updated_at": "2025-09-10T16:02:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bodby",
        "avatar_url": "https://avatars.githubusercontent.com/u/49784526?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah3Os",
      "number": 2362,
      "title": "Per-monitor Wallpaper in output configuration",
      "body": "The ability to add monitor specific wallpaper in the config.\r\nCurrently Outputs have the following options: mode, scale, transform, position, variable-refresh-rate, focus-at-startup, background-color, backdrop-color.\r\nThe integration of wallpaper support would fix the issue of monitors disconnecting and reconnecting on computers breaking wallpapers as they are output specific ( ex. hyprpaper, swaybg ) and if are reconnected on a separate output, wallpaper breaks.\r\n\r\nAn example would be:\r\noutput \"monitor-A\"{\r\n mode \"1920x1080@120.030\"\r\n    scale 2.0\r\n    transform \"90\"\r\n    position x=1280 y=0\r\n    variable-refresh-rate // on-demand=true\r\n    focus-at-startup\r\n    background-color \"#003300\"\r\n    backdrop-color \"#001100\"\r\n\r\n    wallpaper_command <image> <mode>\r\n}\r\n\r\nThe mode's should be at least stretch, fill, fit, center, tile.\r\n\r\nIf a specific wallpaper application is selected it should reflect that in the config in the case that niri changes the application or a custom program is developed. \r\nexample: swaybg_wallpaper <image> <mode>\r\n\r\nIdeally also accessible through niri IPC so rotating wallpapers would also be possible",
      "created_at": "2025-09-10T15:00:24Z",
      "updated_at": "2025-09-10T15:00:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Set2Minecraft",
        "avatar_url": "https://avatars.githubusercontent.com/u/75960074?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah0wZ",
      "number": 2356,
      "title": "\"Outputs changed\" event?",
      "body": "Is there an event I can subscribe to using `niri msg event-stream` that indicates outputs have changed? I'm writing a script which changes my output layout (scale and position) based on if my laptop is docked or not, and on sway I use `swaymsg -t subscribe '[\"output\"]'` to do this.",
      "created_at": "2025-09-08T20:03:06Z",
      "updated_at": "2025-09-10T14:25:56Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "jf-uu",
        "avatar_url": "https://avatars.githubusercontent.com/u/181011550?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah3Ld",
      "number": 2361,
      "title": "Include external config file",
      "body": "Would be very useful to have an option for a path to another KDL config file from within `config.kdl` to import settings from there.\r\nSimilar to `include` in `zathurarc` or `kitty.conf`. Indeed for dynamic theming it's way more convenient to have a separate config file with the color theme, especially if the `config.kdl` is read-only (like in nix home manager), and dynamic theming is thus impossible with current `config.kdl` in this scenario.",
      "created_at": "2025-09-10T14:21:41Z",
      "updated_at": "2025-09-10T14:22:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "BinaryQuantumSoul",
        "avatar_url": "https://avatars.githubusercontent.com/u/19613657?u=a69c74929841d7307d830142fcec5d0e60e77478&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeFiz",
      "number": 1061,
      "title": "Hiding floating windows behind scrolling windows",
      "body": "A way to 'hide' floating windows behind scrolling windows.\r\n\r\nthis could be implemented as keyboard shortcut or a window rule.\r\n\r\nthis could also include only hiding floating windows behind specific scrolling windows, which could be implemented as a window rule.",
      "created_at": "2025-01-28T20:19:13Z",
      "updated_at": "2025-09-09T11:17:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ah0iN",
      "number": 2353,
      "title": "focus-follows-mouse for outputs only",
      "body": "Loving Niri!\r\n\r\nI would love to be able to set the output/display focus to follow the mouse cursor, but not the individual window focus. I like to scroll through a browser window with my mouse while keeping the window next to it in focus, so I have to disable the current focus-follows-mouse implementation.\r\n\r\nI searched around and haven't seen this feature requested yet.",
      "created_at": "2025-09-08T16:33:08Z",
      "updated_at": "2025-09-08T16:33:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "pixelpassport",
        "avatar_url": "https://avatars.githubusercontent.com/u/139646202?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahyyu",
      "number": 2347,
      "title": "Middle click by pressing touchpad with three fingers",
      "body": "Hi, I’m switching from i3wm and was wondering how I can enable middle-click emulation with a three-finger press on the touchpad? It was on by default in i3 but I can't figure out how to enable it in Niri. `middle-emulation` does not work for that",
      "created_at": "2025-09-07T23:45:47Z",
      "updated_at": "2025-09-08T11:51:22Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A2s45",
        "body": "I figured it out. It can be enabled by adding `click-method \"clickfinger\"` to the input config"
      },
      "user": {
        "login": "AlexNomadrg",
        "avatar_url": "https://avatars.githubusercontent.com/u/58301160?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhvCZ",
      "number": 2337,
      "title": "Arch Linux niri install from archinstall in VirtualBox gives black screen in niri session",
      "body": "Opening as discussion rather than issue because I'm open to the possibility this is a massive skill issue.\r\n\r\nI figured I'd try niri out when I saw it's offered as a desktop profile in `archinstall`. I already have VirtualBox on hand and ready so I figured I'd install in that. I installed only the packages in the `niri` profile and `gdm` display manager selection, no additional packages. I can log into the GNOME Wayland session (packages for it were brought with GDM) fine but logging into niri session gives me black screen and seemingly no way to interact with the system - I have to hard reset.\r\n\r\nI'm not sure how to diagnose this. I guess first order of business would be somebody experienced replicating if niri works in any VirtualBox setup and then we can move on from there. I'm happy to provide any logs or configs from the VM I can for more information.\r\n\r\n<img width=\"1275\" height=\"793\" alt=\"image\" src=\"https://github.com/user-attachments/assets/7d672af2-d60d-4db6-8ef5-333ddb4b592e\" />\r\n",
      "created_at": "2025-09-05T07:57:18Z",
      "updated_at": "2025-09-08T07:53:04Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A2odS",
        "body": "I have multiple working virtualbox setups with niri, can you try with a different display manager such as ``ly`` and then make sure you have 3d acceleration enabled"
      },
      "user": {
        "login": "thekovic",
        "avatar_url": "https://avatars.githubusercontent.com/u/72971433?u=819e6f9f25e4b60b3063f37525cdfa14972b335b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhzP9",
      "number": 2350,
      "title": "What would it take to get true per-workspace wallpapers?",
      "body": "Currently I use multibg-wayland to configure different wallpapers per workspace. It works by listening to workspace change events from Niri and then changing the background image to the appropriate one based on configured rules. However, when you open the overview, all visible workspaces show the same background as the current workspace, because there is really only one wallpaper at a time, it just happens to change when the current workspace is changed.\r\n\r\nWhat would it take to get true per-workspace wallpapers such that you can see them on the overview?\r\n\r\nOne option could be to add a layer rule `place-on-workspace`, like a cross between the existing `place-within-backdrop` layer rule and the `open-on-workspace` window rule. You'd then have to set a different namespace for each wallpaper, and a corresponding layer rule in your Niri config and fire off n different wallpaper managers. Also, `open-on-workspace` only works for named workspaces, not dynamic ones, and I'd imagine the reason for that would apply equally to a `place-on-workspace` rule.\r\n\r\nIn order to fully support dynamic workspaces, any set of namespace filtering rules would need to be dynamic as well. Here's another idea: suppose that there was an implicit namespace matching rule such that a layer with namespace `niri-workspace-<id>` would only be shown on the workspace with the matching id (that same stable id field that is used in the IPC interface). Layers of other namespaces would continue to follow the current behaviour and be shown on all workspaces unless it matches a place-within-backdrop rule. Then, a third-party wallpaper manager could listen for WorkspacesChanged events, and create background layers for new workspaces as they appear (and delete the layers when the workspaces disappear). Any use of implicit namespace filtering rules will need to be approached with caution to avoid users triggering it accidentally and wondering why their layer isn't working. I don't know if there's a best practice or common format for specifying layer namespaces.\r\n\r\nSetting per-workspace wallpapers may consume large amounts of memory, but I feel like if a user wants to waste memory on making their environment look pretty, then that's their prerogative. There may be other reasons I'm unaware of as to why per-workspace wallpapers are a bad idea, and I'd be happy to be enlightened.",
      "created_at": "2025-09-08T03:23:03Z",
      "updated_at": "2025-09-08T05:42:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "krendil",
        "avatar_url": "https://avatars.githubusercontent.com/u/876842?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahurx",
      "number": 2334,
      "title": "Invert overview open gesture",
      "body": "I want to open Overview on four fingers down swipe instead of up",
      "created_at": "2025-09-04T21:31:35Z",
      "updated_at": "2025-09-07T09:04:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "psydvl",
        "avatar_url": "https://avatars.githubusercontent.com/u/43755002?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahw0b",
      "number": 2343,
      "title": "\"niri msg overview-state\" should return boolean or 0/1",
      "body": "Some people want to add their features to niri, like changing wallpaper when overview is opened.But why this command returns text?Like, most people that will use this feature in their code need to compare returned text to string? Please,add flag --bool that will return boolean.",
      "created_at": "2025-09-06T18:05:38Z",
      "updated_at": "2025-09-06T19:31:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "glxguard",
        "avatar_url": "https://avatars.githubusercontent.com/u/198370700?u=7017d319c10da1cf29ed378745597501ace4693e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahv4U",
      "number": 2341,
      "title": "Support Num_Lock (aka MOD2) and Caps_Lock as modifier",
      "body": "In hyprland MODKEYs are `SHIFT CAPS CTRL/CONTROL ALT MOD2 MOD3 SUPER/WIN/LOGO/MOD4 MOD5`.\r\n\r\nniri currently allows Super, Alt, Mod3, Mod5, Ctrl, and Shift as modifiers. Lock (Caps Lock) and Mod2 (typically Num Lock) cannot be used as modifiers in key bindings.\r\nThis limits users who rely on Caps/Num as a “leader/Hyper” key and hinders migration from setups that support them.",
      "created_at": "2025-09-05T20:31:30Z",
      "updated_at": "2025-09-06T10:01:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "0WD0",
        "avatar_url": "https://avatars.githubusercontent.com/u/68629279?u=fa9e53a1cab93c6565195fa185985e0d4354f562&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahu6t",
      "number": 2336,
      "title": "spotify work problems",
      "body": "After launching the application and switching to other desktops/monitors, Spotify loses the ability to show the track being played, search for tracks and other functionality, but interaction remains available ( Pre-installed the packages from this guide: https://github.com/YaLTeR/niri/wiki/Important-Software#xwayland)",
      "created_at": "2025-09-05T06:03:16Z",
      "updated_at": "2025-09-18T20:40:12Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A2oYr",
        "body": "Oki, once you remove that can you attempt running Spotify from terminal with the flag ``--ozone-platform=wayland``"
      },
      "user": {
        "login": "medasta",
        "avatar_url": "https://avatars.githubusercontent.com/u/63973222?u=d2bb971ed036ed8fc366bbfca8ae948eed1f4ea2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahrle",
      "number": 2327,
      "title": "If two outputs/connector are the same monitor, select only preferred one",
      "body": "This is kinda tricky but I have a monitor with a built-in KVM which I have both the iGPU HDMI output and the GPU DP connected (for some VMs and other stuff I do with the GPU). When launching niri with the following config I get the following output:\r\n\r\n```\r\noutput \"HDMI-A-2\" {\r\n    // off\r\n    mode \"2560x1440@143.856\"\r\n    scale 1\r\n    // position x=0 y=0\r\n}\r\n\r\noutput \"DP-2\" {\r\n    // off\r\n    mode \"2560x1440@169.831\"\r\n    // scale 1\r\n    position x=0 y=0\r\n    variable-refresh-rate\r\n}\r\n```\r\n\r\n```\r\n INFO niri: starting version 25.05.1 (Nixpkgs)\r\nDEBUG niri_config: loaded config from \"/tmp/tmp.IbHRyzXtsU\"\r\nDEBUG niri::backend::tty: attempting to use render node from config: \"/dev/dri/card1\"\r\n WARN niri::backend::tty: DRM node \"/dev/dri/card1\" is not a render node\r\n INFO niri::backend::tty: using as the render node: \"/dev/dri/renderD129\"\r\nDEBUG niri::backend::tty: device added: 57856 \"/dev/dri/card0\"\r\nDEBUG niri::backend::tty: device changed: 57856\r\nDEBUG niri::backend::tty: new connector: HDMI-A-2 \"GIGA-BYTE TECHNOLOGY CO., LTD. M27Q 21070B005215\"\r\nDEBUG niri::backend::tty: device added: 57857 \"/dev/dri/card1\"\r\nDEBUG niri::backend::tty: this is the primary node\r\nDEBUG niri::backend::tty: this is the primary render node\r\nDEBUG niri::backend::tty: device changed: 57857\r\nDEBUG niri::backend::tty: new connector: DP-2 \"GIGA-BYTE TECHNOLOGY CO., LTD. M27Q 21070B005215\"\r\n WARN niri::backend::tty: new connector DP-2 duplicates make/model/serial of existing connector HDMI-A-2, unnaming\r\nDEBUG niri::backend::tty: connecting connector: DP-2\r\nDEBUG niri::backend::tty: picking mode: Mode { name: \"2560x1440\", clock: 683670, size: (2560, 1440), hsync: (2608,>\r\n```\r\n\r\nI want an option that if enabled and two connectors share the same make/model/serial of existing connector it removes that connector. Ideally but not required to also be able to do not try to attach to every card (I would want only card0 in this case).\r\n\r\nThis is a feature very related to my weird setup tho, because sometimes I attach the compositor to one card or the other depending on the use case but nevertheless maybe someone has the same weird setup. ",
      "created_at": "2025-09-01T19:34:56Z",
      "updated_at": "2025-09-04T20:05:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Pablo1107",
        "avatar_url": "https://avatars.githubusercontent.com/u/17091659?u=2703dc553e1a80a1b83b84ef2d80fde50ec8a7cf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaMDM",
      "number": 472,
      "title": "Add tablet rotation",
      "body": "currently tablets(as in digitizers) are, as far as I can see, locked to their \"native\" rotation. this may be undesirable when, say, it's an on-screen digitizer and the native orientation doesn't match the screen's. (no, map-to-output does not help, it does not rotate it the same way in tablet though it does in touch)",
      "created_at": "2024-06-26T09:39:23Z",
      "updated_at": "2025-09-04T16:51:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "vgskye",
        "avatar_url": "https://avatars.githubusercontent.com/u/116078858?u=80007857ba572126f7fd3fd96081774a9cfd59d0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahnj4",
      "number": 2310,
      "title": "itellij find in files",
      "body": "I find that when I ctrl-shift-f , the find in files dialog appears on top of intellij, but the search field is not focused. Which is a pain.\r\n\r\nIs there a way to fix?\r\n\r\nThanks!",
      "created_at": "2025-08-28T22:24:18Z",
      "updated_at": "2025-09-03T23:37:17Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "gregzuro",
        "avatar_url": "https://avatars.githubusercontent.com/u/235511?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhtYP",
      "number": 2332,
      "title": "Add wlr portal to defaults",
      "body": "The only real use case I have for portals is screencasting and the wlr portal works wonderfully with niri without pulling in an absolute mountain of dependencies like the gnome portal. As a small convenience I would like to see the wlr portal among the defaults for niri so that niri-portals.conf doesn't have to be modified for every release.",
      "created_at": "2025-09-03T16:30:13Z",
      "updated_at": "2025-09-03T20:02:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Toesmasher",
        "avatar_url": "https://avatars.githubusercontent.com/u/39797590?u=4727cb067664996b82f8f4839645b9075761670c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhXDl",
      "number": 2253,
      "title": "Ability to specify proportion as ratio",
      "body": "Currently, if I want to make the width of a column take up _one third_ of the available space, I have to express this as a percentage:\r\n\r\n```kdl\r\nproportion 0.33333\r\n```\r\n\r\nI would like to be able express this as a _ratio_ instead:\r\n\r\n```kdl\r\nproportion 1/3\r\n```\r\n\r\nThe Clojure language has  a builtin ratio type, which I always thought was a neat idea. I recently implemented my own version of it in Rust, for my immediate mode UI library that uses integer coordinates. Very useful construct.",
      "created_at": "2025-08-17T10:15:41Z",
      "updated_at": "2025-09-03T03:10:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "d-r",
        "avatar_url": "https://avatars.githubusercontent.com/u/9402?u=7e295f79c46147f1920e9847b04705e9a38357ce&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhshR",
      "number": 2331,
      "title": "Hiding \"(not bound)\" keys from hotkey overlay?",
      "body": "Is it possible to hide unbound bindings from the hotkey overlay?\r\n<img width=\"749\" height=\"705\" alt=\"image\" src=\"https://github.com/user-attachments/assets/7cd94322-7e88-4426-b2e2-cf96ed6f1c76\" />\r\n",
      "created_at": "2025-09-02T21:55:19Z",
      "updated_at": "2025-09-03T00:51:22Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "jf-uu",
        "avatar_url": "https://avatars.githubusercontent.com/u/181011550?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahrwt",
      "number": 2329,
      "title": "Add the property write-to-disk to screenshot",
      "body": "The `write-to-disk` property is available for `screenshot-window` and `screenshot-screen`, but not for `screenshot` itself. When I try to apply it, the config is invalid due to unexpected property.\r\n\r\nIt would be nice if it was added... Thank you!",
      "created_at": "2025-09-02T02:57:36Z",
      "updated_at": "2025-09-02T15:53:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Veltair-D",
        "avatar_url": "https://avatars.githubusercontent.com/u/159664619?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agsxm",
      "number": 2020,
      "title": "Support for wlr-output-power-management-v1",
      "body": "Are there any plans to add support  for `wlr-output-power-management-v1` to turn on/off outputs with other tools like `wlopm` or `wayout`?",
      "created_at": "2025-07-12T22:52:46Z",
      "updated_at": "2025-09-01T15:06:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "salahoued",
        "avatar_url": "https://avatars.githubusercontent.com/u/17504423?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahq7F",
      "number": 2325,
      "title": "Integrating niri-flake documentation into main documentation",
      "body": "is there anything that is particularly against that?\r\nwould be great to have it in there too.\r\n\r\nalso, the niri-flake documentation is not exactly easy to read...",
      "created_at": "2025-09-01T07:19:51Z",
      "updated_at": "2025-09-01T11:02:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahq1o",
      "number": 2324,
      "title": "Offline version of documentation",
      "body": "maybe using manpages?\r\n\r\ndepending on how they are created, might just be setting a different compilation target, but dont know how easy it is here.\r\n\r\nif possible, it would'nt be a offline copy of the web version\r\n(implying: shouldnt require browser)",
      "created_at": "2025-09-01T06:39:57Z",
      "updated_at": "2025-09-01T08:49:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af69p",
      "number": 1656,
      "title": "Move floating window to screen edge",
      "body": "Loving niri, great work on it!\r\n\r\nI want to start a discussion about the way moving floating windows is handled in niri.\r\n\r\nCurrently `move-window-*` and `move-column-*` are moving floating windows by a small increment in the given direction which is sensible behavior in my opinion.\r\nHowever there are cases where quickly moving a floating window to another side of the screen can be useful (in my case, a floating video obstructing something in the browser).\r\n\r\nAs far as i know most compositors either support one or the other with the \"move window\" binds, leaving no choice to the user.\r\n\r\nAny thoughts on how to handle this in niri?",
      "created_at": "2025-05-24T12:19:09Z",
      "updated_at": "2025-08-31T16:37:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "arnaudmathias",
        "avatar_url": "https://avatars.githubusercontent.com/u/4369601?u=854b5a35adc619c8071b91aa1376b6ca4c26a3b5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhpoF",
      "number": 2322,
      "title": "`libei` support (required for cursor move with Steam Input)",
      "body": "`libei` provides Emulated Input, used at least on Steam Input for mapping controller actions as emulation keyboard and mouse.\r\nAnd while you can interact with game using controller, compositor cursor will not move at all. So you cannot be really sure where pointer really is. \r\n\r\nAccording to library [Overview](https://gitlab.freedesktop.org/libinput/libei#overview) some work on niri (as wayland compositor) required to support this thing.\r\n\r\n<details><summary>On GNOME, for example, you'll see next dialog on interaction from steam request</summary>\r\n<img width=\"669\" height=\"511\" alt=\"image\" src=\"https://github.com/user-attachments/assets/058fec06-f213-491d-b998-39f22861af55\" />\r\n</details> \r\nNB: There is (I think) an issue on GNOME, as since you provide remote interaction, you can move mouse even outside the target window, for example click anything on the top bar.\r\n",
      "created_at": "2025-08-31T16:25:29Z",
      "updated_at": "2025-08-31T16:25:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "psydvl",
        "avatar_url": "https://avatars.githubusercontent.com/u/43755002?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae2i5",
      "number": 1276,
      "title": "Help with setting up with greetd greeter",
      "body": "I have been trying to use niri with greetd and not sure how I am supposed to run the greeter.\r\n\r\nI am using this greeter: https://github.com/rharish101/ReGreet the examples they show are for cage, sway\r\n\r\n```toml\r\n[default_session]\r\ncommand = \"cage -s -mlast -- regreet\"\r\nuser = \"greeter\"\r\n```\r\n\r\nSway\r\n\r\n`/etc/greetd/sway-config`\r\n\r\n```\r\nexec \"regreet; swaymsg exit\"\r\ninclude /etc/sway/config.d/*\r\n```\r\n\r\n```toml\r\n[default_session]\r\ncommand = \"sway --config /path/to/custom/sway/config\"\r\nuser = \"greeter\"\r\n```\r\n\r\nFrom the examples it seems like the greeter needs a graphical session to run, so looks like niri has to be the one to start the greeter?\r\n\r\nI am also using a non systemd distro void-linux so maybe that's the issue?",
      "created_at": "2025-03-15T19:07:05Z",
      "updated_at": "2025-08-31T02:40:56Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Avz7T",
        "body": "Hi, I just got ReGreet working perfectly fine on my setup.\r\n\r\n> I am also using a non systemd distro void-linux so maybe that's the issue?\r\n\r\nI'm also on a non-systemd distro , but its gentoo with openrc. so idk how its handeled in runit. But since its packaged in the official void repo so it must've been setup correctly. \r\n\r\nSo here's what I did to setup ReGreet. \r\n\r\nBe sure to add the greetd service to the required runlevel. \r\n\r\nRun these commands just to be safe.\r\n```\r\n# Create the greeter user\r\nsudo useradd -M -G video greeter\r\nsudo chmod -R go+r /etc/greetd/\r\n```\r\n\r\nThis is what I put in my `/etc/greetd/config.toml` file:\r\n```\r\n[terminal]\r\n# The VT to run the greeter on. Can be \"next\", \"current\" or a number\r\n# designating the VT.\r\nvt = 7\r\n\r\n# The default session, also known as the greeter.\r\n[default_session]\r\n\r\n# `agreety` is the bundled agetty/login-lookalike. You can replace `/bin/sh`\r\n# with whatever you want started, such as `sway`.\r\ncommand = \"niri -c /etc/greetd/config-startup.kdl\"\r\n\r\n# The user to run the command as. The privileges this user must have depends\r\n# on the greeter. A graphical greeter may for example require the user to be\r\n# in the `video` group.\r\nuser = \"greetd\"\r\n```\r\n\r\nPlace your regreet.toml inside of `/etc/greetd/`\r\n\r\nThis is my niri, config for starting ReGreet, placed in `/etc/greetd/config-startup.kdl`:\r\n```\r\n\r\nhotkey-overlay {\r\n\tskip-at-startup\r\n}\r\ninput {\r\n\tkeyboard {\r\n\t\ttrack-layout \"global\"\r\n\t\trepeat-delay 500\r\n\t\trepeat-rate 40\r\n\t\txkb {\r\n\t\t\toptions \"caps:escape_shifted_capslock\"\r\n\t\t}\r\n\t}\r\n\ttouchpad {\r\n\t\ttap\r\n\t\t// dwt\r\n\t\tnatural-scroll\r\n\t\taccel-speed 0.5\r\n\t\taccel-profile \"adaptive\"\r\n\t\tscroll-factor 1.2\r\n\t\tscroll-method \"two-finger\"\r\n\t\ttap-button-map \"left-right-middle\"\r\n\t\tclick-method \"clickfinger\"\r\n\t\t// disabled-on-external-mouse\r\n\t\t// middle-emulation\r\n\t}\r\n\tmouse {\r\n\t\tnatural-scroll\r\n\t\taccel-speed 0.5\r\n\t\taccel-profile \"adaptive\"\r\n\t\tscroll-factor 1.0\r\n\t\tscroll-method \"no-scroll\"\r\n\t}\r\n}\r\n\r\nenvironment {\r\n    GTK_USE_PORTAL \"0\"\r\n    GDK_DEBUG \"no-portals\"\r\n}\r\n\r\nanimations {\r\n\toff\r\n}\r\noutput \"eDP-1\" {\r\n\tmode \"1920x1080@144.023\"\r\n\tscale 1.0\r\n\ttransform \"normal\"\r\n\tposition x=0 y=0\r\n\tvariable-refresh-rate on-demand=false\r\n\tbackground-color \"#191b2b\"\r\n}\r\n\r\nbinds {\r\n}\r\n\r\nlayout {\r\n}\r\n\r\nspawn-at-startup \"sh\" \"-c\" \"regreet --config /etc/greetd/regreet.toml; niri msg action quit --skip-confirmation\"\r\n```\r\n\r\nLMK if this works for you."
      },
      "user": {
        "login": "vikigenius",
        "avatar_url": "https://avatars.githubusercontent.com/u/12724810?u=07dd0c45ea796547433ee76d27d7a2fea9ea8b31&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aho46",
      "number": 2318,
      "title": "Help shell scripting for json event stream",
      "body": "A quick description of my goal:\r\n\r\nI'm making a wrapper script for a flashcard program called anki that I want to launch anki, wait for the window to appear, launch my console dictionary of choice (sdcv) and consume it into the tabbed anki window for hidden but quick access.\r\n\r\nI have a version which works except that the first while loop doesn't end until an extra niri event fires, so anki opens and the next part of the script only proceeds after I trigger some event like changing focus (breaking the script) or viewing overview mode (not breaking the script, but it's meant to be automated, so still very annoying)\r\n\r\n``` fish\r\n#!/usr/bin/fish\r\n\r\n# Launch Anki in the background\r\n/usr/bin/flatpak run net.ankiweb.Anki &>/dev/null &\r\n\r\n# Check if the DESKTOP_SESSION environment variable is set to 'niri'.\r\nif set -q DESKTOP_SESSION; and test \"$DESKTOP_SESSION\" = niri\r\n    niri msg --json event-stream | while read -l event\r\n        if echo \"$event\" | jq -e 'has(\"WindowOpenedOrChanged\") and (.WindowOpenedOrChanged.window.app_id == \"net.ankiweb.Anki\")' >/dev/null\r\n            echo \"found anki window, breaking loop!\"\r\n            break\r\n        end\r\n    end\r\n    echo \"broken out of first while loop!\"\r\n    alacritty --title SDCV -e sdcv &\r\n\r\n    niri msg --json event-stream | while read -l event\r\n        echo \"$event\" | jq\r\n        if echo \"$event\" | jq -e 'has(\"WindowOpenedOrChanged\") and (.WindowOpenedOrChanged.window.title == \"SDCV\")' >/dev/null\r\n            echo \"found SDCV window, consuming-in!\"\r\n            niri msg action consume-or-expel-window-left\r\n            niri msg action focus-window-up\r\n            break\r\n        end\r\n    end\r\nend\r\n\r\n```\r\n\r\nI tried a few ways to use the IPC socket directly with socat, but my results were generally even worse.\r\n\r\nI have been slamming my head into a wall all day over this, reading documentation, the discussions, and then iteratively querying the useless waste-of-electricity bots about it and getting mislead a thousand ways, so help would be really really appreciated!",
      "created_at": "2025-08-30T17:34:45Z",
      "updated_at": "2025-08-30T18:06:50Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Norgus",
        "avatar_url": "https://avatars.githubusercontent.com/u/129944?u=1049a2bd4478a5d5b815501d6c4556ca0daa7b23&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af00k",
      "number": 1605,
      "title": "A logo for niri",
      "body": "Hi! I've been following the progress of niri, and I must say, It's quite impressive, but one thing has been bugging me a little, the lack of a logo for the project.\nAs a standalone compositor/ barebones DE I think it deserves an icon that speaks what it does.\n\nNow, I'm not a designer or an artist, so please try to imagine what my mockups would try to show (instead of their actual very bad, not gud) looks.\n\nI just want to start a convo about this and if other people (with actual artsy skills) would be inspired by this to create something that speaks for the project, I'de be very happy to have been a part of it!\n\nEnough rambling, here is my main idea for an icon composition:\n\n![Image](https://github.com/user-attachments/assets/f906215c-c751-4ad8-8614-161e3a4bb278)\n\nNow I'll be the first to admit this is quite baaad, but I wanted to showcase the main idea behind the whole project: a strip where you can place your windows. This mockup has the center big rectangle, which would be a monitor, the strip, that brings the windows even more into the focus (with it's curvature) and the actual windows (not curved because this is just a crude mockup) (also also, the blurred edges could signify that the strip can go on way longer).\nAnother thing of note is that I kept the full picture to show, how this looks in a 1:1 aspect ratio, as icons usually go, and it shows the biggest problem IMO, which is that 2/3 of the icon remain empty, so I took one iteration on this first idea:\n\n![Image](https://github.com/user-attachments/assets/923b3067-8e1c-42be-bb7c-4c752a4a9b76)\n\nThis try I wanted to fill more of the whitespace, so used it to add workspaces in the way that niri positions them, I know the mockup looks very busy, but the non-main workspaces could be greyed, made smaller to not have the overwhelming feeling of everything everywhere all at once.\n\nOne idea I disregarded was using a film strip in the logo, because that is better associated with video players even though it has a cool strip design.\n\nThis would be my conversation starter for the logo, please give more ideas, if you're talented do some mockups that you feel tell what niri is about or simply tell me how bad I'm at mockups. I can't wait to see where the community can take this!",
      "created_at": "2025-05-18T19:06:46Z",
      "updated_at": "2025-08-30T16:43:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Kingproone",
        "avatar_url": "https://avatars.githubusercontent.com/u/118820223?u=65341cb3a21dff10e890692542157b72c59e1b1b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhFX8",
      "number": 2181,
      "title": "Compilation fails to resolve libevdev dependency?",
      "body": "libevdev-dev seems not to be picked up during compilation.\r\n\r\nUsually these things would pop up from pkg-config dependencies.\r\n\r\nPerhaps the package is trying to use static compilation idk why it would go in either direction by default. For static compilation you need to do the resolve dependencies yourself. Typically done with pkg-config. For dynamic libraries there seems to be more magic involved how dependencies actually are resolved.\r\n\r\n<img width=\"3832\" height=\"2076\" alt=\"image\" src=\"https://github.com/user-attachments/assets/c6565d8a-f1b0-44ca-b424-cf6b248a2c2a\" />\r\n",
      "created_at": "2025-08-03T22:02:55Z",
      "updated_at": "2025-08-30T12:47:13Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "hholst80",
        "avatar_url": "https://avatars.githubusercontent.com/u/6200749?u=f63ac77421f19f9659568320520a0b8094371725&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgSVQ",
      "number": 1830,
      "title": "GitHub Wiki replacement ideas",
      "body": "The GitHub Wiki is very convenient for me as the developer (it's right there, it's simple and it works), but it has some glaring issues, most notably the lack of a good search. (You can in fact search the GitHub Wiki with the top-right search bar, then clicking on \"Wikis\" on the left, e.g. https://github.com/search?q=repo%3AYaLTeR%2Fniri+background&type=wikis, but it's clunky.)\r\n\r\nBy now, several people on Matrix had proposed alternative wiki engines that we could switch to (appreciate it!):\r\n\r\n- https://variety4me.github.io/niri_docs/\r\n- https://highorderlogic.github.io/niri-docs/\r\n- https://niri-docs.vercel.app/\r\n- https://app.radicle.xyz/nodes/seed.radicle.garden/rad:z3jV4nhQ2dNcHcXJ5d6mW1zJ2WcVi (not built)\r\n- probably someone else I forgot about\r\n\r\nIn this discussion I want to clearly list my requirements/wishes for a new wiki, so that we can figure out which one would work best, and switch to that. So, here goes, roughly from most to least important.\r\n\r\n1. Good search. This is the main reason we want to switch to it better be up to the task. Typing something like `background` or `backdrop` should find (ideally with good instant preview) the relevant options, even if it's not a full word match. Typing `default-column-width` should find that setting.\r\n3. Static HTML. Hostable on GitHub Pages, buildable and deployable from the main niri repo by CI, just like GitHub Wiki currently is. The wiki Markdown source must stay in the main niri repo because it's very convenient to keep it in sync with the code this way.\r\n4. Support for GitHub Markdown admonitions. I wrote the current wiki for GitHub Markdown, and I use admonitions extensively. I don't want to rewrite them to something else.\r\n2. Very low maintenance. GitHub Wiki is essentially zero maintenance: it's just Markdown files, and they keep working.\r\n\r\n    As a counter-example, I use Hugo for https://bxt.rs and every time I want to update something (~twice a year) I have to fix my templates for some yet another breaking change in Hugo. This is very annoying and I do not want that. I'd rather focus on the wiki content than fixing breaking changes by the wiki engine.\r\n5. Better page navigation. In particular, an automatic page heading outline. We use headings for most individual settings, so they should be visible in the outline, giving you a glance at everything available on the page. The word wrapping must not be janky.\r\n6. Compatibility with GitHub Wiki source files and structure. A lot of places link to the GitHub Wiki, so I'd like it to stay up. Ideally, we keep the current Markdown file structure, so the GitHub Wiki just keeps being updated on its own (perhaps missing some rendering here and there). Alternatively, some simple script that assembles the files back into the GitHub Wiki format on CI.\r\n7. Support for other syntax extensions. For example, we have Since version annotations for most config settings, would be cool if they were rendered nicely. As another example, some tables in Getting Started could use manual control over column sizes, I guess the ability to insert raw HTML/CSS would be good here.\r\n8. As little JavaScript as possible: ok for interactive search, not ok to do client-side Markdown rendering.\r\n\r\nSo yeah, please suggest what we could use, ideally with a link that people can use to try it out, and how it fares with this list of wishes. People who made the examples I linked at the top are also welcome to repost them to give more details.",
      "created_at": "2025-06-17T15:26:41Z",
      "updated_at": "2025-08-29T19:32:23Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhoND",
      "number": 2313,
      "title": "Tablet: Add a keep-ratio option to map-to-output.",
      "body": "The `keep_ratio` calculation in `src/input/mod.rs:compute_tablet_position` is offsetting my cursor as it moves away from the top-left corner of the screen. Disabling `keep_ratio` fixes it, so it would be nice if there was a configuration option for it in the config. ",
      "created_at": "2025-08-29T14:53:35Z",
      "updated_at": "2025-08-29T14:53:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "martintrumann",
        "avatar_url": "https://avatars.githubusercontent.com/u/44016775?u=d21afe75803dbd0a545f1380fb9dbd41b1f1e266&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad5Ej",
      "number": 1000,
      "title": "switch-preset-column-width (reverse)",
      "body": "Currently `switch-preset-column-width` (`Mod+R`) always grows ->, but sometimes I want to simply shrink instead of cycling through every size. with PaperWM this was `Mod+Shift+R`. would be awesome to have this ability in niri.",
      "created_at": "2025-01-17T15:45:37Z",
      "updated_at": "2025-08-29T01:22:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "not-reed",
        "avatar_url": "https://avatars.githubusercontent.com/u/86171134?u=26bb3357ca4e6653c554fa46c037264a9ff1215f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhnlF",
      "number": 2311,
      "title": "Add idle inhibitor option for window rule",
      "body": "# Description\r\n\r\nAdd a new property/option on window rules that, when toggled on, would inhibit idle sleep if any marching window exists.\r\n\r\n## Use case\r\n\r\nSteam games do not handle idle inhibiting, leading to the need to keep inputing during long cutscenes to prevent sleep. With this feature, you could write a window rule for Steam games that would ensure games inhibit idle when running.\r\n\r\n## Additional information\r\n\r\nHyprland is a compositor offering such capabilities in [its window rules](https://wiki.hypr.land/Configuring/Window-Rules/#dynamic-rules)",
      "created_at": "2025-08-28T23:05:09Z",
      "updated_at": "2025-08-28T23:06:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "filipdutescu",
        "avatar_url": "https://avatars.githubusercontent.com/u/46979062?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbpnH",
      "number": 696,
      "title": "Is it possible to get the total width in-use in a workspace?",
      "body": "I'm attempting to make a workspace indicator akin to a horizontal minimap of the current workspace, and couldn't find a way to get the sum of all columns in an active workspace in Niri, as per [this](https://yalter.github.io/niri/niri_ipc/enum.Event.html) at least.",
      "created_at": "2024-09-28T18:16:06Z",
      "updated_at": "2025-08-30T01:25:48Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A2W05",
        "body": "Closing because of https://github.com/YaLTeR/niri/pull/1265."
      },
      "user": {
        "login": "masroof-maindak",
        "avatar_url": "https://avatars.githubusercontent.com/u/62666332?u=939acc5902f8281d2fadaddeaac75887d10aca19&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag0wE",
      "number": 2083,
      "title": "Conditionally applied rules",
      "body": "Hi,\r\nI'm currently trying to implement a sorta streamer mode into my system, and i've thought that it'd be helpful if i could like... set an environment variable or text in a file or send a message to niri and give a condition in my config that sais \"if this is set, then remove gaps and window borders\" etc\r\n\r\nthe simplest way i could imagine this being used is supplementing window rules with some check?\r\n\r\nenvironment variables are probably bad for this, but if i could for example let niri read from ~/wm_mode or something and if it's \"streamer\" then i can override a bunch of stuff.\r\n\r\ni might just be overlooking something currently, but something like that would make setting sth like this up significantly easier ^^'\r\n\r\n(i specifically need this because i have only an ultrawide monitor and i need to force the window to be 1920x1080 so people voluntarily watch it, noone watches or streams 21:9)\r\n\r\nthis is probably rly niche so feel free to ignore but yea\r\nthanks :3 ",
      "created_at": "2025-07-19T20:51:44Z",
      "updated_at": "2025-08-27T18:10:59Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "schrottkatze",
        "avatar_url": "https://avatars.githubusercontent.com/u/68819302?u=d095d811614b1ed8d5d9d30e8cf18e1af02df999&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahl7Q",
      "number": 2305,
      "title": "hide mouse while typing in intellij",
      "body": "So ghostty and Firefox hide the mouse when I'm typing. But in intellij it does not work for some reason. If I enable the feature globally in niri it works but it is horrible in games. I tried to do that with a focused window rule but the cursor settings seem to not work there.\r\nAny ideas what I could do to make this work?\r\n",
      "created_at": "2025-08-27T09:48:33Z",
      "updated_at": "2025-08-27T10:04:22Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "bomgar",
        "avatar_url": "https://avatars.githubusercontent.com/u/402052?u=c60bd5fe4f2c20b6598bad4671b7f042afff6c5a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahk3d",
      "number": 2299,
      "title": "Support loading ICC profile",
      "body": "$SUBJ$",
      "created_at": "2025-08-26T08:07:20Z",
      "updated_at": "2025-08-26T08:08:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tex",
        "avatar_url": "https://avatars.githubusercontent.com/u/27386?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhkmC",
      "number": 2298,
      "title": "wlr-export-dmabuf support",
      "body": "Some applications have migrated away from the old wlr capture protocol to wlr-export-dmabuf, an example of one such app is sunshine, it would be nice to have support for it.",
      "created_at": "2025-08-25T23:22:14Z",
      "updated_at": "2025-08-26T05:45:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Quackdoc",
        "avatar_url": "https://avatars.githubusercontent.com/u/74831516?u=1a21ee96e1e754a955dfa63cb3b4c755e76b8ac1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdVVI",
      "number": 873,
      "title": "\"Hybird\" Mode",
      "body": "I use niri as my default window manager on my laptop and find the experience to be great, so much in fact that I constantly find myself wanting to bring this experience to my desktop computer. I find myself running into one large wall though on desktop, the way of handling scrollable workspaces does not work that well for a desktop experience. On portable devices such as my laptop I find this great, but on desktop not so much and I always default back to more traditional tiling window managers such as Sway. I have spent a bit of time thinking and have thought of a way which merges the feel of a scrollable window manager such as niri and a traditional one such as Sway, an in-between mode hence the title \"hybrid\" (I also just couldn't think of a better name / description). This mode works by scrolling when the edge is reached manually instead of when new windows are created. The strip behaviour is kept, but managed into individual workspace like groups which I'm calling \"Hybrid Workspaces\" because I can't think of a better name, switching actual workspaces should still work as intended and create a new strip. I think this could also open the door to more benefits such as dynamic tiling options. \r\n\r\nBelow are some designs of possible implementations.\r\n\r\n\"Classic Scrolling\": This mimics the current way that niri shows windows on the left and right sides\r\n\r\n![image](https://github.com/user-attachments/assets/0d2cb7d2-381c-4214-af96-de8ad48fae1a)\r\n\r\n\r\n\"Arrows\": Arrows has little arrows on the sides showing how many \"Hybird Workspaces\" are to the left / right. The number of arrows should follow how many times the user can scroll in that direction.\r\n\r\n![Group 9](https://github.com/user-attachments/assets/f1cdfc68-cacf-442d-a854-75b90582097a)\r\n\r\n![image](https://github.com/user-attachments/assets/e3402b58-b282-4811-bd69-c9ad5c9cd71e)\r\n\r\n\"Dot indicator\": The dot indicator is a classic tray approach which shows where the user is currently located.\r\n\r\n![Group 10](https://github.com/user-attachments/assets/e8c9edd0-1da4-405b-a138-b48e558876f6)\r\n\r\n![image](https://github.com/user-attachments/assets/cffe2a69-831b-4583-abb0-d3a5b1348b50)\r\n",
      "created_at": "2024-12-16T03:28:15Z",
      "updated_at": "2025-08-25T23:25:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Stoppedpuma",
        "avatar_url": "https://avatars.githubusercontent.com/u/58333920?u=cb93fccbfd60edd0a7debb07468282771a091a56&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahjd3",
      "number": 2292,
      "title": "[Feature Request] Extension Support",
      "body": "I was wondering if there will be support for Rust-based extensions in the future. I would like to integrate Niri into [breezy-desktop](https://github.com/wheaney/breezy-desktop) or add direct XR support to Niri for use with XR glasses with a virtual desktop, such as  the Viture line of XR glasses. Please let me know if and how this might be possible in the future. Thank you.",
      "created_at": "2025-08-25T04:21:44Z",
      "updated_at": "2025-08-25T05:39:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "psi4j",
        "avatar_url": "https://avatars.githubusercontent.com/u/116757358?u=c136bba9dd36844e4f332fd16a26c39705045b1e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahi-N",
      "number": 2289,
      "title": "opening pages in firefox",
      "body": "By default when I open a page in Firefox (e.g. with `firefox filename.png`) it opens a new tab in an existing window.\r\n\r\nBut then I have to hunt all my workspaces and monitors to find the appropriate window. And more often then I will think that something didn't work correctly, and not realize the page even opened.\r\n\r\nUnfortunately, the Window is not marked urgent (not sure if this is expected or not).\r\n\r\nHow do people deal with such situations?\r\n\r\nI picked on Firefox because that is the one that comes immediately to mind, but have had similar problems with other programs.\r\n\r\nI considered having a wrapper script for firefox that always uses the \"--new-window\" option. Not sure if that is really a good solution though. I end up with numerous Firefox windows, and when Firefox crashes it is a pain to remember which is which.\r\n\r\nJust wondering if anybody has a better solution?",
      "created_at": "2025-08-24T23:55:28Z",
      "updated_at": "2025-08-25T02:32:44Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "brianmay",
        "avatar_url": "https://avatars.githubusercontent.com/u/112729?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahimg",
      "number": 2287,
      "title": "How to map keyboard shortcut to mouse button",
      "body": "Is there any way to map a keyboard shortcut to perform a mouse button action? I want this because sometimes my trackpad is too small to select all the text on screen, and I can't just stop pressing the touchpad.\r\n\r\nThanks,",
      "created_at": "2025-08-24T19:28:02Z",
      "updated_at": "2025-08-25T02:21:09Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "64-bitman",
        "avatar_url": "https://avatars.githubusercontent.com/u/60551350?u=cd14c4af9a4f97bb3abefd27463216400caff03a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhirT",
      "number": 2288,
      "title": "Disable warp mouse when focusing monitor",
      "body": "Hi, I am looking at how focusing the next monitor works, and the current implementation warps the mouse to the monitor I change the focus to. This behavior might work well while using a trackpad, but I think it feels quite unnatural when using a mouse. An option to disable this behavior would be nice.\r\n\r\nLooking through the code, the lines below seem to be the culprit for the behavior, specifically the fact that `self.maybe_warp_cursor_to_focus_centered` will return `false` if `warp_mouse_to_focus` is disabled.\r\nhttps://github.com/YaLTeR/niri/blob/8b73910a11473ca9d06b204ccb7377360ced00db/src/input/mod.rs#L1528-L1536",
      "created_at": "2025-08-24T20:20:24Z",
      "updated_at": "2025-08-24T20:20:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "The1Penguin",
        "avatar_url": "https://avatars.githubusercontent.com/u/49118502?u=d597bc0e4dd5d2478b223d32bde84e9438d45ccc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgNqC",
      "number": 1779,
      "title": "Inacurate monitor relative positions",
      "body": "Hi! I am having an issue with multi-monitor navigation and I think it is due to how the monitor relative positions are calculated (which seems to differ from other WM I have used). When using stacked layout for multiple monitors, moving focus or windows sometimes yields unexpected results. I'd expect the windows and focus to move between monitors the same way the mouse cursor travels to one another: by the juxtaposed edges.\n\n* From what I gathered, in Niri, the monitor to the right/left of another is the first that overlaps the y position of the top of the reference monitor. Even if there's a gap between these monitors. \n\n* In reality, I'd rather select the one directly next to/sharing its edge or/and with the nearest y center.\n\nConsider this:\n\n```\n                 -----------------\n                 |       B       |\n-----------      |     y = 0     |\n|         |      |    1920x1080  |\n|         |      |_______________|\n|         ||----------------------------|\n|         ||                            |\n|    A    ||             C              |\n| y = 400 ||          y = 1080          |\n|1440x2560||         3440x1440          |\n|         ||                            |\n|         ||____________________________|\n|_________|                              \n```\n\nMoving from A to C with `focus-monitor-right` is impossible, because B is the first overlapping the y projection from the top of A. I have to go to B, then down to C. \n\nIf I position A at `0,1080` then I can move from A to C, but monitors become quite misaligned.\n\nThat's about it, I can provide more info or test if needed.\nGreat project BTW, I am having a lot of fun configuring and using it! 🚀\n\n### System Information\n\n* niri version: 25.05.1 (unknown commit)\n* If it makes a difference, I am using kanshi to position monitors instead of Niri's config\n\n#### Outputs\n\n* Output DP-2 (`A`)\n   Current mode: 2560x1440 @ 59.951 Hz (preferred)\n   Physical size: 600x330 mm\n   Logical position: 0, 400\n   Logical size: 1440x2560\n   Scale: 1\n   Transform: 90° counter-clockwise\n* Output HDMI-A-1 (`B`)\n   Current mode: 1920x1080 @ 60.000 Hz (preferred)\n   Physical size: 510x290 mm\n   Logical position: 2100, 0\n   Logical size: 1920x1080\n   Scale: 1\n   Transform: normal\n* Output DP-1 (`C`)\n   Current mode: 3440x1440 @ 59.999 Hz (preferred)\n   Physical size: 800x350 mm\n   Logical position: 1440, 1080\n   Logical size: 3440x1440\n   Scale: 1\n   Transform: normal\n\nKanshi config:\n\n```\nprofile home-3 {\n  output DP-2 enable position 0,400 transform 90\n  output HDMI-A-1 enable position 2100,0\n  output DP-1 enable position 1440,1080\n}\n```",
      "created_at": "2025-06-12T02:50:54Z",
      "updated_at": "2025-08-24T14:34:29Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "JeffDess",
        "avatar_url": "https://avatars.githubusercontent.com/u/6100619?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhbM6",
      "number": 2268,
      "title": "window-rule -> title match for browser",
      "body": "Hello,\r\n\r\nI am trying to open a (zen) browser window, and would like to apply a window rule to open on particular named workspace. However, I have the impression the application title updates only after the window spawns and the browser can navigate to the URL. For example something like:\r\nflatpak run app.zen_browser.zen --new-window www.google.com\r\n\r\nI have a match statement, for example:\r\nmatch title=\"google\", open-on-workspace \"search\"\r\n\r\nbut so far no luck. If I match just the app_id, zen in this case, it works fine.\r\n\r\nAny ideas? I tried looking for a firefox or zen flag to launch with a custom title, but no luck. Alternatively I can write a bash script to open the window and then move it with niri msg action...\r\n\r\nI could also image it's non-trivial.\r\n\r\nThanks in advance for any feedback.",
      "created_at": "2025-08-19T15:16:14Z",
      "updated_at": "2025-08-27T08:26:40Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A2Kcn",
        "body": "See https://github.com/YaLTeR/niri/discussions/2202 for a script that will monitor the niri event stream and automatically move it. (Just change where it says slack to google and search.)\r\n\r\nThat's the best you can do barring either Firefox fixing their title not being set until later or Zen allowing you to specify it at launch."
      },
      "user": {
        "login": "tino376dev",
        "avatar_url": "https://avatars.githubusercontent.com/u/157116672?u=4a36fb4bf605da9dd257e346114b514619da5250&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgBoW",
      "number": 1700,
      "title": "Option to exclude empty workspaces and specific named workspaces from overview",
      "body": "I think it would be useful to have a ways to exclude empty workspaces, as well as specific named workspaces from the overview mode.\r\n\r\nI have 9 named workspaces, one for each type of application or activity. Depending on what I'm doing, I might only be using 2 of them, or all 9 of them. When I am only using a small number of them and trigger overview mode, a I need to scroll past all of the empty ones, which is a little cumbersome. I would like to propose an option that hides empty workspaces.\r\n\r\nI also have a named scratchpad workspace (thanks to the script in https://github.com/YaLTeR/niri/discussions/329) that has a terminal in it. I don't need this, as well as some single-application workspaces I have, to show up in the overview. I would like to propose an option allowing to specify a regex for named workspaces to exclude from overview mode.",
      "created_at": "2025-05-31T02:27:21Z",
      "updated_at": "2025-08-23T14:32:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "chcore",
        "avatar_url": "https://avatars.githubusercontent.com/u/83099052?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahfrz",
      "number": 2275,
      "title": "new preview video in README",
      "body": "hey, just noticed that the video in the README is massively outdated.\r\n\r\nits just ugly and i think there should be a better-looking demo.\r\n\r\nalso thats probably a very low-importance manner.",
      "created_at": "2025-08-22T17:50:07Z",
      "updated_at": "2025-08-23T11:29:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahgdf",
      "number": 2281,
      "title": "match is-active=false broken",
      "body": "I am playing around with the following rule:\r\n\r\n```\r\nwindow-rule {\r\n    match is-active=false\r\n    draw-border-with-background false\r\n    geometry-corner-radius 12.000000 12.000000 12.000000 12.000000\r\n    clip-to-geometry true\r\n    opacity 0.800000\r\n}\r\n```\r\n\r\nIt appears \"is-active=false\" does the same thing as \"is-focused=false\".\r\n\r\nThat is in any applies for any non-focused window, including the active window on another monitor.\r\n\r\nMy understanding is that it should not apply for any active window, including an active window on a monitor that doesn't have focus.\r\n\r\nOr am I doing something wrong here?\r\n\r\nversion: niri 25.05.1 (Nixpkgs)",
      "created_at": "2025-08-23T09:26:04Z",
      "updated_at": "2025-08-23T09:37:38Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "brianmay",
        "avatar_url": "https://avatars.githubusercontent.com/u/112729?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhcVs",
      "number": 2271,
      "title": "Bind on Screenshot",
      "body": "Hello, I want to put a screenshot on the bind Fn + Prior(PageUp), so, I write in the config: Fn+Prior { screenshot; } and I get an error \"unexpected hotkey\"",
      "created_at": "2025-08-20T11:36:56Z",
      "updated_at": "2025-08-20T12:10:30Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "ArchLinuxUserIgor",
        "avatar_url": "https://avatars.githubusercontent.com/u/85604075?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhQne",
      "number": 2219,
      "title": "Alternative to multiple commands in keybind definition/25%-sized window",
      "body": "I'd like to create a keybind setting the window size to 25% (so 50% height, 50% width), so far I tried the following in both this and my fullscreen keybind to no avail. What alternatives are there if any? Is this a bad idea for me as an end-user?\r\n```kdl\r\nbinds {\r\n    Mod+F { set-window-height \"100%\"; maximize-column; }\r\n    Mod+M { set-window-height \"50%\"; set-column-width \"50%\"; }\r\n}\r\n```",
      "created_at": "2025-08-12T07:02:38Z",
      "updated_at": "2025-08-20T11:22:32Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1v_D",
        "body": "> Mod+F { spawn \"sh\" \"-c\" \"niri msg action set-window-height '100%' && niri msg action set-window-width '100%'\"; }\r\n\r\nWouldn't that be better?\r\n` spawn \"sh\" \"-c\" \"niri msg action maximize-column | niri msg action reset-window-height \"`"
      },
      "user": {
        "login": "cyrus01337",
        "avatar_url": "https://avatars.githubusercontent.com/u/63274991?u=16c882164d1fe189492fb02b870f879a44dfc539&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad2_c",
      "number": 984,
      "title": "Add option to make windows that are nearly off screen not respond to mouse clicks and focus to them instead",
      "body": "I apologize if this already exists, but if not, I feel that this would be a useful feature for people who prefer to use the mouse.\r\nUsage example: Firefox open in the center, Discord has 32px of its left side exposed. It would be nicer if clicking on it (only place to click is the server list) would focus the window instead, rather than accept the input and then focus the window",
      "created_at": "2025-01-15T14:37:21Z",
      "updated_at": "2025-08-19T13:52:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "maggster165",
        "avatar_url": "https://avatars.githubusercontent.com/u/69034405?u=6b61c031044c620ff95e874ef7b6e6f39b56e5b4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af7UU",
      "number": 1662,
      "title": "Snap to left/right",
      "body": "Is there a way to snap (not move) the current column to the left or right? I use `center-column` frequently, but I do not see corresponding actions to pan the viewport to the left/right.\r\n\r\n![snap-left drawio(1)](https://github.com/user-attachments/assets/72bee1ef-42b7-42f6-ba8f-759d2672ba56)\r\n\r\n\r\nCurrent workaround is to focus the column to the right, which pans the viewport, then focus left again to the original column.\r\n\r\n",
      "created_at": "2025-05-24T22:47:49Z",
      "updated_at": "2025-08-19T13:15:17Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "rwx7",
        "avatar_url": "https://avatars.githubusercontent.com/u/109705225?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ahaql",
      "number": 2266,
      "title": "Heading links for docs",
      "body": "Congrats on the new docs page! Super excited to have a good search for the documentation! \r\n\r\nOne great feature that I'd like to propose is header links, in which headers are given specific tags and thus allows people to link to a specific header or section on a docs page. This would be especially helpful when helping newbies locate certain sections within the docs and generally serves as a helpful way to organize a wiki, as specific locations can be linked within the wiki as well as outside of it. ",
      "created_at": "2025-08-19T05:56:43Z",
      "updated_at": "2025-08-19T07:44:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Fireye04",
        "avatar_url": "https://avatars.githubusercontent.com/u/45439844?u=86cc2b7fce20edc4c3f786c9fda4a9be10275d25&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhZwR",
      "number": 2261,
      "title": "FEAT: Allow mouse to resize floating windows",
      "body": "Niri, being a tiling WM, is of course, primarily a keyboard focused experience. But, since some windows can be floating, it'd be handy to be able to resize them by grabbing the edges/corners and dragging them out to the size you wish.\r\n\r\nSeparately, It might be nice if you could click and drag to resize the columns/rows of non floating windows, and allow the mouse to resize those as well. (this would usually end up resizing more than one window at onece).",
      "created_at": "2025-08-18T15:36:57Z",
      "updated_at": "2025-08-18T16:39:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "MrDowntempo",
        "avatar_url": "https://avatars.githubusercontent.com/u/8398380?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhX2N",
      "number": 2259,
      "title": "Option to only warp mouse when focusing with keybinds",
      "body": "This could either be an option for the warp mouse on focus setting or a new action, such as \"focus-window-left-warp\". Basically, when I press a keybind to change window focus, I want my mouse to move to that window. The problem with the warp mouse option already available is that it moves my mouse even when I don't explicitly focus a window, such as when new windows open and with pop-ups, pip, etc. This is how hyprland's focus keybinds functions by default for reference.",
      "created_at": "2025-08-17T20:11:24Z",
      "updated_at": "2025-08-17T20:11:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Hikiru",
        "avatar_url": "https://avatars.githubusercontent.com/u/18605854?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhXDT",
      "number": 2252,
      "title": "Retain border and focus ring width in overview",
      "body": "I use single pixel borders in niri, as I think anything thicker than that looks ugly on my 1080p laptop screen.\r\n\r\nNow... If I have zoom set to 0.3, and I enter the overview, the borders disappear. I assume this is because *everything* gets scaled down, borders included. Scaling a 1 pixel border down means it's no longer going to be visible. Or it'll only be partially visible.\r\n\r\nWould it be possible to *always* render the borders and the focus ring at the configured width, even in the overview?",
      "created_at": "2025-08-17T10:01:01Z",
      "updated_at": "2025-08-17T10:01:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "d-r",
        "avatar_url": "https://avatars.githubusercontent.com/u/9402?u=7e295f79c46147f1920e9847b04705e9a38357ce&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhPQL",
      "number": 2214,
      "title": "I have mutltiple problems while focusing",
      "body": "Hello,\r\n\r\nMaybe I don't understand but with `focus-at-startup` my mouse pointer move to this output but new apps are opened on another output (the first one)\r\n\r\n```kdl \r\noutput \"Xiaomi Corporation Mi Monitor 6638000002298\" {\r\n    mode \"3840x2160@60\";\r\n    position x=2560 y=0;\r\n    focus-at-startup;\r\n}\r\n```\r\n\r\nand for the windows rules:\r\n\r\n```kdl\r\nwindow-rule {\r\n    match at-startup=true\r\n    match app-id=\"kitty\"\r\n    open-on-output \"Xiaomi Corporation Mi Monitor 6638000002298\"\r\n}\r\n\r\nwindow-rule {\r\n    match at-startup=true\r\n    match app-id=\"firefox\"\r\n    open-focused false\r\n    open-on-output \"Hewlett Packard HP Z27n CNK72307H3\"\r\n}\r\n```\r\nthey both open in the same output at startup with `match at-startup=true` But if I remove, it work fine\r\n\r\n",
      "created_at": "2025-08-11T03:49:35Z",
      "updated_at": "2025-08-16T23:36:33Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "clifinger",
        "avatar_url": "https://avatars.githubusercontent.com/u/3530471?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgyPH",
      "number": 2069,
      "title": "Discord server (and its coexistence with Matrix)",
      "body": "Update: we set up a separate [`#niri-discord:matrix.org`](https://matrix.to/#/#niri-discord:matrix.org) room two-way bridged to a `#matrix-bridge` channel on Discord.\r\n\r\n---\r\n\r\nTwo weeks or so ago, @Purian23 has created a Discord server for niri: https://discord.gg/vT8Sfjy7sx A few days ago I joined too, which I suppose makes it semi-official. If it keeps going well, I'll start linking it elsewhere in the repo.\r\n\r\nThe question is, how do we reconcile it with our Matrix rooms?\r\n\r\nMy main reason for choosing Matrix over Discord is: it feels right to choose an open platform like Matrix for a free software project like niri. Insert all arguments about how Discord is a closed silo and all. Plus, I don't like constant nitro ads. (Matrix has its own massive share of problems, but I prefer it over other open platforms. Anyhow, this is beside the point.)\r\n\r\nI stand by this argument, and I'd like Matrix to remain the \"default\" communication channel. That said, Discord is much more convenient for many people, so I expect the Discord server to quickly grow. This results in an unfortunate community split between Matrix and Discord—people don't see the discussions in the other, can't answer questions, etc. Eventually there will be development talk, which benefits from both sides seeing it too.\r\n\r\nSo, what do we do about this?\r\n\r\nOne obvious answer is bridging, however I want to be very cautious with this because bridges are usually brittle. In particular, I imagine everything will break spectacularly if there's a spam wave on either side (this is a very real concern, Matrix had been under heavy spam attacks over the past few months), moderation bots will try to clean it up and cause all sorts of conflicts or lingering spam messages. This is to say, I'm reluctant to 2-way bridge the main Matrix room with the main Discord channel, or some such.\r\n\r\nPerhaps 1-way bridges are a better solution? I.e. have a read-only `#niri-matrix` in Discord and a read-only `#niri-discord` in Matrix (a set of rooms for main Discord channels maybe?.. this will finally put the niri Matrix space to good use). It won't be as discoverable on Matrix but that's probably fine. Unfortunately, this would make it annoying to respond to people on the other side. Not sure what to do about this.\r\n\r\nMaybe there's an entirely different setup that would work better? What do you think?",
      "created_at": "2025-07-17T09:51:14Z",
      "updated_at": "2025-08-16T06:10:18Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhVbC",
      "number": 2243,
      "title": "Toggle 'center-focused-column' per-workspace",
      "body": "Hey!\r\n\r\nIt would be great to have a built-in toggle for `center-focused-column \"always\"` and `center-focused-column \"never\"` that only applies to the current workspace. I have some serious neck pain, so I like to keep the current window centered most of the time, but in some situations it's useful to have two windows side by side persistently. I can toggle `center-focused-column` with this script I got from [Reddit](https://www.reddit.com/r/linux/comments/1kov5vc/comment/msxrsob/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button), but it is kinda clunky and I don't even know if it's possible to make it workspace-dependent (maybe using named workspaces, but then I have to rely on a specific workspace to position my windows accordingly).\r\n\r\nI guess it's possible to improve this script using Niri's event stream, but that would be a little annoying and I have a feeling that enough people would want this feature to make it worth implementing. This and scratchpads are the only things missing in Niri to me.",
      "created_at": "2025-08-15T17:55:40Z",
      "updated_at": "2025-08-15T17:55:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "uiriansan",
        "avatar_url": "https://avatars.githubusercontent.com/u/46610810?u=e714fdc6cba90fb54097813e328bcb550752c4f2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhVDA",
      "number": 2242,
      "title": "Copy a window across workspaces",
      "body": "It would be nice to have a feature that copies a window (floating or not) across workspaces. For example, if watching something in a window, you can switch to several workspaces and the window will still be there. Basically, this option: https://hackage.haskell.org/package/xmonad-contrib-0.18.1/docs/XMonad-Actions-CopyWindow.html",
      "created_at": "2025-08-15T14:22:59Z",
      "updated_at": "2025-08-15T15:56:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "GregorySchwartz",
        "avatar_url": "https://avatars.githubusercontent.com/u/2490088?u=2c0820da39629b52aa56124751c1aa80b449bcbb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhU1i",
      "number": 2241,
      "title": "A little problem with shell profile and niri-session",
      "body": "This problem is solved, just in case anyone else is encountering the same thing. I spend days on this before I found `niri-session` is a script... (kinda silly)\r\n\r\nSimply put, if you don't use a display manager, then do not directly run `niri-session` in your shell profile (`.profile`, `.bash_profile`, `.zprofile`, etc.).\r\nThe script will spawn your default shell as a login shell, which will cause the profile itself to be loaded again, creating an infinite loop, and Niri would never start.\r\n\r\nI solved this by adding a variable that detects if it's the first login shell on bootup:\r\n```shell\r\nif [ -z \"$DISPLAY\" && \"$(tty)\" = \"/dev/tty1\" && -z \"$NIRI_LOADED\" ]; then\r\n    export NIRI_LOADED=1\r\n    # If you manage `PATH` through shell profile, you might also want to run this only once\r\n    # PATH=\"$PATH:/path/to/cool/scripts\"\r\n    exec niri-session\r\nfi\r\n```",
      "created_at": "2025-08-15T11:54:15Z",
      "updated_at": "2025-08-15T11:56:16Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "uhiovk",
        "avatar_url": "https://avatars.githubusercontent.com/u/84575318?u=ea82199220e29d663318fce7945e4a7fc18c0794&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhNbS",
      "number": 2209,
      "title": "Niri is not recognizing my Super Key",
      "body": "For some reason Niri is not recognizing my Super Key.  When I check what is returned by that key it shows up as MetaLeft.  Niri does not  allow me to use MetaLeft as a modifier.  What am I missing here.\r\n\r\n",
      "created_at": "2025-08-09T17:16:36Z",
      "updated_at": "2025-08-16T14:40:35Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A10mh",
        "body": "Found the solution.  It turns out the problem was lightdm.  I needed to add the following line to my niri.desktop\r\n\r\nX-LightDM-Session-Type=wayland\r\n\r\n"
      },
      "user": {
        "login": "cleanshaven",
        "avatar_url": "https://avatars.githubusercontent.com/u/11422758?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhR54",
      "number": 2228,
      "title": "Niri discards xwayland-satellite logs",
      "body": "Stdout and stderr output of xwayland-satellite is being sent to `/dev/null` when spawning it.\nWhile this makes the Niri logs less noisy, it also makes debugging problems with satellite more difficult.\n\nGuess there are two solutions for this that I can currently think of:\n- Either output the logs to for example ~/.local/share/niri/logs/xwayland-satellite.logs`\n- Patch upstream to output its logs to an alternative location\n\nI think the easier solution would be to just redirect the output to a file\n\n### System Information\n\n* niri version: niri 25.05.1 (unknown commit)\n* Distro: NixOS\n* GPU: AMD RX 7800 XT\n* CPU: AMD Ryzen 5 7600X\n",
      "created_at": "2025-08-13T12:15:04Z",
      "updated_at": "2025-08-14T01:59:35Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "valeth",
        "avatar_url": "https://avatars.githubusercontent.com/u/3198362?u=f128937cb2c253a31eb107b5352106d88cef5884&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhRNL",
      "number": 2220,
      "title": "keybind to go to last focused workspace",
      "body": "-title-\r\n\r\nespecially useful when you are on an unnamed workspace and go to a named workspace and want to go back.\r\n\r\nexample in my workflow:\r\ni have a named 'chat' workspace. i get a message. i quickly check it and want to go back. now i swap through my workspaces like a crazy man trying to find back my old workspace.\r\n\r\nmaybe this already exists? idk, quickly grepped through `niri msg action` list, but didnt find any.",
      "created_at": "2025-08-12T18:18:09Z",
      "updated_at": "2025-08-13T05:25:59Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhRSR",
      "number": 2221,
      "title": "Exclusive named workspaces",
      "body": "Currently windows are opened on the currently focused workspace.\r\n\r\nI'd like it if there was an option to mark a named workspace as \"exclusive\", meaning that windows can only be placed there via window rule.\r\n\r\nSo if a window is opened, and the currently focused workspace isn't included in any rule for it, it would just be placed on the next workspace that isn't marked as exclusive.\r\n\r\nI'd imagine the config option to look somewhat like this:\r\n```kdl\r\nworkspace \"chat\" {\r\n  open-on-output \"DP-1\"\r\n  exclusive true\r\n}\r\n```",
      "created_at": "2025-08-12T20:17:40Z",
      "updated_at": "2025-08-12T20:17:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "valeth",
        "avatar_url": "https://avatars.githubusercontent.com/u/3198362?u=f128937cb2c253a31eb107b5352106d88cef5884&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcIQx",
      "number": 763,
      "title": "Any plans to move away from xdg-desktop-portal-gnome?",
      "body": "Niri has been great in the few months I have been using it, but I do have one thing I don't really like: `xdg-desktop-portal-gnome` pulls `gnome-desktop` as a dependency, and I'd like to get away from it if possible. Are there any plans to implement niri's own portal, or support other portals?",
      "created_at": "2024-10-27T02:53:35Z",
      "updated_at": "2025-08-12T16:20:04Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "coatlessali",
        "avatar_url": "https://avatars.githubusercontent.com/u/61166135?u=df6c36ba859eb16651f56f20b8e57ef4e061081c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhQUT",
      "number": 2218,
      "title": "Workspaces and windows counters",
      "body": "As of today (20250811, August) niri seems to keep the counters of all opened/created windows/workspaces. \r\nWhile it may seem as minor issue (right now or EVER in the project's lifetime) but it may cause problems in the future. \r\nTherefore it may be a good idea to handle the situation early if possible in order to prevent bugs originating from these number excessive growth (e.g.  to prevent the <type>_MAX + 1 errors).\r\n\r\nPutting this as discussion/question as it is not a bug per se, but earnest wish for the project to grow, develop and gain as much success as possible. Great work!",
      "created_at": "2025-08-11T21:08:15Z",
      "updated_at": "2025-08-12T07:42:33Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kuR0s-s44d",
        "avatar_url": "https://avatars.githubusercontent.com/u/191451613?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgWQ0",
      "number": 1867,
      "title": "How to use Steam's Desktop Configuration (gamepad)?",
      "body": "I like using my PC on my TV, and being able to control it using steam's desktop gamepad thing is very convenient. How can I do that using niri?\r\nI think steam is using X's XTEST protocol to control mouse and keyboard, GNOME's (Wayland) regular permission popups are a bit annoying but it kinda works there. ",
      "created_at": "2025-06-21T18:14:42Z",
      "updated_at": "2025-08-11T19:08:27Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "weltensturm",
        "avatar_url": "https://avatars.githubusercontent.com/u/811167?u=84cf4dd822b4ddcc86b30da1a8c2e4e8dd22ffef&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhDqo",
      "number": 2166,
      "title": "Why are some windows like wofi or fuzzel not animated?",
      "body": "Wouldn't it look nice if our program list applications (and maybe others) appeared smoothly, like other windows, instead of just popping in instantly? Or am I just misconfiguring something?",
      "created_at": "2025-08-01T22:33:34Z",
      "updated_at": "2025-08-11T04:55:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "filipencopav",
        "avatar_url": "https://avatars.githubusercontent.com/u/54444526?u=7e19008b65c840ee336a9d937df51be93365679c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhOK1",
      "number": 2211,
      "title": "Better api for bars to get window properties",
      "body": "So I was looking for a way to get all active windows in a workspace in order to display a list of icons in my status bar so I know in which row of windows a certain application is and it seems that there is no way to get this information directly from niri.\r\n(Atleast I couldn't find a way).\r\nI think it would be great, if there was a way to get the current applications in a certain workspace with positioning info and what window is currently in focus, so that it is possible to add window lists into bars.",
      "created_at": "2025-08-10T15:21:18Z",
      "updated_at": "2025-08-11T04:38:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "moonleay",
        "avatar_url": "https://avatars.githubusercontent.com/u/74376181?u=73727a978e820919b2128769ebf3ee7399fec5fd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhO1V",
      "number": 2213,
      "title": "Temporarily changing input configuration at runtime via IPC",
      "body": "My setup has this weird thing where some (but not all) Electron applications scroll way faster than they should. With sway I had a hack where I'd dynamically adjust the scroll speed in response to window focus changes, and I'd like to be able to replicate that.\r\n\r\nUnfortunately I don't think there's any 'merge this kdl into this already-parsed object' (or even 'set this single nested property on this already-parsed object'), so maybe a hand-coded approach specializing to inputs a la `niri msg input mouse scroll-speed -0.4` would be the easier thing.",
      "created_at": "2025-08-10T22:54:22Z",
      "updated_at": "2025-08-10T22:54:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "deifactor",
        "avatar_url": "https://avatars.githubusercontent.com/u/30192992?u=feec256b2b62f92511b65a4abeb02c213b74ad93&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfSzk",
      "number": 1428,
      "title": "Add GNOME polkit in 'Important Software' section in Wiki",
      "body": "Hi! I noticed the wiki's “Authentication Agent” sectioncurrently recommends only plasma-polkit.\n\nGiven that Niri integrates well with GNOME stuff, I think it would be useful to also mention polkit-gnome as an alternative.\n\nSomething like:\n\n- polkit-gnome – GTK Based authentication agent \n\nJust a small suggestion to help users pick the agent that best fits their environment 🙂\nYou could also add the actual config line to start it, which would be:\n\n```\nspawn-at-startup \"/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1\"\n```\n\nnot something you'd figure out quickly :)",
      "created_at": "2025-04-15T03:49:48Z",
      "updated_at": "2025-08-10T21:11:48Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "arkboix",
        "avatar_url": "https://avatars.githubusercontent.com/u/175595176?u=8978e5fa75f1c0b8f85cda9fcb6fd9185168a15d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhNMH",
      "number": 2206,
      "title": "Reload config if input.xkb.file changes",
      "body": "I type text in a lot of languages and find it handy to only have to switch between two keyboard layouts at the time, e.g. German <> Russian, German <> Arabic, German <> Hindi etc. instead of having to move around all of them to get to a specific one.\r\n\r\nIn X11, I used a script which set `setxkbmap` to the pair I wanted to use, and then comfortably switch between the two.\r\n\r\nSince the keyboard layouts are configured in the Niri config and cannot be changed via RPC (which Sway allows, for example), a naive solution would be to programmatically update the Niri config via `sed` or so, to set the keyboard layout pair I want.\r\n\r\nA cleaner solution could be to set `input.xkb.file` in the Niri config and then only update that file with a script. I had to find out that the Niri config watcher watches only the config file and not the files it depends upon. I would have expected it to watch the `input.xkb.file` as well and reload when that is updated.",
      "created_at": "2025-08-09T07:54:41Z",
      "updated_at": "2025-08-10T04:13:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kmein",
        "avatar_url": "https://avatars.githubusercontent.com/u/10352507?u=436d0b799d45bf78e6dda108288e1b5eefb91717&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgdZc",
      "number": 1927,
      "title": "How to I constrain the mouse to a single monitor?",
      "body": "I've been searching and found some mention of cursor/pointer constraints in the code, but couldn't find anything in the documentation.\r\n\r\nThe problem I'm having is if I try to play a game, moving the cursor off the edge of the monitor in a multi-monitor setup makes the game lose mouse input, so I'd like to set up a toggle or window rule to capture the mouse. Is this possible?",
      "created_at": "2025-06-28T22:19:11Z",
      "updated_at": "2025-08-09T19:03:25Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1oYE",
        "body": "So I did eventually get it working by running steam (and therefore the steam game) via gamescope. To make it work, it seems I had to pass a few extra commanding arguments. Right now, these seem to be working although I haven’t checked what the minimal ones I need are:\r\n\r\n```\r\ngamescope --force-grab-cursor --grab -f -w 2560 -h 2560 -b steam\r\n```\r\n\r\nThe game runs at 1440p, mouse is captured, and everything is working as desired! Thanks for the help."
      },
      "user": {
        "login": "danielytics",
        "avatar_url": "https://avatars.githubusercontent.com/u/2631410?u=06f0bb3e4c16f192970b5bc388ff8e22caff61f8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af45w",
      "number": 1641,
      "title": "An awesome list for niri",
      "body": "Hii everyone. I have made an awesome list for niri. You can check it out here:\r\n\r\nhttps://github.com/Vortriz/awesome-niri\r\n\r\nI plan to add more stuff as I find. If you have made something or if you find something cool which be used on niri, feel free to open a PR. I hope it turns out to be a valuable resource for everyone!",
      "created_at": "2025-05-22T11:44:02Z",
      "updated_at": "2025-08-09T18:42:56Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Vortriz",
        "avatar_url": "https://avatars.githubusercontent.com/u/97402159?u=a8017dbc1a7a830afc9a862c91cdc22c9451ec42&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgyOc",
      "number": 2068,
      "title": "Push to talk (Mumble)",
      "body": "Hi,\r\nI'm playing with Niri and really enjoy it but I cannot figure out how I can spawn somethen upon releasing a key. In hyprland I have\r\n\r\n```\r\nbind = SUPERSHIFT, z, exec,  gdbus call -e -d net.sourceforge.mumble.mumble -o / -m net.sourceforge.mumble.Mumble.startTalking\r\nbindr = SUPERSHIFT, z, exec,  ~/bin/stopmumble.sh\r\n```\r\n\r\nto do push to talk but I cannot find a bind for releasing in niri. Any good ideas on how to do this ?",
      "created_at": "2025-07-17T09:39:41Z",
      "updated_at": "2025-08-09T12:37:25Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "desdic",
        "avatar_url": "https://avatars.githubusercontent.com/u/13243026?u=89449c8c6d1b596d0343c564f6829614d40652b8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af4aF",
      "number": 1635,
      "title": "window-rule that match `app-id=(unset)` for some tiny popup window",
      "body": "Hi, @YaLTeR , sorry to interupt you but I want to ask a question :\\\r\n\r\n1.  Try to match the tiny popup window:\r\n```kdl\r\nwindow-rule {\r\n    match app-id=null title=null\r\n    open-floating true\r\n}\r\n```\r\n\r\n2. Run vscode in wayland: `code --ozone-platform-hint=auto --enable-wayland-ime --wayland-text-input-version=3`\r\n\r\n3. If set the popup window as **floating**, then **drag and drop** tabs is feasible.\r\n\r\nbefore drag:\r\n![before drag](https://github.com/user-attachments/assets/31b8699a-1f72-4044-bd8f-9e78a6a002b1)\r\n\r\ndragging:\r\n![dragging](https://github.com/user-attachments/assets/5e2c107b-d6b0-4d28-91f2-80648bd5b82a)\r\n\r\n4. Run `sleep 1.5; niri msg windows` to see this window property:\r\n```yaml\r\nWindow ID 22: (focused)\r\n  Title: \"\"\r\n  App ID: (unset)\r\n  Is floating: yes\r\n  PID: 2334\r\n  Workspace ID: 1\r\n```\r\n\r\nIs there any window-rule that can match this situation? I've read [wiki](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules) and tried *the window-rule above* but **ALL** windows become **floating**",
      "created_at": "2025-05-22T02:45:14Z",
      "updated_at": "2025-08-08T19:46:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "AClon314",
        "avatar_url": "https://avatars.githubusercontent.com/u/30747832?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgB1X",
      "number": 1702,
      "title": "struts for indivitual workspace?",
      "body": "so basically i have a workspace that will only have 1 window open (ex: browser) \r\n\r\nis it possible to ignore the struts (and gaps also) in that workspace?",
      "created_at": "2025-05-31T08:25:46Z",
      "updated_at": "2025-08-08T19:13:15Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "anispwyn",
        "avatar_url": "https://avatars.githubusercontent.com/u/36318840?u=f57bd0e7b00662dfd5918d2d8d89bb5962099300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhLrL",
      "number": 2200,
      "title": "Cannot screencast in any app, via pipewire",
      "body": "I have a slightly unusual setup. I am running Debian 12 with Home Manager. I have installed niri and Firefox via Home Manager, but pipewire is from Debian. As a result, the versions are quite far off - niri is using pw 1.4.5 while the daemon is 0.3.65-3+deb12u1. I suspect this is the cause of my problems, but I wanted to ask here before taking steps like upgrading my OS (Debian 13 is stable now, though work would rather I use Ubuntu 24.04) or installing niri manually rather than via Home Manager.\r\n\r\nI have attached the output of running `PIPEWIRE_DEBUG=D firefox`, loading https://webrtc.github.io/samples/src/content/getusermedia/getdisplaymedia/, hitting Start, and selecting a full monitor to cast. The result is always that Firefox pops up the permission dialog. I pick \"use operating system settings\". Then a window appears allowing me to select a window or monitor to cast. This shows the windows and monitors correctly. When I pick one, nothing happens. \r\n\r\n[pipewire-debug.txt](https://github.com/user-attachments/files/21669066/pipewire-debug.txt)\r\n\r\nHere's the content of journalctl at that time:\r\n\r\n```\r\nAug 07 11:56:14 .xdg-desktop-po[4726]: Failed to associate portal window with parent window\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.747819Z DEBUG niri::dbus::mutter_screen_cast: record_window properties=RecordWindowProperties { wi>\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.750111Z DEBUG niri::dbus::mutter_screen_cast: start\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.750209Z DEBUG niri::niri: StartCast session_id=7 stream_id=7\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.750322Z DEBUG niri::pw_utils: pw stream: state changed: Unconnected -> Connecting\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.767298Z DEBUG niri::pw_utils: pw stream: state changed: Connecting -> Paused\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.767328Z DEBUG niri::pw_utils: pw stream: sending signal with 115\r\nAug 07 11:56:18 wireplumber[3514]: <WpPortalPermissionStorePlugin:0x55fae6c991c0> Failed to call Lookup: GDBus.Error:org.freedesktop.portal.Error.>\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.829755Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRA, fl>\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.829778Z DEBUG niri::pw_utils: pw stream: fixating the modifier\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.829784Z DEBUG niri::pw_utils: find_preferred_modifier: size=Size<smithay::utils::geometry::Physica>\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.830177Z DEBUG niri::pw_utils: pw stream: allocation successful (modifier=Unrecognized(144115188349>\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.830332Z DEBUG niri::pw_utils: pw stream: got format = VideoInfoRaw { format: VideoFormat::BGRA, fl>\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.830339Z DEBUG niri::pw_utils: pw stream: moving to ready state\r\nAug 07 11:56:18 pipewire[3513]: pw.core: 0x5582e469d130: error -2 for resource 2: port_use_buffers(0:0:0) error: No such file or directory\r\nAug 07 11:56:18 pipewire[3513]: mod.client-node: 0x5582e49ef490: error seq:260 -2 (port_use_buffers(0:0:0) error: No such file or directory)\r\nAug 07 11:56:18 niri[3645]: 2025-08-07T15:56:18.831244Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Streaming\r\nAug 07 11:56:21 niri[3645]: 2025-08-07T15:56:21.787070Z DEBUG niri::pw_utils: pw stream: state changed: Streaming -> Paused\r\nAug 07 11:56:21 niri[3645]: 2025-08-07T15:56:21.787541Z DEBUG niri::dbus::mutter_screen_cast: stop\r\nAug 07 11:56:21 niri[3645]: 2025-08-07T15:56:21.787605Z DEBUG niri::niri: StopCast session_id=7\r\nAug 07 11:56:21 niri[3645]: 2025-08-07T15:56:21.787697Z DEBUG niri::pw_utils: pw stream: state changed: Paused -> Unconnected\r\n```\r\n\r\nSo far as I can tell the error about `WpPortalPermissionStorePlugin` is not relevant - it's related to there being no entry in permissions for `camera`, but that's also the case on my NixOS box where screencast works fine. That system doesn't log this warning but does return an error on DBus, so I don't think it's related.\r\n\r\nThe error there, `port_use_buffers(0:0:0) error: No such file or directory` is not one that I've found referenced many places. I haven't traced through everything, but I did also strace pipewire while doing essentially the same test (this wasn't concurrent but is also testing screencast). I'm pretty sure that's the issue - in the PIPEWIRE_DEBUG log you can see `client_node_port_use_buffers` is the specific thing that's erroring, and it's not hard to imagine that if the client node doesn't have buffers it wouldn't be able to get any data!\r\n\r\n[pipewire.trace.txt](https://github.com/user-attachments/files/21669147/pipewire.trace.txt)\r\n\r\nAs you'll see if you look at this log, there is one case where \"No such file or directory\" is returned by a syscall: `openat(80, \".flatpak-info\", O_RDONLY|O_NOCTTY|O_CLOEXEC) = -1 ENOENT (No such file or directory)`. Nothing here is running in a flatpak so it's not surprising that there's no `/.flatpak-info`.\r\n\r\nThere's also one other error that caught my attention, `mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, 75, 0x81000000) = -1 ENXIO (No such device or address)`. fd 75 is created here `openat(AT_FDCWD, \"/dev/snd/pcmC4D0p\", O_RDWR|O_NONBLOCK|O_CLOEXEC) = 75`. I'm not sure what's up with that, but ENXIO is \"No such device or address\" so it's probably not the cause.\r\n\r\nThings I've tried:\r\n- Run Firefox in Flatpak. Same result.\r\n- Capture in obs. Same result.\r\n- Capture in Chrome. Same result.\r\n- Run the system firefox-esr. pipewire emits errors of this form `pw.context: params Spa:Enum:ParamId:EnumFormat: 0:0 Invalid argument (input format (no more input formats))` and no capture happens; otherwise the same result.\r\n\r\nThings I haven't tried:\r\n- Run a newer pipewire\r\n- Run pipewire from nix\r\n- Install niri manually and use only system libraries\r\n- Run a different compositor, either from nix or not\r\n\r\nMy next step is going to be upgrading to Debian 13 since that's pretty easy, then probably Ubuntu 24.04.3 since IT wants me to. If it's still not working then I'll probably install niri manually and test on a different user which has no nix stuff going on.",
      "created_at": "2025-08-07T16:19:38Z",
      "updated_at": "2025-08-08T18:50:53Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1mOB",
        "body": "Upgrading to Debian 13 (which uses Pipewire 1.4.2) appears to have fixed this issue. Obviously that also changed a bunch of other system libraries, daemons, etc. so I can't say whether that was the specific issue."
      },
      "user": {
        "login": "dyfrgi",
        "avatar_url": "https://avatars.githubusercontent.com/u/1012426?u=4b67292b52c24338f675d7fa52cd40ddac665d59&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhMrU",
      "number": 2204,
      "title": "Inhibit mouse waking the monitor when using \"niri msg action power-off-monitors\"",
      "body": "This is definitely an outlier \"issue\", but is there a way—or possibly a request, if not—to add an option to prevent the mouse from waking the monitor when using `niri msg action power-off-monitors`? This could be a valuable feature, especially since something as simple as bumping the desk that the mouse is on can cause the screen to wake. This way, only the keyboard would be able to wake the screen. Alternatively, it would be great to have the option for the opposite scenario, where only the mouse can wake the system.\r\n\r\nThese are just some ideas. If this functionality is already possible, I apologize and would appreciate any guidance.\r\n\r\nNiri has been my go-to window manager for the last six months and will continue to be for the foreseeable future. Thank you so much for it!",
      "created_at": "2025-08-08T16:47:44Z",
      "updated_at": "2025-08-08T16:47:45Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "scorpius2k1",
        "avatar_url": "https://avatars.githubusercontent.com/u/25441483?u=01424de4779f1a243fc7b59256d4319fff2c32d3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhJ_o",
      "number": 2192,
      "title": "OBS cant capture screen",
      "body": "OBS without screen capture option. xdg-portal, xdg-portal-gtk, xdg-portal-gnome, pipewire is running. \r\n<img width=\"628\" height=\"523\" alt=\"Screenshot from 2025-08-06 15-53-53\" src=\"https://github.com/user-attachments/assets/748f43f9-3eeb-4c15-b882-cac9383b0892\" />\r\n\r\nwhat I have tied\r\n\r\n1.  start niri as session (niri-session) via tty, not working.\r\n2.  killall xdg-portal service, then start xdg-portal, xdg-portal-gnome service manually, not working. \r\n3.  start pipewire, xdg-portal, xdg-portal-gnome service before niri via script, not working. \r\n\r\n`#!/bin/bash\r\n\r\nsystemctl --user start pipewire.service\r\nsleep 1\r\n\r\nsystemctl --user start xdg-desktop-portal.service\r\nsleep 1\r\n\r\nsystemctl --user start xdg-desktop-portal-gnome.service\r\nsleep 1\r\n\r\n/usr/bin/niri-session`\r\n ",
      "created_at": "2025-08-06T08:09:25Z",
      "updated_at": "2025-08-08T11:54:33Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1lKL",
        "body": "I figured out the problem, I forgot to set prefer portal in the xdg-desktop-portal config file. （I switched from hyprland, the prefer portal was hyprland, change it to gnome slove that problem.）"
      },
      "user": {
        "login": "DENG-XC",
        "avatar_url": "https://avatars.githubusercontent.com/u/153186602?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhDVI",
      "number": 2160,
      "title": "Layers above lock (hyprlock, swaylock)",
      "body": "It would be very useful, if it would be possible, to tell a layer, that it can be shown (and interacted with) above locking app. It could be used for virtual keyboards for touchscreens or situations, when for ex. the bluetooth keyboard doesn't work. For now I have no way to unlock my framework12 in tablet mode",
      "created_at": "2025-08-01T13:43:29Z",
      "updated_at": "2025-08-07T16:37:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KyleKrein",
        "avatar_url": "https://avatars.githubusercontent.com/u/50716293?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhKHb",
      "number": 2193,
      "title": "NEWBIE: Cycle focus when last or first column is active (fullscreen)",
      "body": "Hello,\r\nI've small display and all windows are fullscreen. How to configure \"cycle\" bind \r\n1) when last column is active and focus on right is pressed then first column is focused\r\n2) when first column is active and focus on left is pressed then last column is focused\r\n\r\nThanks",
      "created_at": "2025-08-06T09:57:38Z",
      "updated_at": "2025-10-03T16:57:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1iOa",
        "body": "there are binds for that, they're called `focus-column-right-or-first` and `focus-column-left-or-last`."
      },
      "user": {
        "login": "ffilipus",
        "avatar_url": "https://avatars.githubusercontent.com/u/6762631?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhKy9",
      "number": 2198,
      "title": "Remove Window/Layer Rule Ambiguity To Enable Window/Layer Rule Commands and Intuitive Use",
      "body": "Window and Layer rules are - in my opinion - counterintuitive. Their ambiguity also makes them less effective.\r\n\r\nWhen most people see a `match` statement, they likely would not expect an optional directive.\r\n\r\nNo match or switch statement in code is represented in this manner either, a single match or switch statement uses multiple lines for OR conditionals.\r\n\r\nI would challenge asking people who have never used Niri to read a window or layer rule with multiple `match` directives, then ask what they think it means. \r\n\r\nI believe changing Window and Layer rules such that `match` directives are AND conditions will remove ambiguity, making configuration more intuitive. \r\n\r\nOR conditions can still be easily accomplished by having a subsequent window or layer rule. \r\n\r\nThe other benefit of removing ambiguity from layer rules - you make it easy to implement command execution from within layer and window rules. See https://github.com/YaLTeR/niri/discussions/1945. \r\n\r\nI personally believe tsdh's suggestion in the above discussion is one of the most powerful and flexible features Niri can incorporate. \r\n\r\nYou make it easy to make a competely custom, flexible, and tailored desktop experience right from niri config if that is implemented. \r\n\r\nMaking window and layer rules non-ambiguous makes it way easier to implement. \r\n\r\nBeing able to split niri config as hyprland can and as referenced in several issues like https://github.com/YaLTeR/niri/discussions/275 would also be complementary to this. ",
      "created_at": "2025-08-06T23:40:46Z",
      "updated_at": "2025-08-07T02:06:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "andar1an",
        "avatar_url": "https://avatars.githubusercontent.com/u/12686470?u=d97437ef672acc9410592179ede92a38a725c937&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhKuC",
      "number": 2197,
      "title": "Are there plans to change matcher and excluder logic for layer and window rules?",
      "body": "I am curious about what is planned for matchers and excluders in niri. \r\n\r\nOne of the biggest challenges I have when learning these rules is that I personally expect matchers to require a match for every matcher defined, and instead it is a \"match any\" situation which is a bit counter-intuitive when you are writing \"match something\".\r\n\r\nAre there any plans on roadmap to make it such that matchers and excluders behave more like boolean logic? \r\n\r\nNamely the ability to have AND or OR (OR I believe is current logic) statements would be pretty wonderful so that matcher and excluder rules are more powerful, and less tedious.",
      "created_at": "2025-08-06T21:04:47Z",
      "updated_at": "2025-08-06T22:40:30Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "andar1an",
        "avatar_url": "https://avatars.githubusercontent.com/u/12686470?u=d97437ef672acc9410592179ede92a38a725c937&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad3aS",
      "number": 988,
      "title": "support for Scrolling/Parallax Background (like on Android)",
      "body": "I recently installed Niri and like it so far, however, before I set up waybar, I had difficulty remembering which workspace I was in (and still do without looking at Waybar). I also had the simultaneous problem of picking an image as a backdrop, when the image I liked was too big or had different proportions than my screen, I was faced with the decision of what to do, to crop it at some point, or convert it to an animation. I recall that on my phone, as I move to different sections of the home screen, the background moves with it, giving a subtle sense of location within a digital workspace, and also allowing me to set overly-wide images as backgrounds without cropping or scaling them.\r\n\r\nHaving a scrolling background is not something that can be done passively without some information being sent from the compositor to the background daemon, so I'm thinking to have something like this would need to be feature supported by Niri, where it would send to the daemon the relative x/y focus location (such that x,y are between 0 and 1) within all connected workspaces. I think once this is implemented, dynamic background daemons can use this information for use with layered/parallax wallpapers, the same way waybar is informed which workspace one is in.",
      "created_at": "2025-01-16T00:40:26Z",
      "updated_at": "2025-08-06T22:05:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "NOTtheMessiah",
        "avatar_url": "https://avatars.githubusercontent.com/u/2946283?u=4752030abc5e1da382a8a4498dd62100e4c2a6df&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhJb6",
      "number": 2191,
      "title": "QT apps and max-scroll-amount",
      "body": "Hi, I just moved to niri and im new to all this stuff, I turned focus-follows-mouse on and turned max-scroll-amount to 100%. When I have a qt application open and I scroll off it, I can't scroll to it by moving my mouse to the side of my screen. Other apps work fine though, just qt ones are wonky. Could anyone help me with this? Thanks in advance.",
      "created_at": "2025-08-05T17:04:30Z",
      "updated_at": "2025-08-06T16:56:06Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1fqK",
        "body": "You want to set left and right struts to at least 1 px"
      },
      "user": {
        "login": "allinuxuser",
        "avatar_url": "https://avatars.githubusercontent.com/u/165105879?u=7bcf9366e6969aee37e6ed1642ed53b72d8afe22&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhKOL",
      "number": 2194,
      "title": "In specific cases existing windows are not focused when they shoud be",
      "body": "In specific scenarios existing application windows are not focused:\r\n\r\n- clicking on a notificiation (provided by SwayNotificationCenter and if I recall correctly mako as well) that opens an application window (for example, Ferdium, Solanum);\r\n- clicking on an tray (Waybar) icon that should open a window (for example: blueman, Gammastep info and KDE Connect configuration);\r\n- clicking (both just clicking (for example, in Markdown preview) and Ctrl-clicking) links in Zed.\r\n\r\nProbably there are more cases, but the ones above I recall and can reproduce.\r\n\r\nEverything is fine when there are no windows of the target applicaiton open.\r\n\r\nIs this something to do with niri or with each application separately?\r\nGiven that clicking links in Zed does not focus browser window, but clicking links in Code OSS (VS Code) does, this seems to be an application specific issue, but I want to be sure before filing bug reports.",
      "created_at": "2025-08-06T11:36:21Z",
      "updated_at": "2025-08-06T14:23:46Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1exu",
        "body": "All application issues. For tray icons specifically also see https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options#honor-xdg-activation-with-invalid-serial"
      },
      "user": {
        "login": "eandersons",
        "avatar_url": "https://avatars.githubusercontent.com/u/9976861?u=52190ffee07180300529172ee59b0b430e37b0d0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhDl0",
      "number": 2164,
      "title": "Window position info or ordered window list",
      "body": "Hello,\r\n\r\nCould You add to cli cmd (niri msg -j windows) info about position of each window ( x and y coordinate). Or maybe could You order output of niri msg -j windows to display windows in the same order that they are currently visible on workspace.\r\nThis will be useful for some scripting. ",
      "created_at": "2025-08-01T20:08:16Z",
      "updated_at": "2025-08-05T09:03:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Nyslay",
        "avatar_url": "https://avatars.githubusercontent.com/u/15617980?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhHJm",
      "number": 2186,
      "title": "Pointer/mouse sensitivity setting without mouse acceleration",
      "body": "Niri seems to forward libinput settings such as acceleration profiles and scrolling. The [Input configuration](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#pointing-devices) wiki mentions these, but it does not show any way of flatly scaling mouse sensitivity (eDPI(?), assumed to be based on hardware DPI).\r\n\r\nIs there any way this is supposed to be handled *outside* niri, is this a missing feature (seems like that to me), or is there already a way to do this (calibration matrix or different interpretation of the `accel-speed` field on pointer devices?\r\n\r\n<details>\r\n\r\n<summary>(The input section of my config file)</summary>\r\n\r\n```kdl\r\ninput {\r\n    // workspace-auto-back-and-forth\r\n    keyboard {\r\n        track-layout \"global\"\r\n        xkb {\r\n            // You can set rules, model, layout, variant and options.\r\n            // For more information, see xkeyboard-config(7).\r\n\r\n            // For example:\r\n            // layout \"us,ru\"\r\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\r\n            layout \"dk\"\r\n            options \"caps:escape\"\r\n        }\r\n    }\r\n\r\n    // Next sections include libinput settings.\r\n    // Omitting settings disables them, or leaves them at their default values.\r\n    touchpad {\r\n        // off\r\n        tap\r\n        dwt\r\n        // dwtp\r\n        // drag false\r\n        // drag-lock\r\n        natural-scroll\r\n        // accel-speed 0.05\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"two-finger\"\r\n        scroll-factor 0.75\r\n        disabled-on-external-mouse\r\n        middle-emulation\r\n    }\r\n\r\n    mouse {\r\n        // off\r\n        // natural-scroll\r\n        // accel-speed 0.005\r\n        accel-profile \"flat\"\r\n        // scroll-method \"no-scroll\"\r\n    }\r\n\r\n    trackpoint {\r\n        // off\r\n        // natural-scroll\r\n        // accel-speed 0.2\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"on-button-down\"\r\n        // scroll-button 273\r\n        // middle-emulation\r\n    }\r\n\r\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\r\n    // warp-mouse-to-focus\r\n\r\n    // Focus windows and outputs automatically when moving the mouse into them.\r\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\r\n    // focus-follows-mouse max-scroll-amount=\"0%\"\r\n}\r\n```\r\n</details>",
      "created_at": "2025-08-04T14:36:26Z",
      "updated_at": "2025-08-04T16:38:15Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1Xrj",
        "body": "I would look at this: https://github.com/YaLTeR/niri/discussions/1917"
      },
      "user": {
        "login": "selvmaya",
        "avatar_url": "https://avatars.githubusercontent.com/u/31762830?u=7385307b0b9b2e06cf0330450cfc51d214b94eb6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhHOO",
      "number": 2187,
      "title": "global hotkeys",
      "body": "Will it be added to niri global hotkeys? It is in hyprland, but not in niri. I really want this feature.",
      "created_at": "2025-08-04T15:08:36Z",
      "updated_at": "2025-08-04T15:11:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "IVKLD",
        "avatar_url": "https://avatars.githubusercontent.com/u/54883747?u=560384f91b0537e0bf425ccf21e9f051019c4fc9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhFTH",
      "number": 2180,
      "title": "little fuzzel scale menu",
      "body": "I often switch the scale factor in niri. I would like to have the setting stored, so I created this little script to change the config.kdl with fuzzel.\r\nI use only one monitor, so it just searches for the monitor name and then replaces the value. \r\n\r\nPlease notice, that I not a coder. I just fiddled around. But maybe someone finds this helpfull. Feel free to improve or correct :)\r\nI really love these simple ways, because it opens some possibilities like changing the focus-ring color or setting mouse speed.\r\n\r\n<img width=\"491\" height=\"368\" alt=\"2025-08-03-23-03-13-screenshot\" src=\"https://github.com/user-attachments/assets/5d27e2c5-98bf-4920-b648-b315cbc75a48\" />\r\n\r\n\r\n\r\n```\r\n#!/bin/bash\r\n\r\n# Get the monitor name\r\nMONITOR=$(niri msg --json outputs | jq -r '.[] | {name} | .name')\r\nSCALE=$(niri msg --json outputs | jq -r '.[] | .logical | .scale')\r\n\r\nNIRICONF=\"$HOME/.config/niri/config.kdl\"\r\n\r\n# Get the scale value using fuzzel\r\nCHOICE=$(echo -e \"1.0\\n1.25\\n1.5\\n1.75\\n2.0\" | fuzzel -d -l 5 -p \"Select scale for $MONITOR (currently $SCALE): \")\r\n\r\n# Check if CHOICE is empty\r\nif [ -z \"$CHOICE\" ]; then\r\n    exit 1\r\nfi\r\n\r\n# Validate the selected scale value to be > 1 and <= 2\r\nif (( $(echo \"$CHOICE < 1\" | bc -l) || $(echo \"$CHOICE > 2\" | bc -l) )); then\r\n    exit 1\r\nfi\r\n\r\n# Replace the scale line for the active monitor\r\nsed -i \"/output \\\"$MONITOR\\\" {/,/}/ {\r\n    /scale /s/scale .*/scale $CHOICE/\r\n}\" \"$NIRICONF\"\r\n\r\n```\r\n\r\nUpdate: Error in checking < 1",
      "created_at": "2025-08-03T21:04:25Z",
      "updated_at": "2025-08-03T21:17:27Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {}
    },
    {
      "id": "D_kwDOKFkxdc4AhFTE",
      "number": 2179,
      "title": "Suppress window events such as fullscreen, activate, activatefocus, fullscreenoutput",
      "body": "At first I thought I could achieve an equivalent if implemented through or similar to:\r\n```\r\nwindow-rule {\r\n  match is-fullscreen=true\r\n  open-fullscreen false\r\n}\r\n```\r\nThen I realized this just applies when opening the window which is not sufficient.\r\n\r\nSuppressing these events would give me more control especially if a window/app misbehaves.\r\nI imagine it would look something like so:\r\n```\r\nwindow-rule {\r\n  suppress-fullscreen true\r\n  suppress-maximize true\r\n  suppress-activate true\r\n  suppress-activate-focus true\r\n  suppress-fullscreenoutput true\r\n}\r\n```",
      "created_at": "2025-08-03T21:03:47Z",
      "updated_at": "2025-08-03T21:03:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "BluewyDiamond",
        "avatar_url": "https://avatars.githubusercontent.com/u/115411576?u=784fbbf63c47cf5135b8f5d281af4f2caac27331&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhE3J",
      "number": 2177,
      "title": "Fallback config",
      "body": "Maybe add an option to specify a safe fallback config path in case main one fails to load?\r\nLoading default config on Asahi causes black screen and it's pretty annoying",
      "created_at": "2025-08-03T16:19:45Z",
      "updated_at": "2025-08-03T16:34:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sioodmy",
        "avatar_url": "https://avatars.githubusercontent.com/u/81568712?u=50fc75c5a8c64dd5e30bc2e4e764d4b211707b5f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhENh",
      "number": 2172,
      "title": "Prevent focusing floating window",
      "body": "It is annoying because this kind of focus change could be somehow unpredictable and sometimes unwanted, the same in reverse when the floating window is closed. So is the cursor jump (if `warp-mouse-to-focus` set), I would have to look for it.\r\n\r\nThe `is-floating` window rule matcher \"will apply only after the window is already open\", according to the wiki. Is it technically impossible not to focus floating windows?",
      "created_at": "2025-08-02T23:51:58Z",
      "updated_at": "2025-08-03T15:51:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "uhiovk",
        "avatar_url": "https://avatars.githubusercontent.com/u/84575318?u=ea82199220e29d663318fce7945e4a7fc18c0794&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhEt8",
      "number": 2176,
      "title": "Focused Window not Transparent",
      "body": "Hello,\r\nsorry if there is an answer for this question somewhere, i haven't found it.\r\n<img width=\"1919\" height=\"1041\" alt=\"image\" src=\"https://github.com/user-attachments/assets/a85c244f-27f9-4d3e-9fdd-a21363710847\" />\r\nTo reiterate my question. Is there a way to get the focused window to stay transparent?\r\nI am on 25.05.1 Niri using NixOS",
      "created_at": "2025-08-03T14:42:22Z",
      "updated_at": "2025-08-03T16:04:34Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Lars5Janssen",
        "avatar_url": "https://avatars.githubusercontent.com/u/27292942?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhEKF",
      "number": 2169,
      "title": "journal flooded when using 2 niri sessions",
      "body": "For testing purposes I often use a different LXQt Wayland session started on another tty, when it's niri after exciting I find lots of messages\r\n```\r\nago 02 20:50:18 casa niri[547577]: 2025-08-02T18:50:18.551529Z  WARN niri::backend::tty: device is inactive\r\n```\r\nprinted on the screen. I've added ` systemd-cat --identifier=niri` to log things in the start script and now all those end up  in the journal. I went to count them...\r\n```\r\nago 02 20:50:17 casa niri[547577]: 2025-08-02T18:50:17.354128Z  WARN niri::backend::tty: device is inactive\r\nago 02 20:50:18 casa niri[547577]: 2025-08-02T18:50:18.348144Z  WARN niri::backend::tty: device is inactive\r\nago 02 20:50:18 casa niri[547577]: 2025-08-02T18:50:18.348432Z  WARN niri::backend::tty: device is inactive\r\nago 02 20:50:18 casa niri[547577]: 2025-08-02T18:50:18.350041Z  WARN niri::backend::tty: device is inactive\r\nago 02 20:50:18 casa niri[547577]: 2025-08-02T18:50:18.355751Z  WARN niri::backend::tty: device is inactive\r\nago 02 20:50:18 casa niri[547577]: 2025-08-02T18:50:18.551483Z  WARN niri::backend::tty: device is inactive\r\nago 02 20:50:18 casa niri[547577]: 2025-08-02T18:50:18.551529Z  WARN niri::backend::tty: device is inactive\r\nstef@casa:lxqt-panel$ journalctl -b |grep \"device is\"|wc -l\r\n34487\r\n```\r\nI guess there's no easy way to disable this warning.",
      "created_at": "2025-08-02T21:03:31Z",
      "updated_at": "2025-08-03T05:06:04Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "stefonarch",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?u=a2928499988ebbb05ef99547bd768ab7bbcf2fd2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag77c",
      "number": 2127,
      "title": "Allow Integer in Window Rule option open-on-workspace idx",
      "body": "Hello,\r\n\r\nI'm not sure if this is related to #1317 .\r\n\r\nI would like to do this on the focused output using static workspaces:\r\n\r\n```kdl\r\nwindow-rule{\r\n    match app-id=\"Spotify\"\r\n    open-on-workspace 2\r\n}\r\n```\r\n\r\nHowever, I get this:\r\n\r\n```sh\r\nniri validate\r\nError:   × error loading config\r\n  ├─▶ error parsing\r\n  ╰─▶ error parsing KDL\r\n\r\nError:   × expected string scalar, found integer\r\n     ╭─[config.kdl:576:1]\r\n 576 │     match app-id=\"Spotify\"\r\n 577 │     open-on-workspace 2\r\n     ·                       ┬\r\n     ·                       ╰── unexpected integer\r\n 578 │ }\r\n     ╰────\r\n```\r\n\r\nThe use case is: Sometimes users want to open up a program on a workspace in the focused output. That output\r\ncould be 1, 2, or 3. The current system does not work with static workspaces. Users have to put \"2Media\" which\r\nis limited to a specific monitor.\r\n\r\nThanks",
      "created_at": "2025-07-25T21:36:40Z",
      "updated_at": "2025-08-02T22:20:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rickswe",
        "avatar_url": "https://avatars.githubusercontent.com/u/76216665?u=8c1f0535e59828c41d1c26d25ac2f9cb3232b7f7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhCLH",
      "number": 2151,
      "title": "Logitech MX Master 3 thumb button",
      "body": "Has anybody been successfull with mapping MX Master \"thumb\" button? If I run wev, I get this for it:\r\n\r\n```\r\n[14:     wl_keyboard] key: serial: 176890; time: 1735374591; key: 133; state: 1 (pressed)\r\n                      sym: Super_L      (65515), utf8: ''\r\n[14:     wl_keyboard] modifiers: serial: 0; group: 16\r\n                      depressed: 00000040: Mod4 \r\n                      latched: 00000000\r\n                      locked: 00000010: Mod2 \r\n[14:     wl_keyboard] key: serial: 176893; time: 1735374703; key: 133; state: 0 (released)\r\n                      sym: Super_L      (65515), utf8: ''\r\n[14:     wl_keyboard] modifiers: serial: 0; group: 16\r\n                      depressed: 00000000\r\n                      latched: 00000000\r\n                      locked: 00000010: Mod2 \r\n```\r\n\r\nBut I can't figure out, what I should use in Niri config to map some action to it? I wan't to have the overview on it.",
      "created_at": "2025-07-31T09:41:16Z",
      "updated_at": "2025-08-02T18:42:58Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1NI0",
        "body": "I also have a MX Master 3s with the thumb button. The easiest way I have found as of know is to use [solaar](https://github.com/pwr-Solaar/Solaar) and bind it to a command."
      },
      "user": {
        "login": "VaclavC",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhDbr",
      "number": 2162,
      "title": "Overview dynamic on content",
      "body": "Hi there,\r\n\r\nI recently switched to niri from hyprland and love the overview feature. However, i notice that if I use many horizontal tiles on one row, I tend to miss where the window is I am looking for.  Currently, we can scale the zoom level, but this looks worse if I only have a few windows. Therefore the proposed feature would be to add a \"scaler\" where it would scale according to the width of the number of windows horizontally/vertically used.\r\n",
      "created_at": "2025-08-01T15:46:35Z",
      "updated_at": "2025-08-02T15:14:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cvanelteren",
        "avatar_url": "https://avatars.githubusercontent.com/u/19485143?u=86bd93ea3ff417092ca3b04370c4b2030b24620c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad_X3",
      "number": 1035,
      "title": "Is there a way to pevent mouse pointer jumping up when changing workspaces?",
      "body": "It doesn't even jump to the center of a window that gets focused after the switch, it only gets centered vertically. ",
      "created_at": "2025-01-23T14:25:26Z",
      "updated_at": "2025-07-31T14:10:50Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "JohnDowson",
        "avatar_url": "https://avatars.githubusercontent.com/u/40003182?u=ef68b18acd7ad69c688c30b8a19e18b623413e9f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhCWu",
      "number": 2152,
      "title": "How can I have a \"pop-up\" menu for renaming, etc for Nautilus on NiriWM",
      "body": "Everything seem fine on other DE/WM so I suppose this is a Niri-related. Sorry If I am wrong.\r\n\r\nSo I use Nautilus, no reason just because is GNOME-tools. But when I try to rename a folder/file, using F2 or right-click > rename\r\nIt do not pop up any menu for me to renaming. How can I fix this ? ",
      "created_at": "2025-07-31T13:09:33Z",
      "updated_at": "2025-07-31T13:26:08Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "minhincs",
        "avatar_url": "https://avatars.githubusercontent.com/u/205402779?u=93de06018588baf9cab6b8a80952d05bd3008cfe&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag_5t",
      "number": 2145,
      "title": "Overview extra custom functionality",
      "body": "I do not like having waybar or similar things taking up room on my laptop, but I also hate spamming 'acpi -b' in my terminal. I think the perfect solution at least for me, would be to allow a command to run along side open-overview and close-overview.\r\n\r\nLike if I had waybar or some custom ewww modules in my overview, only I think it would be extremely cool and we could make overview more similar to the gnome one, without having to code all of that and instead letting users decide what would go there.\r\n\r\nThe only issue in my head right now would be about time taken to spawn waybar (or similar), or if it would just hide rather than die, but with testing im sure we can see if it would be an issue.\r\n\r\nI haven't done anything like this before but could spend some time doing it.",
      "created_at": "2025-07-29T09:44:54Z",
      "updated_at": "2025-07-31T02:36:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "JTrenerry",
        "avatar_url": "https://avatars.githubusercontent.com/u/105094182?u=d3905d225db8f83eaf592d9554fbfb86f982401b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhBei",
      "number": 2148,
      "title": "Binding Win key",
      "body": "Hi, is there some sort of limitation that prevents binding single Win key press? I would like to open my fuzzel with it (I use Alt as the mod key, so Win does nothing currently), but when i configure it like this:\r\n```\r\nbinds {\r\n    // [...]\r\n    Win { spawn \"fuzzel\"; }\r\n    // [...]\r\n}\r\n```\r\n\r\nIt throws this error:\r\n```\r\nniri validate \r\nError:   × error loading config\r\n  ├─▶ error parsing\r\n  ╰─▶ error parsing KDL\r\n\r\nError:   × invalid keybind\r\n  ├─▶ invalid keybind\r\n  ╰─▶ invalid key: Win\r\n     ╭─[config.kdl:332:1]\r\n 332 │     Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\r\n 333 │     Win { spawn \"fuzzel\"; }\r\n     ·     ─┬─\r\n     ·      ╰── invalid value\r\n 334 │     Alt+Tab { spawn \"niri-switch\"; }\r\n     ╰────\r\n```\r\n\r\nBinding other keys works just fine. Is it some sort of hardcoded limitation?",
      "created_at": "2025-07-30T17:07:50Z",
      "updated_at": "2025-07-30T17:18:03Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1Kk_",
        "body": "See #1923."
      },
      "user": {
        "login": "MusicFreak456",
        "avatar_url": "https://avatars.githubusercontent.com/u/58264216?u=61bbb8e7796ae2ba194ac995e315bb4763d51ab0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AhA2X",
      "number": 2146,
      "title": "Sticky windows",
      "body": "Could we get something like sticky windows that stick as we scroll horizontally or between workspaces ( maybe a different type of sticky window for sticky horizontally or sticking between workspaces or both).\n\nIf we could bind it to a shortcut to enable a sticky window on the currently focused window or something like that?",
      "created_at": "2025-07-30T06:04:19Z",
      "updated_at": "2025-07-30T13:05:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nikhilm25",
        "avatar_url": "https://avatars.githubusercontent.com/u/134196172?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgslJ",
      "number": 2017,
      "title": "making Opening windows opened by other windows open in the same column",
      "body": "e.g.: some program opens a seperate window. a good example would be a browser that opens another window. i would like to make it open in the same column as the browser that opened it. it could be implemented as a window rule.",
      "created_at": "2025-07-12T14:53:22Z",
      "updated_at": "2025-07-30T08:14:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfNcK",
      "number": 1408,
      "title": "Window \"marks\" (or \"tags\")",
      "body": "Hi,\r\n\r\nBrand new Niri user here, trying out the compositor for the first time. Very impressed so far, thanks for all your amazing work! I did have one idea for a possible new (or alternate) addition to the UI paradigm, though, and wanted to share it here.\r\n\r\n### Summary\r\nAdd the ability to \"mark\" (or \"tag\") windows. Each mark has a unique name and points to a single window. When that window is destroyed, any marks pointing to it stop existing. Marks can either be assigned dynamically via keybindings, or else statically associated with certain windows using window rules. Add commands to quickly interact with marked windows.\r\n\r\nThis is related to https://github.com/YaLTeR/niri/discussions/884 but with the important distinction of marks being *unique*, which makes them more useful for navigation and interaction with windows, rather than being a property of the window itself. Think vim marks.\r\n\r\n### Motivation\r\nFrankly, a big part of the draw of Niri for me is that I've grown tired of *needing* to manage separate workspaces in the first place, and want to sometimes just have a single large workspace that can grow dynamically to accommodate many windows. I love being able to just spawn in new windows without shrinking all of the other windows in the process. But, a natural downside of growing a workspace too much is the ease with which windows can be lost. Allowing us to mark \"important\" windows would alleviate some of this problem.\r\n\r\n### New commands (placeholder names)\r\n* `set-mark \"name\"`: Create (or replace) a named mark pointing at the currently focused window.\r\n* `focus-mark \"name\"`: Scroll and switch focus to the marked window.\r\n* `summon-mark-{left/right/above/below} \"name\"`: Move the marked window to left/right/above/below the currently focused window. Alternatively, `summon-mark \"name\"` to just summon it into whatever adjacent placement makes the most sense.\r\n* `move-to-mark-{left/right/above/below} \"name\"`: Move the currently focused window to left/right/above/below the marked window.\r\n\r\n### Window rules\r\n* Match rule `mark=\"regex\"`, matching windows with marks satisfying the regex\r\n* Action `set-mark \"name\"`, make the named mark point at the matched window\r\n\r\n### Open questions\r\n* Should marks be per-workspace (\"local\") or global? I can see a use-case for both - but while global marks can arguably already be served using named workspaces, local marks have no current direct analog. Maybe we could have a `--global` or `--local` modifier for these commands, or we could have a special prefix for mark names to make them global/local. But all being said, I am leaning towards *local* marks.\r\n* Should a mark me able to point to multiple windows at once? (How would we interact with mark groups? `add-to-mark`, `remove-from-mark`?)\r\n* Should marks point to windows, or window *columns*?\r\n\r\n### Example use cases\r\n* Have one browser window per workspace, with only tabs relevant to that workspace. Use a dedicated keybinding to jump to (or summon) the \"browser\" mark. (Bonus points: If the mark does not yet exist, create new browser window on this workspace)\r\n* Use Mod+Shift+N to mark frequently used windows inside a workspace, use Mod+N to jump to them, rather than having to always navigate \"by eye\" using HJKL. Expect these mappings to be short-lived and unique to the current workflow. A bit like dynamic workspace, but horizontally scrolling.\r\n\r\n### Alternative approaches\r\n* We could instead just gain the ability to focus/summon windows by name/class/etc. directly. But I think the mark system would be more flexible / generally useful.\r\n\r\nThoughts?",
      "created_at": "2025-04-09T01:30:36Z",
      "updated_at": "2025-07-30T03:01:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "haasn",
        "avatar_url": "https://avatars.githubusercontent.com/u/1149047?u=166016eb8b35ba4b436e8de60c223d2583c54d3c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag_Qq",
      "number": 2144,
      "title": "Bind key to other key",
      "body": "I'm trying to bind `XF86NotificationCenter` to `XF86AudioPlay`. Or, I want the same effect of toggling media play/pause. Does Niri have any builtin functionality for this?\r\nI'd like to do this for other keys as well, such as `XF86{Pickup,Hangup}Phone` to whatever is Previous and Next.\r\nIs there a config way to do this, or do I have to `spawn` a command?",
      "created_at": "2025-07-28T18:52:41Z",
      "updated_at": "2025-07-30T05:08:44Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1IAQ",
        "body": "You can specify a custom keymap file [here](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#layout) though I cannot tell you what exactly to put in there. Googling 'custom xkb layout' could yield some useful results."
      },
      "user": {
        "login": "ackledotdev",
        "avatar_url": "https://avatars.githubusercontent.com/u/111009970?u=3d7ae04e9151ca95628cae3981a74268325bc856&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag5lk",
      "number": 2111,
      "title": "Focus urgent window",
      "body": "A common feature of window managers allows you to bind a shortcut for changing your focus to the latest urgent window.",
      "created_at": "2025-07-23T12:40:07Z",
      "updated_at": "2025-07-28T10:38:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jrvieira",
        "avatar_url": "https://avatars.githubusercontent.com/u/16804617?u=86b3da7ab9f301becda3e5350c7de407c3b0e13a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag86F",
      "number": 2135,
      "title": "Action to cycle focusing monitors",
      "body": "We have actions to focus monitors based on their relative position (right, left, etc), but it would be nice to have an action to focus the next output in the config and cycle through them (effectively back and forth if you only have two monitors), something like `focus-monitor-next`",
      "created_at": "2025-07-27T13:33:46Z",
      "updated_at": "2025-07-28T17:31:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "iacs",
        "avatar_url": "https://avatars.githubusercontent.com/u/4656513?u=4a8e6c0a439b4153c4156dd2099956cdf1860e14&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag8UF",
      "number": 2130,
      "title": "Execute a command/script when monitor is connected/disconnected?",
      "body": "\r\nSimple situation: laptop with an external monitor. lxqt-panels (and not only them afaik) are tied to a screen and my main panel is on  HDMI-A-1. \r\nThere is `lxqt-panel-profiles` which can switch configs and I've to do that every time.\r\n\r\n\r\n<img width=\"319\" height=\"323\" alt=\"immagine\" src=\"https://github.com/user-attachments/assets/fe7115a8-1012-4715-aae3-063816f9c70a\" />\r\n\r\nBut it would be nice to have it switch automatically, any idea how to script that with `niri msg -j event-stream `  and  `jq`. Just trigger every time a command or  one on connect and another one on disconnect.\r\n\r\n```\r\n{\"WorkspacesChanged\":{\"workspaces\":[{\"id\":1,\"idx\":1,\"name\":\"Net\",\"output\":\"eDP-1\",\"is_urgent\":false,\"is_active\":true,\"is_focused\":true,\"active_window_id\":90},{\"id\":15,\"idx\":2,\"name\":null,\"output\":\"eDP-1\",\"is_urgent\":false,\"is_active\":false,\"is_focused\":false,\"active_window_id\":null},{\"id\":2,\"idx\":1,\"name\":\"Social\",\"output\":\"HDMI-A-1\",\"is_urgent\":false,\"is_active\":true,\"is_focused\":false,\"active_window_id\":4},{\"id\":3,\"idx\":2,\"name\":\"Git\",\"output\":\"HDMI-A-1\",\"is_urgent\":false,\"is_active\":false,\"is_focused\":false,\"active_window_id\":7},{\"id\":4,\"idx\":3,\"name\":\"Media\",\"output\":\"HDMI-A-1\",\"is_urgent\":false,\"is_active\":false,\"is_focused\":false,\"active_window_id\":62},{\"id\":17,\"idx\":4,\"name\":null,\"output\":\"HDMI-A-1\",\"is_urgent\":false,\"is_active\":false,\"is_focused\":false,\"active_window_id\":77},{\"id\":19,\"idx\":5,\"name\":null,\"output\":\"HDMI-A-1\",\"is_urgent\":false,\"is_active\":false,\"is_focused\":false,\"active_window_id\":null}]}}\r\n```\r\nAny help appreciated!",
      "created_at": "2025-07-26T15:45:30Z",
      "updated_at": "2025-07-28T08:54:03Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1BY5",
        "body": "If I understand correctly and HDMI-A-1 is the one being connected/disconnected, if not change that to the proper display:\r\n\r\n```bash                                                     \r\n#!/usr/bin/env bash\r\n\r\nwhile read event; do\r\n\r\n   if [[ \"$event\" =~ \"WorkspacesChanged\" ]]; then\r\n      if [[ `echo $event | jq 'any(.WorkspacesChanged.workspaces[].output == \"HDMI-A-1\"; .)'` == 'true' ]]; then\r\n         cp ~/.config/niri/config-monitor-connected.kdl ~/.config/niri/config.kdl\r\n      else\r\n         cp ~/.config/niri/config-monitor-disconnected.kdl ~/.config/niri/config.kdl\r\n      fi\r\n   fi\r\n\r\ndone < <(niri msg -j event-stream)\r\n```"
      },
      "user": {
        "login": "stefonarch",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?u=a2928499988ebbb05ef99547bd768ab7bbcf2fd2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag9Lg",
      "number": 2137,
      "title": "Is there a way to start Niri open on a named workspace",
      "body": "Is it possible to have Niri start with a named workspace open, say I have the following named workspaces, in order\r\n\r\n- scratchpad\r\n- development\r\n- chat\r\n\r\nAnd I want to Niri open on `development` at startup, is there a way I can do so?",
      "created_at": "2025-07-27T16:24:43Z",
      "updated_at": "2025-07-28T05:53:26Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1CMd",
        "body": "`spawn-at-startup \"niri\" \"msg\" \"action\" \"focus-workspace\" \"development\"`\r\n"
      },
      "user": {
        "login": "tonycsoka",
        "avatar_url": "https://avatars.githubusercontent.com/u/5617902?u=042a585c808c06d47afd9fc5efa6bfce4550f898&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag3Wz",
      "number": 2099,
      "title": "Foot terminal background removed with resize",
      "body": "I am using foot terminal with no transparency, and when opening the terminal with a keybind or command, it opens just fine on any default column width.\r\n\r\nBut as soon as I resize the window, with keybinds or mouse, it immediately looses it's background and becomes transparent(Not completely).\r\nAlthough this doesn't happen on other terminals such as Kitty, Alacritty, Wezterm, which led me to believe that it's a foot terminal issue.\r\n\r\nSo I did create an issue there, or more like commented on an old issue that looked related, here's the [issue](https://codeberg.org/dnkl/foot/issues/1229). But according to the author, the issue might be related to Niri or Smithay, or more so that this behaviour is intented.\r\n\r\nI did read through the prefer-no-csd docs, and It might have something to do with it, since there's an line about Niri not drawing a solid background.\r\n> With prefer-no-csd set, applications that negotiate server-side decorations through the xdg-decoration protocol will have focus ring and \r\nborder drawn around them without a solid colored background.\r\n\r\nI'm not sure what I might need to change for this to work. Here's the things that I have tried.\r\n\r\nwith the csd settigns in `foot.ini`, setting it to `none/server/client` barely have any effect by default. except for a visible titlebar.\r\n```ini\r\n[csd]\r\npreferred=none/client/server\r\n```\r\n\r\nRemoving the `prefer-no-csd` rule from niri, makes foot have an solid blue/grey background but only on the active window, it goes transparent when it's not in focus.\r\n\r\nI tried creating a window-rule for foot and footclients, the opacity rule doesn't have any effect, and the draw-border-with-background has the same effect as the background with `prefer-no-csd`.\r\n```kdl\r\n window-rule {\r\n  match app-id=\"foot\"\r\n  match title=\"foot\"\r\n  match app-id=\"footclient\"\r\n\r\n  draw-border-with-background true\r\n  opacity 1.0\r\n}\r\n```\r\n\r\nI frequently adjust the width of the terminal in my workflow. but I can't find a good non-hack-y workaround for this, or even a way to make the background that is drawn with niri to be a bit more darker and active on non-focused windows too. And I don't want to switch to another terminal for this.\r\n\r\nFor now, I'm using this workaround of drawing a black shadow with no offset/softness/spread behind the foot windows.\r\n\r\n```kdl\r\n window-rule {\r\n  match app-id=\"foot\"\r\n  match app-id=\"footclient\"\r\n  match title=\"foot\"\r\n\r\n  draw-border-with-background false\r\n  opacity 1.0\r\n  shadow {\r\n    on\r\n    draw-behind-window true\r\n    softness 0\r\n    spread 0\r\n    offset x=0 y=0\r\n    color \"#000000\"\r\n    inactive-color \"#000000\"\r\n  }\r\n}\r\n```",
      "created_at": "2025-07-21T10:42:50Z",
      "updated_at": "2025-07-27T19:15:29Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "SwayKh",
        "avatar_url": "https://avatars.githubusercontent.com/u/59339401?u=2678da68836335262eff485c2dc3b6e98366ab2d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgWMf",
      "number": 1866,
      "title": "`focus-follows-mouse` in overview",
      "body": "First of all huge thanks for the project, I'm currently migrating to niri from hyprland and it's been really nice so far.\r\n\r\nOne thing I'd like to be able to do is mouse over an offscreen window and then close it with a keybind in the overview, could something like this be supported?\r\n\r\nI'm not sure if the auto-scrolling functionality could work since the windows would probably move past where the mouse is and just keep scrolling indefinitely, so maybe it should only auto-scroll if the window is partially outside the overview rather than outside the zoomed-in view?",
      "created_at": "2025-06-21T16:04:31Z",
      "updated_at": "2025-07-27T18:52:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "maevii",
        "avatar_url": "https://avatars.githubusercontent.com/u/41077433?u=1f6fa277454a6aaede514b150a37444ab0f349c8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag8th",
      "number": 2133,
      "title": "How to bind tui utilities?",
      "body": "Hello, I tried binding the TUI utility \"yazi\" to XF86Explorer, but it’s not working. I used { spawn \"kitty -e yazi\"; }, and it doesn’t work. Because of this, I also can’t bind rofi-wayland. I used { spawn \"rofi -config /path/to/config/ -show\"; }, and this isn’t working either.",
      "created_at": "2025-07-27T10:31:46Z",
      "updated_at": "2025-07-27T10:35:53Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1ByU",
        "body": "Try `spawn \"kitty\" \"-e\" \"yazi\";`\r\n\r\nEdit: [relevant wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Key-Bindings#spawn)"
      },
      "user": {
        "login": "ArchLinuxUserIgor",
        "avatar_url": "https://avatars.githubusercontent.com/u/85604075?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag8sv",
      "number": 2132,
      "title": "keep resize windows dynamically to fit current page",
      "body": "Dear niri community.\r\nI know this may be against niri original design but I will ask anyway. Would it be possible to tell niri to resize current windows to fit new windows in the same fasion as hyprland does. I open my apps using shortcuts (eg: Mod+T opens alacritty) and I would like to do something like Mod+Shit+T resizes current windows to fit new one running alacritty\r\nthank you",
      "created_at": "2025-07-27T09:58:22Z",
      "updated_at": "2025-07-27T09:58:22Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Masber",
        "avatar_url": "https://avatars.githubusercontent.com/u/722064?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag6ky",
      "number": 2121,
      "title": "Disabling snap points? Arbitrary scroll of larger-than-fullscreen windows?",
      "body": "Niri has the unique feature that you can create a window that is wider than the display bounds (Mod+Equal FTW!), however I can't work out how to view the off-screen portion of the window without creating a small window to the right side (and even then, if it's really wide, you wouldn't be able to see the centre of the window, just the left and right extremities).\r\n\r\nIf I use Mod+Middle mouse button it still snaps to the next window and doesn't allow for arbitrary viewing of different parts of the super wide window.\r\n\r\nI know I could still technically view the full window by breaking it out into floating mode and dragging it around with Mod+Right click+drag, but I'm wondering if there is any way to view arbitrary points in a super wide window within the tiling mode? ",
      "created_at": "2025-07-24T12:41:21Z",
      "updated_at": "2025-07-27T04:43:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "benkaiser",
        "avatar_url": "https://avatars.githubusercontent.com/u/608054?u=9fbc49400f678dc170eef4b4e3f27da6c5ee99cf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag8QA",
      "number": 2128,
      "title": "Performance monitoring",
      "body": "Is there any way to display the current fps niri is running at or some other performance stats? I seem to have low framerates on most of the desktop animations as well as huge frame drops when scrolling folders in nautilus. I would like to be able to see some performance statistics in order to attempt debugging this.",
      "created_at": "2025-07-26T13:14:20Z",
      "updated_at": "2025-07-27T04:10:00Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "GhishNchips",
        "avatar_url": "https://avatars.githubusercontent.com/u/42581623?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag8bY",
      "number": 2131,
      "title": "not able to configure tofi launcher",
      "body": "Dear Niri community,\r\nI would lile to se tofi launcher https://github.com/philj56/tofi\r\nI set this line in my niri configuration file\r\n\r\n```\r\n    Mod+D hotkey-overlay-title=\"Run an Application: tofi\" { spawn \"tofi-drun --drun-launch=true\"; }\r\n```\r\n\r\nThis command `tofi-drun --drun-launch=true` works in my terminal but not through niri\r\n\r\nAny idea why?\r\n\r\nthank you",
      "created_at": "2025-07-26T20:36:26Z",
      "updated_at": "2025-07-26T21:06:27Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A1BMp",
        "body": "@Masber  The problem is that the command doesn’t work in Niri because `spawn` doesn’t interpret the string `\"tofi-drun --drun-launch=true\"` correctly when it contains spaces. Niri tries to execute a single binary named literally `tofi-drun --drun-launch=true`, which obviously doesn't exist.\r\n\r\nIf you want to run a command with arguments, you need to separate them like a list, for example:\r\n\r\n```kdl\r\nspawn \"tofi-drun\" \"--drun-launch=true\";\r\n```\r\n\r\nAlternatively, if you want to run the command through a shell (useful for pipes, redirection, etc.), you can do:\r\n\r\n```kdl\r\nspawn \"sh\" \"-c\" \"tofi-drun --drun-launch=true\";\r\n```\r\n\r\nIn short: Niri does **not** parse commands like a shell does. So `spawn \"command with args\"` won’t work — you have to split the command and its arguments properly."
      },
      "user": {
        "login": "Masber",
        "avatar_url": "https://avatars.githubusercontent.com/u/722064?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgvDH",
      "number": 2037,
      "title": "How you can help with niri",
      "body": "It's great seeing niri grow and get many new users. Welcome everyone!\r\n\r\nHowever, with popularity comes a flood of questions, discussions, bug reports and pull requests. Already many more than I can answer on my own (with university research taking up a lot of my time and all). So, I need your help!\r\n\r\nI made a contributing guide outlining how you can help with issues, discussions, pull request testing and review (especially pull request review). Read it here: https://github.com/YaLTeR/niri/blob/main/CONTRIBUTING.md\r\n\r\nHuge thanks to the many people who are already answering questions and helping others, wouldn't be able to manage without you. :heart: ",
      "created_at": "2025-07-14T09:16:51Z",
      "updated_at": "2025-07-26T23:21:46Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfQo0",
      "number": 1421,
      "title": "Option to disable middle click paste",
      "body": "It seems like Niri currently doesn't provide a way to turn of middle click paste without turning off the middle click action completely. That would be nice to have since I (and according to a cursory internet search, a lot of others too) find it to be a very annoying historical feature.",
      "created_at": "2025-04-12T09:38:40Z",
      "updated_at": "2025-07-25T09:07:59Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jakesarjeant",
        "avatar_url": "https://avatars.githubusercontent.com/u/137307920?u=e31594b29350f9f255923add58b59c8ede55b76f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag7FV",
      "number": 2125,
      "title": "Constrain Window to Monitor Size",
      "body": "Hello,\r\n\r\nFormer river user here made the switch to Niri. In river the windows are constrained to the screen.\r\nThis makes for a perfect resize with the mouse. I do not see any benefit of floating windows going off\r\nthe screen. However, I understand the reasoning behind it may be to move windows between monitors with the mouse. Maybe a rule constraint-to-screen? Is there a way to do this without doing automatic resize using `niri msg action set-window-width`?\r\n\r\nThanks in advance.\r\n",
      "created_at": "2025-07-25T01:13:46Z",
      "updated_at": "2025-07-25T05:33:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rickswe",
        "avatar_url": "https://avatars.githubusercontent.com/u/76216665?u=8c1f0535e59828c41d1c26d25ac2f9cb3232b7f7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag63l",
      "number": 2124,
      "title": "Windows jump when moving them from monitor to monitor using the mouse",
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n## Description\n*In case the niri config could be an issue causing it i can provide it when asked, but i assume its not a bug occurring with my config*\n### What happens\nWhen using your mouse and modifier key to move a window across screens it first vanishes to the side and then jumps over to the next monitor vanishing from the first. A window in Move can never be on two monitors at the same time, which seems like an unintended bug, rather than a design choice. I have attached a video below to show how the issue looks like\n\nhttps://github.com/user-attachments/assets/81bbcfff-7aec-4657-bce0-e77b4e28fed4\n\n### What should happen\nThe window is visible on both screens at the same time and the transition between monitors feels smooth like theyre connected, for example Gnome, KDE, Hyprland and Windows do it that way\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: `niri 25.05.1 (8ba57fc)`\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: `Arch Linux`\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: `AMD RX 6600TX`\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: `Intel Core i7 6700k`\n",
      "created_at": "2025-07-24T10:22:13Z",
      "updated_at": "2025-07-24T18:33:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "forest-cat",
        "avatar_url": "https://avatars.githubusercontent.com/u/71219154?u=af8d6475e0044b5886ec30132cc525dbbbc4842b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag6x1",
      "number": 2122,
      "title": "monet-niri",
      "body": "niri with matugen themed uniform qt and gtk apps \r\n<img width=\"1920\" height=\"1080\" alt=\"MoreSS\" src=\"https://github.com/user-attachments/assets/a5f1ddd3-e945-42f4-8952-f45421affda0\" />\r\n<img width=\"1920\" height=\"1080\" alt=\"MoreSS2\" src=\"https://github.com/user-attachments/assets/91c2bc25-cd35-44fb-8bf8-31467d0fd93c\" />\r\n<img width=\"1920\" height=\"1080\" alt=\"desktop\" src=\"https://github.com/user-attachments/assets/7bc4e903-d426-412e-9a3e-187a02e08db1\" />\r\n<img width=\"1920\" height=\"1080\" alt=\"terminal\" src=\"https://github.com/user-attachments/assets/d386ae10-e69a-4a2d-a4b6-c226339d6eb8\" />\r\n<img width=\"1920\" height=\"1080\" alt=\"ytmpv-script\" src=\"https://github.com/user-attachments/assets/3606b5ed-12a2-4022-b000-edfc538fe086\" />\r\n<img width=\"1920\" height=\"1080\" alt=\"zathura\" src=\"https://github.com/user-attachments/assets/3a30236d-c226-4d89-bdf0-c2cd38134e67\" />\r\n\r\n\r\n\r\ndotfiles ==> https://github.com/n3ptune-plan3t/monet-niri",
      "created_at": "2025-07-24T16:31:53Z",
      "updated_at": "2025-07-24T17:30:41Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "n3ptune-plan3t",
        "avatar_url": "https://avatars.githubusercontent.com/u/222282311?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag6Ir",
      "number": 2117,
      "title": "Automatically center all fully visible columns",
      "body": "It'd be awesome to have a config switch to automatically center all fully visible columns whenever the layout or focus changes.",
      "created_at": "2025-07-24T02:05:53Z",
      "updated_at": "2025-07-24T02:05:55Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Gingeh",
        "avatar_url": "https://avatars.githubusercontent.com/u/39150378?u=4f3479471239403bca057341167f1eed270efb90&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag5v4",
      "number": 2113,
      "title": "I want to combine two monitors",
      "body": "I recently installed a second monitor, and here's what I learned from using Niri: it's not very convenient. I have to create additional keybinds to jump between monitors, or use _focus-window-or-monitor-<left/right>_. It's awkward, takes some getting used to, and just plain weird. I'd like to make it so that the monitors are merged into one superwide one.\r\n\r\nЕсли что, мы можем продолжить обсуждение на русском языке.",
      "created_at": "2025-07-23T15:06:53Z",
      "updated_at": "2025-07-23T15:55:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sea7ones",
        "avatar_url": "https://avatars.githubusercontent.com/u/192795928?u=b47f02e05572ab08baa5d676112b838aef312880&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag3q0",
      "number": 2105,
      "title": "Identify xwayland windows?",
      "body": "I run `xwayland-satellite` at startup, and can freely use X11 programs (like Steam), everything works great.\r\n\r\nBut it would be nice if I could mark those windows with a different window border color, using window rules. However, I don't see anything unique about xwayland windows when I run `niri msg windows`.\r\n\r\nIs there any way for window rules or IPC to identify a window that is using xwayland?",
      "created_at": "2025-07-21T16:46:12Z",
      "updated_at": "2025-07-22T09:55:26Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Nairou",
        "avatar_url": "https://avatars.githubusercontent.com/u/942190?u=fce8347b1eb6c8a9d1dee0459164949d026bf5dd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag13m",
      "number": 2093,
      "title": "Low-priority named workspaces",
      "body": "OK, so here is my use-case.\r\n\r\nI'm pretty happy with the workflow of having Firefox in the first workspace, followed by a dynamic workspace for each project/task that I'm working on.  I re-order my workspaces to put the ones that I'm actively using near the top.\r\n\r\nThere is one wrinkle.  I have a number of other apps which I would like to keep open, like chat and notes.  I would like to be able to get to the workspaces corresponding to these apps with a single shortcut, but I do NOT want them to clog up my 2,3,4 workspace slots.\r\n\r\nI can already bind them to separate keys using named workspaces, but by default named workspaces are spawned at the beginning of a display.  When starting to work on a new thing, I need to first press `Mod+9` to highlight the blank workspace that is auto-created at the end, open an app there, then press `Mod+Shift+I` a bunch of times to move it up past the non-essential apps to my working area.\r\n\r\nI can think of a couple of ways to make this possible:\r\n\r\n1. Commands to allow moving a window into an empty workspace.  Something like `move-column-to-workspace` but it creates a new blank workspace in that spot and moves everything else down.\r\n2. Ability to configure named workspaces to float to the end.  Of course, right now niri has no notion of \"the end\", workspace numbers can go up to infinity, so that would have to be introduced as well.\r\n3. Ability to pin named workspaces to specific indices.  This seems to go pretty hard against \"the niri way\" but it should be possible in theory.  ",
      "created_at": "2025-07-20T18:10:58Z",
      "updated_at": "2025-07-22T00:15:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "whmountains",
        "avatar_url": "https://avatars.githubusercontent.com/u/8680147?u=2454de4e3c88e16c42acdb0b36343cd7993d9c6a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag3xG",
      "number": 2106,
      "title": "Window rule that Matchs Display?",
      "body": "I've got a vertical monitor and a horizontal one. I'd like to have a window-rule that only applies to windows opened on the vertical monitor. It doesn't look look like there's a match that'll check for that though.\r\n\r\nMy goal would be to change the default column width and window height on that display, since everything opens so skinny on it. ",
      "created_at": "2025-07-21T18:48:43Z",
      "updated_at": "2025-07-21T23:42:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "MrDowntempo",
        "avatar_url": "https://avatars.githubusercontent.com/u/8398380?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag3Ls",
      "number": 2096,
      "title": "simplified version of niri",
      "body": "I'm from a certain demographic with significant lower mental capabilities than those of the author of niri and I'm overwhelmed by niri.\r\n\r\nEspecially when using multiple outputs, there are too many dimensions for my mind on which I could move things:\r\n\r\n- move window\r\n  - across workspaces\r\n  - across outputs (even worse if outputs were ordered on two dimensions)\r\n  - across columns\r\n  - into columns\r\n  - across tabs\r\n- move workspace\r\n  - across outputs\r\n  - within workspace order\r\n- move focus\r\n  - across outputs\r\n  - ...\r\n- move column\r\n  - ...\r\n\r\nI like that niri is fast, reliable and customizable. However to be productive, I now consider the following options:\r\n\r\na) Find and stick to a subset of niri that I can mentally grasp.\r\nb) Switch to a different compositor.\r\nc) Go back and try Xlibre with xmonad.\r\n\r\nI'd prefer option a) and would appreciate if anybody could point me to an existing config with easy to remember key bindings.\r\n\r\nWhat I want is to quickly switch between a handful of apps (browser, editor, terminal, chat, others) and move those between outputs. I like my apps to always be fullscreen. I don't like my mouse. I don't like to search my apps across outputs and workspaces.\r\n\r\nAs for niri development I'd suggest to split niri into two projects: niri-simple for people like me and niri-full with everything you can imagine.",
      "created_at": "2025-07-21T08:10:00Z",
      "updated_at": "2025-07-21T18:50:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "thkoch2001",
        "avatar_url": "https://avatars.githubusercontent.com/u/94641?u=da775569a720a6114db0bc16f5d9db6de229dc75&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag3jT",
      "number": 2103,
      "title": "use wlr-which-key",
      "body": "I [complained about the complexity of niri](https://github.com/YaLTeR/niri/discussions/2096). I might have found a good-enough solution: [wlr-which-key](https://github.com/MaxVerevkin/wlr-which-key).\r\n\r\nhttps://gist.github.com/thkoch2001/47dc084079e8b16156a59371fce37b07\r\n\r\nYou need at least version 1.2 of wlr-which-key for the above config. I bound it to Mod+SPACE in niri:\r\n\r\n```\r\nbinds {\r\n    Mod+SPACE hotkey-overlay-title=\"wlr-which-key\" { spawn \"wlr-which-key\"; }\r\n...}\r\n```\r\n\r\nObviously this is not perfect:\r\n\r\n- I had to hard-code my monitor setup\r\n- The number of workspaces is hard coded\r\n- Now I have another place where I define keybindings besides niri config and NixOS config.\r\n\r\nI hope somebody finds this interesting and comes up with additional improvements to this idea.",
      "created_at": "2025-07-21T14:27:50Z",
      "updated_at": "2025-07-21T18:45:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "thkoch2001",
        "avatar_url": "https://avatars.githubusercontent.com/u/94641?u=da775569a720a6114db0bc16f5d9db6de229dc75&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag3qK",
      "number": 2104,
      "title": "modifier-only keybindings",
      "body": "I'd like to bind the Mod key, without any other key to an action, similar to how GNOME handles the super key to open the overview or the proper modifier-only shortcuts introduced to KDE last year.\r\n\r\nAre there any major blockers for such a feature?\r\n\r\nhttps://pointieststick.com/2024/04/05/this-week-in-kde-real-modifier-only-shortcuts-and-cropping-in-spectacle/",
      "created_at": "2025-07-21T16:33:34Z",
      "updated_at": "2025-07-21T16:38:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "pjungkamp",
        "avatar_url": "https://avatars.githubusercontent.com/u/56401138?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agrph",
      "number": 2005,
      "title": "How to resize/scale an xwayland window? (niri v25.05.1)",
      "body": "Hello everyone,\r\n\r\nI recently switched from Hyprland to Niri and am in the process of setting up my environment. I've encountered an issue with scaling XWayland windows.\r\n\r\nHere is some relevant information from fastfetch:\r\n   `niri 25.05.1`\r\n    `Logical size: 1920x1080`\r\n    `Current mode: 1920x1080`\r\n\r\nThis is my output configuration:\r\n```\r\noutput \"eDP-1\" {\r\n\r\n    // off\r\n\r\n    mode \"1920x1080@60.02\"\r\n\r\n    scale 1\r\n\r\n    transform \"normal\"\r\n\r\n    position x=1280 y=0\r\n}\r\n```\r\n\r\nWhen I set the scale to `1`, XWayland windows scale correctly and are consistent with native Wayland windows, as shown in this screenshot:\r\n\r\n<img width=\"1920\" height=\"1080\" alt=\"image\" src=\"https://github.com/user-attachments/assets/7bc86cf0-ed6c-48ae-96a8-72bee1fc2ff4\" />\r\n\r\nHowever, when I change the scale to a fractional value like `1.125` or `1.25`, XWayland windows no longer scale properly.\r\n\r\n<img width=\"1920\" height=\"1080\" alt=\"image\" src=\"https://github.com/user-attachments/assets/75b6c49c-ba40-4bb2-9e4b-ec0f30b742ca\" />\r\n\r\nIs there a known workaround for this scaling issue with XWayland?\r\n\r\nAlso, are there any plans for Niri to support XWayland natively in the future?\r\n\r\nThank you for your help!\r\n",
      "created_at": "2025-07-11T09:54:12Z",
      "updated_at": "2025-07-21T13:36:11Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "rycue",
        "avatar_url": "https://avatars.githubusercontent.com/u/151157051?u=fa2306fe02f2d3a45e13a6a14c4868f80c3edaa6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag3YF",
      "number": 2100,
      "title": "Bind the mouse/trackball scroll button to a keypress?",
      "body": "Basically what the title says, when using a mouse/trackball with ```on-button-down``` scroll, is it possible to make that bindable to a keyboard shortcut as well for added flexibility, so that pressing some key combo would also trigger the scroll function?\r\n\r\nI know it’s areally niche feature but I’ve been using it ever since labwc introduced it.",
      "created_at": "2025-07-21T11:17:54Z",
      "updated_at": "2025-07-21T11:17:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Alanon202",
        "avatar_url": "https://avatars.githubusercontent.com/u/25981252?u=8023ea739925bc14afc1fe7dfc9fadc8d02a761a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaKCB",
      "number": 467,
      "title": "Keybinding to focus to a window",
      "body": "Can I configure a keybinding to focus on a window, such as Mod+Shift+n, to focus on the nth window from the left",
      "created_at": "2024-06-22T11:24:04Z",
      "updated_at": "2025-07-21T09:31:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mohammedbilalns",
        "avatar_url": "https://avatars.githubusercontent.com/u/70318383?u=3c211f9e22cde4ff9bdc00517c8f634508d934fe&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfmPa",
      "number": 1530,
      "title": "Overview: show names of workspaces above the workspace strips",
      "body": "It would be very nice to show the name/id of a workspace above the workspace in the overview mode. Especially when using named workspaces. There are four positions where I think they would look good:\r\n\r\n- on top of each workspace, left-aligned to the _workspace screen_ (not the strip of actual windows)\r\n- on top of each workspace, center-aligned to the _workspace screen_ \r\n- on the bottom of each workspace, left-aligned to the _workspace screen_\r\n- on the bottom of each workspace, center-aligned to the _workspace screen_\r\n\r\nto clarify, by \"on top of\" i mean \"above\" the rectangle that represents the screen, such that the windows are not being covered (ie you can still drag them)\r\n",
      "created_at": "2025-05-05T23:03:48Z",
      "updated_at": "2025-07-21T07:53:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cor",
        "avatar_url": "https://avatars.githubusercontent.com/u/4728062?u=2b33a1355ebae291846bcb380d171ffa0de15783&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag11e",
      "number": 2092,
      "title": "Where can I find a list of movement commands?",
      "body": "I'm looking for a list of commands like `move-workspace-down` and `focus-column-right`.\r\n\r\nIn particular, I want to know if there is a command to create an empty workspace below the current one and move an empty window into it.  Or perhaps create an empty workspace below the current one and spawn my launcher in it, similar to the Arc browser new tab screen.\r\n\r\nI want to read the docs to make sure I'm not missing anything, but I can't find this type of command documented anywhere except the default config file.",
      "created_at": "2025-07-20T17:49:29Z",
      "updated_at": "2025-07-21T01:39:39Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "whmountains",
        "avatar_url": "https://avatars.githubusercontent.com/u/8680147?u=2454de4e3c88e16c42acdb0b36343cd7993d9c6a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaVgD",
      "number": 524,
      "title": "Is it possible to add a `xwayland-scale` configuration?",
      "body": "Can we add an `Xwayland-scale` configuration to control whether the xwayland application is scaled? Because the current scale will scale the xwayland application together, which will cause the xwayland application to be very blurry, and it is obviously unreasonable to give up scaling for xwayland application.",
      "created_at": "2024-07-06T16:07:36Z",
      "updated_at": "2025-07-20T19:31:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cexossqu",
        "avatar_url": "https://avatars.githubusercontent.com/u/78533568?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag1w3",
      "number": 2091,
      "title": "maybe switch focus workspaces still the bar position",
      "body": "When switching the focused workspace, an animation is triggered.\r\nI think the bar (e.g. Waybar) should stay in place during this animation.\r\nThat would look a bit more correct, in my opinion.",
      "created_at": "2025-07-20T17:07:21Z",
      "updated_at": "2025-07-20T19:05:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "yuzhen1024",
        "avatar_url": "https://avatars.githubusercontent.com/u/47154428?u=8f6b5553d516885d23169bf8bd9531fadd2caf72&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag1qv",
      "number": 2090,
      "title": "Keybind to open a terminal in current column, rather than new column",
      "body": "Here's what I tried so far.  `Mod+T` opens `foot`.  `Mod+Shift+T` opens `foot -a foot-below` aka a custom app id to allow it to be targeted by a window rule.  But now I'm stuck.  I want to make a window rule that would match `foot-below` and put it in the current column rather than a new column, but I'm not sure how to do that.\r\n\r\nCurrently I accomplish this using `Mod+T` and then `Mod+BracketLeft` (`consume-or-expel-window-left`) but I put multiple terminals in the same column so frequently that I'd really like to have a single binding for it.\r\n\r\nBased on the existing discussions it looks like this is not supported yet:\r\n\r\nhttps://github.com/YaLTeR/niri/discussions/410\r\nhttps://github.com/YaLTeR/niri/discussions/1419\r\nhttps://github.com/YaLTeR/niri/discussions/897",
      "created_at": "2025-07-20T16:03:44Z",
      "updated_at": "2025-07-20T16:03:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "whmountains",
        "avatar_url": "https://avatars.githubusercontent.com/u/8680147?u=2454de4e3c88e16c42acdb0b36343cd7993d9c6a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag1CT",
      "number": 2086,
      "title": "Include Named Workspace Identifier in `niri msg windows` output",
      "body": "It would be convenient for troubleshooting and visibility that if a workspace is named it could be output as well as id when using command like 'niri msg windows'\r\n\r\nCould use an Option to do so and output may look like:\r\n\r\n```sh\r\n# Named\r\nWindow ID 115:\r\n  Title: \"terminal\"\r\n  App ID: \"Alacritty\"\r\n  Is floating: no\r\n  PID: 21998\r\n  Workspace ID: 4\r\n  Workspace Name: \"Terminal Workspace\" \r\n\r\n# Unnamed\r\nWindow ID 115:\r\n  Title: \"terminal\"\r\n  App ID: \"Alacritty\"\r\n  Is floating: no\r\n  PID: 21998\r\n  Workspace ID: 4\r\n  Workspace Name: None\r\n```",
      "created_at": "2025-07-20T03:49:00Z",
      "updated_at": "2025-07-20T11:11:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "andar1an",
        "avatar_url": "https://avatars.githubusercontent.com/u/12686470?u=d97437ef672acc9410592179ede92a38a725c937&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag1Rr",
      "number": 2088,
      "title": "How to map to extra mouse buttons",
      "body": "This is a question/feature request so I don't know where to put it.\r\nI can't find a way to map buttons of mice with extra buttons, in hyprland is possible to do so by telling the code of the button (as seen in `wev` output). In niri more than one of such buttons is merged into `MouseForward` (the problem in this case comes from Smithay). ",
      "created_at": "2025-07-20T10:08:40Z",
      "updated_at": "2025-07-20T10:08:41Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "leiserfg",
        "avatar_url": "https://avatars.githubusercontent.com/u/2947276?u=bef0300dde7e714eda2556e3078ca4381137eceb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag01P",
      "number": 2084,
      "title": "Keyboad shortcut to focus Layer Shell windows",
      "body": "In gnome shell you can use ctrl+alt+tab to focus the top bar, in kde plasma you can use meta+alt+p to cycle between panels.",
      "created_at": "2025-07-19T22:13:34Z",
      "updated_at": "2025-07-20T07:28:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "evant",
        "avatar_url": "https://avatars.githubusercontent.com/u/628930?u=9405b20209531430511bbb72b07e2d79056ba6eb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaHEL",
      "number": 457,
      "title": "move-column-to-workspace without automatic focus-workspace",
      "body": "Right now, if you move a column/window to a different workspace, your focus will also be switched there.\r\n\r\nI would like a move that doesn't change focused workspace. In fact, I would have assumed that that's what \"move\" means -- what is there now is \"move-column-and-self\".\r\n\r\nI often send a group of related windows to a new workspace (to start a new \"topic\"), and if my focus changes after every window, that requires much more user input and carefulness, going back after every move.\r\n\r\nYou can hack around this with `niri msg action move-column-to-workspace 9 && niri msg action focus-workspace-previous` but that's not an easy way set up bindings and it's wasteful with subprocesses and doing extra work.\r\n\r\nRelated but not really the same thing: with the automatic focus switch, sometimes I have trouble telling whether moving a full-width column to a new workspace did anything -- nothing on the screen changes!",
      "created_at": "2024-06-20T21:39:03Z",
      "updated_at": "2025-07-20T03:58:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tv42",
        "avatar_url": "https://avatars.githubusercontent.com/u/419909?u=731cd7ab19c143556b4206a4d8473ee5999d4656&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgUtv",
      "number": 1855,
      "title": "[Feature] Inibit idle for window rules",
      "body": "Window Rules allow for matching various windows, an option to also inhibit idling for swayidle/hypridle. This would allow a better experience if you watching media, listening to music etc. because currently any idle program would execute there settings. \r\nIf this is already implemented in niri I could not find it.\r\n\r\nI also cannot find an option to match for a fullscreen/maximized state of a window. If this exists please let me know",
      "created_at": "2025-06-19T17:34:58Z",
      "updated_at": "2025-07-19T19:55:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Set2Minecraft",
        "avatar_url": "https://avatars.githubusercontent.com/u/75960074?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgjW7",
      "number": 1957,
      "title": "env_magic",
      "body": "Add it. Now.",
      "created_at": "2025-07-04T16:15:07Z",
      "updated_at": "2025-07-19T19:20:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zararashigal",
        "avatar_url": "https://avatars.githubusercontent.com/u/161075247?u=b5ac5a12d59531bff32e6e38c077dfe948f291b9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag0cC",
      "number": 2082,
      "title": "Should niri translate tip_down() events to button_down() events for tablets?",
      "body": "In Xorg, I am able to use my (graphic drawing) tablet to sign on a browser canvas. In niri, I am unable to do this. With some help from @titaniumtraveler in the matrix.org room, I have learned that pressing the stylus onto the tablet causes niri to emit the TabletToolTipEvent using tool.tip_down(). It would be useful for this use-case for niri to be configurable to emit the TabletToolButtonEvent using tool.button_down() instead. Would such a thing be useful for more people than just me?",
      "created_at": "2025-07-19T15:11:01Z",
      "updated_at": "2025-07-19T16:40:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "henryso",
        "avatar_url": "https://avatars.githubusercontent.com/u/421318?u=73b84844e1d0781037ed71810ac5560ce018e914&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ag0Ul",
      "number": 2080,
      "title": "Feature Request: Add `is_x11` or `is_xwayland` rule to match X11 windows",
      "body": "Hi, thanks a lot for your work on Niri - it’s great and I really enjoy using it!\r\n\r\nI’d like to ask for a small feature: a way to match X11 (Xwayland) windows in the rule system. This would help me see which apps are running under Xwayland and avoid confusion when things don’t behave like native Wayland apps. Right now, I can’t tell them apart easily using rules.\r\n\r\nI saw that Xwayland satellite integration is coming in the next release - this feature would go really well with that.\r\n\r\nDoes this make sense? Would other people find this useful too?\r\n\r\nThanks again!\r\n\r\nPS I tried renaming windows based on niri IPC events: [gist](https://gist.github.com/sQu1rr/13737eeeaf5369824f08f2669cee7df6), but it turns out that most non-trivial apps other than glxgears constantly reset their name so that doesn't work well for me.",
      "created_at": "2025-07-19T12:44:47Z",
      "updated_at": "2025-07-19T12:44:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sQu1rr",
        "avatar_url": "https://avatars.githubusercontent.com/u/3148267?u=cdda722e17e37ec813147f85461bd80e25ec7dea&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgWpC",
      "number": 1874,
      "title": "OLED mitigations",
      "body": "Would it be possible with Niri to have some mitigations for oled screen burn-in?\r\nI just got a new laptop with an oled screen, and I'm a little paranoid about it.\r\nOr, if you know of any existing methods for this without building them into method I'd be interested to hear about it.\r\n\r\nFor example:\r\n- Pixel shifting: A bounded random walk of shifting the display by one pixel in a random direction every so often (e.g. 100ms). This would require a padding zone for UI elements around the edge of the display. This wouldn't apply to full-screen windows.\r\n- Static element dimming: Dim static UI elements. Detection here will be the hard part -- not sure how that would be implemented.\r\n- Limiting static elements: such as an integration with waybar to enable auto-hide behavior.",
      "created_at": "2025-06-22T14:09:12Z",
      "updated_at": "2025-07-19T04:07:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "FlyingWombat",
        "avatar_url": "https://avatars.githubusercontent.com/u/25214020?u=bb68823e5b979f3c022106f21101546df1343b72&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfjGE",
      "number": 1507,
      "title": "Make Floating Windows Sticky Across Workspaces (Workspace-level to Monitor-level)",
      "body": "I'm not sure if this idea is in progress or been asked already, but it would be very nice if we can make floating window tiles sticky across workspace (and not within the specific workspace only). Use case for example would be to have a video playing in a corner while moving across workspaces.\r\n\r\nThanks",
      "created_at": "2025-05-01T18:29:12Z",
      "updated_at": "2025-07-18T12:38:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "pomterre",
        "avatar_url": "https://avatars.githubusercontent.com/u/39233499?u=5a69fb3d876840981c5054e7b3944e9f0f30ff21&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agy8U",
      "number": 2074,
      "title": "Sticky/Pinned columns",
      "body": "I wish i had pinned columns. That is columns that take (normally) the full height but have a fixed position on a screen and don't scroll, for simplicity this position may be anchored on either side. They are on the same depth/layer than the normal scrolling windows, thus unlike floating windows, the normal/scrolling windows do not scroll behind them, if transparent then the background not the scrolled window shows through (this may be configurable). Scrolling should be aware about pinned columns in the same way it is about screen borders, thus edges become aligned with respective to the pinned column edges.\r\n\r\nRationale: I often have some documentation, system monitors or compiler output showing in some windows and do not want this to get out of the view when scrolling between other windows. Floating windows could solve this problem partially, but they are unergonomic to use because one has to resize and place them manually and they overlay normal windows. Furthermore having the normal tap/split machinery on these pinned columns would add to their usability over floating windows which can be split/tabbed.\r\n\r\n",
      "created_at": "2025-07-18T00:43:43Z",
      "updated_at": "2025-07-18T01:16:55Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cehteh",
        "avatar_url": "https://avatars.githubusercontent.com/u/6441625?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgtGD",
      "number": 2025,
      "title": "Issues with Wezterm-nightly",
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\nI've found https://github.com/YaLTeR/niri/wiki/Application-Issues which was helpful, but hasn't solved my current issue. When I ran stable Wezterm, it wouldn't show up at all, unless I added the window-rule from that page that set default-column-width to an empty bracket set. Then it would load up and run fine, but it would never respect my global default-common-width, or any value I told it to use in that window rule. I decided to try wezterm-nightly, and it DOES solve that issue. However, Wezterm-nightly always shows a strange version of CSD that is an empty bar, with a close button that is a square. (I have CSD turned off globally so I shouldn't see any at all). I've changed wezterm's config.window_decorations to just RESIZE, even removing INTEGRATED_BUTTONS. But that had no effect. How can I remove the CSD from wezterm? I also tried switching frontend engine from WebGpu to OpenGL but get the same effect. I also tried setting enable_wayland off an on, but it also had no effect. I did the xeyes test to verify it is running in wayland as well. I'm fairly certain though that this isn't an issue with my wezterm config, as both wezterm and wezterm-nightly work correctly in KDE without showing this strange blank CSD. \n}\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (40f2fe36)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: PikaOS\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD RX 9070/9070 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 9800X3D\n",
      "created_at": "2025-07-13T07:22:02Z",
      "updated_at": "2025-08-06T08:46:36Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "MrDowntempo",
        "avatar_url": "https://avatars.githubusercontent.com/u/8398380?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgyNB",
      "number": 2067,
      "title": "Rust crate for `niri msg`?",
      "body": "is there a crate for interacting with niri that can do most things that `niri msg ...` can do?\r\n\r\ni specifically need that for a anyrun plugin, and i would need the functionality of:\r\n- *`niri msg outputs`*\r\n- `niri msg workspaces`\r\n- `niri msg windows`\r\n- `niri msg keyboard-layouts`\r\n- *`niri msg output`*\r\n- *`niri msg overview-state`*\r\n- *`niri msg layers`*\r\n- `niri msg action`\r\n\r\n(*italic* means here that they are not **necessary** but nice-to-have)",
      "created_at": "2025-07-17T09:08:17Z",
      "updated_at": "2025-07-17T09:13:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A0mbs",
        "body": "> is there a crate for interacting with niri that can do most things that `niri msg ...` can do?\r\n> \r\n> i specifically need that for a anyrun plugin, and i would need the functionality of:\r\n> \r\n>     * _`niri msg outputs`_\r\n> \r\n>     * `niri msg workspaces`\r\n> \r\n>     * `niri msg windows`\r\n> \r\n>     * `niri msg keyboard-layouts`\r\n> \r\n>     * _`niri msg output`_\r\n> \r\n>     * _`niri msg overview-state`_\r\n> \r\n>     * _`niri msg layers`_\r\n> \r\n>     * `niri msg action`\r\n> \r\n> \r\n> (_italic_ means here that they are not **necessary** but nice-to-have)\r\n\r\nhttps://docs.rs/niri-ipc/latest/niri_ipc/ has been there the whole time ..."
      },
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgwTg",
      "number": 2051,
      "title": "Feature Design: Shared (internal) Interface for querying keybinds",
      "body": "# Motivation\r\n\r\nBecause I wouldn't be able to live without a compositor that supports both submaps **and* executing multiple actions per-bind, I made a few patches on top of `niri` to add those features:\r\n\r\nSee [<https://github.com/titaniumtraveler/niri/tree/fork/main>](https://github.com/YaLTeR/niri/compare/main...titaniumtraveler:niri:fork/main)\r\n\r\n# Problem\r\n\r\nInteresting in this context are specifically these commits:\r\n- Submap implementation: https://github.com/YaLTeR/niri/commit/ac24df476c876926a3c0329117fda58f9990de2b ( a bugfix at https://github.com/YaLTeR/niri/commit/1edbc28bb28fb7214c88c8a450deb381936e53d5)\r\n- Multi-Action implementation: https://github.com/YaLTeR/niri/commit/bf8f4c2872cac0932f0378e23aab5dcbed41dc44\r\n\r\nThe core implementation in both cases was *relatively* easy and most of the work was to actually make unrelated parts of the code compile, which was honestly very much exhausting because there was a lot of code needing to be changed and the expected semantics weren't really clear in some cases.\r\n\r\n# Suggested Solution\r\n\r\nMy suggestion would be to have a common interface that can be queried for keybinds.\r\nThat interface should consist of a few functions/methods that return `impl Iterator<Item = BindDescription>`. `BindDescription` is a separate type from `Bind` to protect it from breaking changes of `niri-config::Binds` and should make it's content accessible via methods to make sharing implementations easy and to prevent parts of the code to depend on specific fields.\r\n\r\n## Basic Query API\r\n\r\nThe querying would need to support two basic modes:\r\n- Search for a single keybind\r\n  That would be needed when dispatching the users binds after they typed them.\r\n- Search for all keybinds matching a specific pattern, like it is done with the hotkey-overlay.\r\n\r\nThose two can be implemented using a basic `.first()`/just filtering normally and then iterating over all the items.\r\n\r\nAdditionally there should be modes to query with or without consideration of the current `State`:\r\n\r\nFor example when querying for keybinds for the `hotkey-overlay`, it might be desired to either query using the current submap-state, which could then even be used to make the hotkey-overlay an interactive keybind overview the way helix and [`which-key.nvim`](https://github.com/folke/which-key.nvim) can provide, or statically if someone wants to just look up some submap bindings to confirm they work as intended. (Might be especially helpful while writing the configuration)\r\n\r\nA good implementation of that is probably to separate the specific `KeybindState`, which could be quickly initialized using `Keybind::defaut()` for cases where the keybinds should be queried statically.\r\n\r\nHaving that as general pattern would make testing/benchmarking easier too.\r\n\r\n## Attributes that need to be queryable \r\n\r\n- key\r\n- action\r\n  - an open question here is how to expose this api when there are multiple actions,\r\n    or when something like conditional actions are added.\r\n- repeat\r\n- cooldown\r\n  - cooldown duration\r\n  - cooldown active + time\r\n- allow_when_locked\r\n- allow_inhibiting\r\n- hotkey_overlay_title\r\n\r\nSome of those could then also be wrapped in helper methods like something like `.can_be_run_right_now()` to check whether it should be executed as binding at this point of time, while considering cooldown timers, `allow_when_locked` etc. to make sure the filter parameters are implemented in the same place where the binds themselves are implemented so refactoring some keybind settings doesn't require looking at a second file like `input/mod.rs`, which makes it easier to not accidentally forget about it.\r\n\r\nThese attributes might in the future also include things like gestures that can be matched on.\r\nThat would make it relatively easy to enable binding custom actions to gestures. \\\r\nProvided we have a model of how gesture actions should work by then.\r\n\r\n## Turning the execution upside-down\r\n\r\nBecause not only the way the specific keybinds should work might change, but also how, when and how many actions are executed when a binding is triggered, instead of taking the action out of the binding description and matching on it, it would be helpful to instead execute the binding using `bind.run(&mut state)`, which means from the point of view of the API it is not important what happens in `.run()` other than that it is executed.",
      "created_at": "2025-07-15T12:33:49Z",
      "updated_at": "2025-07-17T04:50:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "titaniumtraveler",
        "avatar_url": "https://avatars.githubusercontent.com/u/106187091?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agw-0",
      "number": 2057,
      "title": "Dragging within xwayland apps moves entire window",
      "body": "For example, under xwayland-sattelite. If you try to move channels around in Discord or playlists around in Spotify, the whole window moves to the left.\r\n\r\nThe only way I've found to prevent this is to toggle fullscreen-window \r\n\r\nIs there any way to prevent this behaviour outside fullscreen?\r\n",
      "created_at": "2025-07-16T05:09:38Z",
      "updated_at": "2025-07-17T04:05:53Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "LukeDearden",
        "avatar_url": "https://avatars.githubusercontent.com/u/6813601?u=ff3d8f056c90ed44003696de51057a9b22c7f4fa&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgV-O",
      "number": 1864,
      "title": "Add input modes, similar to sway, with built-in input mode to replace hardcoded keybindings for overview",
      "body": "Sway's input has modes, when one set of keybindings gets replaced with another set of keybindings. \r\nEg in sway-based [scroll](https://github.com/dawsers/scroll/blob/c8bafa57b52c7507ce515b23a1e2a581632cc776/config.in#L303) pressing Mod+B, releasing them, then  pressing 6, changes the tile size  to 50%, instead of sending 6 to the app.\r\n\r\nNiri sorta doesn't have modes until it does but built-in unconfigurable with inheritance of normal bindings: the overview mode  has additional bindings on top of existing inputs:  it has hardcoded bindings in `hardcoded_overview_bind` in `input/mod.rs` to jump around.\r\n\r\nMight as well make modes generic, so user gets special treatment rather than overview alone:\r\n\r\nThe problem with overview bindings is they are counterintuitve to the default bindings and can't be reconfigured(configuring `Up` globally doesn't count): \r\n\r\nIn normal mode I press Mod+Left to focus-column-left. In overview I press left to FocusColumnLeft. OK.\r\n\r\nIn normal mode I press Mod+Right to focus-column-right. In overview I press right to FocuseColumnRight. Makes sense.\r\n\r\nIn normal mode I press Mod+PageDown to focus-workspace-down. In overview I press PageDown and... nothing happens as hardcoded_overview_bind has no binding for it.\r\n\r\nIn normal mode I press Mod+Up and chances are nothing happens as it's is default focus-window-up. \r\nIn overview mode I press Up and it moves up, because it's hardcoded to different action FocusWindowOrWorkspaceUp. \r\n\r\nMy deep-fried brains are unnecessary confused at this point.\r\n\r\nAlso according to docs default keybindings  shouldn't exist(https://github.com/YaLTeR/niri/wiki/Configuration:-Key-Bindings):\r\n\r\n> This is one of the few sections that does not get automatically filled with defaults if you omit it, so make sure to copy it from the default config. \r\n\r\nBut it doesn't apply to overview mode.\r\n\r\nSo I propose to\r\n\r\na) add modes with two builtins: \"normal\" and \"overview\"(Or even \"#normal\" and \"#overview\" to show they are built-in, and forbid user modes to have '#' prefix). Will allow to add additional modes like scroll's  `setsizeh`  instead of pressing Mod+R over and over)\r\n\r\nb) maybe add \"fallback\" option to modes so overview mode can still use normal mode bindings without user having to copy-pasting them, as overview does now\r\n\r\nc) maybe even add more `niri msg actions` related to inputs: eg right now it seems the only way to change key-bindings is to spawn script that `sed`s config.kdl.",
      "created_at": "2025-06-21T07:03:59Z",
      "updated_at": "2025-07-17T02:02:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Maykeye",
        "avatar_url": "https://avatars.githubusercontent.com/u/13607441?u=ee818d192472a91a570ad8d6baf33a83d2a1b899&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agxdn",
      "number": 2062,
      "title": "NixOS-specific documentation for https://github.com/YaLTeR/niri/wiki/Nvidia",
      "body": "## Current documentation and modification\r\n\r\nhttps://github.com/YaLTeR/niri/wiki/Nvidia provides the (_currently_) necessary workaround to avoid a crazy high VRAM usage when using Niri, since NVIDIA does not have Niri in their list of Wayland compositor thingy yet.\r\n\r\nThe provided instructions work for basically any sensible Linux distributions, but NixOS is its own special flake (_get it? Nix? Flakes? …_ 🚪), and as such, require the same thing done, but in its own way:\r\n\r\n```configuration.nix\r\n{ config, ... }: {\r\n\tenvironment.etc.\"nvidia/nvidia-application-profiles-rc.d/50-limit-free-buffer-pool-in-wayland-compositors.json\".text = ''\r\n{\r\n    \"rules\": [\r\n        {\r\n            \"pattern\": {\r\n                \"feature\": \"procname\",\r\n                \"matches\": \"niri\"\r\n            },\r\n            \"profile\": \"Limit Free Buffer Pool On Wayland Compositors\"\r\n        }\r\n    ],\r\n    \"profiles\": [\r\n        {\r\n            \"name\": \"Limit Free Buffer Pool On Wayland Compositors\",\r\n            \"settings\": [\r\n                {\r\n                    \"key\": \"GLVidHeapReuseRatio\",\r\n                    \"value\": 0\r\n                }\r\n            ]\r\n        }\r\n    ]\r\n}\r\n\t'';\r\n}\r\n```\r\n\r\nTo avoid duplication, one could simply put \"NixOS users have to put this text in `environment.etc.\"nvidia/nvidia-application-profiles-rc.d/50-limit-free-buffer-pool-in-wayland-compositors.json\".text = '' '';` for it to work\", or something like that.\r\n\r\nI think most NixOS people (_hi_) will know how to do this without this documentation, but it could still be nice to have it here for completion's sake.\r\n\r\nThis was useful for me, reducing Niri's VRAM usage from ~800 to ~1200 Mb of VRAM, down to ~20 to ~60 in normal use.\r\n\r\n---\r\n\r\n## How I usually work around these kinds of issues.\r\nNot the first time NVIDIA caused problems. Not the last time.\r\nIn my `./temporary.nix` module (_this one has not been pushed to my `NixOS-configuration` GitHub repository, as I am finishing some things in the background for the full transition to Niri_), I have another workaround to apply Firefox-specific NVIDIA patches to LibreWolf, a fork of Firefox (along with some other stuff), as seen here:\r\n```temporary.nix\r\n{ config, lib, pkgs, ... }: let\r\n\r\n\t# Shortcut to check if LibreWolf is installed.\r\n\t# It is in the `./programs/internet.nix` module.\r\n\twolf = lib.elem pkgs.librewolf config.environment.systemPackages;\r\n\r\n\t# Shortcut to check if Niri is enabled.\r\n\t# Niri is toggleable in the `./desktop/niri.nix` module.\r\n\tniri = config.programs.niri.enable;\r\n\r\n\t# Shortcut to check if proprietary NVIDIA drivers are being used.\r\n\t# This is configurable in the `./gpu/nvidia.nix` module.\r\n\tnv = lib.elem \"nvidia\" config.services.xserver.videoDrivers;\r\n\r\nin {\r\n\r\n\t# https://github.com/YaLTeR/niri/issues/1962\r\n\tenvironment.etc.\"nvidia/nvidia-application-profiles-rc.d/50-limit-free-buffer-pool-in-niri.json\".text = lib.mkIf (niri && nv) ''\r\n{\r\n\t\"rules\": [{\r\n\t\t\"pattern\": {\r\n\t\t\t\"feature\": \"procname\",\r\n\t\t\t\"matches\": \"niri\"\r\n\t\t},\r\n\t\t\"profile\": \"Limit Free Buffer Pool on the Niri Wayland compositor\"\r\n\t}],\r\n\t\"profiles\": [{\r\n\t\t\"name\": \"Limit Free Buffer Pool on the Niri Wayland compositor\",\r\n\t\t\"settings\": [{\r\n\t\t\t\"key\": \"GLVidHeapReuseRatio\",\r\n\t\t\t\"value\": 0\r\n\t\t}]\r\n\t}]\r\n}\r\n\t'';\r\n\r\n\t# Add Firefox workarounds for NVIDIA GPUs to LibreWolf.\r\n\t# The full `.librewolf-wrapped` name is necessary.\r\n\tenvironment.etc.\"nvidia/nvidia-application-profiles-rc.d/60-librewolf-firefox.json\".text = lib.mkIf (wolf && nv) ''\r\n{\r\n\t\"rules\": [{\r\n\t\t\"pattern\": \".librewolf-wrapped\",\r\n\t\t\"profile\": \"ForceSeparateTrimThread\",\r\n\r\n\t\t\"pattern\": \".librewolf-wrapped\",\r\n\t\t\"profile\": \"FA0\",\r\n\r\n\t\t\"pattern\": \".librewolf-wrapped\",\r\n\t\t\"profile\": \"DedicatedHwStatePerCtx\"\r\n\t}]\r\n}\r\n\t'';\r\n\r\n\t# https://github.com/NixOS/nixpkgs/issues/361592\r\n\tsecurity.pam.services.systemd-run0 = {\r\n\t\tsetEnvironment = true;\r\n\t\tpamMount = false;\r\n\t};\r\n\r\n}\r\n```\r\n\r\n\r\n\r\n\r\n---\r\n\r\n## Useless rambling.\r\n\r\nSomewhat unrelated, but that whole thing can also be written in a much more compact way, even if it does not matter one bit:\r\n```50-limit-free-buffer-pool-in-wayland-compositors.json\r\n{\r\n\t\"rules\": [{\r\n\t\t\"pattern\": {\r\n\t\t\t\"feature\": \"procname\",\r\n\t\t\t\"matches\": \"niri\"\r\n\t\t},\r\n\t\t\"profile\": \"Limit Free Buffer Pool On Wayland Compositors\"\r\n\t}],\r\n\t\"profiles\": [{\r\n\t\t\"name\": \"Limit Free Buffer Pool On Wayland Compositors\",\r\n\t\t\"settings\": [{\r\n\t\t\t\"key\": \"GLVidHeapReuseRatio\",\r\n\t\t\t\"value\": 0\r\n\t\t}]\r\n\t}]\r\n}\r\n```\r\n(_By the way, is the usage of spaces instead of tabs intentional? I use tabs since I can define their width dynamically, but fixed spaces just break everything for me, especially accessibility-wise (bad vision)._)",
      "created_at": "2025-07-16T14:27:34Z",
      "updated_at": "2025-07-16T14:27:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Atemo-C",
        "avatar_url": "https://avatars.githubusercontent.com/u/160250128?u=213842e97ddd7389e69df74e93fc36f08cdf0e53&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AblGU",
      "number": 683,
      "title": "dGPU hot unplug?",
      "body": "Hi!!\r\nI am wondering it would be possible for niri to support nvidia dGPU hot unplug?\r\nHot plug works fine, I can rescan the pci bus, load nvidia modules and run \r\n`sudo udevadm trigger --verbose --type=devices --action=add --subsystem-match=drm --property-match=\"MINOR=0\"` \r\nniri does pick up my dGPU. But when I try to run this command to make niri release the dgpu:\r\n\r\n`sudo udevadm trigger --verbose --type=devices --action=remove --subsystem-match=drm --property-match=\"MINOR=0\"`\r\n\r\nmy screen that is connected to the dGPU goes black, so something is happening but when I run nvidia-smi niri is still present on the dGPU process list with prevents me from rmmod the nvidia modules and then unbind the dGPU from PCI bus.\r\n\r\nOn my laptop this is necessary because the dGPU doesn't support D3 Runtime Suspend so it never goes off even when not used by any screens or programs. Currently I have to logout to be able to unbind the dGPU from PCI bus so it goes off when I am on battery. I did try the same stuff on wlroots based compositor and it didn't work too, from what I found wlroots itself should support it but they are missing bits in libglvnd to release the dGPU. Is they any hope for niri to be not limited by that?",
      "created_at": "2024-09-24T10:44:09Z",
      "updated_at": "2025-07-15T21:28:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dragonnn",
        "avatar_url": "https://avatars.githubusercontent.com/u/1771469?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agwji",
      "number": 2053,
      "title": "Per monitor cursor size",
      "body": "I have a 4k monitor as my primary display, and a 1080p monitor as my secondary display.\r\n\r\nThe cursor on the 4k monitor looks normal, but on the 1080p monitor it's very large. Gnome has the same issue.\r\n\r\nThe \"scaling\" of windows on each monitor looks great; Text rendered on the 4k monitor is the same size as on the 1080p monitor, just more crisp due to the extra pixels.\r\n\r\nThe 4k monitor:\r\n<img width=\"3840\" height=\"2160\" alt=\"Screenshot from 2025-07-15 13-02-11\" src=\"https://github.com/user-attachments/assets/b3c060b2-c34d-4f1d-bb04-336e304bda56\" />\r\n\r\nThe 1080p monitor:\r\n<img width=\"1920\" height=\"1080\" alt=\"Screenshot from 2025-07-15 13-02-16\" src=\"https://github.com/user-attachments/assets/1ab00d1f-304d-45e5-b38b-019016361823\" />\r\n",
      "created_at": "2025-07-15T17:01:34Z",
      "updated_at": "2025-07-15T17:49:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "luveti",
        "avatar_url": "https://avatars.githubusercontent.com/u/4952718?u=c3a45e516be3a1a2d86b1da304955acd3a8fdf33&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgwM5",
      "number": 2049,
      "title": "Option to use struts only if a window is in that direction",
      "body": "This might be a misuse of how struts are supposed to work, but I use them to be sort of an indicator that there is another window in that direction and show a bit of it. However the way this currently works is that this causes there to be larger gaps when a window is by itself/there isn't another window in that direction. Might it be possible to add that functionality? or would that need to be an entirely new feature",
      "created_at": "2025-07-15T10:10:51Z",
      "updated_at": "2025-07-15T10:10:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "winkelnp",
        "avatar_url": "https://avatars.githubusercontent.com/u/68015877?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgR4z",
      "number": 1825,
      "title": "Multiple actions for one keypress",
      "body": "The Idea: you can press one key combo that executes multiple actions in order.\r\n\r\ni dont exactly know if this would require changing of config syntax, but it should mainly depend on wheather kdl tags are ordered, so you could use multiple together. example:\r\n\r\n```kdl\r\nbinds {\r\n  // ...\r\n  Mod+Q { spawn \"swaylock\"; suspend; }\r\n  // ...\r\n}\r\n```\r\n\r\ni have looked at some parts of the code (particularly `src/input/mod.rs` and `niri-config/src/lib.rs`), and it seems not like a huge chunk of work.\r\n\r\ni might try implementing it myself and look how far i get, and open a pr when i get somewhere.\r\n\r\nalso im sorry if this is a duplicate.",
      "created_at": "2025-06-17T09:14:11Z",
      "updated_at": "2025-07-14T17:53:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgsOu",
      "number": 2012,
      "title": "Indicate presence of multiple columns when focused column is maximized",
      "body": "Hey, great project. I find myself realizing that there unknown open windows when I open the overview mode. I would like to have an indication that there are invisible windows to the sides when it's the case. ",
      "created_at": "2025-07-11T23:42:54Z",
      "updated_at": "2025-07-14T14:52:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "paulolieuthier",
        "avatar_url": "https://avatars.githubusercontent.com/u/1238157?u=a9faed08ae5236904375d128a50282ed7ef2fdaa&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgvNp",
      "number": 2040,
      "title": "Support for translating strings",
      "body": "It would be a great addition for Niri to support localizing strings. (bindings menu, screenshot UI, etc) I know there aren't many right now, but it would be nice for non-English users to have a fully translated interface.\r\nMaybe something like the Fluent system (https://projectfluent.org/) could be used with Weblate (https://weblate.org) integration.",
      "created_at": "2025-07-14T12:48:35Z",
      "updated_at": "2025-07-14T13:46:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "therealmate",
        "avatar_url": "https://avatars.githubusercontent.com/u/61843503?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgvKB",
      "number": 2038,
      "title": "Add wrap (or, in math, mod n)-like bindings?",
      "body": "First, hats down for the bold idea of a scrolling compositor and the pristine Rust realization! Now down to business:\r\nNiri has already the wrap  behavior on the strip with commands like ```focus-column-left-or-last``` and ```focus-column-right-or-first```. Thus you wrap around columns and never get stuck when repeating the command.\r\n\r\nSuggestion: Allow for torus/donut-like navigation  (for those who prefer it)  by adding the same-spirit commands  for workspaces, e.g.:\r\n```\r\nfocus-window-or-workspace-{up,down}-or-wrap;\r\n```\r\n<img width=\"250\" alt=\"torus\" src=\"https://github.com/user-attachments/assets/ab4145c3-15bf-4a19-88ba-13b2fd24a2c7\" />\r\n\r\n Similarly, one can imagine wrap-commands for monitors when two or more: \r\n```\r\nfocus-monitor-{left,right,up,down}-or-wrap;\r\n```\r\nThe latter will make navigating to a freshly connected monitor (automatically placed left-or-right) easier. ",
      "created_at": "2025-07-14T11:34:01Z",
      "updated_at": "2025-07-14T12:45:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tjavdar",
        "avatar_url": "https://avatars.githubusercontent.com/u/10163826?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agrm7",
      "number": 2004,
      "title": "Order of named workspaces",
      "body": "Hi,\r\n\r\nI run Niri on my laptop.\r\nI am unclear about the named workspaces. I have 5 named workspaces in my config in this order:\r\n- main (open-on-output LG)\r\n- dev (open-on-output LG)\r\n- chat (open-on-output Dell)\r\n- stuff (open-on-output Dell)\r\n- extra (open-on-output Dell)\r\n\r\nThey also have an \"open-on-output <monitor model name>\" setting for my 2 monitors on my docking station.\r\nWhenever I dock my laptop, the order of the workspaces are as I expect based on the config, like so:\r\n- main, dev on my LG (left to right order)\r\n- chat, stuff, extra on Dell (left to right order)\r\n\r\nHowever, when I unplug my laptop and open the lid or shutdown/reboot my  laptop, the named workspace always open in alphabetical order -> chat, dev, extra, main, stuff\r\n\r\nBased on the docs this is not what I expect. I thought that they would open in the defined order in the config. The outputs specified in the config are not available of course when using my laptop not docked.\r\nWhat am I understanding correctly? Coming from static tilers, I like my workspaces in a fixed order, mainly due to my muscle memory ;)\r\n\r\nCan this be done?\r\n\r\nThanks,\r\n\r\nDanny",
      "created_at": "2025-07-11T09:03:01Z",
      "updated_at": "2025-07-14T08:03:10Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A0bbn",
        "body": "When workspaces move across outputs they should be just appended to the target output in the same order they were in on the previous output. I don't think anything in niri sorts them alphabetically. Also the only time the named workspace order is \"enforced\" is when they are initially created at compositor startup, afterwards they just go in whatever order you arrange them"
      },
      "user": {
        "login": "dannykruitbosch",
        "avatar_url": "https://avatars.githubusercontent.com/u/5293848?u=e47a77c9f9ad79219e28b5382692cac060c74dd4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgrIt",
      "number": 1999,
      "title": "option to Disable 'mousing' between monitors",
      "body": "this isnt *really* nessesary, but the idea is a configuration option to disable switching between monitors using the cursor and only being able to switch them using keybinds. for me, it would be a pure QoL feature, because i switch between monitors only using keybind anyway and going to another monitor when going to the edge of the monitor is annoying.",
      "created_at": "2025-07-10T20:05:04Z",
      "updated_at": "2025-07-14T06:18:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AguIX",
      "number": 2034,
      "title": "Implement XDG toplevel drag",
      "body": "https://wayland.app/protocols/xdg-toplevel-drag-v1",
      "created_at": "2025-07-14T00:18:28Z",
      "updated_at": "2025-07-14T00:18:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "travankor",
        "avatar_url": "https://avatars.githubusercontent.com/u/38744110?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgZS2",
      "number": 1905,
      "title": "Away until July 14",
      "body": "I'll be traveling until July 14 with limited connectivity and won't be monitoring new pull requests and such.\r\n\r\nI would appreciate any help with things like:\r\n\r\n- answering questions in discussions and issues\r\n- marking duplicate issues (these are quite frequent)\r\n- reviewing PRs\r\n\r\nAll this would help in general, not just while I'm away—with many new users the repo activity is getting quite overwhelming. Guess I need to write some contributing guidelines.\r\n\r\nThanks!",
      "created_at": "2025-06-25T07:04:17Z",
      "updated_at": "2025-07-13T16:50:09Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgqER",
      "number": 1994,
      "title": "Is there a reason that `draw-border-with-background` defaults to `true`?",
      "body": "It seems to lead to unexpected behavior when working with transparent windows.\r\nLike it did in https://github.com/YaLTeR/niri/discussions/1663 for example.",
      "created_at": "2025-07-09T20:41:53Z",
      "updated_at": "2025-07-13T13:50:09Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A0bdT",
        "body": "Sort of? It's more of an xdg Tiled state question which frequently squares the corners (and goes together with prefer-no-csd by default). There isn't really a perfect solution here without the protocol, so I'm leaning towards the \"don't do extra things silently\""
      },
      "user": {
        "login": "titaniumtraveler",
        "avatar_url": "https://avatars.githubusercontent.com/u/106187091?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agazx",
      "number": 1911,
      "title": "Switching TTYs delay",
      "body": "I started noticing this more ever since I started using gamescope embedded mode as a session, running alongside niri\r\n\r\nWhen I switch from gamescope (tty3) to niri (tty2), the screen turns black for a quick second, but its instant and seamless when I switch from niri back to gamescope\r\n\r\nI tested 2 niri sessions running on 2 TTYs, and the black screen happens when switching back and forth between both of them\r\n\r\nThis is not a huge issue for me, I'm just wondering whats causing this behavior?",
      "created_at": "2025-06-26T13:38:19Z",
      "updated_at": "2025-07-13T13:53:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A0bc6",
        "body": "https://github.com/YaLTeR/niri/issues/118"
      },
      "user": {
        "login": "zgibberish",
        "avatar_url": "https://avatars.githubusercontent.com/u/67570424?u=3e2675a3faa827dbe0fed15709024dbbf758d687&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af7vZ",
      "number": 1668,
      "title": "waybar/eww display sharp corner behind the bar",
      "body": "![2025-05-25-225157_hyprshot](https://github.com/user-attachments/assets/b9947885-c0eb-4d4d-b0d1-fc360ac2ce08)\r\n\r\n![default](https://github.com/user-attachments/assets/7ddb2339-5bf6-41f9-8d75-67560fc854cc)\r\n\r\nwaybar and eww bar display sharp corner behind the bar, I try set border off, focus ring off in niri config, nothing change. screenshot and screen record doesn't display that sharp corner, so I take a picture with my phone. not sure what cause this problem? ",
      "created_at": "2025-05-25T15:35:21Z",
      "updated_at": "2025-07-14T11:59:29Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzZSD",
        "body": "For Waybar, it worked for me by setting the alpha of the bar to below 1. It can be 0.99 which looks basically the same."
      },
      "user": {
        "login": "DENG-XC",
        "avatar_url": "https://avatars.githubusercontent.com/u/153186602?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgoVV",
      "number": 1979,
      "title": "Prevent a window from resizing itself?",
      "body": "I'm using Citrix to connect to my work environment, and the latest version keeps resizing itself in niri no matter how I configure it. Sometimes it tries to span both monitors (but fails and stays on the main monitor), sometimes it gets twice as wide as the main monitor.\r\n\r\nI haven't tried setting max width/height as window rule, as I change between displays with different resolutions often.\r\n\r\nPreventing it from resizing itself would be ideal, so that only user resizes are allowed.\r\n\r\n`niri msg event-stream` sadly doesn't show what's happening there.",
      "created_at": "2025-07-08T10:07:50Z",
      "updated_at": "2025-07-13T13:28:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "weltensturm",
        "avatar_url": "https://avatars.githubusercontent.com/u/811167?u=84cf4dd822b4ddcc86b30da1a8c2e4e8dd22ffef&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgrLb",
      "number": 2000,
      "title": "Build Niri Without Animations",
      "body": "Hi! First of all, thank you for building and maintaining `niri`, it’s a fantastic project which is clean, modern and efficient.\r\n\r\nI'd like to open a discussion about the possibility of building `niri` without animations. The idea is to make animations optional at compile time, allowing users to exclude all animation-related code and dependencies entirely.\r\n\r\n## Why?\r\n\r\n1. Reduced memory footprint: By excluding crates and logic related to animations, we can potentially reduce the binary size and runtime memory usage. This could make `niri` even more appealing for:\r\n\r\n- Laptops or low-resource systems\r\n\r\n- Users who prefer a minimalist\r\n\r\n2. Minimalism as a feature: Some users simply might prefer a compositor that \"just works\" without any animated transitions for either aesthetic or performance reasons.\r\n\r\n3. Less CPU usage: Especially useful when running on battery.\r\n\r\n## Possible Implementation\r\n\r\nSince `niri` is written in Rust, one potential approach would be to use Cargo features (which `niri` already uses). This way animations could be gated behind a feature like animations and users who don’t want them can compile with:\r\n\r\n```\r\ncargo build --no-default-features\r\n```\r\n\r\nOr, if animations aren't included by default:\r\n\r\n```\r\ncargo build --features minimal\r\n```\r\n\r\nThis would involve:\r\n\r\n- Grouping animation-related code under #[cfg(feature = \"animations\")] attributes\r\n\r\n- Moving crates like `keyframe`, `glam`, etc. behind that feature\r\n\r\n- Providing non-animated fallbacks where appropriate (e.g. immediate layout transitions)\r\n\r\nI understand that every additional build feature has maintenance cost, so I’m opening this more as a discussion rather than a demand. But as a happy `niri` user, I’d really appreciate the option of a leaner, animation-free build.\r\n\r\nThanks again for your great work on this project!",
      "created_at": "2025-07-10T21:19:21Z",
      "updated_at": "2025-07-13T13:23:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cevdetta",
        "avatar_url": "https://avatars.githubusercontent.com/u/76725496?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgtFr",
      "number": 2024,
      "title": "Moving cursor in multi-monitor setup can be inconsistent",
      "body": "# Problem\nWhen the focus goes from `monitor_right_bottom` to `monitor_top` and then comes back down, the cursor goes to `monitor_left_down` instead of the original one.\n\n# Context\nI have 3 monitors, two horizzontally next to each other and the third on top of both.\nI want my cursor to not jump around a lot when passing from a monitor to another, so I set up the monitors position according to their real life position.\n\n```\n         _______\n        |       |\n        |_______|\n _______    ______\n|       |  |      |\n|_______|  |      |\n           |______|\n```\n \nThe third monitor is (horizzontally) in between the bottom 2.\n\nIf I do `Mod+Shift+K` then `Mod+Shift+J` it does:\n```\n          _______                _______                _______    \n         |       |              |   _   |              |       |   \n         |_______|              |_______|              |_______|   \n  _______    ______      _______    ______      _______    ______   \n |       |  |      |    |       |  |      |    |   _   |  |      | \n |_______|  |  --  |    |_______|  |      |    |_______|  |      | \n            |______|               |______|               |______| \n```\n\nI would like it to go back to the previous monitor. Would there be something against this feature except from the time needed to implement it?\n\nI'll check out the code and try to submit a PR, but I thought I should ask. \n \n# Config\nIt's basically the default one, I just configured the monitors:\n```config.kdl\noutput \"DP-1\" {\n    mode \"2560x1440@143.998\"\n    scale 1\n    transform \"normal\"\n    position x=0 y=0\n}\noutput \"DP-2\" {\n    mode \"2560x1440@143.998\"\n    scale 1\n    transform \"90\"\n    position x=2560 y=0\n}\noutput \"HDMI-A-5\" {\n    mode \"1280x720@60.00\"\n    scale 1\n    transform \"normal\"\n    position x=1920 y=-720\n}\n```\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.05.1 (unknown commit)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: `> nixos-version` 25.05.20250710.10e6872 (Warbler)\n",
      "created_at": "2025-07-13T11:36:24Z",
      "updated_at": "2025-07-13T13:03:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "lnk3",
        "avatar_url": "https://avatars.githubusercontent.com/u/23727619?u=7cfb53df6ec4efd41e614041ad319d9f082f5d3d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgUWd",
      "number": 1850,
      "title": "Is it possible to ignore warp-mouse-to-focus when using `niri msg`",
      "body": "Hi, I added buttons to my waybar which allow me to scroll to the left/right column via mouse click. This is of course based on the niri's IPC protocol and `niri msg`.\r\n\r\nThe waybar in question: \r\n![image](https://github.com/user-attachments/assets/a1f20ee1-edd2-42fc-936e-a97cd84bf671)\r\n\r\nNow it doesn't quite work well, because I also enjoy using the `warp-mouse-to-focus` option, so whenever I click on the \"focus the column to the right\" button it also moves the cursor away from the button right after.\r\n\r\nI can imagine two solutions, neither of which would be \"quick fixes\" AFAICT\r\n\r\n1. Add the ability to set options via IPC. For this particular use case this allows for `warp-mouse-to-focus` to be temporarily be disabled.\r\n2. Add a `--no-warp-mouse` flag to various actions.",
      "created_at": "2025-06-19T10:20:02Z",
      "updated_at": "2025-07-13T12:20:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cornservant",
        "avatar_url": "https://avatars.githubusercontent.com/u/3222?u=dd4ca82d5c25dbb0f717cfa647bb06c580bdbb35&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ags7J",
      "number": 2021,
      "title": "Blue-light filter for Niri",
      "body": "Is there an equivalent of [hyprsunset](https://github.com/hyprwm/hyprsunset) for Niri?\r\n\r\nTo my understanding, hyprsunset directly integrates [a custom Wayland protocol](https://deepwiki.com/hyprwm/hyprsunset/1-overview), so you get seamless color control at the compositor level.",
      "created_at": "2025-07-13T07:03:28Z",
      "updated_at": "2025-07-13T08:55:09Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "calebperkins",
        "avatar_url": "https://avatars.githubusercontent.com/u/300328?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgkDa",
      "number": 1960,
      "title": "Idea for scrolling downwards being an options",
      "body": "why downwards you may ask well some of us (me) need even more of a downward useage depending on some apps... (idk what is there more to say)",
      "created_at": "2025-07-05T00:00:58Z",
      "updated_at": "2025-07-12T19:01:33Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {}
    },
    {
      "id": "D_kwDOKFkxdc4AgssT",
      "number": 2019,
      "title": "allow to send windows an open signal",
      "body": "some applications try to hide themself when they get a focus lost event and wait for an open signal.\r\n\r\nsince niri does not support hiding windows (windows are always at some \"shown\" (probably off screen)).    \r\nthis would allow to leave these applications (mostly games) without having to kill the application afterwards.",
      "created_at": "2025-07-12T18:49:39Z",
      "updated_at": "2025-07-12T18:49:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "PatrickHechler",
        "avatar_url": "https://avatars.githubusercontent.com/u/65898051?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgsmB",
      "number": 2018,
      "title": "keybind option to option in currently focused column",
      "body": "i believe the title says everything, comment if something is unclear.",
      "created_at": "2025-07-12T15:27:31Z",
      "updated_at": "2025-07-12T15:27:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgQIi",
      "number": 1806,
      "title": "Dim everything below a layer or application",
      "body": "When using application launchers like rofi it would be nice if there was some option to have them \"dim\" everything around/below them.\r\n\r\nIn Hyprland there is the [`dimaround`](https://wiki.hypr.land/Configuring/Window-Rules/#layer-rules) layer rule that can be used and that acts as a sort of semi-transparent background for a layer.\r\n\r\nIs there anything similar possible in niri? ",
      "created_at": "2025-06-15T13:26:48Z",
      "updated_at": "2025-07-12T15:00:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "MonaMayrhofer",
        "avatar_url": "https://avatars.githubusercontent.com/u/43534802?u=232c9b545146a932822e0e5f853f9d7636c583b2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agrad",
      "number": 2001,
      "title": "binding the copilot key",
      "body": "when using wev, the copilot key shows the command super+shift+XF86Assistant\r\nbut binding that does not invoke the action",
      "created_at": "2025-07-11T04:36:38Z",
      "updated_at": "2025-07-12T04:48:16Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A0ZSl",
        "body": "I don't have a copilot key, so this might not work here, but I used a key remapper to try to mimic having one. What I found is that when I set it to send Super+Shift+F23 I was seeing Super+Shift+XF86Assistant, but if I did just F23 I was seeing XF86TouchpadOff.  So in my niri config, I put Super+Shift+XF86TouchpadOff and that seems to work."
      },
      "user": {
        "login": "roadbloack",
        "avatar_url": "https://avatars.githubusercontent.com/u/155280493?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgsKF",
      "number": 2010,
      "title": "fullscreening currently visible tiles *constantly*",
      "body": "there is already the `expand-column-to-available-width` keybind, but i would want a way to keep all columns that are currently on screen maximized, so when they are resized, adjacent columns get resized as well instead of moving. i know that kind of defeats the purpose of niri.\r\n\r\nmaybe that could also be done by setting the count of columns that are in screen. then, to add a new column to the screen, you would use a keybind. when moving view to another column, the view would move with it and resize windows appropriately to fill the screen.",
      "created_at": "2025-07-11T20:23:54Z",
      "updated_at": "2025-07-11T20:23:55Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agm97",
      "number": 1973,
      "title": "Second Monitor coloring mismatch",
      "body": "I recently swapped from plasma to niri and after id did the basic setup in the niri config i noticed that my second monitor has a extreme color mismatch. i thought first the monitor settings were causing this but they seem all normal. i tried finding solutions on google (and even asked gpt) but to no avail. this only happens when i log in with niri, when i swap back to plasma it goes back to normal. so i would appreciate if someone could help me.\r\n\r\nsome info:\r\n`\r\n                                       ┌──────────────────────Hardware──────────────────────┐\r\n                                        PC: GP75 Leopard 9SD (REV:1.0)\r\n                                       │ ├: Intel(R) Core(TM) i7-9750H (12) @ 4.50 GHz\r\n                                       │ ├󰍛: NVIDIA GeForce GTX 1660 Ti Mobile [Discrete]\r\n                                       │ ├󰍛: Intel UHD Graphics 630 @ 1.15 GHz [Integrated]\r\n                                       │ ├󰍛: 1.33 GiB / 15.45 GiB (9%)\r\n                                       └ └: 173.52 GiB / 236.47 GiB (73%) - btrfs\r\n                                       └ └: 197.52 GiB / 931.51 GiB (21%) - btrfs\r\n                                       └────────────────────────────────────────────────────┘\r\n\r\n    ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠛⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿    ┌──────────────────────Software──────────────────────┐\r\n    ⣿⣿⣿⣿⣿⠿⠿⠿⠿⢛⣋⡍⠉⠉⠉⠀⠀⠀⠀ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿     OS: CachyOS x86_64\r\n    ⣿⣿⣿⡿⠁⣾⣿⣿⣾⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⡀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿    │ ├: Linux 6.15.5-2-cachyos\r\n    ⣿⣿⣿⣷⠀⠙⣻⣿⣿⣿⣿⣧⠀⠀⢀⡀⣀⣴⠇⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿    │ ├: E17E2IMS.119 (1.25)\r\n    ⣿⣿⣿⣿⡇⣰⣿⣿⣿⣿⣿⣿⡄⠠⠋⠙⠉⠈⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿    │ ├󰏖: 1503 (pacman), 16 (flatpak-system), 13 (flatpak-user)\r\n    ⣿⣿⣿⣿⠀⣿⣿⣿⣏⠀⣽⣿⠇⠒⢲⣤⡀⠀⠀⢠⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿    └ └: fish 4.0.2\r\n    ⣿⣿⣿⣿⡄⣿⣿⣿⣿⣿⢳⣿⣶⡴⣿⡿⠗⣠⡺⠀⠀ ⢠⣿⣿⣿⣿⣿⣿⣿⣿\r\n    ⣿⣿⣿⣿⣇⢻⣿⣿⣿⣿⣯⢍⠉⠀⠦⠄⠚⠉⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿    │ ├: sddm 0.21.0 (Wayland)\r\n    ⣿⣿⣿⣿⣿⡄⠻⣿⣿⡿⢟⣃⡙⣒⡛⠁⠀⠀⠀⠀⠀⠀⠀ ⠀⠹⣿⣿⣿⣿⣿    │ ├: niri (Wayland)\r\n    ⣿⣿⣿⣿⣿⡟⢀⣬⣍⣾⣿⣿⠏⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠘⣿⣿⣿⣿    └ └: alacritty 0.15.1\r\n    ⣿⣿⣿⣿⡿⢀⡾⣫⣼⠿⠛⢁⣴⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠹⣿⣿⣿    └────────────────────────────────────────────────────┘\r\n\r\n                                       ┌────────────────────Uptime / Age / DT────────────────────┐\r\n                                         OS Age : 133 days\r\n                                         Uptime : 2 mins\r\n                                         DateTime : 2025-07-07 08:52:19\r\n                                       └─────────────────────────────────────────────────────────┘\r\n                                         ● ● ● ● ● ● ● ●\r\n~\r\n❯`\r\n`24: None 00.0: 10002 LCD Monitor\r\n  [Created at monitor.125]\r\n  Unique ID: rdCR.HIcTw67HRUB\r\n  Parent ID: VCu0.QUvzkvJ6Um8\r\n  Hardware Class: monitor\r\n  Model: \"LG ELECTRONICS LG HDR WFHD\"\r\n  Vendor: GSM \"LG ELECTRONICS\"\r\n  Device: eisa 0x5bb9 \"LG HDR WFHD\"\r\n  Serial ID: \"406216\"\r\n  Resolution: 640x480@60Hz\r\n  Resolution: 640x480@75Hz\r\n  Resolution: 800x600@60Hz\r\n  Resolution: 800x600@75Hz\r\n  Resolution: 832x624@75Hz\r\n  Resolution: 1024x768@60Hz\r\n  Resolution: 1024x768@75Hz\r\n  Resolution: 1280x1024@75Hz\r\n  Resolution: 1152x864@60Hz\r\n  Resolution: 1280x1024@60Hz\r\n  Resolution: 1280x720@60Hz\r\n  Resolution: 1600x900@60Hz\r\n  Resolution: 1920x1080@60Hz\r\n  Resolution: 2560x1080@60Hz\r\n  Size: 798x334 mm\r\n  Year of Manufacture: 2022\r\n  Week of Manufacture: 2\r\n  Detailed Timings #0:\r\n     Resolution: 2560x1080\r\n     Horizontal: 2560 2608 2640 2720 (+48 +80 +160) -hsync\r\n       Vertical: 1080 1083 1093 1111 (+3 +13 +31) +vsync\r\n    Frequencies: 181.25 MHz, 66.64 kHz, 59.98 Hz\r\n  Year of Manufacture: 2022\r\n  Week of Manufacture: 2\r\n  Detailed Timings #1:\r\n     Resolution: 1920x1080\r\n     Horizontal: 1920 2008 2052 2200 (+88 +132 +280) +hsync\r\n       Vertical: 1080 1084 1089 1125 (+4 +9 +45) +vsync\r\n    Frequencies: 148.50 MHz, 67.50 kHz, 60.00 Hz\r\n  Driver Info #0:\r\n    Max. Resolution: 2560x1080\r\n    Vert. Sync Range: 56-75 Hz\r\n    Hor. Sync Range: 30-90 kHz\r\n    Bandwidth: 181 MHz\r\n  Config Status: cfg=new, avail=yes, need=no, active=unknown\r\n  Attached to: #9 (VGA compatible controller)\r\n\r\n25: None 00.0: 10002 LCD Monitor\r\n  [Created at monitor.125]\r\n  Unique ID: rdCR.XrZVy2KDSM2\r\n  Parent ID: _Znp.YQ4VOR2yea8\r\n  Hardware Class: monitor\r\n  Model: \"CMN LCD Monitor\"\r\n  Vendor: CMN \"CMN\"\r\n  Device: eisa 0x1760\r\n  Serial ID: \"0\"\r\n  Resolution: 1920x1080@60Hz\r\n  Size: 381x214 mm\r\n  Year of Manufacture: 2019\r\n  Week of Manufacture: 12\r\n  Detailed Timings #0:\r\n     Resolution: 1920x1080\r\n     Horizontal: 1920 1968 2000 2080 (+48 +80 +160) -hsync\r\n       Vertical: 1080 1090 1095 2740 (+10 +15 +1660) -vsync\r\n    Frequencies: 342.06 MHz, 164.45 kHz, 60.02 Hz\r\n  Year of Manufacture: 2019\r\n  Week of Manufacture: 12\r\n  Detailed Timings #1:\r\n     Resolution: 1920x1080\r\n     Horizontal: 1920 1968 2000 2080 (+48 +80 +160) -hsync\r\n       Vertical: 1080 1090 1095 1142 (+10 +15 +62) -vsync\r\n    Frequencies: 342.06 MHz, 164.45 kHz, 144.00 Hz\r\n  Config Status: cfg=new, avail=yes, need=no, active=unknown\r\n  Attached to: #21 (VGA compatible controller)\r\n\r\n~`",
      "created_at": "2025-07-07T06:59:26Z",
      "updated_at": "2025-07-11T19:46:14Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A0ZQb",
        "body": "found the issue, sddm auto enables HDR, disable it and it works. found solution on here: https://github.com/YaLTeR/niri/issues/1841"
      },
      "user": {
        "login": "illyrius666",
        "avatar_url": "https://avatars.githubusercontent.com/u/28700752?u=27729d5e1bf4de0d3c177dbacdc07e4824d0e3f1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgqIV",
      "number": 1995,
      "title": "Recording keybinds on Discord -- keypresses not being registered",
      "body": "I'm trying out Niri for the first time, so please bear with me. I installed Discord and want to set up keybinds for PTT and toggle mute. When I click on \"Record Keybind,\" and press the keybind I want to use, it doesn't register or recognize the keystroke at all. This wasn't an issue when I was on GNOME and can easily record a keystroke. Is there a setting in Niri I need to configure or am I missing something?",
      "created_at": "2025-07-09T23:15:35Z",
      "updated_at": "2025-07-11T02:43:30Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A0XW8",
        "body": "It's in the default config. See https://github.com/YaLTeR/niri/blob/main/resources/default-config.kdl#L366"
      },
      "user": {
        "login": "RyanSicat",
        "avatar_url": "https://avatars.githubusercontent.com/u/119932414?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgrIe",
      "number": 1998,
      "title": "Widgets in overview",
      "body": "having widgets (stuff like bars etc.) that only get displayed while in overview.\r\ni dont need my bar all the time, and going into overview to see my bar would be wonderful.",
      "created_at": "2025-07-10T20:00:35Z",
      "updated_at": "2025-07-11T02:22:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agq3j",
      "number": 1997,
      "title": "Changing settings at runtime",
      "body": "As far as I am aware, there isn't a way to change the value of a setting at runtime, something like the equivalent of `hyprctl keyword general:col.active_border \"rgb(BABAA0)\"` in hyprland?\r\n\r\nI know the config can be live reloaded, but it feels like using a clunky sledgehammer on a nail when all I want to do is change some colors / borders. :sweat_smile: \r\n\r\nMaybe an include directive as suggested in some of the other discussions could be a possible solution?",
      "created_at": "2025-07-10T14:45:55Z",
      "updated_at": "2025-07-10T15:26:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "iynaix",
        "avatar_url": "https://avatars.githubusercontent.com/u/94313?u=02c5471181b8fc0c352027008e71b650c33d9d85&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgqAy",
      "number": 1993,
      "title": "Feature: Fullscreen on first window only",
      "body": "If there is only one window in a workspace, that window is, by default, maximized. The act of creating a second window or moving said window to a non-empty workspace would make the window a non-maximized size. Manually resizing the window would also work to alter it's size.\r\n\r\nI find I mimic this described behavior manually almost every time I use niri.",
      "created_at": "2025-07-09T19:20:15Z",
      "updated_at": "2025-07-09T21:32:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "j3hn-prof",
        "avatar_url": "https://avatars.githubusercontent.com/u/172990620?u=7320d87f4ee540edc218dc3dc556c5e880d32323&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ago4Y",
      "number": 1982,
      "title": "How to arbitrarly resize windows?",
      "body": "Coming from hyprland where I could do\r\n```\r\nbindm  = ALT, mouse:272, resizewindow\r\n```\r\n\r\nwhich would allow me to hold alt and move my touchpad to arbitrarily resize window.\r\n\r\nthere is `set-column-width` and `TouchpadScrollDown` but that requires 2 fingers, I am looking for hold and drag. Like how mod + mouse movement allows to move window. ",
      "created_at": "2025-07-08T19:23:26Z",
      "updated_at": "2025-07-09T18:09:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "kumawatdarshan",
        "avatar_url": "https://avatars.githubusercontent.com/u/104432537?u=d1a762c73d06d47ecd4579d285e08975105c4712&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agpx6",
      "number": 1990,
      "title": "Where should “niri-portals.conf” be located?",
      "body": "What’s the correct path for this config? Should it be:\r\n\r\nUser-specific (e.g., ~/.config/niri-portals.conf)?\r\n\r\nOr system-wide (e.g., /etc/niri-portals.conf)?",
      "created_at": "2025-07-09T14:35:37Z",
      "updated_at": "2025-07-09T16:23:32Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "xiaozhuo256",
        "avatar_url": "https://avatars.githubusercontent.com/u/91036800?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agp0e",
      "number": 1991,
      "title": "Focus window left/right",
      "body": "Currently, focus-column-left/right doesn't respect your focus height when moving to the next column. I.e: moving between 2 columns of 3 windows each will always move focus to the top window in the stack. It would be great to have focus-window-right so that moving from the bottom window of left stack will focus on the bottom window of the right stack (whereas focus-column-right would focus the top window of right stack). This would be far more convenient for treating groups of windows as grids (or other layouts like xmonad/bsp etc.) like a traditional WM would, instead of distinct columns.",
      "created_at": "2025-07-09T15:13:17Z",
      "updated_at": "2025-07-09T15:13:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "just-anothernerd",
        "avatar_url": "https://avatars.githubusercontent.com/u/182258857?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgWeE",
      "number": 1870,
      "title": "No gaps when only one window",
      "body": "How to make gapless when in workspace only one window?",
      "created_at": "2025-06-22T06:15:21Z",
      "updated_at": "2025-07-09T11:43:59Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "xaolanx",
        "avatar_url": "https://avatars.githubusercontent.com/u/49628247?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agpda",
      "number": 1988,
      "title": "Focus movement for specific windows position",
      "body": "![image](https://github.com/user-attachments/assets/a9309e88-5ef5-4552-ac05-776488bdd520)\r\nIn these kind of tiling situation, triggering focus-window-up/down should move focus to the right top/bottom window.",
      "created_at": "2025-07-09T08:44:54Z",
      "updated_at": "2025-07-09T08:44:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "RQuarx",
        "avatar_url": "https://avatars.githubusercontent.com/u/117576142?u=bbbc97ae6e391096ad7ac33f10648a3b80acdc32&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgpN1",
      "number": 1987,
      "title": "window-rule match output",
      "body": "I think it would be nice to set window rules based on the output. My first intuition was to look for a match statement to match the output, but didn't see one in the docs.\r\n\r\nA basic use case would like to have different column widths for different outputs, e.g. 1.0 on a small display and 0.5 on a widescreen.\r\n\r\nApologies if this has been covered, but I didn't see it with a basic search in the issues. And if there is a already a simple solution all the better!\r\n\r\nThanks in advance for any feedback. Awesome WM.",
      "created_at": "2025-07-09T05:35:28Z",
      "updated_at": "2025-07-09T06:18:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tino376dev",
        "avatar_url": "https://avatars.githubusercontent.com/u/157116672?u=4a36fb4bf605da9dd257e346114b514619da5250&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgpFm",
      "number": 1986,
      "title": "Allow focus and workspace scroll actions to be mouse-position-aware",
      "body": "I often try to scroll sideways or between workspaces on my second monitor, but I end up scrolling on my primary monitor.\r\n\r\nIt's quite natural for me to imagine that the monitor I'm scrolling on will be the one my mouse is on, but in my current setup, the monitor in focus is the one that's being scrolled.\r\n\r\nAs you can see in my settings below, it is tottaly focus-relative:\r\n    Mod+WheelScrollDown      { focus-column-right; }\r\n    Mod+WheelScrollUp        { focus-column-left; }\r\n    Mod+Shift+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\r\n    Mod+Shift+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\r\n    \r\nI think it makes sense to have options in the niri action that control focus relative to the mouse position or something like that. And if the mouse is hidden (cursor's hide-when-typing), then the current focus would be used.",
      "created_at": "2025-07-09T02:46:59Z",
      "updated_at": "2025-07-09T02:47:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bk304",
        "avatar_url": "https://avatars.githubusercontent.com/u/13324249?u=6969de414d5384201460b6c050ad17075a9bb529&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agoi8",
      "number": 1981,
      "title": "New `focus-available-*` for workspaces, monitors, and columns",
      "body": "I suggest a new command `focus-available-{left,right,up,down}` as a all-in-one command that does both `focus-window-or-workspace-*` and `focus-monitor-*`\r\n\r\nThe command would work similarly to  `focus-window-or-workspace-*`, by going left and right across columns or up and down across workspaces, but it stops at the columns at the start and end, Instead, `focus-available-*`, will move to the monitor across the edge. This will mean that the command will move across windows, workspaces, and monitors, making movement very seamless and convenient.",
      "created_at": "2025-07-08T13:50:13Z",
      "updated_at": "2025-07-08T13:50:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sewnie",
        "avatar_url": "https://avatars.githubusercontent.com/u/47404953?u=28e9b579ce53c96d54cd340591b22021baec0073&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgnT_",
      "number": 1976,
      "title": "option to change padding between workspaces",
      "body": "hi, i think it would be nice if there were an option to change the space between each workspace in the overview ",
      "created_at": "2025-07-07T11:02:54Z",
      "updated_at": "2025-07-07T11:02:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nyxmeowmeow",
        "avatar_url": "https://avatars.githubusercontent.com/u/180290547?u=698207273a2fbf23b425d9a03f243ddbcf3cb8f0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agmsc",
      "number": 1972,
      "title": "Providing Interactive Screenshot support for xdg-desktop-portal",
      "body": "First I want to thank you for developing one of the greatest window manager/wayland compositor I have even used.\r\n\r\nI wanted to use [Gradia](https://flathub.org/apps/be.alexandervanhee.gradia) to take screenshot and edit it. Gradia is using the is a xdg-desktop-portal for getting [interactive screenshot](https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.Screenshot.html#org-freedesktop-portal-screenshot-screenshot). Presently `xdg-desktop-portal-gnome` invokes `InteractiveScreenshot` dbus method to get the interactive screeenshot which, in GNOME is provided by gnome-shell, but Niri currently doesn't provide support for it.\r\n**trigger:** i used [ASHPD Demo](https://flathub.org/apps/com.belmoussaoui.ashpd.demo) app.\r\n**screenshot:** I requested an interactive screenshot\r\n![image](https://github.com/user-attachments/assets/f0690ff0-f46b-47d4-bb6a-ab95532da0d2)\r\n**xdp-gnome error:** `xdg-desktop-portal-gnome[1908]: InteractiveScreenshot failed: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: Unknown method 'InteractiveScreenshot'`\r\nCan you please add support for the interactive screenshot from xdg-desktop-portal, which will make screenshot apps which use desktop portals functional in Niri.",
      "created_at": "2025-07-07T04:28:51Z",
      "updated_at": "2025-07-07T04:28:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "user9169747",
        "avatar_url": "https://avatars.githubusercontent.com/u/201052305?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZXd1",
      "number": 337,
      "title": "have a way to exit fullscreen mode",
      "body": "right now, we have an action to toggle full-screen mode, which i sometimes use.\r\ni also have keys/scripts using spawn actions, and sometimes use these when i am in full-screen mode.\r\n\r\nunder these circumstances the present window stays in full-screen, which occasionally i experience as counter-intuitive, as seemingly nothing happened.\r\ni would like to have these instead have niri exit full-screen if applicable. however, it doesn't seem there is currently a way to do this: the existing action toggles, whereas there is no current way check whether one is in full-screen mode (i think?) or to simply exit full-screen rather than toggling.\r\n\r\nit would be nice if we could add either of those to facilitate this use-case.\r\n",
      "created_at": "2024-05-12T00:25:24Z",
      "updated_at": "2025-07-06T10:58:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgkG5",
      "number": 1961,
      "title": "Keybind accidental press prevention",
      "body": "Far too often, I run into the issue where I hit a critical keybind by accident. This is most prevalent with closing windows - if a window closes and you try to close it not knowing it would close by itself, due to focusing being instant it'll close whatever window becomes focused right after. Similarly, some keyboard have issues with doublepresses (mine included, unfortunately at the Q key) which can cause the same issue.\r\n\r\nI've thought about how this could be solved, and have come up with 3 possible solutions that solve various forms of this:\r\n\r\n1. A `ratelimit` option on keybinds, making you unable to trigger them more often than, eg. 500ms\r\n2. A `sensitive`? `event-ratelimit`?` option on keybinds, acting similar as the above but also activating whenever an important event happens, such as opening a window, closing a window, etc.\r\n3. A `hold` option on keybinds, forcing you to hold down the keybind for some short amount of time to activate it. I've seen something like this in the wild with [SlowQuitApps](https://github.com/dteoh/SlowQuitApps) on macOS; something like this but applicable to any keybind would be ideal.\r\n\r\nThe former two seem like the easiest to implement, but don't additional cover genuine accidental misinputs; the last is a pretty extreme solution but I'd highly appreciate it.",
      "created_at": "2025-07-05T00:31:39Z",
      "updated_at": "2025-07-05T11:15:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "oatmealine",
        "avatar_url": "https://avatars.githubusercontent.com/u/23474882?u=f0bacc9b24ffbebcb815273bb66bc9071601f94a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgjI-",
      "number": 1956,
      "title": "Session Management - Higher-Level Workspace Organization",
      "body": "## Summary\r\nAdd a \"session\" concept to niri that groups multiple workspaces across monitors into named, persistent contexts. This would enable users to organize their workspaces by project, client, or activity type while maintaining niri's excellent infinite scrolling workspace model.\r\n\r\n## Problem Statement\r\nCurrently, niri provides excellent workspace management with infinite horizontal/vertical scrolling. However, users working on multiple projects or contexts (client work, personal projects, learning, etc.) end up with many workspaces that become difficult to organize and navigate. There's no way to group related workspaces or quickly switch between completely different work contexts.\r\n\r\n## Proposed Solution: Sessions\r\n\r\n### Concept\r\nA **session** is a named collection of workspaces across all monitors that represents a complete work context. Users can:\r\n- Switch between sessions instantly\r\n- Organize workspaces by logical groupings rather than just numeric order\r\n\r\n### Example Session Structure\r\n\r\n```\r\nPersonal\r\n├── Monitor 1\r\n│   ├── Workspace 1 [Browser] → News, social media, general browsing\r\n│   ├── Workspace 2 [Terminal] → System maintenance, dotfiles, experiments  \r\n│   └── Workspace 3 [Media] → Music player, video calls, streaming\r\n└── Monitor 2\r\n    ├── Workspace 1 [Communication] → Signal, email, calendar\r\n    ├── Workspace 2 [Notes/Writing] → Obsidian, journal, personal docs\r\n    └── Workspace 3 [Gaming] → Games, Discord\r\n\r\nClient-Acme\r\n├── Monitor 1\r\n│   ├── Workspace 1 [Development] → Wezterm, Helix, project code\r\n│   ├── Workspace 2 [Documentation] → Browser, API refs, project docs\r\n│   └── Workspace 3 [Testing/QA] → Test environments, staging\r\n└── Monitor 2\r\n    ├── Workspace 1 [Communication] → Slack, client email, video calls\r\n    ├── Workspace 2 [Project Management] → Linear/Jira, timesheets, invoicing\r\n    └── Workspace 3 [Monitoring] → Logs, metrics, system health\r\n\r\nLearning-Rust\r\n├── Monitor 1\r\n│   ├── Workspace 1 [Code Practice] → Wezterm, Rust exercises, cargo\r\n│   ├── Workspace 2 [Documentation] → Rust book, docs.rs, examples\r\n│   └── Workspace 3 [Community] → Reddit, Discord, Stack Overflow\r\n└── Monitor 2\r\n    ├── Workspace 1 [Notes] → Learning journal, code snippets\r\n    ├── Workspace 2 [Tutorials] → YouTube, course platforms\r\n    └── Workspace 3 [Reference] → Cheat sheets, quick lookup\r\n\r\nDeep-Focus\r\n├── Monitor 1\r\n│   ├── Workspace 1 [Single Task] → One application, minimal UI\r\n│   └── Workspace 2 [Reference] → Docs, specs, minimal browser\r\n└── Monitor 2\r\n    ├── Workspace 1 [Notes] → Simple text editor, scratch pad\r\n    └── Workspace 2 [Productivity] → Pomodoro, ambient sounds\r\n```\r\n\r\n### Proposed Implementation\r\n\r\n#### Session Commands\r\n```bash\r\nniri msg action create-session \"Client-A\"\r\nniri msg action switch-session \"Client-A\"\r\nniri msg action list-sessions\r\nniri msg action delete-session \"Personal\"\r\n```\r\n\r\n#### Session Workflow\r\n1. Create session with current workspace layout\r\n2. Work within session using existing niri workspace navigation\r\n3. Switch to different session - all workspaces change contextually\r\n4. Return to previous session - exact layout restored\r\n\r\n## Benefits\r\n- **Maintains niri's strengths**: No changes to core workspace scrolling behavior\r\n- **Adds logical organization**: Group workspaces by context rather than just sequence\r\n- **Improves multi-project workflows**: Quick context switching between different types of work\r\n- **Enhances multi-monitor use**: Coordinate workspace layouts across screens\r\n- **Reduces cognitive load**: Users can focus on work rather than workspace management\r\n\r\n## Implementation Considerations\r\n- Sessions should feel lightweight - quick creation and switching\r\n- Integration with existing workspace commands (sessions contain workspaces, not replace them)\r\n- Session state could be stored in JSON/TOML files for easy inspection/backup\r\n- Optional integration with external tools for application restoration within sessions\r\n- Optional pinning of \"side\"-monitor for cross-session applications, spotify/music/etc, (perhaps better achieved using toggle-able call-by-need floating window)\r\n- Alternatively, sessions could be contained per-monitor similar to workspaces, effectively creating a 3rd dimension of \"scroll-ability\".\r\n\r\nThis feature would make niri even more powerful for users managing complex, multi-context workflows while preserving the excellent foundation you've already built.\r\n\r\n---\r\n\r\n**This PR was drafted by Claude so apologies ahead-of-time.*",
      "created_at": "2025-07-04T14:11:27Z",
      "updated_at": "2025-07-04T14:25:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Padraic-O-Mhuiris",
        "avatar_url": "https://avatars.githubusercontent.com/u/39857859?u=0e0e2fb5dfd55a8980e171a624f5451fac8e08af&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgePo",
      "number": 1933,
      "title": "Save and Load windows trees | A tool I wrote and I ported from Sway to Niri",
      "body": "Link: https://github.com/fabienjuif/swaytreesave\r\n\r\nIt allows me to switch my Niri windows/workspaces from working realm to personal one.\r\nI use it like this:\r\n- **work**: `swaytreesave --compositor niri --name work load`\r\n- **personal**: `swaytreesave --compositor niri load`\r\n\r\nIf you do not want to start from fresh config file, you can save a current tree, then modify the saved tree manually, example: `swaytreesave --compositor niri save`, some trees examples at the end of this post.\r\n\r\nIt's less important if you are using window rule to tied a window to a workspace.\r\nBut I find this still useful to kill and restart a fresh \"tree\" (or \"realm\").\r\n\r\nThis is super early stage, I know there is some weird config etc.\r\nThis is mostly an excuse to write some Rust, but I thought it can be useful for other folks than me.\r\n\r\nFeel free to fork it if you want.\r\n\r\n### Example trees files\r\n\r\nAnd here's are my 2 niri trees that are tied to commands above\r\n**work**\r\n```yaml\r\n- name: chat\r\n  type: workspace\r\n  nodes:\r\n  - nodes:\r\n    - app_id: Slack\r\n      desktop_entry: slack\r\n      timeout: \"1s\"\r\n    - app_id: discord\r\n      desktop_entry: discord\r\n      timeout: \"1s\"\r\n    - app_id: signal\r\n      desktop_entry: signal-desktop\r\n      timeout: \"1s\"\r\n    layout: splith\r\n- name: browser\r\n  type: workspace\r\n  nodes:\r\n  - nodes:\r\n    - app_id: Firefox\r\n      exec: /usr/lib/firefox/firefox -P Work\r\n    - app_id: Firefox\r\n      exec: /usr/lib/firefox/firefox -P default-default\r\n    layout: splith\r\n- name: code\r\n  type: workspace\r\n  nodes:\r\n  - nodes:\r\n    - app_id: code-oss\r\n    layout: splith\r\n\r\n```\r\n\r\n**personal**\r\n```yaml\r\n- name: chat\r\n  type: workspace\r\n  nodes:\r\n  - nodes:\r\n    - app_id: discord\r\n      desktop_entry: discord\r\n      timeout: \"1s\"\r\n    - app_id: signal\r\n      desktop_entry: signal-desktop\r\n      timeout: \"1s\"\r\n    layout: splith\r\n- name: browser\r\n  type: workspace\r\n  nodes:\r\n  - nodes:\r\n    - app_id: Firefox\r\n      exec: /usr/lib/firefox/firefox -P default-default\r\n    layout: splith\r\n- name: code\r\n  type: workspace\r\n  nodes:\r\n  - nodes:\r\n    - app_id: code-oss\r\n    layout: splith\r\n```",
      "created_at": "2025-06-30T08:16:07Z",
      "updated_at": "2025-07-04T07:30:04Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "fabienjuif",
        "avatar_url": "https://avatars.githubusercontent.com/u/17828231?u=0c47eb7313d4abdb22127a94bae10d823d2f3242&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfhbF",
      "number": 1497,
      "title": "Support include in config file",
      "body": "Hi,\r\nComing from sway I've got a modular configuration separated into different files.\r\nIs it possible to get the same with '`config.kdl`'?\r\nI mean to get `config.kdl` to 'include' other '`*.kdl`' files?\r\n\r\nIt seems I can't find anything about this in the `KDL` specs.",
      "created_at": "2025-04-30T07:10:50Z",
      "updated_at": "2025-07-03T15:33:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "antoniocorbi",
        "avatar_url": "https://avatars.githubusercontent.com/u/7315145?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agh0q",
      "number": 1953,
      "title": "Is it possible to modularize Niri's configuration?",
      "body": "There is a way to have multiple .kdl files to load into a single configuration? I mean, there is something like `include \"src/input.kdl` to load different parts of te configuration?",
      "created_at": "2025-07-03T15:01:21Z",
      "updated_at": "2025-07-03T15:08:18Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4A0Fce",
        "body": "Sorry, first time using Discussions section. There was already a discussion about this."
      },
      "user": {
        "login": "SrShelo",
        "avatar_url": "https://avatars.githubusercontent.com/u/47431066?u=7ff86991b41ad46fdd672f898a0c3a979eab6482&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aggkq",
      "number": 1952,
      "title": "Disable animations for specific window",
      "body": "I don't want to have animations for flameshot, a powerful screenshot tool. How can i achieve that? ",
      "created_at": "2025-07-02T11:48:44Z",
      "updated_at": "2025-07-03T01:43:15Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "sivaplaysmC",
        "avatar_url": "https://avatars.githubusercontent.com/u/89677765?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agfhj",
      "number": 1949,
      "title": "Glob outputs",
      "body": "In sway, you can use the syntax `output \"*\"` to define a set of rules for all monitors. There is no equivalent for this on Niri.\r\n\r\nUsecase: Easily set a background color on all displays",
      "created_at": "2025-07-01T11:40:32Z",
      "updated_at": "2025-07-01T16:29:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sewnie",
        "avatar_url": "https://avatars.githubusercontent.com/u/47404953?u=28e9b579ce53c96d54cd340591b22021baec0073&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agflk",
      "number": 1950,
      "title": "toggle-windowed-fullscreen",
      "body": "I expected the   toggle-windowed-fullscreen action to full screen the window without sending fullscreen api to the window but it seems it give fullscreen api but doesn't fullscreen the window.\r\n\r\nhttps://github.com/user-attachments/assets/7dfb4b21-c893-44f2-a3de-e68567f6ff29\r\n\r\n",
      "created_at": "2025-07-01T12:50:10Z",
      "updated_at": "2025-07-01T12:56:40Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "YujanSubedi",
        "avatar_url": "https://avatars.githubusercontent.com/u/119090328?u=4c54db7b04e13044ecbe811237b02cc1fb88f906&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Age-F",
      "number": 1940,
      "title": "Help debug a spawn command",
      "body": "Hi,\r\n\r\nUp until last week my key binding on opening a terminal was working fine:\r\n\r\n`Mod+Return hotkey-overlay-title=\"Open a Terminal: ghostty\" { spawn \"ghostty\"; }`\r\n\r\nNow it does nothing! :(\r\n\r\nRunning from the command line as:\r\n\r\n`niri msg action spawn -- ghostty`\r\n\r\nalso does absolutely nothing:\r\n\r\n```\r\n➜  niri msg action spawn -- ghostty\r\n\r\n\r\n```\r\n\r\nSubstituting `kitty` for `ghostty` works!\r\n\r\nI know ghostty is correctly installed because I can start it from my application menu, or by just calling it from within kitty just by running `ghostty`.\r\n\r\nHow can I debug this and see what happens when niri is spawning the `ghostty` command?\r\n\r\nI'm on latest unstable nixos is that matters somehow!\r\n\r\nThanks!",
      "created_at": "2025-06-30T21:13:35Z",
      "updated_at": "2025-07-01T10:00:48Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Az9v1",
        "body": "Appears to a problem with your `$PATH`."
      },
      "user": {
        "login": "stratosgear",
        "avatar_url": "https://avatars.githubusercontent.com/u/193463?u=f4db9e49bab3327562234ca2668e1625bcd46eb1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgfOD",
      "number": 1944,
      "title": "hide workspaces of the deactivated screen?",
      "body": "Hello,\r\n\r\nI have 2 monitors and have set the option \r\n`\"output\": \"DP-1\"`\r\nin the waybar config so that the waybar only appears on one monitor. However, the workspaces of the 'hidden' monitor are also visible.",
      "created_at": "2025-07-01T05:56:56Z",
      "updated_at": "2025-07-01T05:56:57Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "bobblkabb",
        "avatar_url": "https://avatars.githubusercontent.com/u/7815101?u=30f6d40c7d0361f14b6b239e13a9a72a18d59972&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adtpb",
      "number": 938,
      "title": "Problems with wl-copy or clipboards in general... works fine in Sway, what am I doing wrong?",
      "body": "Hello there!\r\n\r\nI have the following problem that plagues my otherwise smooth usage of Niri and makes it very cumbersome to do work in it:\r\n\r\nI can't  copy passwords from passwordstore to e.g. chrome\r\n\r\nIn sway I do\r\n\r\n> pass my/store/password -c\r\n\r\nand it's then in the clipboard and I can use it in any application, no matter if it's xorg or wayland.\r\n\r\nBut in niri I can't for the life of it paste it in chromium (or anywhere for that matter)\r\n\r\nI can actually only use it in the very same terminal.\r\n\r\nE.g. if I get my ssh passwords, I can do that in the same wezterm process/window and then paste it to ssh-add. But I can't copy and do it on another wezterm window.\r\n\r\nIt's driving me nuts.\r\nI know under Linux there are multiple clipboards, but I can't seem to find what I configured differently in sway (which I used for many years only to fall in love with niri)\r\n\r\nAny ideas?\r\nThanks in advance!",
      "created_at": "2025-01-06T15:27:39Z",
      "updated_at": "2025-07-01T02:05:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Froidoh",
        "avatar_url": "https://avatars.githubusercontent.com/u/88844015?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Age_n",
      "number": 1942,
      "title": "Diferenciate mouse lateral buttons",
      "body": "Currently (and caused by smithays  `PointerButtonEvent::button()` pressing \r\n     BTN_FORWARD or  BTN_EXTRA maps to `MouseButton::Forward` which makes it impossible to add a shortcut for the thumb button in some  mises that have it, like the `Logitech Mx Master 3s`. I will like to see a MouseButton::Extra or a more generic way to make keybindings using the numberic code of the keys (as shown in wev) instead of the name.",
      "created_at": "2025-06-30T21:54:37Z",
      "updated_at": "2025-06-30T21:54:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "leiserfg",
        "avatar_url": "https://avatars.githubusercontent.com/u/2947276?u=bef0300dde7e714eda2556e3078ca4381137eceb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Age_U",
      "number": 1941,
      "title": "Bind to progress focus through a workspace then proceed to the next workspace automatically",
      "body": "Theoretically this could function like `focus-column-right` and `focus-column-left` but upon reaching the end of a workspace, it increments the workspace and returns to the first window of the next workspace, or at the beginning, it decrements workspace and goes to the end of the previous workspace. \r\n\r\nThe idea of this is to navigate through workspaces in a snaking motion. Just thought I'd open up a discussion for this or something similar. Not married to any specific implementation, but it would be nice to have a bind that allows users to scroll through all of their windows, on that monitor anyway.",
      "created_at": "2025-06-30T21:45:38Z",
      "updated_at": "2025-06-30T21:45:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Fireye04",
        "avatar_url": "https://avatars.githubusercontent.com/u/45439844?u=86cc2b7fce20edc4c3f786c9fda4a9be10275d25&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agekp",
      "number": 1938,
      "title": "focus-ring alternatives",
      "body": "Hello, I am not a big fan of the focus ring as a concept, and usually relied on other means to indicate which window is active, usually by indicating which windows are inactive. My typical is to greyscale inactive windows, but it would also be nice to be able to change the opacity maybe, or the size (so that the gap increases for inactive windows, making the active window seem larger). \r\n\r\nWhat do yall think of incorporating these?",
      "created_at": "2025-06-30T14:26:43Z",
      "updated_at": "2025-06-30T15:15:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "liabri",
        "avatar_url": "https://avatars.githubusercontent.com/u/40229335?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Agd09",
      "number": 1931,
      "title": "Change window size based on number of windows",
      "body": "How would I go about making a setup which makes the first window of a workspace take up 100% of the workspace and as soon as a second window gets openend they split the screen 50/50? I don't want my first window using 50% of the display with just 50% unused screen next to it.\r\n\r\nNot quite sure how to configure this so if anyone could give me pointers that would be nice.",
      "created_at": "2025-06-29T17:17:22Z",
      "updated_at": "2025-06-29T17:35:57Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "ItsLiyua",
        "avatar_url": "https://avatars.githubusercontent.com/u/53657159?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgdzI",
      "number": 1930,
      "title": "the order of the output for niri msg action should be improved",
      "body": "Hello y'all\r\nI have been trying out niri again and while configuring, I have been using niri msg action a lot in order to find the actions that niri offers. However, sometimes the order of the ouput is a pain. It's somewhat unintuitive that move-column-left-or-to-monitor-left is in entirely a different section compared to move-column-to-monitor-left. Like I feel like all the move-window and move-column actions should be grouped together.  \r\n\r\nI don't know how the command works under the hood, but if I were to design it, I would probably go\r\nfocus-window actions\r\nfocus-column actions\r\nfocus-workspace\r\nfocus-monitor\r\nthen all, the move actions, resizing actions, then the misc actions. \r\n\r\n\r\n\r\n ",
      "created_at": "2025-06-29T15:52:49Z",
      "updated_at": "2025-06-29T15:52:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "thairanaru",
        "avatar_url": "https://avatars.githubusercontent.com/u/106037630?u=24331be0e8c9230197196db990021178a5a92a2c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgdRw",
      "number": 1926,
      "title": "Modal window management",
      "body": "I've been kicking around an idea for niri that I think could be really useful, and I wanted to get your thoughts on it. I'm a big fan of modal editors, and I've been wondering if we could apply that same concept to window management.\r\n\r\nMy main motivation is ergonomics. I'm getting tired of the finger gymnastics required for shortcuts like `Super+Shift+Ctrl+L`. It's a mouthful to say and a handful to type. I want to control my windows with simple, single key presses.\r\n\r\nThe core idea is to give niri two keyboard modes: passthrough and window mode.\r\n\r\n1. When you're in passthrough mode, niri stays out of your way. Every key you press goes straight to your terminal, your browser, your code editor. Nothing is intercepted.\r\n2.  The only keybind niri intercepts is a special toggle keybind, which puts you in window mode. Now, `h` focuses the window left, `j` moves a window down, `t` opens a terminal. No `Super` key required. When you're done, you hit the toggle again and you're back to typing in your application. In order to indicate that the mode has changed, a message through niri's IPC can be made, or the focus ring or border rings can flash a certain color.\r\n\r\nIt's a simple state switch. For example, you could be coding, realize you need to rearrange things, hit the left and right `Alt` keys at the same time, tap `l`, `l`, `Shift+J` to quickly move things around, and then hit both `Alt` keys again to get right back to coding.\r\n\r\nI'm not a core dev, but I imagine the configuration could be pretty straightforward. Something like this inside the `input` block:\r\n\r\n```kdl\r\nmodal {\r\n    enabled true\r\n    toggle-keys \"Alt_L\" \"Alt_R\"\r\n\r\n    bindings {\r\n        h { focus-column-left; }\r\n        l { focus-column-right; }\r\n        Shift+H { move-column-left; }\r\n\r\n        // Your custom stuff\r\n        t { spawn \"alacritty\"; }\r\n        d { spawn \"fuzzel\"; }\r\n    }\r\n}\r\n```\r\n\r\nHowever, adding this in would add more complexity to niri. A new mode means new state to manage, and new state means new, creative ways for things to break. A mode could get stuck, an app could interact with it weirdly, etc. I think it would be fair to ask if the ergonomic win is worth the added code and potential for bugs, especially if no one will be using it anyway.\r\n\r\nThis isn't an idea I want to just drop and run. If the community thinks this has merit and it gets greenlit, I'm happy to implement it and take ownership for it. I'll put in the work to build it and, more importantly, to stick around and fix the bugs that will inevitably pop up.\r\n\r\nAnyway, that's the gist of it. Is this a crazy idea, or is it something you could see yourself using? I'd love to hear what everyone thinks.",
      "created_at": "2025-06-28T19:08:44Z",
      "updated_at": "2025-06-29T11:25:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "iamthenoname",
        "avatar_url": "https://avatars.githubusercontent.com/u/84768826?u=c50dcc82120cd118e12ac5d2bd04b40df06c4742&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgdnY",
      "number": 1928,
      "title": "Add an action to send SIGTERM (and maybe SIGKILL) to the process owner of the focused window.",
      "body": "The intention is to be able to kill the App (a-la xkill) even if it's not responding.",
      "created_at": "2025-06-29T09:23:10Z",
      "updated_at": "2025-06-29T11:03:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "leiserfg",
        "avatar_url": "https://avatars.githubusercontent.com/u/2947276?u=bef0300dde7e714eda2556e3078ca4381137eceb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aga2a",
      "number": 1912,
      "title": "Crosshairs in Niri.",
      "body": "I have made the switch from Hyprland to Niri a few weeks ago. I am still in the process of adapting everything I use to be compatible with Niri, but I have hit my second roadblock *(after weird `screenshot` behaviour)*: I cannot figure out how to make a simple red dot crosshair.\r\n\r\nI simply use `feh` that opens an image (not Wayland native, I have yet to find an alternative that is as lightweight, but it works), with appropriate window rules to float the image, remove its decorations, and round it. However, I cannot figure out how, if it is even possible, to:\r\n\r\n- Make this window specifically stay above every other one *(even fullscreen ones)*, no matter the circumstances (no need for it to be pinned across worksapces though, so https://github.com/YaLTeR/niri/issues/932 is not too relevant here)*.\r\n- And make it not able to be focused, so that it would not accidentally interfere with any other program behind it.\r\n\r\nI have read the Wiki but have not found relevant window rules for this.\r\nHere are the current window rules I have applied for it:\r\n\r\n```kdl\r\n// Window rules for the crosshair.\r\nwindow-rule {\r\n\tmatch app-id=r#\"feh$\"# title=\".*/crosshair.png$\"\r\n\topen-floating true\r\n\topacity 0.8\r\n\tblock-out-from \"screencast\"\r\n\tborder {\r\n\t\toff\r\n\t}\r\n\tfocus-ring {\r\n\t\toff\r\n\t}\r\n\tshadow {\r\n\t\toff\r\n\t}\r\n\tgeometry-corner-radius 3\r\n}\r\n```\r\n\r\nI have heard from the Matrix room that this is probably not possible without using a layer-shell based program, so, perhaps, new window rules should be implemented for that? I do want to use these kind of rules for other things as well, so it would be pretty neat.",
      "created_at": "2025-06-26T14:05:47Z",
      "updated_at": "2025-06-27T18:59:05Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Az3p7",
        "body": "You need instead to find or create an app that displays a crosshair window in the `overlay` layer.\r\n\r\nStart from choosing a widget framework: [awesome-wayland/widgets](https://github.com/rcalixte/awesome-wayland?tab=readme-ov-file#widgets-bars-panels-etc)."
      },
      "user": {
        "login": "Atemo-C",
        "avatar_url": "https://avatars.githubusercontent.com/u/160250128?u=213842e97ddd7389e69df74e93fc36f08cdf0e53&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgcCi",
      "number": 1919,
      "title": "[FR] Allow resolving bindings with respect to a fixed keyboard layout or keycode",
      "body": "Consider a scenario with the keyboard layouts `us,us(dvorak)`. Note that [Dvorak Layout](https://en.wikipedia.org/wiki/Dvorak_layout) shuffles the latin characters on the keyboard.\r\n\r\nSome keybindings might be mnemonic, such as `f` for full screen, others such as WASD or HJKL are \"positional\" (in lack of a better term). Switching between the QWERTY-layout and Dvorak layout, makes positional bindings meaningless, as their physical positions on the keyboard depend on the layout. It would be nice to \"fix\" the keyboard layout which is used to resolve Niri bindings, i.e. the Niri keybinding is independent of the currently active keyboard layout and always resolved with respect to a fixed layout.\r\n\r\nWhy do I want that?  I have configured my keybindings to be on the left-hand only, switching to a different keyboard layout puts the bindings all over the place, making these hard to reach with only one hand.\r\n\r\n### Related Work:\r\n\r\n * Sway has the `--to-code` flag for `bindsym` which translates into the corresponding keycodes in the first configured layout.\r\n * Sway has `bindcode` command which use key codes instead of key names\r\n * Hyprland has the option `resolve_binds_by_sym` which, if false, always resolves bindings with respect to the first layout.\r\n\r\n### Draft\r\n\r\nhttps://github.com/YaLTeR/niri/pull/1920 provides an implementation draft\r\n\r\n### Related issues/discussions:\r\n\r\n#1330",
      "created_at": "2025-06-27T15:24:54Z",
      "updated_at": "2025-06-27T15:42:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sbroglie",
        "avatar_url": "https://avatars.githubusercontent.com/u/218117192?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgXmO",
      "number": 1895,
      "title": "Randomizing shaders",
      "body": "Hello, I'm a part-time shader artist and I would like more diversity in shaders, please could you add support for adding multiple shaders and picking one at random when the action (for instance opening a window) is triggered ? I'd like to have this element of surprise in my compositor experience. Also controlling shaders via IPC or whatever as someone suggested in #913 would be neat.\r\nThank you for your time",
      "created_at": "2025-06-23T16:25:19Z",
      "updated_at": "2025-06-27T14:12:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "keksc",
        "avatar_url": "https://avatars.githubusercontent.com/u/92041098?u=bfb4f09710005ee67fee2d3e9c4345e445137747&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af7Xr",
      "number": 1663,
      "title": "Firefox/chromium: both transparency and a focus ring?",
      "body": "I read that the focus-ring/border is actually just a background, and that toggling `prefer-no-csd` is supposed to help getting transparency with a border, but I can't get it to work. Has anyone accomplished this with Firefox or Chromium?",
      "created_at": "2025-05-25T01:48:34Z",
      "updated_at": "2025-06-27T10:57:19Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Aylo6",
        "body": "Those two probably don't use xdg-decoration so you want https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#draw-border-with-background"
      },
      "user": {
        "login": "stelcodes",
        "avatar_url": "https://avatars.githubusercontent.com/u/22163194?u=bf91a3834139872d23c8316fe4cc026f35d191a0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgaA-",
      "number": 1908,
      "title": "move-column-to-workspace-up should be possible on first workspace",
      "body": "My expectation when using `move-column-to-workspace-up` on a column that is on the first workspace would be that all other columns (or rather: everything else) is moved one workspace down, effectively making the focused column the new workspace1 while everything else is now `workspace + 1`.",
      "created_at": "2025-06-25T20:35:06Z",
      "updated_at": "2025-06-27T07:27:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "matthiasbeyer",
        "avatar_url": "https://avatars.githubusercontent.com/u/427866?u=bff6afa0becc48e397ca2292eca04ef680dac1ca&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgVH-",
      "number": 1859,
      "title": "Keyboard input feels much laggy than gnome/hyprland",
      "body": "Keyboard input is noticeable slower. Especially repeating input. \nI tried adjust repeat-delay and repeat-rate. Same value works much smooth in hyprland",
      "created_at": "2025-06-20T02:36:12Z",
      "updated_at": "2025-06-27T02:42:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "jilen",
        "avatar_url": "https://avatars.githubusercontent.com/u/546573?u=bdcca8e8165e7b1bed27226e11a6558b2361c10a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfkZa",
      "number": 1515,
      "title": "Endless scrolling",
      "body": "Hi, would it be possible ta add, at least the option, for endless scrolling? meaning wrapping back to the left/rightmost or top/bottom window/workspace? \r\n\r\nMaybe by doing something like this in the scrolling.rs?\r\n\r\n```rust\r\nfn focus_up(&mut self) -> bool {\r\n  if self.active_tile_idx == 0 {\r\n    return self.activate_idx(self.tiles.len().saturating_sub(1));\r\n  }\r\n  \r\n  self.activate_idx(self.active_tile_idx - 1)\r\n}\r\n\r\nfn focus_down(&mut self) -> bool {\r\n  if self.active_tile_idx + 1 >= self.tiles.len() {\r\n    return self.activate_idx(0);\r\n  }\r\n  \r\n  self.activate_idx(self.active_tile_idx + 1)\r\n}\r\n\r\npub fn focus_left(&mut self) -> bool {\r\n  if self.active_column_idx == 0 {\r\n    if self.columns.is_empty() {\r\n      return false;\r\n    }\r\n    self.activate_column(self.columns.len() - 1);\r\n    return true;\r\n  }\r\n  \r\n  self.activate_column(self.active_column_idx - 1);\r\n  true\r\n}\r\n\r\npub fn focus_right(&mut self) -> bool {\r\n  if self.active_column_idx + 1 >= self.columns.len() {\r\n    if self.columns.is_empty() {\r\n      return false;\r\n    }\r\n    self.activate_column(0);\r\n    return true;\r\n  }\r\n\r\n  self.activate_column(self.active_column_idx + 1);\r\n  true\r\n}\r\n```",
      "created_at": "2025-05-03T07:10:50Z",
      "updated_at": "2025-06-26T09:23:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Mauitron",
        "avatar_url": "https://avatars.githubusercontent.com/u/150491936?u=f21f8fa0f25bdbb4e0c04ab7093504fe24bdd28a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgUeZ",
      "number": 1852,
      "title": "Niri won't start when selected from sddm login",
      "body": "\r\n\r\nHello there!\r\n\r\nSo as of recently I started configuring Niri to be my daily driver wm, but it happens to not start when selected into sddm's screen, even though it does run if i type it on a tty session or from KDE's Konsole.\r\n\r\nI compiled it myself since it is not available on Debian's repos, and it works just fine if I execute it manually, but I see it a bit inconvenient for me to require to get into a tty session to actually run the WM.\r\n\r\nOS: Debian 13 trixie (testing)\r\nKernel: 6.12\r\nDE: KDE 6.3.4\r\nWM: KWin (Wayland)\r\n\r\nEven though it is not directly related to the WM itself, I wonder if anyone could help me out to fix this situation. Thanks in advance!\r\n",
      "created_at": "2025-06-19T13:16:06Z",
      "updated_at": "2025-06-24T21:05:08Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Akirapearl",
        "avatar_url": "https://avatars.githubusercontent.com/u/69759315?u=117043787986fe036ee204192d135172650f5be4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgYeR",
      "number": 1896,
      "title": "Missing icons in `Screen Share`",
      "body": "From https://github.com/YaLTeR/niri/wiki/Screencasting, it looks like the prompt should look something like:\r\n![image](https://github.com/user-attachments/assets/9453dabb-0cdd-459c-b249-f4f1a47faed8)\r\n\r\nHowever, I have:\r\n\r\n![image](https://github.com/user-attachments/assets/fc600e5a-ce72-42fd-a43f-0d4b14283d27)\r\n\r\n\r\nI'm wondering if I'm missing some recommended packages.\r\n\r\n",
      "created_at": "2025-06-24T13:10:40Z",
      "updated_at": "2025-06-24T17:56:58Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Azvkx",
        "body": "You're not supposed to use the `:dark` variant by hand, it's not supported"
      },
      "user": {
        "login": "Moelf",
        "avatar_url": "https://avatars.githubusercontent.com/u/5306213?u=5a0f8814297057f4baf0c6c1db2407d2030cbba6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgYq2",
      "number": 1899,
      "title": "Change shader uniforms using IPC and command line",
      "body": "Was asked to make a standalone feature request for this over in issue #913.\r\n\r\nI am requesting support for updating  window shader uniforms through the IPC port, or the niri command line. Something like `niri msg action update-passive-shader [uniform] [value]` in command line. \r\n\r\nThis would allow for window shaders to react to external information. A few examples would include:\r\n- Changing the color of a window decoration based on current vim mode.\r\n- Flipping between different window decorations by setting the frame index on a flipbook shader.\r\n- Intensifying the flicker of a CRT effect at semi-randomized intervals, or in reaction to a specific change in system state.\r\n- Depending on IPC overhead, it might even be possible to do dynamic effects, like rotating a window based on current mouse velocity while it's being dragged, akin to balatro's card-dragging effects. It might not be possible to do this every frame, but might be manageable by calculating deltatime in a separate script and running at a set sample-rate.\r\n\r\nI think implementing this feature would allow for some very interesting reactive behavior, and would very much like to see it, or something like it.",
      "created_at": "2025-06-24T16:34:39Z",
      "updated_at": "2025-06-24T16:47:56Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "DraconicMentalist",
        "avatar_url": "https://avatars.githubusercontent.com/u/46231058?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgXQV",
      "number": 1887,
      "title": "Add window geometry information to IPC Window structure",
      "body": "I assumed to get window width and height (as well as current screen coordinates and workspace coordinates) when running `niri msg windows` but I got nothing to indicate window size or position.\r\n\r\nWould it be possible to add this information so I can make use of them in scripts?\r\n\r\nI propose something like this:\r\n```json\r\n{\r\n    \"id\": 13,\r\n    \"title\": \"window title\",\r\n    \"app_id\": \"app_id\",\r\n    \"pid\": 1234,\r\n    \"workspace_id\": 10,\r\n    \"is_focused\": false,\r\n    \"is_floating\": false,\r\n    \"is_urgent\": false,\r\n    \"window_size\": {\r\n        \"width\": 1920,\r\n        \"height\": 1080\r\n    },\r\n    \"screen_position\": {\r\n        \"x\": 0,\r\n        \"y\": 0\r\n    }\r\n    \"workspace_position\": {\r\n        \"x\": 1920,\r\n        \"y\": 0\r\n    }\r\n}\r\n```\r\n\r\n`window_size` represents the current window size\r\n`screen_position` represents the absolute position on the screen (This can be negative if a window is scrolled out partly on the left side or null if fully scrolled out of view)\r\n`workspace_position` represents the window position relative to the workspace origin\r\n\r\nI would also like some sort of `workspace_offset` in the Workspace data structure to indicate how much the workspace origin (basically the top left corner of left most window including gaps) is currently scrolled out.",
      "created_at": "2025-06-23T10:20:55Z",
      "updated_at": "2025-06-23T17:58:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Tordarus",
        "avatar_url": "https://avatars.githubusercontent.com/u/1444581?u=69a3821f3709bb939bb746fb78e5828ff7bf3df9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgWs6",
      "number": 1876,
      "title": "A `back-and-forth` flag to the `focus-workspace` action.",
      "body": "A `back-and-forth` flag to the focus-workspace action seems like a nice addition. so that the user can do this only for specific workspaces, on-demand.\r\n\r\nI personally want this so I can implement a concept akin to `scrathpad` workspaces present in other compositors more robustly, since there is no such thing as a `scratchpad` in niri atp. I know about the `workspace-auto-back-and-forth`  option, but it does it globally. I just want it to come into play only when I switch to my `scratchpad`. \r\n\r\nWould it be doable without much a hassle or doable at all ??",
      "created_at": "2025-06-22T16:17:52Z",
      "updated_at": "2025-06-23T17:11:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "voidstar-null",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?u=9284ed0b1e1f71e30306d1672bfc0f045ddf9003&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgUTD",
      "number": 1848,
      "title": "Configuration: Outputs: Global pattern",
      "body": "To make the configuration as much as portable possible it would be nice to have a global pattern to match any monitor connected like so:\r\n```\r\noutput {\r\n\tvariable-refresh-rate on-demand=true\r\n\tbackground-color \"#003300\"\r\n}\r\n```\r\nAlso it would be nice to have a `highest-resolution-and-refresh-rate` for the `mode` like:\r\n```\r\noutput {\r\n\tmode highest-resolution-and-refresh-rate\r\n}\r\n```\r\nso that instead of choosing the \"prefered\" value by default by the manufacturer, it would use the highest value.\r\n\r\nCombining the two of course makes any monitor connected use the best mode value possible and I think it would be a nice to have.",
      "created_at": "2025-06-19T09:19:09Z",
      "updated_at": "2025-06-23T13:21:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "RichardFevrier",
        "avatar_url": "https://avatars.githubusercontent.com/u/5154754?u=bbdab8baaf74d968b121e297c436292dc4840748&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgXV7",
      "number": 1893,
      "title": "Tab animations",
      "body": "i would like the highlighted tab indicator to slide between the tabs instead of just changing the colour\nmaybe crossfading between the old tab window and new tab window too?",
      "created_at": "2025-06-23T11:41:05Z",
      "updated_at": "2025-06-23T12:04:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nishiiko",
        "avatar_url": "https://avatars.githubusercontent.com/u/142626254?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgW5-",
      "number": 1883,
      "title": "Ability to make focus-follows-mouse only do so from focus-column* or focus-window* commands",
      "body": "Thanks for this project!\r\n\r\nI like my mouse following my keyboard for the most part, otherwise opening windows from waybar or from my app menu is awkward since the mouse jumps to their center, wonder if this would be a worthy addition.\r\n\r\nWhether it is a global setting or per keybind it would be nice.",
      "created_at": "2025-06-23T02:11:40Z",
      "updated_at": "2025-06-23T06:49:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "marcelohdez",
        "avatar_url": "https://avatars.githubusercontent.com/u/76508651?u=3d1fa07751720e81ae0a41a6bee6b94831cdb49d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgW3i",
      "number": 1882,
      "title": "Does gap have a space-around option?",
      "body": "This is an odd question, because it is rarely the behavior you want, but under certain conditions, like the grid based image used as the background here, it is exactly what you need.\r\n\r\n![image](https://github.com/user-attachments/assets/8fa75633-0b8f-4fba-9c2a-f4fb153bddae)\r\n\r\nSee how the center gap seems oddly squished? This is because the amount of the square visible there is significantly less than the side gap.\r\n\r\nTo remedy this you would have your gap doubled between windows, so each window has a gap's worth of pixels around it in all directions, regardless of other windows. Therefore between two windows you would have double the gap of space.\r\n\r\nIn the CSS specification this is achieved with the `space-around` value of the `justify-content` property. Is there a similar behavior available in Niri?",
      "created_at": "2025-06-23T00:31:10Z",
      "updated_at": "2025-06-23T00:50:13Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "bdjnk",
        "avatar_url": "https://avatars.githubusercontent.com/u/620722?u=e7a19fd45c8f1bc60cbf2712608f9d76398151c1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgOR4",
      "number": 1784,
      "title": "Add easy installation for ubuntu",
      "body": "Hey there! I would love to try this out, but I am a just a simple user with not much time to experiment.\r\nWould be amazingly awesome if there would be an easy way to install niri on ubuntu. Terminal instructions, link to a dabian package, whatever you prefer. But something that does not require things like compiling it ourselves etc.\r\n\r\nThanks and congrats for the great work!",
      "created_at": "2025-06-12T17:40:22Z",
      "updated_at": "2025-06-22T18:04:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alkismavridis",
        "avatar_url": "https://avatars.githubusercontent.com/u/3485572?u=21debd04a0fd238eadb62db753efcdee8f69042e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaUGM",
      "number": 517,
      "title": "named workspaces as dynamics",
      "body": "Heho,\r\n\r\ni switched to niri recently and it is a pleasure to work with it. I have one thing that bugs me. Coming from Hyprland/Sway my workflow resolved around creating and focusing workspaces by name.\r\n\r\nThus, creating workspaces by name with the given cli would be awesome. If this function would fit your vision, i can work/pr on the implementation with a small hint where i should start looking.\r\n\r\nKind regards\r\nAlexander",
      "created_at": "2024-07-04T16:05:32Z",
      "updated_at": "2025-06-22T17:32:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "aserowy",
        "avatar_url": "https://avatars.githubusercontent.com/u/8199164?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgWrK",
      "number": 1875,
      "title": "Is it possible for me to not let niri auto utilize nvidia dgpu ?",
      "body": "I am a vfio-passthrough user, who can use both igpu+dgpu together for different purposes as per my needs. In simple words what i do is - i isolate my nvidia dgpu from main system, so that i can use it in qemu vm machine for running windows 11 with dgpu and simultaneously work on main system(arch linux + niri) with amdgpu drivers. \r\n\r\nSo to summarize my setup - i use nvidia dpgu in vm and amd igpu for main system. It works without issues for me, but when i want to rebind my dgpu with main linux system - it is able to achieve this easily but niri takes over some memory i dont know why of dgpu suddently because of which i cant detach it and give back to vm without reboot.\r\n\r\nso is it possible to stop niri from taking my dgpu memory when i reattach it back to my main system. I dont understand like it is comfortably using amdgpu driver and operating without issue, then why does it want my dgpu vram :-(( . I know their might be some technical reason behind it, but if you can explain about this behavior and if there is any solution to stop it from utilizing dgpu, so that i can rebind according to my needs, then it will be best for me. \r\n\r\n\r\nBtw thankyou very much for this wonderful project dev",
      "created_at": "2025-06-22T15:04:22Z",
      "updated_at": "2025-06-22T15:20:15Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Greatz08",
        "avatar_url": "https://avatars.githubusercontent.com/u/55040435?u=1d3751acf272cf5597b70db85c4d0d4422740dfd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgWoA",
      "number": 1873,
      "title": "Debian package",
      "body": "Hi there, \r\ni tried several times to install Niri on cutting edge distros and always fail. I tried to build in my Debian 12 and works.\r\nI made a deb package to easy install Niri on Debian and derivates, without customization.\r\n\r\n[This is the link of the repo ](https://github.com/overbost/niri-debian)\r\n\r\nIt was very simple, check if you want to take it and add to the packages/distros list.\r\n\r\nIf there are someone who have nice and clean customization (waybar/dunst/wofi/...) i can add to another deb package so we have nice defaults",
      "created_at": "2025-06-22T13:44:32Z",
      "updated_at": "2025-06-22T13:44:33Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "overbost",
        "avatar_url": "https://avatars.githubusercontent.com/u/42868321?u=93e8341b7dc635b159b8cfb3e295be7c757accf1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgBoh",
      "number": 1701,
      "title": "Uncouple the workspace-switch animation setting from overview mode scrolling",
      "body": "I have the `workspace-switch` animation set to `off`, as I like to use named workspaces and switch between them instantly. But this setting also disables the nice scrolling animation in overview mode, and therefore less pleasant to use. Could this setting please be uncoupled from overview mode?",
      "created_at": "2025-05-31T02:31:26Z",
      "updated_at": "2025-06-21T12:21:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "chcore",
        "avatar_url": "https://avatars.githubusercontent.com/u/83099052?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgUWD",
      "number": 1849,
      "title": "All commands with monitor names should action the same",
      "body": "I've found reason to use the \"focus-monitor\" command recently and it only works using the display output value, which could be unstable. \r\n\r\nIt would be preferable if all commands dealing with output worked the same. So they could take either a display output value, or the better \"vendor model serial\" value. The consistency would be great!\r\n",
      "created_at": "2025-06-19T10:09:29Z",
      "updated_at": "2025-06-21T06:49:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "morenathan",
        "avatar_url": "https://avatars.githubusercontent.com/u/98691858?u=303cae5d64147a6376a3ebc2f37f5269a7e0ee8d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgVgg",
      "number": 1860,
      "title": "Xwayland-satellite and Integrated GPU",
      "body": "Hi, I have a laptop with hybrid graphics; namely both intel meteor lake and an nvidia 4060 mobile, when i run nvtop it shows only niri running on the nvidia card and all xwayland processes including steam and minecraft running on the iGPU. I'm not really sure where to start with this issue so any help would be much appreciated\r\n\r\nEdit:\r\nafter looking some more I believe that niri is open on both GPUs but it appears to be rendering all applications using the iGPU so perhaps it is a niri configuration and not an X11/Xwayland one",
      "created_at": "2025-06-20T14:32:37Z",
      "updated_at": "2025-06-20T15:14:33Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Yolsh",
        "avatar_url": "https://avatars.githubusercontent.com/u/146455868?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgTOn",
      "number": 1838,
      "title": "Clipboard-like window managment in overview mode",
      "body": "Hi! this project is really cool and I can't express how much I like niri.\r\nWith the new overview feature, it would be really cool if you can move windows by something like:\r\n- Switch to overview\r\n- Focus on a window\r\n- Use a hot key (let's say ctrl+x)\r\n- Window gets highlighted indicating that it has been \"stored\" in some kind of buffer \r\n- Move to a different workspace/position\r\n- Use another hot key (say, ctrl+v)\r\n- Said window moves there!\r\nCan probably be extended even more with something like selecting multiple windows.\r\n",
      "created_at": "2025-06-18T08:14:34Z",
      "updated_at": "2025-06-20T12:21:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "doomed-neko",
        "avatar_url": "https://avatars.githubusercontent.com/u/79870712?u=1094ff242dc3cc90867addf44a5cf27436e8082e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af13P",
      "number": 1617,
      "title": "Thanks for niri",
      "body": "I own a dell latitude e4310 (mesa crocus for Ironlake mobile GPU stuck to OpenGL 2.1 and GL ES 2.0 common in late core2 and first gen i5 era)\r\n\r\nThanks for still supporting GL ES 2.0 and still have nice smooth animations.\r\n\r\nAnd the \"windows management mechanics\" are awesome as well.\r\nOther stuff I tried with animations felt sluggish (even if gnome triple buffering somehow helped) and I would have found sad not to be able to have some basic windows and namespace switch animations.\r\n\r\nOtherwise I would have been stuck with non animated old feeling wm or x11 only legacy desktops.\r\n\r\nSo thanks again.\r\nniri works fine and and prolong my laptop's (which is still fine for many things) desktop life.",
      "created_at": "2025-05-19T19:46:01Z",
      "updated_at": "2025-06-20T11:45:10Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "naguam",
        "avatar_url": "https://avatars.githubusercontent.com/u/27785393?u=dd0a76ab915ab0438bebdcdef38d793433da570b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgVGf",
      "number": 1858,
      "title": "Swap Ctrl and Alt Key",
      "body": "Hey, i would like to swap the Ctrl and Alt key. i believe thats what the `keyboard.xkb.options` option is for, but i cant figure out how to do it.",
      "created_at": "2025-06-20T07:09:51Z",
      "updated_at": "2025-06-20T11:38:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Azmr4",
        "body": "```kdl\r\ninput {\r\n  keyboard {\r\n    xkb {\r\n      options \"ctrl:swap_lalt_lctl,ctrl:swap_ralt_rctl\"\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nFound in `man xkeyboard-config`."
      },
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgQ-y",
      "number": 1821,
      "title": "Transparent overview",
      "body": "Right now overview blocks the wallpaper. It'll be nice to see it.\r\n\r\nIt'll be nice to be able to make everything semitransparent during overview, as now it blocks the view\r\n\r\n![wallpaper is blocked by overview](https://github.com/user-attachments/assets/1ef616af-2eb6-4a02-aafa-998eb230a8bc)\r\n\r\n\r\n\r\n",
      "created_at": "2025-06-16T12:20:31Z",
      "updated_at": "2025-06-20T08:00:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Maykeye",
        "avatar_url": "https://avatars.githubusercontent.com/u/13607441?u=ee818d192472a91a570ad8d6baf33a83d2a1b899&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgUsV",
      "number": 1854,
      "title": "Exclusive fullscreen",
      "body": "Could be a good feature for gamers because FSE like on Windows reduces latency and in some cases increases FPS.",
      "created_at": "2025-06-19T17:07:21Z",
      "updated_at": "2025-06-19T17:31:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "shibahaczix",
        "avatar_url": "https://avatars.githubusercontent.com/u/97233130?u=879e0958f05a22e795b74c81979c7d5aed653a5d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgT9d",
      "number": 1845,
      "title": "Fuzzel is starting covering the whole screen",
      "body": "Hi everyone,\r\n\r\nI have the following code in my config to open fuzzel:\r\n\r\n```kdl\r\nMod+D { spawn \"fuzzel\" \"--width=20\"; }\r\n```\r\n\r\nHowever, fuzzel starts covering the whole screen, instead of respecting the defined width. Do any of you have this issue? How can I fix this?\r\nThanks!",
      "created_at": "2025-06-19T00:21:58Z",
      "updated_at": "2025-06-19T14:04:13Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "cristobaltapia",
        "avatar_url": "https://avatars.githubusercontent.com/u/7276493?u=efe15a91b8439d96e19d8a4132b6994940448df9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgUa7",
      "number": 1851,
      "title": "allow for App-id to be used where the window id's are currently used",
      "body": "In some situations that you need to handle windows with scripts/automation the ID format becomes very limiting since it doesn't retain the same behavior, if i want to have alacritty in workspace 11, but move it to my current workspace, and them move it back to 11 its not possible consistently, since the ID changes every time a window is spawned (just an example about it)",
      "created_at": "2025-06-19T12:08:50Z",
      "updated_at": "2025-06-19T12:18:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "luizansounds",
        "avatar_url": "https://avatars.githubusercontent.com/u/114603943?u=feb8db1cc6755f5942f36ea226fc33045d5fcdca&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgO8M",
      "number": 1787,
      "title": "Focus on Urgent",
      "body": "Windows shall be focused once they have requested to be,\r\nor just add an \"became urgent\" event to the eventstream\r\n",
      "created_at": "2025-06-13T12:18:00Z",
      "updated_at": "2025-06-19T10:29:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "RQuarx",
        "avatar_url": "https://avatars.githubusercontent.com/u/117576142?u=bbbc97ae6e391096ad7ac33f10648a3b80acdc32&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgTxX",
      "number": 1843,
      "title": "IPC: Add window's fullscreen state",
      "body": "Hi, thanks a lot for this great compositor, I've been feeling really comfortable with it!\r\n\r\nI'm migrating some of my scripts to niri. Is it possible to add a field to [`niri_ipc::Window`](https://yalter.github.io/niri/niri_ipc/struct.Window.html) to indicate whether a window is in not-fullscreen/windowed-fullscreen/fullscreen state?",
      "created_at": "2025-06-18T18:19:45Z",
      "updated_at": "2025-06-19T06:53:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nghialm269",
        "avatar_url": "https://avatars.githubusercontent.com/u/13317164?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeFJJ",
      "number": 1060,
      "title": "Floating: relative to scrolling",
      "body": "related to #871.\r\n\r\nthe idea is that you can toggle if a floating window should scroll with the rest with a window rule and/or a keyboard shortcut.\r\nthis is only an idea, but i think it would be a good feature, also for popups of tiled windows.",
      "created_at": "2025-01-28T12:22:40Z",
      "updated_at": "2025-06-18T16:58:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgQeW",
      "number": 1812,
      "title": "How do you disable notifcations for screenshots?",
      "body": "I'm doing programmatically invoking `niri msg action {screenshot-screen/screenshot-window/screenshot} -p false -d false` reading from clipboard and performing OCR, but I don't want the notification pup-ops to interfere, it's also annoying to have to click them away.",
      "created_at": "2025-06-16T00:54:32Z",
      "updated_at": "2025-06-18T14:27:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzeD-",
        "body": "In swaync, screenshot notifications can be disabled by putting this into `.config/swaync/config.json`:\r\n\r\n```json\r\n\"notification-visibility\": {\r\n  \"niri screenshots\": {\r\n    \"app-name\": \"niri\",\r\n    \"summary\": \"Screenshot captured\",\r\n    \"state\": \"ignored\"\r\n  },\r\n}\r\n```"
      },
      "user": {
        "login": "codecnotsupported",
        "avatar_url": "https://avatars.githubusercontent.com/u/2294209?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgTXH",
      "number": 1840,
      "title": "Global fullscreen",
      "body": "Hi, I'm really liking niri and have been daily-driving it recently but I did hit the same 'wall' that made me drop hyprland and few others I've tried to date. Would it be possible to implement a 'global fullscreen' option as in i3 and sway?\r\n\r\nMy use-case is 'simple', or even minor, for I believe, most people, but a really crucial to be actually a real daily-driver - Citrix workspace used for remote work - when in 'global fullscreen', it allows to fullscreen the application on all attached monitors instead of on the only current one, without this option only one monitor is available in the connected VMs - so you're essentially wasting all available attached monitors during the working hours (also, as a side-note: additional monitors that are not in 'work mode' do tempt to do something else on them other than actually work... :sweat_smile: )\r\n\r\nHere's the relevant sway pr that introduced the function sometime in 2019: https://github.com/swaywm/sway/pull/3423\r\n\r\nI do understand it may be a bit of a stretch to ask for, as it seems each monitor to be totally separate 'entity' in niri, but still worth a try.\r\n\r\nThanks!",
      "created_at": "2025-06-18T10:42:50Z",
      "updated_at": "2025-06-18T10:44:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "teohz",
        "avatar_url": "https://avatars.githubusercontent.com/u/77596774?u=5725277f7e87cd7599e9c95a73651b792914324e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgTMR",
      "number": 1836,
      "title": "Focus column cycle?",
      "body": "This is my config:\r\n    Alt+Tab {\r\n        focus-column-left\r\n    }\r\n    Ctrl+Tab {\r\n        focus-column-right\r\n    }\r\n\r\nMy working space  usually has only two or three Windows. I want to use Alt+Tab to focus to the right and then go back to the first one when it's the last one. Is there any configuration that can achieve this? thanks.",
      "created_at": "2025-06-18T07:40:57Z",
      "updated_at": "2025-06-18T08:49:33Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Azhd1",
        "body": "can use focus-column-right-or-first, sorry."
      },
      "user": {
        "login": "obmutescences",
        "avatar_url": "https://avatars.githubusercontent.com/u/29330637?u=2d7b6f2494d0a25b312178edc2bae4618b95680d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgTNu",
      "number": 1837,
      "title": "Focus-on-startup seems that doesn't work",
      "body": "I have 2 monitors and today I changed the first(main monitor) which is connected to DP while the second is connected to HDMI.\r\nAfter the change the workspaces switched and startup applications started to open to second monitor.\r\nI changed the configuration to specify the resolutions, positions etc. This is the section:\r\n```\r\noutput \"DP-3\" {\r\n    // off\r\n    mode \"1920x1080\"\r\n    // scale 1.3\r\n    // transform \"90\"\r\n    position x=0 y=0\r\n    variable-refresh-rate\r\n    // on-demand=true\r\n    focus-at-startup\r\n    background-color \"#003300\"\r\n    backdrop-color \"#001100\"\r\n}\r\n\r\noutput \"HDMI-A-1\" {\r\nmode \"1680x1050\"\r\nposition x=1920 y=0\r\n}\r\n```\r\n\r\nI also checked the config file and commented out any related configuration for outputs. But still the workspaces which used to be on the first monitor are on the second and also on when niri starts the cursor is on the second monitor and startup applications start there too.  Isn't \"focus-on-startup\" set this?\r\nDo I need to add some other configuration?",
      "created_at": "2025-06-18T08:00:57Z",
      "updated_at": "2025-06-18T08:00:57Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "dancaer69",
        "avatar_url": "https://avatars.githubusercontent.com/u/43911684?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgR_B",
      "number": 1827,
      "title": "Window Filter in Workspace Overview",
      "body": "Niri looks really cool!\r\n\r\nOne thing I looked for but didn't find in Niri is the ability to filter windows by title/class in the Workspace Overview. I've found this is to be really a killer feature when you have a lot of open windows across different workspaces (especially when you update terminal titles to include the last issued command).\r\n\r\nHere's a screengrab of the feature in action on my plasma desktop:\r\n\r\nhttps://github.com/user-attachments/assets/d392824b-9d42-4c7e-bb0b-42ad8e9d3f97\r\n\r\nI think this feature would be a great addition to Niri.\r\n",
      "created_at": "2025-06-17T11:06:56Z",
      "updated_at": "2025-06-17T11:06:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mgrachten",
        "avatar_url": "https://avatars.githubusercontent.com/u/1051212?u=12c2138e521d6614a1ed55fde7d208907f7bcac4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgR6X",
      "number": 1826,
      "title": "Maximize to number of columns",
      "body": "Setting number of columns that should be shown on screen.\r\nthis could be done using keybind actions.\r\n\r\nso: select 2 columns, and current column and the column right to it (or left to it if there is none) get resized to fit screen size.\r\nscrolling could still be implemented by resizing windows automatically when scroilng.\r\n\r\nthis would *kind of* implement classic tiling while keeping scrolling.",
      "created_at": "2025-06-17T09:35:07Z",
      "updated_at": "2025-06-17T09:35:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgQI5",
      "number": 1807,
      "title": "Bind a shortcut to move a (floating) window by an offset",
      "body": "Is there a way to bind a shortcut that would move a floating window by an X/Y offset?\r\nExample:\r\n`Mod+Left { move-window-by-offset x=-5% y=100 }` move the window -5% window width on X, -100px on Y\r\n`Mod+Right { move-window-by-offset x=50 y=0 }` move the window 50px X, 0px on Y.",
      "created_at": "2025-06-15T13:42:45Z",
      "updated_at": "2025-06-16T18:45:30Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "rdbo",
        "avatar_url": "https://avatars.githubusercontent.com/u/57117082?u=e4e4f26d1509bb4d50b240e032c7a7cbbf14e645&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgQwS",
      "number": 1814,
      "title": "Headless Output",
      "body": "It would be possible to expose (and apparently finalize) the already available API for headless output. A similar command, like Hyprland's 'hyprctl output create [backend] (name)' or Sway's 'swaymsg create_output', would be valuable. The source code comments suggest this functionality is possible. I think this would be a very useful feature.",
      "created_at": "2025-06-16T08:28:32Z",
      "updated_at": "2025-06-16T16:02:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "0xjmz",
        "avatar_url": "https://avatars.githubusercontent.com/u/11503535?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgPtV",
      "number": 1801,
      "title": "Opacity smooth shift",
      "body": "One annoying thing with opacity is that when it is for example only on non-focused window when I switch the focus to a window it brightens suddenly if it is light themed, which makes a kindof flash. Please add smooth transition and maybe customizations for how its interpolated if you do it this way, for example lerp, bezier etc. I think Hyprland has it already because it didnt strike me there.\r\n\r\n\r\nhttps://github.com/user-attachments/assets/c689f3eb-91cb-460b-a23d-2f762d2cfa53\r\n\r\nIf you want I could share a video of how it looks on Hyprland.\r\n\r\n",
      "created_at": "2025-06-14T16:32:08Z",
      "updated_at": "2025-06-16T11:59:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "keksc",
        "avatar_url": "https://avatars.githubusercontent.com/u/92041098?u=bfb4f09710005ee67fee2d3e9c4345e445137747&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgQwy",
      "number": 1816,
      "title": "Support input methods (ibus, fcitx5)",
      "body": "Please support input methods (like ibus, fcitx5).",
      "created_at": "2025-06-16T08:37:53Z",
      "updated_at": "2025-06-16T11:21:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "hongquan",
        "avatar_url": "https://avatars.githubusercontent.com/u/314607?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZwia",
      "number": 411,
      "title": "Events IPC",
      "body": "I would like to suggest a separate, read-only Events IPC socket. This is something that the [Hyprland compositor provides](https://github.com/hyprwm/hyprland-wiki/blob/c56516109eea6dabd64d99c03ae4b0869a2612d4/pages/IPC/_index.md#xdg_runtime_dirhyprhissocket2sock).\r\n\r\nAll events can be monitored by watching this socket. This would allow bars that have no plans to implement Wayland protocols to retrieve status changes immediately and efficiently. In particular, [Eww](https://github.com/elkowar/eww) is the bar I currently use. It has [a listening mechanism](https://elkowar.github.io/eww/configuration.html), `deflisten`, that monitors the output of a command and updates the bar UI.\r\n\r\nIn summary, if Niri had a read-only Events IPC, I would then be able to use the `socat` utility to extract and parse whatever Niri state I would like. It is lightweight and responsive method. My only use case at the moment is for workspaces status and focused window titles, but I am sure others would leverage this to suit their needs.\r\n\r\nRelated discussions and issues:\r\n* https://github.com/YaLTeR/niri/discussions/209\r\n* https://github.com/YaLTeR/niri/issues/135",
      "created_at": "2024-05-30T16:08:25Z",
      "updated_at": "2025-06-16T11:04:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mentalblock",
        "avatar_url": "https://avatars.githubusercontent.com/u/1371873?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgP4y",
      "number": 1802,
      "title": "[Feature request] Create *previous* workspace even if current workspace is numbered 1",
      "body": "So users can have parallel workspaces to their main ones both on top and bottom. Niri doesn't have scratchpad, but I think there's a better solution.\r\n`focus-window-or-workspace-up` should work just like `f-w-o-w-DOWN` that it creates a new workspace.\r\n\r\nUsecase: instead of having two terminal windows side by side, one with editor other to run/build/test/etc, I got used to having a floating terminal window to run commands that I'd send to scratchpad when I wanted to edit code and invoke it back should I need it again. With niri I have my scratchpad below my workspace and I'd like to have one above as well for other things like launching a VPN or opening a scratch buffer to save my notes, or open a REPL or do something else that I wouldn't like to get mixed with my primary (interpret as only) workspace while I treat my other workspaces as scratchpads.",
      "created_at": "2025-06-15T02:04:29Z",
      "updated_at": "2025-06-16T10:35:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {}
    },
    {
      "id": "D_kwDOKFkxdc4AgPf_",
      "number": 1796,
      "title": "Expose tablet pen-to-screen mapping (and possibly other input options) via ipc",
      "body": "Hi!\r\n\r\nIt would be nice to expose input options like tablet mapping via ipc. I have a drawing tablet and multiple displays and used to map pen to the different displays on-the-fly with custom script that I wrote for Sway but after switching to Niri I struggled to adapt my script because there's no such ipc commands and all that I can do now — dynamically update `config.kdl` every time rewriting `tablet` section",
      "created_at": "2025-06-14T07:37:42Z",
      "updated_at": "2025-06-16T06:39:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "eepysillycat",
        "avatar_url": "https://avatars.githubusercontent.com/u/202458474?u=392424d1377c4f7204ab416f0ef7fcf1f513a472&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdZ8e",
      "number": 879,
      "title": "Do someone have any ideas that can set wallpapers on Niri ? Possibly using 'feh' or 'swww'",
      "body": "I just switch WM from sway to Niri, I have no idea how to set the wallpapers on Niri, Please offer me proper advices",
      "created_at": "2024-12-18T13:40:16Z",
      "updated_at": "2025-06-15T23:01:03Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "gentrywang",
        "avatar_url": "https://avatars.githubusercontent.com/u/74128201?u=1f743d700158ca7b3e8840f55c5cb11a87bf0e6e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgNRl",
      "number": 1775,
      "title": "Allow focusing on activated windows",
      "body": "It would be cool if we could get an option to enable auto-focusing on any activated window so that e.g. clicking a notification or clicking a link in an app would auto-focus on the window that activated (where on GNOME a notification would be sent to click on)",
      "created_at": "2025-06-11T18:27:40Z",
      "updated_at": "2025-07-15T06:54:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "marcelohdez",
        "avatar_url": "https://avatars.githubusercontent.com/u/76508651?u=3d1fa07751720e81ae0a41a6bee6b94831cdb49d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgLvm",
      "number": 1761,
      "title": "Move focus between overflowing windows without moving viewport",
      "body": "I often have two windows that are overflowing the monitor and I want to copy/paste or compare them, in such a setting I want to somehow pause the behavior that attempts to keep focused window on the monitor. I.e. to keep viewport intact on the below picture.\r\n\r\n\r\n![0e22a9a7-f206-42aa-a753-893f083eb6cc](https://github.com/user-attachments/assets/9fe06db2-e925-4c97-a2eb-51fb634f37f0)\r\n\r\n",
      "created_at": "2025-06-10T10:07:57Z",
      "updated_at": "2025-06-14T06:20:47Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzMUA",
        "body": "There's no way to lock the viewport for now, it will always scroll to the focused window. In these cases I usually try to resize them to fit the viewport"
      },
      "user": {
        "login": "dolzenko",
        "avatar_url": "https://avatars.githubusercontent.com/u/43391?u=f95ea25a9a74393abd99b0dbddb4539bcbe42050&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgPRu",
      "number": 1793,
      "title": "RuntimeDirNotSet",
      "body": "I setup everything manually so I think something is wrong with my niri.service not setting RuntimeDir .. XDG_RUNTIME_DIR?\r\n\r\nI'm running Debian and my niri.service looks like, the following, I don't have a 'graphical-session' service. Any thoughts?\r\n\r\n  1 [Unit]\r\n  2 Description=A scrollable-tiling Wayland compositor\r\n  3 BindsTo=graphical.target\r\n  4 Before=graphical.target\r\n  5 Wants=graphical-pre.target\r\n  6 After=graphical-pre.target\r\n  7\r\n  8 Wants=xdg-desktop-autostart.target\r\n  9 Before=xdg-desktop-autostart.target\r\n 10\r\n 11 [Service]\r\n 12 Slice=session.slice\r\n 13 Type=notify\r\n 14 ExecStart=/usr/bin/niri --session\r\n\r\n\r\n\r\nJun 13 15:31:34 joetoth44 niri[40741]: 2025-06-13T19:31:34.861356Z  INFO niri: starting version 25.05.1 (v25.05.1-29-gf3f6e79e)\r\nJun 13 15:31:34 joetoth44 niri[40741]: 2025-06-13T19:31:34.879211Z DEBUG niri_config: loaded config from \"/root/.config/niri/config.kdl\"\r\nJun 13 15:31:35 joetoth44 niri[40741]: 2025-06-13T19:31:35.171988Z  INFO niri::backend::tty: using as the render node: \"/dev/dri/renderD128\"\r\nJun 13 15:31:35 joetoth44 niri[40741]: thread 'main' panicked at src/niri.rs:2425:67:\r\nJun 13 15:31:35 joetoth44 niri[40741]: called `Result::unwrap()` on an `Err` value: RuntimeDirNotSet\r\nJun 13 15:31:35 joetoth44 niri[40741]: stack backtrace:\r\nJun 13 15:31:35 joetoth44 niri[40741]:    0: rust_begin_unwind\r\nJun 13 15:31:35 joetoth44 niri[40741]:              at ./rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58/library/std/src/panicking.rs:665:5\r\nJun 13 15:31:35 joetoth44 niri[40741]:    1: core::panicking::panic_fmt\r\nJun 13 15:31:35 joetoth44 niri[40741]:              at ./rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58/library/core/src/panicking.rs:76:14\r\nJun 13 15:31:35 joetoth44 niri[40741]:    2: core::result::unwrap_failed\r\nJun 13 15:31:35 joetoth44 niri[40741]:              at ./rustc/e71f9a9a98b0faf423844bf0ba7438f29dc27d58/library/core/src/result.rs:1699:5\r\nJun 13 15:31:35 joetoth44 niri[40741]:    3: unwrap<smithay::wayland::socket::ListeningSocketSource, wayland_server::socket::BindError>\r\nJun 13 15:31:35 joetoth44 niri[40741]:              at ./home/joetoth/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/result.rs:1104:23\r\nJun 13 15:31:35 joetoth44 niri[40741]:    4: {closure#8}\r\nJun 13 15:31:35 joetoth44 niri[40741]:              at ./home/joetoth/projects/niri/src/niri.rs:2425:33\r\nJun 13 15:31:35 joetoth44 niri[40741]:    5: then<std::ffi::os_str::OsString, niri::niri::{impl#5}::new::{closure_env#8}>\r\nJun 13 15:31:35 joetoth44 niri[40741]:              at ./home/joetoth/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/bool.rs:61:24\r\nJun 13 15:31:35 joetoth44 niri[40741]:    6: new\r\nJun 13 15:31:35 joetoth44 niri[40741]:              at ./home/joetoth/projects/niri/src/niri.rs:2424:49\r\nJun 13 15:31:35 joetoth44 niri[40741]:    7: new\r\nJun 13 15:31:35 joetoth44 niri[40741]:              at ./home/joetoth/projects/niri/src/niri.rs:651:24\r\nJun 13 15:31:35 joetoth44 niri[40741]:    8: main\r\nJun 13 15:31:35 joetoth44 niri[40741]:              at ./home/joetoth/projects/niri/src/main.rs:178:21\r\nJun 13 15:31:35 joetoth44 niri[40741]:    9: call_once<fn() -> core::result::Result<(), alloc::boxed::Box<dyn core::error::Error, alloc::alloc::Global>>, ()>\r\nJun 13 15:31:35 joetoth44 niri[40741]:              at ./home/joetoth/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5\r\nJun 13 15:31:35 joetoth44 niri[40741]: note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.\r\nJun 13 15:31:35 joetoth44 systemd[1]: niri.service: Main process exited, code=exited, status=101/n/a",
      "created_at": "2025-06-13T19:50:24Z",
      "updated_at": "2025-06-14T06:10:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "joetoth",
        "avatar_url": "https://avatars.githubusercontent.com/u/13778?u=ac99fb1f92d116335162efc86f6c1612e97b4bc2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgO9f",
      "number": 1789,
      "title": "Window Rule for all Godot Debug Windows",
      "body": "When working in Godot and previewing a scene it opens up a window with something like this:\r\n```\r\nWindow ID 127:\r\n  Title: \"my_game (DEBUG)\"\r\n  App ID: \"my_game\"\r\n  Is floating: no\r\n  PID: 3407\r\n  Workspace ID: 6\r\n```\r\n\r\nI'm trying to implement a rule that opens the window on top of Godot like so:\r\n```\r\nwindow-rule {\r\n    match title=r#\"^.*\\(DEBUG\\)$\"#\r\n    open-floating true\r\n    default-floating-position x=0 y=20 relative-to=\"top\"\r\n    default-column-width { fixed 1280; }\r\n    default-window-height { fixed 720; }\r\n}\r\n```\r\n\r\nIf I want to make it generic I can't use the app-id. The only thing that stays consistent for all windows is the `(DEBUG)` part.\r\n\r\nBut for some reason this doesn't work. Could it be that the window title is set too late by Godot itself?",
      "created_at": "2025-06-13T12:50:54Z",
      "updated_at": "2025-06-13T12:57:57Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzWWT",
        "body": "> Could it be that the window title is set too late by Godot itself?\r\n\r\nYes. I suggest using one of the dynamic floating scripts or tools that people have been posting in Discussions"
      },
      "user": {
        "login": "sommerper",
        "avatar_url": "https://avatars.githubusercontent.com/u/1512048?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgMV7",
      "number": 1764,
      "title": "[Feature] spawn-on-reload-success",
      "body": "An option to spawn something upon a sucessful reload. This can be used to change backgrounds dynamically, reload ststus bars, reload idle configs etc. An option to spawn upon a failed reload would also be nice to customize messages but is not as important",
      "created_at": "2025-06-10T22:28:48Z",
      "updated_at": "2025-06-13T09:57:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Set2Minecraft",
        "avatar_url": "https://avatars.githubusercontent.com/u/75960074?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgOl0",
      "number": 1785,
      "title": "How to debug key bindings?",
      "body": "Hi,\r\n\r\nI have a binding to start a new `emacsclient` instance. This binding works well on `hypr` and `sway`. For some reason in `niri` it doesn't want to work. If I run `emacsclient -c` from `fuzzel` or a terminal, a new `emacs` starts up as expected, but when running from a binding with `spawn \"emacsclient -c\";` doesn't do anything.\r\n\r\nIs there any way to debug what might be going on? `emacs` is running as a `add-wants` service using `systemd`.",
      "created_at": "2025-06-13T04:19:12Z",
      "updated_at": "2025-12-11T20:44:44Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "felipebalbi",
        "avatar_url": "https://avatars.githubusercontent.com/u/45936891?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgNiV",
      "number": 1777,
      "title": "Does anyone have tried a bar different than waybar in niri?",
      "body": "I've recently switched from dwl to niri and the concept seems appealing, my previous WM was working with  `dwlb` and a script I spent a questionable amount of time to fit my needs, here in niri I tried to launch the with the directive from `~/.config/niri/config.kdl`\r\n\r\n```kdl\r\nspawn-at-startup \"/usr/local/bin/dwlb\"\r\n```\r\n\r\nhowever if I launch the directive\r\n```kdl\r\nspawn-at-startup \"foot\" \"dwlb\"\r\n```\r\n\r\nthe bar appears with the cost of having to keep a foot window open during the session.\r\nDoes anyone have experienced the same with another bar? or there is a way to launch my bar without having to use foot?\r\nIf possible I would also would like to understand what changes between both startup calls",
      "created_at": "2025-06-12T02:23:56Z",
      "updated_at": "2025-06-13T02:33:22Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "jvech",
        "avatar_url": "https://avatars.githubusercontent.com/u/64784774?u=33d7d0207bd86ce579056867d8f0cf0e9687f40e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgN7d",
      "number": 1782,
      "title": "Exclude bottom layer from zooming out in overview, or moving shell components between layers",
      "body": "This would allow for bottom-layer things like conky or bars (that do not have space reserved) to remain behind windows during normal usage, and visible in the overview.\r\n\r\nIn the same interest of reusing components, I was also wondering if they could be (temporarily) moved to other layers, for example, to be displayed over other programs like fuzzel or rofi, similar to how on X11 it was possible for someone to move windows to the top/bottom of the window stack (e.g., conky displaying over rofi or i3lock).",
      "created_at": "2025-06-12T11:17:22Z",
      "updated_at": "2025-06-12T16:06:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "aoyamajia",
        "avatar_url": "https://avatars.githubusercontent.com/u/39614559?u=d77e6d9a663d254155cff6d0f9c5d249637ee390&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeggU",
      "number": 1159,
      "title": "Add default-tiled-position",
      "body": "currently when you open a new tiled window, it always spawns to the right of the currently focused window. I think it would be nice to have the option to change this behavior. Some possibilities are:\r\n\r\nbefore-focused-column - adds the window to a new column before the focused column\r\n\r\nafter-focused-column - adds the window to a new column after the focused column (current behaviour)\r\n\r\nabove-focused-window - adds the window to the same column as the focused window, positioning it above it\r\n\r\nbelow-focused-window - adds the window to the same column as the focused window, positioning it above it\r\n\r\nmouse-direction-from-focus -  chooses one of the above options depending on where the mouse is positioned relative to the focused window (e.g. if the mouse is to the right of the focused window, it will choose \"after-focused-column\")\r\n\r\nto-end - adds the window to the end of the carousel\r\n\r\nto-beginning - adds the window to the beginning of the carousel",
      "created_at": "2025-02-21T08:41:44Z",
      "updated_at": "2025-06-12T06:56:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alicealysia",
        "avatar_url": "https://avatars.githubusercontent.com/u/35021050?u=ded3a507afc26687bb40b8db245903fae47fc2cc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgMhh",
      "number": 1767,
      "title": "Virtual Keyboards.",
      "body": "Does anyone have any good virtual keyboards for Niri? I've tried using wvkbd as I've done on other compositor but every time I press a key I get this error: `zwp_virtual_keyboard_v1#16: error 0: modifiers sent before keymap.\r\nWayland socket has been disconnected.` and then wvkbd quits.",
      "created_at": "2025-06-11T05:10:57Z",
      "updated_at": "2025-06-12T02:38:55Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzRWV",
        "body": "Probably has to do with this.\r\nhttps://github.com/YaLTeR/niri/issues/403"
      },
      "user": {
        "login": "Sempyos",
        "avatar_url": "https://avatars.githubusercontent.com/u/78216633?u=4c5f7b3623c95f6ee9798c5c59658869bce96c71&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgNGo",
      "number": 1774,
      "title": "How to do automatic monitor power off?",
      "body": "Hi there, I have a Manjaro/KDE/Wayland Plasma  installation that I installed Niri on.  KDE System Settings / Power management does not work, it gives 'Kscreen not started'.  I read a lot on sway yesterday based on an earlier thread here but when I finally got it started and configured properly but now the sway daemon won't start and gives an error telling me to set XDG_RUNTIME_DIR=/run/user/1000 which is already set.  When I run swayidle itself to send the swaymsg, I get an error that the socket file is not found in /run/user/1000 and sure enough it isn't there.  I also get the socket error when I run anything with swaymsg.\r\n\r\nI just want my monitors to shut off after 10 minutes and then resume on a keypress.  Can anyone help?  I have been long struggling to find a WM that works how I work and Niri is perfect for my needs other than this.   Thank you.",
      "created_at": "2025-06-11T15:06:54Z",
      "updated_at": "2025-06-11T17:12:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "malibu1966",
        "avatar_url": "https://avatars.githubusercontent.com/u/69011653?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgMvm",
      "number": 1771,
      "title": "spawn-at-startup inconsistent",
      "body": "I'm having some issue with spawn-on-startup. Sometimes some of them simply won't start when the session starts.\r\n\r\n These are my spawn-at-startup:\r\n\r\n```\r\nspawn-at-startup \"/nix/store/m3cbs4i4wx8y3jxkpfqz5qgnlf794hir-xwayland-satellite-0.5.1/bin/xwayland-satellite\"\r\nspawn-at-startup \"/nix/store/iqgh8ahagk9nwk5f5phjrf724nngsjgx-albert-0.27.8/bin/albert\"\r\nspawn-at-startup \"/nix/store/67d9m97vncd3lfm2yfyy6n7vyc78wmhl-valent-1.0.0.alpha.46-unstable-2024-10-26/bin/valent\" \"--gapplication-service\"\r\nspawn-at-startup \"/nix/store/76jvna4jq5qqxv1nhzaz8f19bp306rlf-wbg-1.2.0/bin/wbg\" \"/nix/store/b68xvlfdradadm67fgjv8c1d3xf33n93-logit.jpg\"\r\nspawn-at-startup \"/nix/store/byk85j6108618kybgqjh784yqrmc90gc-slack-4.42.120/bin/slack\"\r\nspawn-at-startup \"/nix/store/m8n7zklmdnn22y4r7avpyrg1j5752kk7-teams-for-linux-2.0.13/bin/teams-for-linux\"\r\n```\r\n\r\nIt affects specially the graphical ones (teams / slack / albert)\r\n\r\nNiri has been installed and enabled via nixos official repo option ( programs.niri.enable = true; ) and my config is just a  home-manager .file.\".config/niri/config.kdl\".text thingy. \r\n\r\nAny one faced that before ? ",
      "created_at": "2025-06-11T09:30:50Z",
      "updated_at": "2025-06-11T14:50:23Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzP3r",
        "body": "Yes, it's because they need xwayland-satellite and it hasn't started yet.\r\n\r\nThis is solved if you install git niri and xwayland-satellite (and remove manual startup and DISPLAY config)."
      },
      "user": {
        "login": "lamarios",
        "avatar_url": "https://avatars.githubusercontent.com/u/1192563?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfuVo",
      "number": 1565,
      "title": "max-width didn't take effect immediately.",
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nhttps://github.com/user-attachments/assets/3035dcc6-4bda-45a5-b283-b70bc7298fd9\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n```kdl\nwindow-rule {\n    match is-floating=true\n\n    focus-ring {\n        off\n    }\n\n    border {\n        on\n        width 2\n    }\n\n    // BUG: firefox 不会立即改变大小，需要移动窗口\n    // logic 1440x900\n    max-width 1152 // 80%\n    max-height 720 // 80%\n}\n```\n\n[full config](https://github.com/colorsakura/dotfiles/blob/307a7f617c4035e8f522b38173d7f2de53aeeb9a/config/niri/config.kdl#L150)\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.02\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\n",
      "created_at": "2025-04-25T11:49:07Z",
      "updated_at": "2025-06-11T12:44:57Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "colorsakura",
        "avatar_url": "https://avatars.githubusercontent.com/u/32534829?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgKau",
      "number": 1751,
      "title": "Google Chrome and Gnome Keyring",
      "body": "Hello everyone,\r\n\r\nBefore using Niri, I was using GNOME.\r\nI use Google Chrome every day for my daily tasks.\r\nAfter switching to Niri, my Google Chrome session was not restored, and I had to log in again to every site where I was previously logged in.\r\n\r\nI want to switch to Niri from GNOME without losing my Google Chrome session. Is that possible?\r\n\r\nThanks you",
      "created_at": "2025-06-09T03:06:22Z",
      "updated_at": "2025-06-11T05:05:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzI9-",
        "body": "I found a solution: I need to use `--password-store=gnome-libsecret`.\r\n\r\nNext question: Is there any way to make this setting global, so that it works with Chrome, Chromium, and Vivaldi?"
      },
      "user": {
        "login": "nalakawula",
        "avatar_url": "https://avatars.githubusercontent.com/u/8051577?u=a48f754ebc5a55115f0554bfa2c7a4055d6260e1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AedFf",
      "number": 1143,
      "title": "IPC: add `window_index` field to niri windows api",
      "body": "`window_index` would be the position of the window on its workspace starting from the left. Useful to highlight the focused or last focused window for workspaces in bars.  \r\n\r\n![image](https://github.com/user-attachments/assets/2ee77cc0-0bca-45fa-8a87-16d33b8c0d29)\r\n\r\nHere is a sample of indicating opened windows for each workspace, though the focused window is not marked. ",
      "created_at": "2025-02-18T06:53:51Z",
      "updated_at": "2025-06-10T21:27:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "hansp27",
        "avatar_url": "https://avatars.githubusercontent.com/u/32414911?u=c8a980229945d4ddcd8ed6e7eebac3b60ea2f811&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgJ2t",
      "number": 1745,
      "title": "session-lock notification mechanism",
      "body": "It would be nice if niri implemented `hyprland-lock-notify-v1`.\r\nThat way hypridle would be able to wait for the compositor to be locked before releasing its sleep inhibitor.\r\nOtherwise it briefly flashes the contents of the screen when my laptop resumes from sleep.",
      "created_at": "2025-06-08T02:51:03Z",
      "updated_at": "2025-06-10T19:29:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "notpeelz",
        "avatar_url": "https://avatars.githubusercontent.com/u/920910?u=570f5b4dcd99060b7748874a7b4f48e9c6882c51&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgMJN",
      "number": 1762,
      "title": "How can i have only my window move up/down when switching workspaces?",
      "body": "Whenever i switch workspaces i can see my background move up/down as well, is there way i can only have window move up/down?",
      "created_at": "2025-06-10T17:04:21Z",
      "updated_at": "2025-06-10T18:15:12Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "NucleoFusion",
        "avatar_url": "https://avatars.githubusercontent.com/u/148791547?u=e6f5a3660ecc01f7f20b02366dfd37945257766e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad5iA",
      "number": 1004,
      "title": "Failed to run on Ubuntu 24.10, how to debug?",
      "body": "I built niri from source and installed these file:\r\n\r\n```console\r\n🐠 ❯ ls /usr/local/bin/niri-session \r\n/usr/local/bin/niri-session\r\n\r\n~ \r\n🐠 ❯ ls /usr/local/share/wayland-sessions/niri.desktop\r\n/usr/local/share/wayland-sessions/niri.desktop\r\n\r\n~ \r\n🐠 ❯ ls /usr/local/share/xdg-desktop-portal/niri-portals.conf \r\n/usr/local/share/xdg-desktop-portal/niri-portals.conf\r\n\r\n~ \r\n🐠 ❯ ls /etc/systemd/user/niri.service \r\n/etc/systemd/user/niri.service\r\n\r\n~ \r\n🐠 ❯ ls /etc/systemd/user/niri-shutdown.target \r\n/etc/systemd/user/niri-shutdown.target\r\n```\r\n\r\nNiri appears on GDM. But after logging-in to it, I am immediately kicked out. Could someone tell me how to debug, to see what's wrong?\r\n\r\nI looked into `journalctl --user -e` but don't see the session of niri (only see GNOME Shell session).",
      "created_at": "2025-01-18T09:26:26Z",
      "updated_at": "2025-06-10T12:48:06Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzMmy",
        "body": "Today I tried installing Niri again and managed to find the related log in journalctl. It turns out that niri failed to start because of missing _libseat.so.1_. So Ubuntu users need to install `libseat1` package."
      },
      "user": {
        "login": "hongquan",
        "avatar_url": "https://avatars.githubusercontent.com/u/314607?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgLJa",
      "number": 1759,
      "title": "outsource settings?",
      "body": "Running niri on 3 computers.\r\nI would like to have a central config file that is very general and applies to all machines. And I would like to store machine-specific settings in separate files.\r\nIs this possible?",
      "created_at": "2025-06-09T19:14:39Z",
      "updated_at": "2025-06-10T07:48:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "bobblkabb",
        "avatar_url": "https://avatars.githubusercontent.com/u/7815101?u=30f6d40c7d0361f14b6b239e13a9a72a18d59972&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgLHe",
      "number": 1758,
      "title": "Is it possible to auto tile up to a point",
      "body": "Howdy, \r\nI like the idea of a scrolling window manager, but I also like tiling. My use case is to make it so that only 4 tiles are shown at a time after which it starts to scroll Is this possible?",
      "created_at": "2025-06-09T18:30:28Z",
      "updated_at": "2025-06-10T06:32:07Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "DrTeagle",
        "avatar_url": "https://avatars.githubusercontent.com/u/65212972?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgKqz",
      "number": 1754,
      "title": "Per output default column width and window-rule output match",
      "body": "I use 2 different monitors with very different aspect rations, a 16:9 and 32:9 monitors. Ideally i'd like to have different default width for columns on each monitors, 50% of the width on the 32:9 and 100% on the 16:9.\r\n\r\nI also have a set of apps that i open half of my default column width, so same thing here, knowing where the app is being opened could be useful so i can make them either 25% on my 32:9 monitor or 50% on my 16:9 monitor.\r\n\r\n",
      "created_at": "2025-06-09T09:15:14Z",
      "updated_at": "2025-06-09T13:17:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "lamarios",
        "avatar_url": "https://avatars.githubusercontent.com/u/1192563?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgKqK",
      "number": 1752,
      "title": "Add window-rule match by monitor it is being opened on",
      "body": "I use monitors with different aspect rations, 16:9 and 32:9 in my case.  When i open new windows on my 32:9 monitor I prefer them to take half the screen width, but when i open them on my 16:9 I'd like the window to default to full width for example.  Some of my windows i want them to open half of the other windows so having a window match rule would be useful.",
      "created_at": "2025-06-09T09:02:46Z",
      "updated_at": "2025-06-09T09:16:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "lamarios",
        "avatar_url": "https://avatars.githubusercontent.com/u/1192563?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgKRo",
      "number": 1750,
      "title": "key binding to 'spawn' floating?",
      "body": "I'd like to have two key bindings to open a terminal window. One in **tiling** mode:\r\n`Mod+Return { spawn \"alacritty\"; }`\r\nAnd the other one in **floating** mode \r\n`Mod+Shift+Return ....?`\r\nHow to do this?",
      "created_at": "2025-06-08T20:37:15Z",
      "updated_at": "2025-06-09T06:42:29Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzJFa",
        "body": "You could spawn it with a custom app-id (--class) and have a window rule for that app-id to open-floating"
      },
      "user": {
        "login": "bobblkabb",
        "avatar_url": "https://avatars.githubusercontent.com/u/7815101?u=30f6d40c7d0361f14b6b239e13a9a72a18d59972&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgJFU",
      "number": 1741,
      "title": "How are window shadows clipped to workspace bounds in niri?",
      "body": "Hi there! I've been working on adding support for shadows on tiled windows in labwc. The labwc developers had disabled shadows for tiled windows due to [potential visual leakage issues](https://github.com/labwc/labwc/pull/2789).\r\n\r\nI came across [this discussion](https://github.com/YaLTeR/niri/issues/1466) related to how niri handles it, and I was curious — how does niri implement this?\r\n\r\nI'm not very familiar with Rust, so any pointers would be appreciated!",
      "created_at": "2025-06-06T18:06:51Z",
      "updated_at": "2025-06-08T20:02:38Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AzIcT",
        "body": "Wdym? The shadow, as well as window textures and everything else, are rendered with shaders in OpenGL. Smithay has a crop operation which simply draws the shader over a smaller rectangle than its full size."
      },
      "user": {
        "login": "diredocks",
        "avatar_url": "https://avatars.githubusercontent.com/u/26994007?u=61df8a40849393ff21b6a4d4d4f249ca838fa9e1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgKJe",
      "number": 1749,
      "title": "Option to disable pointer in screenshot by default",
      "body": "When I make a screenshot, I usually do not want the pointer in it. This means I have to either disable it every time with `P` or just move it out of the way first, both of which are a minor annoyance.\r\nIt would be useful to me to have an option to change the default or preserve the option chosen for the previous screenshot.",
      "created_at": "2025-06-08T15:28:44Z",
      "updated_at": "2025-06-08T20:01:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Noratrieb",
        "avatar_url": "https://avatars.githubusercontent.com/u/48135649?u=f47185e959d8ac7ec628af62c40ed782e9d6485b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgIx9",
      "number": 1740,
      "title": "No pointer cursor on niri",
      "body": "Hello and thanks for niri !\r\n\r\nWhen I hover a link in my browser I don't see my cursor changing to pointer (the hand)\r\n\r\nIs there any way to fix this?",
      "created_at": "2025-06-06T11:45:49Z",
      "updated_at": "2025-06-08T06:47:14Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "qleguennec",
        "avatar_url": "https://avatars.githubusercontent.com/u/7882725?u=4a0930cbbbec2b3119ed97b135e79443c0b4fbde&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgJgr",
      "number": 1743,
      "title": "Show overview only while pressing certain keys",
      "body": "Right now I'm using MOD+TAB to toggle the overview, move to the workspace and window and press again MOD+TAB to go to normal view.\r\n\r\nI thing it could be more comfortable if I could do\r\n\r\n- press MOD+TAB (and keep it pressed)\r\n- move to the specific window with MOD+HJKL\r\n- release MOD+TAB\r\n\r\nI dont think is possible to hack around that at this moment, but would be quite handy if we could have something like\r\n\r\n```\r\nwhile pressing MOD+TAB { show-overview; }\r\non release MOD+TAB { hide-overview; }\r\n```\r\n\r\nAny thoughts?",
      "created_at": "2025-06-07T12:32:27Z",
      "updated_at": "2025-06-08T06:35:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "victordiaz",
        "avatar_url": "https://avatars.githubusercontent.com/u/422387?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af6-h",
      "number": 1658,
      "title": "Use grave as workspace 0",
      "body": "I'm a long time i3 user who recently started trying out Niri. One minor configuration that I really love in my i3 config is `bindsym $mod+grave workspace number 0`, which would be `Mod+grave { focus-workspace 0; }` in Niri.\r\n\r\nI find it really natural to place the pinky on the `~` or `grave` key, which can be easily done without looking at the keyboard.\r\n\r\nI also do the same with `0`, `minus` and `equal`, which are mapped to 10, 11, 12.\r\n\r\nCurrently, `focus-workspace 0` does switch workspaces, but switches to 1 rather than 0.\r\n\r\nSearching around I found the following comment: \r\n\r\n```\r\n           // Start from 1 to reduce the possibility that some other code that uses these IDs will\r\n           // get confused.\r\n```\r\nhttps://github.com/YaLTeR/niri/blob/main/src/utils/id.rs#L13\r\n\r\n## Hack using named workspaces\r\n\r\n```\r\nworkspace \"0\" {}\r\nworkspace \"1\" {}\r\nworkspace \"2\" {}\r\nworkspace \"3\" {}\r\nworkspace \"4\" {}\r\nworkspace \"5\" {}\r\nworkspace \"6\" {}\r\nworkspace \"7\" {}\r\nworkspace \"8\" {}\r\nworkspace \"9\" {}\r\nworkspace \"10\" {}\r\n\r\n...\r\n\r\n    Mod+grave { focus-workspace \"0\"; }\r\n    Mod+1 { focus-workspace \"1\"; }\r\n    Mod+2 { focus-workspace \"2\"; }\r\n    Mod+3 { focus-workspace \"3\"; }\r\n    Mod+4 { focus-workspace \"4\"; }\r\n    Mod+5 { focus-workspace \"5\"; }\r\n    Mod+6 { focus-workspace \"6\"; }\r\n    Mod+7 { focus-workspace \"7\"; }\r\n    Mod+8 { focus-workspace \"8\"; }\r\n    Mod+9 { focus-workspace \"9\"; }\r\n    Mod+0 { focus-workspace \"10\"; }\r\n```\r\n\r\nWith this configuration and restarting Niri, I also get a workspace 12, which is the +1 workspace that's always created. And it is 12 rather than 11 because the actual ID is one more than the named workspace name. For example, named workspace \"10\" has an ID of 11.",
      "created_at": "2025-05-24T12:42:42Z",
      "updated_at": "2025-06-06T07:35:02Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "pamolloy",
        "avatar_url": "https://avatars.githubusercontent.com/u/996930?u=a10cf5a27cd6e3a3497f8d71aaed02e1a8efdc6c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgIFe",
      "number": 1735,
      "title": "Add RightShift modifier",
      "body": "I'd like to create this binding (to prevent my left shift key from toggling the overview while I'm typing, for instance):\r\n\r\n```\r\nRightShift+Space { toggle-overview; }\r\n```\r\n\r\nMy proposition would be:\r\n- `Shift` by default, corresponding to either left or right shift\r\n- Separate `LeftShift` / `RightShift` modifiers that take priority over `Shift` modifiers\r\n  - If both `Shift+Space` and `RightShift+Space` are bound, then `Shift+Space` becomes `LeftShift+Space`\r\n  - Or instead, throw a validation warning, allowing the user to manually change `Shift+Space` to separate shift bindings",
      "created_at": "2025-06-05T16:04:57Z",
      "updated_at": "2025-06-06T06:26:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Treeways",
        "avatar_url": "https://avatars.githubusercontent.com/u/56928485?u=5aaeef8574da780f6842d52ee6edd3490a6dff5e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgHum",
      "number": 1734,
      "title": "How to start niri on specified GPU?",
      "body": "I am running niri on a laptop (really cool wm, thanks!) with a second dedicated nvidia gpu. Is there a simple way to define which gpu niri utilizes when launching the session? Currently it is always running on the nvidia GPU and has issues with suspend (blank screen on resume). I would like to run niri on the integrated GPU to hopefully resolve the nvidia suspend issues, and save battery.\r\n\r\nNo matter what card I select, nvidia-smi shows the gpu with a /usr/bin/niri process\r\n```kdl\r\ndebug {\r\n    render-drm-device \"/dev/dri/card0\"\r\n}\r\n```\r\n\r\nMany thanks in advance for any inputs.\r\n",
      "created_at": "2025-06-05T10:01:29Z",
      "updated_at": "2025-06-06T03:28:29Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "tino376dev",
        "avatar_url": "https://avatars.githubusercontent.com/u/157116672?u=4a36fb4bf605da9dd257e346114b514619da5250&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgD7X",
      "number": 1719,
      "title": "Problems with browser popups",
      "body": "Hello,\r\n\r\ntoday it has already happened twice that a function of a website did not work. I use **Firefox**.\r\nFirst the Outlook (OWA) menu item for uploading attachments and later the upload button of a forum. Nothing happens when I click the button.\r\nI have just carried out a few tests. Also with imgur, reddit and a transfer portal it does not work. These were always **file dialogues** to upload content. I couldn't quickly find a page where it worked.\r\n\r\nIn the first case I tried it with **Midori Browser**, where it worked. So it can't be a general Niri setting.\r\nI have also created a completely new, fresh Firefox profile.\r\nI have also deactivated all Firefox rules.\r\n\r\nWhat could be the reason for this?\r\nHow do I get to the bottom of it? Any ideas?",
      "created_at": "2025-06-02T17:24:58Z",
      "updated_at": "2025-06-05T17:21:46Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "bobblkabb",
        "avatar_url": "https://avatars.githubusercontent.com/u/7815101?u=30f6d40c7d0361f14b6b239e13a9a72a18d59972&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af75F",
      "number": 1673,
      "title": "overview auto-zoom",
      "body": "I would like for the overview feature to behave more like other platforms, see for example macos' expose. this is actually not that difficult to achieve provided two things:\r\n\r\n1. enable an \"auto-zoom\" feature:\r\n\r\nWithin a user-defined min-max range, allow Niri to auto set the zoom level based on how many workspaces are open. Perhaps also adjust for windows on each workspace. I have been fiddling with the zoom levels and have not found a satisfactory level: when i have a lot of windows open, i want a low value, and when i only have a few, i want to maximize the content shown. \r\n\r\nUsers wanting to preserve the current behavior should do nothing, as a single float value will simply be interpreted as both the min and the max.\r\n\r\n2. do not center the current workspace.\r\n\r\nThis is more controversial, as there is currently not a focus-ring or similar setting for the active workspace, but i think this would make sense if the goal of the overview is to show as much as possible. when I'm at the last workspace and enter the overview, the bottom half is currently empty, a waste of space!\r\n\r\n\r\nOtherwise a super nice feature, really helpful.",
      "created_at": "2025-05-25T21:32:01Z",
      "updated_at": "2025-06-05T09:22:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "trbjo",
        "avatar_url": "https://avatars.githubusercontent.com/u/26080212?u=7b7cd682a92b833913d800f1d810b7ed4a11db9a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af4PP",
      "number": 1632,
      "title": "Interactive Resize",
      "body": "Is it possible to resize a window with a keybind and mouse ? Or is it hardcoded to only be Mod+Right click ?\r\nhttps://github.com/YaLTeR/niri/wiki/Gestures#interactive-resize\r\nOn a laptop it's not very convenient\r\n\r\nThank you !",
      "created_at": "2025-05-21T21:26:54Z",
      "updated_at": "2025-06-05T08:50:35Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyduH",
        "body": "With client-side decorations (default, without prefer-no-csd), windows should let you resize them with just the mouse. Otherwise, hardcoded to Mod+right click, yes"
      },
      "user": {
        "login": "aphelei",
        "avatar_url": "https://avatars.githubusercontent.com/u/25272247?u=2321bd28134b7e12842be6c488457cd26ea4a75a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af7rq",
      "number": 1667,
      "title": "Add a way to resize multiple adjacent windows at once",
      "body": "With `Super+PPM` we can resize a window. I think it'd be nice to have some modifier there (like `Ctrl+Super+PPM`) that would at the same time decrese/increase the size of some window and increase/decrease the size of window next to it.\r\nThat would be most useful when two windows are fully visible on one screen size.\r\nThis is also what happens on DEs or other operating systems when resizing windows snapped to edges.\r\n\r\nI think this feature could also handle more windows (like when you have 4 windows open on one screen, resizing one of them should resize all the others to either take new space or reduce their size to allow the resized window to occupy more space).",
      "created_at": "2025-05-25T13:37:08Z",
      "updated_at": "2025-06-05T08:49:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AekOk",
      "number": 1176,
      "title": "VRR Automation - Add \"is_fullscreen\" to niri msg windows, focused-window",
      "body": "Adding `is_fullscreen` to the Niri msg windows/focused-window output would be a useful option to have for user scripts and also for Niri itself. A great use-case scenario for this would be the current VRR (variable refresh) implementation in Niri being either on/off/dynamic (based on manual window naming). If Niri had the option to display this information, automation could much more easily be had to enable/disable VRR via user scripts when a window fullscreen state is entered (either by app or user key bind). `niri msg output DP-1 vrr ON` is a good example of where scripts could benefit from parsing a new `is_fullscreen` window output from `niri msg`\r\n\r\nPerhaps an additional new `automatic` feature could also be added to Niri's already built-in option `variable-refresh-rate`, in which Niri would automatically toggle the VRR state to enabled for any focused window that is in a _fullscreen_ state and disable it when any focused window is in a _windowed_ state. This would negate the need for user scripts aiming to accomplish the same goal\r\n\r\n--\r\n\r\n**Examples**\r\n\r\nAutomatic VRR toggle in Niri, based on focused window is fullscreen or windowed\r\n```\r\noutput \"DP-1\" {\r\n  variable-refresh-rate automatic\r\n}\r\n```\r\n\r\nAdd \"Is fullscreen\" output to niri msg windows, focused-window\r\n```\r\nWindow ID 75: (focused)\r\n  Title: \"niri msg windows\"\r\n  App ID: \"kitty\"\r\n  Is floating: no\r\n  Is fullscreen: yes\r\n  PID: 2405277\r\n  Workspace ID: 2\r\n```\r\n\r\n",
      "created_at": "2025-02-25T17:54:50Z",
      "updated_at": "2025-06-05T08:47:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "scorpius2k1",
        "avatar_url": "https://avatars.githubusercontent.com/u/25441483?u=01424de4779f1a243fc7b59256d4319fff2c32d3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgGZF",
      "number": 1729,
      "title": "Additional workspace animations",
      "body": "Now that overview exists, I feel that having an animation for moving a workspace up or down makes some sense, as currently the workspace just jumps up or down, which ofc only stands out bc window movement is so fluid and smooth in the first place. I think having the workspace glide up or down might be a nice touch. I also think a similar gliding animation would be nice for moving windows between workspaces",
      "created_at": "2025-06-04T12:26:18Z",
      "updated_at": "2025-06-05T08:46:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SturgeonInc",
        "avatar_url": "https://avatars.githubusercontent.com/u/84652446?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae5Fv",
      "number": 1295,
      "title": "Add an option to indicate scrollable directions",
      "body": "When you have a lot of workspaces sitting around, it is hard to keep track of the number of windows in each workspace. In my case, whenever I switch back to a workspace, I would have to scroll through every single window just to make sure that I'm not leaving out any background running windows. Therefore, you should add some sort of indicators at the two left and right edges of the screen to show whether there are any more windows in the said direction and, hence, whether you can scroll in that direction.",
      "created_at": "2025-03-18T12:49:25Z",
      "updated_at": "2025-10-31T14:18:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "PokumeKachi",
        "avatar_url": "https://avatars.githubusercontent.com/u/108186213?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgGJp",
      "number": 1727,
      "title": "Change ipc overview message from bool to float",
      "body": "Consider changing the overview enabled/disabled msg from a boolean to a float, where the float would represent the zoom level where 0.0 would be off and 1.0 would be on. This would enable listeners to make animations gradually, instead of discretely. for example the wallpaper could blur gradually, just like macos' launchpad pinch animation. or a hidden bar could gradually be revealed. \r\n\r\nif there is risk of spamming the ipc with messages, we could limit the emission of once every frame or so. ",
      "created_at": "2025-06-04T09:28:31Z",
      "updated_at": "2025-06-04T11:21:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "trbjo",
        "avatar_url": "https://avatars.githubusercontent.com/u/26080212?u=7b7cd682a92b833913d800f1d810b7ed4a11db9a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgEAp",
      "number": 1720,
      "title": "Smoothly running xwayland-run to get X11 app to work",
      "body": "Hello,\r\n\r\nFirst of all thank you for niri, very cool project :)\r\n\r\nI understand the decision to not pollute niri with cursed X11 code. However sadly all the tools I use require X11 and handle wayland badly. For example I use soapui, burpsuite etc. Lets take google-chrome as an example (I know it has the wayland support flag but lets run it without it for test).\r\n\r\n\r\nI managed to run chrome with xwayland-satellite. However it is buggy. The three dots are not opening for example.\r\n\r\nI tried to run it with cage but it keeps crashing. \r\n\r\nThe promising thing was xwayland-run. \r\n![image](https://github.com/user-attachments/assets/52e2c3c8-6afc-48b4-93c8-a8e4b4390547)\r\n\r\n\r\nAs you see above, It opens and work correctly but I am missing 2 things:\r\n\r\n- The default size. I want to use some xwayland option to be to detect my screen size and size the application correctly at startup\r\n- Resize. I want when I resize my window with Super+F for example, for the application to resize with it\r\n\r\nI know you cannot get everything you want in life. But I am sharing this, maybe someone already digged deeper and found a solution and is willing to share to save me time.\r\n\r\nI think that if I get chrome to run correctly without bugs, I might get my other tools to work correctly the same way :)\r\n\r\nThanks",
      "created_at": "2025-06-02T19:04:08Z",
      "updated_at": "2025-06-03T15:33:55Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ay6ni",
        "body": "Hi could you try _JAVA_AWT_WM_NONREPARENTING=1 for JavaFX applications \nFor chrome you can enable Wayland flags to use Wayland by default instead of XWayland, this is supported since few years and be much smoother "
      },
      "user": {
        "login": "almounah",
        "avatar_url": "https://avatars.githubusercontent.com/u/85132188?u=1cd68745db05e204e8416d385a96d8904efd2891&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgEC1",
      "number": 1721,
      "title": "Invisible mouse cursor when sharing a window via xdg screen cast portal",
      "body": "This is mostly a reality check but whenever I'm sharing a window (or the dynamic screencast target) with Niri e.g. via https://www.webrtc-experiment.com/Pluginfree-Screen-Sharing, the mouse cursor is not visible, whereas if I share the whole screen, it is.\r\n\r\nIs this a restriction of xdg desktop portal itself?",
      "created_at": "2025-06-02T20:12:32Z",
      "updated_at": "2025-06-03T13:37:59Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ay6vh",
        "body": "It needs to be implemented in niri. Related: https://github.com/YaLTeR/niri/issues/115"
      },
      "user": {
        "login": "bascht",
        "avatar_url": "https://avatars.githubusercontent.com/u/51264?u=0e008af44dc50163993a7455b682622b8f5989d0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgDX-",
      "number": 1715,
      "title": "Add a flag to allow no importing environment when running as `--session`",
      "body": "# Description\r\n\r\nCurrently, `niri` automatically imports environment variables into systemd upon startup. This behavior may not be suitable in certain scenarios. For instance, users might prefer to manage environment variables manually to ensure greater flexibility and control over their configurations.\r\n\r\n# Proposed Feature\r\n\r\nIntroduce a command-line parameter that allows users to choose whether niri should automatically import environment variables into systemd during startup. When this automatic import is disabled, users can set the necessary environment variables themselves.\r\n\r\nI'll make a PR for this feature.",
      "created_at": "2025-06-02T07:36:09Z",
      "updated_at": "2025-06-02T07:36:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "wrvsrx",
        "avatar_url": "https://avatars.githubusercontent.com/u/42770726?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgB8p",
      "number": 1703,
      "title": "Cycle through the workspaces",
      "body": "How can I do the following :eyes:\r\n\r\n```\r\nOutput \"DP-2\":\r\n   1\r\n   2 \"main\"\r\n   3 \"game\"\r\n * 4\r\n```\r\n\r\nWhen I am in the last workspace (4), `focus-workspace-down` will walk to workspace 1; or if I am in workspace 1, `focus-workspace-up` will walk to the last workspace (4)",
      "created_at": "2025-05-31T12:46:02Z",
      "updated_at": "2025-06-02T01:55:19Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ay3Vd",
        "body": "I guess you could script it"
      },
      "user": {
        "login": "liuhq",
        "avatar_url": "https://avatars.githubusercontent.com/u/48037182?u=6fec44d1baf353a05f5966f7cbb94efb1f750fd4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgC-K",
      "number": 1712,
      "title": "Please can you add some themeing features?",
      "body": "First things first, I just want to say thanks for publishing this amazing Wayland compositor. On my machine, for gtk and qt, including all of my apps ,I use Share Tech Mono font. But the thing is when Niri exit messages, Hotkey Overlay, Config error and screenshot ui show up, the font and colors are different from my setup,so I want to them them. I find on the wiki but not found anything. I look through code , and I guess I could change them through source code (P.S. I am not a programmer ) may be I can theme and change font to my needs but I think I should request that as a feature; sorry If I'm being rude:! And thanks",
      "created_at": "2025-06-01T18:23:54Z",
      "updated_at": "2025-06-02T00:38:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Justinn-zZ",
        "avatar_url": "https://avatars.githubusercontent.com/u/214388821?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcPYr",
      "number": 769,
      "title": "SSH agent not working under niri",
      "body": "With another wayland compositor (river) running ssh-agent.service has been sufficient. However, no shell spawned by niri can remember my password.\r\n\r\nThe service is running, and SSH_AUTH_SOCK is in my shell environment.\r\n\r\n`systemctl --user status ssh-agent.service`\r\n```\r\n● ssh-agent.service - OpenSSH key agent\r\n     Loaded: loaded (/usr/lib/systemd/user/ssh-agent.service; enabled; preset: enabled)\r\n     Active: active (running) since Thu 2024-10-31 09:33:57 CET; 12h ago\r\n Invocation: abdcf89869514b829e2a0892a139c1a7\r\n       Docs: man:ssh-agent(1)\r\n             man:ssh-add(1)\r\n             man:ssh(1)\r\n   Main PID: 1485 (ssh-agent)\r\n      Tasks: 1 (limit: 76720)\r\n     Memory: 1.3M (peak: 2M)\r\n        CPU: 12ms\r\n     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/ssh-agent.service\r\n             └─1485 /usr/bin/ssh-agent -D -a /run/user/1000/ssh-agent.socket\r\n\r\nOct 31 09:33:57 cyxwel systemd[1470]: Started OpenSSH key agent.\r\nOct 31 09:33:57 cyxwel ssh-agent[1485]: SSH_AUTH_SOCK=/run/user/1000/ssh-agent.socket; export SSH_AUTH_SOCK;\r\nOct 31 09:33:57 cyxwel ssh-agent[1485]: echo Agent pid 1485;\r\n```\r\n\r\nAm I supposed to configure something for niri to see the agent?",
      "created_at": "2024-10-31T21:35:11Z",
      "updated_at": "2025-06-01T20:22:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "cmvanb",
        "avatar_url": "https://avatars.githubusercontent.com/u/3225873?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgC8L",
      "number": 1711,
      "title": "[Feature Request] Mouse actions over an empty area",
      "body": "Rationale: mouse actions/bindings over an empty desktop area (area not covered by windows or panels) would mitigate the lack of support for Niri _workspaces scrolling_ in bars/panels. \r\n\r\nThe user could then use any standalone panel that supports _margin_ functionality (not cover the entire length of the screen edge) (or use struts) and use the empty area for Niri-specific functionality like workspace- or window management. Say, I could then use mouse wheel to scroll the workspace left-right, Shift + mouse wheel to switch workspaces. Among all other use-cases. \r\n\r\nI am aware you can currently do Mod+mouse to achieve exactly this _over_ the windows.\r\n\r\nBtw, customizable _hot edges_ & _hot corners_ (that require mouse action rather than just position) are (seemingly) almost the same.\r\n\r\nAnd thank you for this amazing thing! You single-handedly created the best WM I have heard of!",
      "created_at": "2025-06-01T17:16:28Z",
      "updated_at": "2025-06-01T18:18:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "w-jablonski",
        "avatar_url": "https://avatars.githubusercontent.com/u/12428234?u=8fa3503c252328616e48b3906867ade5dc6bfb7e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgCk6",
      "number": 1709,
      "title": "Strange behavior after Super+Z",
      "body": "I have an application launcher mapped on Super+Z key. But from some point (I'am not sure, but it may correlate with 25.05 release), it started to open Gnome Activity Manager on this keypress often instead of that app launcher. I can't figure out where is that keyboard shortcut configured, so I'am starting to suspect Niri itself.\r\n\r\nIf I try to uninstall Gnome Activity Manager at all, it start opening Additional Drivers window.\r\n\r\nHas anybody some idea where may be the problem?",
      "created_at": "2025-06-01T10:28:58Z",
      "updated_at": "2025-06-01T12:06:42Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "VaclavC",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgCEO",
      "number": 1705,
      "title": "Niri service configuration",
      "body": "I'm using niri the last days and also the niri service which cause me an issue. I don't use a login manager, but I'm using a script which I created to choose a WM/DE on login. So I have enabled the tty autologin and this script is running after that. In this script I have all X and Wayland WMs DEs and wayland compositors and I can choose one for 3 secs, otherwise the default will start. The problem is that the niri service autostarts, so this script loaded but I cannot use it because niri starts almost immediately. Same thing happens if I logout, close niri. \r\nSo, is there any way to configure the service to starts only if I choose niri or if it will auto-launch after the 3 secs pass from the script if is the default?",
      "created_at": "2025-05-31T15:55:28Z",
      "updated_at": "2025-06-01T11:43:22Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "dancer69",
        "avatar_url": "https://avatars.githubusercontent.com/u/710551?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfeZa",
      "number": 1482,
      "title": "Tie backgounds to monitors instead of workspaces",
      "body": "Greetings from a user of Niri. I wonder if we could have backgrounds tied to monitors, instead of workspaces. I have tested the latest version, and the experience of workspace switching feels \"less lightweight\" than before, since the movement of backgrounds catches my attention and makes me a bit distracted from the content of windows. It might be made into configurations where the overview darkens the background to some degree or so, which IMHO is a decent alternative to the current version.",
      "created_at": "2025-04-27T15:40:42Z",
      "updated_at": "2025-06-01T11:35:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "js2xxx",
        "avatar_url": "https://avatars.githubusercontent.com/u/12331626?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgBJa",
      "number": 1698,
      "title": "Rounded workspace shadows in the overview",
      "body": "Since we already have support for rounded windows, rounded workspace shadows would be really great in the overview. Right now rounded windows inside of rectangular workspace shadows just look a little weird. ",
      "created_at": "2025-05-30T13:03:55Z",
      "updated_at": "2025-06-01T11:30:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "gro-david",
        "avatar_url": "https://avatars.githubusercontent.com/u/99834433?u=b5c808570d075c40266c9c9173cf32d0ac02b236&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgCQ-",
      "number": 1707,
      "title": "x y output ???",
      "body": "why is output position in x y wtf bro how complicate ",
      "created_at": "2025-06-01T01:24:23Z",
      "updated_at": "2025-06-01T11:16:42Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nico2004444",
        "avatar_url": "https://avatars.githubusercontent.com/u/137115205?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AgCX5",
      "number": 1708,
      "title": "Add settings to map input to output region",
      "body": "For example this would be useful for syncing tablet and monitor aspect ratios together.\r\nFrom sway-input(5):\r\n```\r\nMAPPING CONFIGURATION\r\n    ...\r\n\r\n    input <identifier> map_to_region <X> <Y> <width> <height>\r\n        Maps inputs from this device to the specified region of the global\r\n        output layout. Only meaningful if the device is a pointer, touch,\r\n        or drawing tablet device.\r\n\r\n    input <identifier> map_from_region <X1xY1> <X2xY2>\r\n        Ignores inputs from this device that do not occur within the\r\n        specified region.\r\n        ...\r\n\r\n        Commonly used to maintain the aspect ratio of the input device and\r\n        screen. Cropping a 16:10 input region to match a 16:9 display can\r\n        use 0x0 1x0.9 as the argument.\r\n```",
      "created_at": "2025-06-01T06:44:23Z",
      "updated_at": "2025-06-01T11:13:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Klink75",
        "avatar_url": "https://avatars.githubusercontent.com/u/89726191?u=77eb5be805fb2fba306f836e44173ab4f12dc31f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0CY",
      "number": 1589,
      "title": "v25.05",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nHere are the improvements from the last release.\r\n\r\n> [!NOTE]\r\n> Packagers: the niri default config now spawns [waybar](https://github.com/Alexays/Waybar) at startup so as not to start with a blank desktop. Please consider adding Waybar as a recommended dependency (or changing it to some other bar).\r\n\r\n## The Overview\r\n\r\nThe big new thing in niri v25.05 is the Overview. It zooms out your workspaces and windows to let you see what's going on at a glance, navigate, and drag windows around, all without having to touch the keyboard.\r\n\r\nhttps://github.com/user-attachments/assets/379a5d1f-acdb-4c11-b36c-e85fd91f0995\r\n\r\nYou can open it with the `toggle-overview` bind, via the new top-left hot corner, or using a touchpad four-finger swipe. While in the overview, all keyboard shortcuts keep working, while pointing devices get easier:\r\n\r\n- Mouse: left click and drag windows to move them, right click and drag to scroll workspaces left/right, scroll to switch workspaces (no holding Mod required).\r\n- Touchpad: two-finger scrolling that matches the normal three-finger gestures.\r\n- Touchscreen: one-finger scrolling, or one-finger long press to move a window.\r\n\r\nhttps://github.com/user-attachments/assets/7d9deada-dfb5-4cad-93f2-23b0d72a7877\r\n\r\nDrag-and-drop will scroll the workspaces up/down in the overview, and will activate a workspace when holding it for a moment. Combined with the hot corner, this lets you do a mouse-only DnD across workspaces.\r\n\r\nhttps://github.com/user-attachments/assets/5f09c5b7-ff40-462b-8b9c-f1b8073a2cbb\r\n\r\nBy the way, this new drag-and-drop hold will also bring floating windows to the top outside the overview.\r\n\r\nYou can drag-and-drop a window to a new workspace above, below, or between existing workspaces.\r\n\r\nhttps://github.com/user-attachments/assets/b76d5349-aa20-4889-ab90-0a51554c789d\r\n\r\nTo make the spatial model work for the overview, niri now draws a separate background under each workspace. For layer-shell tools, the *background* and *bottom* layers zoom out together with the workspaces, while the *top* and *overlay* layers remain on top of the overview. Make sure to put your bar on the *top* layer.\r\n\r\nThe background behind the workspaces in the overview is called the *backdrop*. There are new `backdrop-color` settings both [globally in the `overview {}` section](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#backdrop-color) and [per-output](https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs#backdrop-color).\r\n\r\nIf you want something more interesting in the backdrop, there's a new [`place-within-backdrop`](https://github.com/YaLTeR/niri/wiki/Configuration:-Layer-Rules#place-within-backdrop) layer rule. You can use it on a wallpaper tool showing a blurred version of your background, for example.\r\n\r\n![image](https://github.com/user-attachments/assets/adcf7a97-8dd4-4264-9149-ea406ef25bcc)\r\n\r\nSince backgrounds are now tied to workspaces, they will also move together with workspaces. If you don't like this, you can combine `place-within-backdrop` with a transparent [`background-color`](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#background-color) to get the stationary wallpaper back. Check [the overview wiki page](https://github.com/YaLTeR/niri/wiki/Overview#backdrop-customization) for an example configuration. There, you will also find how to change the overview zoom level or disable the hot corner.\r\n\r\nThere have also been smaller spatial model fixes to accommodate the overview. For example, the top layer-shell layer and the interactively dragged window now render on top of the background- and bottom-layer popups.\r\n\r\nFinally, @CharlieQLe added an IPC [request](https://yalter.github.io/niri/niri_ipc/enum.Request.html#variant.OverviewState) and [event](https://yalter.github.io/niri/niri_ipc/enum.Event.html#variant.OverviewOpenedOrClosed) for monitoring the overview's open state.\r\n\r\n## Screencasting features\r\n\r\nFor this release, I worked on several new features for screencasting and screensharing. To keep track of them, I wrote [a new wiki page](https://github.com/YaLTeR/niri/wiki/Screencasting) that describes all screencasting-related functionality in niri. Check it out!\r\n\r\nI should also mention the new [`wait-for-frame-completion-in-pipewire`](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options#wait-for-frame-completion-in-pipewire) debug flag by @coleleavitt. If you started having glitches when screencasting on NVIDIA (e.g., in Discord), this flag should help, until we [support explicit sync for PipeWire screencasts](https://github.com/YaLTeR/niri/issues/1432).\r\n\r\n### Dynamic screencast target\r\n\r\nA dynamic cast target is a special target that can change what it streams. You can select it as a special \"niri Dynamic Cast Target\" in the window selection dialog:\r\n\r\n![Screencast dialog showing niri Dynamic Cast Target.](https://github.com/user-attachments/assets/e236ce74-98ec-4f3a-a99b-29ac1ff324dd)\r\n\r\nThe dynamic target starts as an empty, transparent video stream. Then, you can use the following binds to change what it shows:\r\n\r\n- `set-dynamic-cast-window` to cast the focused window.\r\n- `set-dynamic-cast-monitor` to cast the focused monitor.\r\n- `clear-dynamic-cast-target` to go back to an empty stream.\r\n\r\nYou can also use these actions from the command line, for example, to interactively pick which window to cast. Check [the screencasting wiki page](https://github.com/YaLTeR/niri/wiki/Screencasting#dynamic-screencast-target) for more details and examples.\r\n\r\nhttps://github.com/user-attachments/assets/c617a9d6-7d5e-4f1f-b8cc-9301182d9634\r\n\r\n### Windowed fullscreen\r\n\r\nA common feature in WMs is fake, or detached, or windowed fullscreen. The compositor tells the window that it went fullscreen, but in reality keeps it as a normal window.\r\n\r\nThis is useful when screencasting browser-based presentations like Google Slides, where you usually want to hide the browser UI, which requires fullscreening the browser. Real fullscreen is not always convenient, for example, if you have an ultrawide monitor, or just want to leave the browser as a smaller window, without taking up an entire monitor.\r\n\r\nNow, niri can help, with the new `toggle-windowed-fullscreen` bind. It tells the app that it went fullscreen, while in reality leaving it as a normal window that you can resize and put wherever you want.\r\n\r\n```kdl\r\nbinds {\r\n    Mod+Ctrl+Shift+F { toggle-windowed-fullscreen; }\r\n}\r\n```\r\n\r\nHere's an example showing a windowed-fullscreen Google Slides [presentation](https://youtu.be/Kmz8ODolnDg), along with the presenter view and a meeting app, all on the same monitor:\r\n\r\n![Windowed Google Slides presentation, another window showing the presenter view, and another window showing Zoom UI casting the presentation.](https://github.com/user-attachments/assets/b2b49eea-f5a0-4c0a-b537-51fd1949a59d)\r\n\r\n## Screenshot UI\r\n\r\nFor this release, I made the screenshot UI support tablet and touchscreen input for drawing the selection, closing this long-standing gap. I also added a small capture button to the panel at the bottom, making it possible to select and save a screenshot without a keyboard.\r\n\r\nhttps://github.com/user-attachments/assets/0748412e-da21-4909-9c86-2244d8bb068c\r\n\r\nKeyboard use got better too: the screenshot UI will now recognize some windowing binds like `move-column-left/right`, `move-window-up/down` and `set-window-width/height`, and move the selection region as if it was a floating window. Thanks to @nnyyxxxx for prototyping the implementation! Naturally, this [opens the door](https://github.com/YaLTeR/niri/issues/1358) for making a bunch more windowing actions work on the screenshot UI selection.\r\n\r\nFinally, @TobyBridle added a `show-pointer` flag to `screenshot` and `screenshot-screen` actions to control whether the mouse cursor is included in the image.\r\n\r\n## Window urgency\r\n\r\nUrgency is an unspecified but commonly implemented Wayland behavior where a window can request the user's attention. The compositor will then draw it with a red border, and signal this urgency to other desktop components.\r\n\r\nNow, @Duncaen implemented window urgency in niri. It comes with a host of `urgent-color` settings on [borders, focus-rings](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#focus-ring-and-border) and [tab indicators](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#tab-indicator), an [`is-urgent`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#is-urgent) window rule matcher, and urgency indicators for [windows](https://yalter.github.io/niri/niri_ipc/struct.Window.html#structfield.is_urgent) and [workspaces](https://yalter.github.io/niri/niri_ipc/struct.Workspace.html#structfield.is_urgent) in the IPC.\r\n\r\nUrgency is cleared once you focus a window. You can also manually toggle urgency for a specific window with the new `toggle-urgent`, `set-urgent`, and `unset-urgent` actions.\r\n\r\n@Duncaen is also adding niri urgency support to Waybar in [this PR](https://github.com/Alexays/Waybar/pull/4113).\r\n\r\n## IPC improvements\r\n\r\nWe have several new things in the IPC system.\r\n\r\n@bbb651 implemented `niri msg pick-window` that lets you select a window by clicking. The command then outputs information about this window, which can be used for scripting. For example, you can make a \"screenshot clicked window\" script:\r\n\r\n```sh\r\n$ niri msg action screenshot-window --id=\"$(niri msg --json pick-window | jq .id)\"\r\n```\r\n\r\n@nnyyxxxx added `niri msg pick-color` that prints the color of the selected pixel. They also hooked it up to the PickColor method of the Screenshot portal, making the color picker work in apps.\r\n\r\nhttps://github.com/user-attachments/assets/93cc4381-851b-4f3f-aa4e-2042acd00b72\r\n\r\nThe niri IPC socket had so far been conservatively limited to a single request per connection. @titaniumtraveler helped to lift this limitation: now niri will keep reading and replying to requests as they arrive. Keep in mind that requests are still processed one by one and not atomically; read [the niri-ipc documentation](https://yalter.github.io/niri/niri_ipc/index.html) for more details.\r\n\r\nFinally, there's a small UX improvement. It's a common situation after updating niri that the running niri compositor is still the old version (since you haven't restarted it yet), but the niri binary (and hence the `niri msg` CLI) is already the new version. Then, using a newly added `niri msg` feature will ask the running niri compositor something that it doesn't understand yet, yielding an error.\r\n\r\nWhen this happens, `niri msg` will additionally request the version of the running niri compositor, and notify you if it doesn't match the CLI version, prompting you to restart. Unfortunately, this check didn't fire if `niri msg` failed parsing the response, leading to some confusion.\r\n\r\nIn the new release, I made the check work properly for this case too.\r\n\r\n## Windowing actions\r\n\r\nWe've got a number of new actions for working with windows:\r\n\r\n- @annikahannig added `focus-monitor`, `move-window-to-monitor`, and `move-column-to-monitor` by monitor name (in addition to the existing directional actions).\r\n- @Duncaen added `focus-column` and `move-column-to-index` that work by index of the column within the workspace.\r\n- @nnyyxxxx worked on a new `move-window-to-workspace --focus=false` flag that will send the active window to a different workspace without following it.\r\n- @yzy-1 added `--focus=false` to the `move-column-to-workspace/up/down` actions.\r\n- Fixed panic when passing out-of-bounds index to `move-workspace-to-index --reference`.\r\n- Fixed `move-workspace-to-index` being 0-based instead of 1-based (we use 1-based workspace indices elsewhere).\r\n\r\nI also added a new `center-visible-columns` action that centers all fully visible columns on screen, as a companion to `expand-column-to-available-width` from the last release.\r\n\r\nhttps://github.com/user-attachments/assets/55267aeb-5dc8-4b0e-a49a-6961e9d9c3aa\r\n\r\nFinally, while not a new action, `consume-or-expel-window-left` will now restore the view position similarly to closing a window. This is especially useful with tabbed columns: opening a new window and immediately consuming it left will add it as a tab without messing up the view.\r\n\r\nhttps://github.com/user-attachments/assets/eb49c7a4-0bc9-4125-9b48-ff0e071c5171\r\n\r\n## Input device settings\r\n\r\nWe added several settings for input devices. Read more about them on the [input configuration](https://github.com/YaLTeR/niri/wiki/Configuration:-Input) wiki page.\r\n\r\n- Added `drag` to `touchpad` that allows disabling tap-and-drag (thanks @alexdavid).\r\n- Added `off` to `touch` to disable touchscreen devices (thanks @nnyyxxxx).\r\n- Added `left-handed` to `trackpoint` (thanks @dbeley).\r\n- Added `mod-key` and `mod-key-nested` that let you change the `Mod` key (thanks @notpeelz).\r\n- Added `numlock` setting to `keyboard` to automatically enable Num Lock at startup (thanks @erdii). Note that there's a [known issue](https://github.com/YaLTeR/niri/issues/1501) where it only works after pressing a modifier key (Super, Alt, etc.).\r\n- @TyberiusPrime extended [`warp-mouse-to-focus`](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#warp-mouse-to-focus) with modes: `mode=center-xy` and `mode=center-xy-always` make the mouse always go to the center of the window both vertically and horizontally.\r\n\r\n## Output focusing at startup\r\n\r\n@lualeet added a new [`focus-at-startup`](https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs#focus-at-startup) output flag that will make niri focus that output when starting up if it is connected. Additionally, niri will now start with the mouse cursor centered in the focused monitor.\r\n\r\n## Screen locker red flash fix\r\n\r\nNiri will now wait for a lock surface to appear before rendering a locked session, thereby fixing the infamous red flash when locking the screen. Note that semitransparent lock surfaces will still show a red background, so you'll want to disable the fade-in in hyprlock.\r\n\r\nhttps://github.com/user-attachments/assets/3bca8cae-56fd-40c9-a5cb-17e5bd976050\r\n\r\n## Tiled state window rule\r\n\r\nThe Tiled state is one of the states a Wayland compositor can set on a toplevel window. Generally, windows react to it by removing their shadows and squaring rounded corners. Terminals stop snapping their window size to the terminal grid.\r\n\r\nBy default, niri sets the Tiled state together with [`prefer-no-csd`](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#prefer-no-csd). However, it can be useful to control the Tiled state separately, for example if you want to keep client-side decorations (for mouse-only dragging and closing) together with square corners (for visuals).\r\n\r\nIn this release, I exposed it as the [`tiled-state`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#tiled-state) window rule. Apart from blanket enabling, you can also set it based on whether the window is tiled or floating. For example:\r\n\r\n```kdl\r\n// Make tiled windows rectangular while using CSD.\r\nwindow-rule {\r\n    match is-floating=false\r\n    tiled-state true\r\n}\r\n```\r\n\r\nhttps://github.com/user-attachments/assets/270d823f-0fe4-4065-8b3a-5acebc693c8d\r\n\r\n## More efficient offscreening\r\n\r\nOffscreening is rendering a window into an intermediate texture rather than straight to the monitor. It's often used to correctly apply alpha blending when compositing multiple layers.\r\n\r\nSo far, offscreening in niri was rather inefficient because it was only used during short animations. The intermediate texture would get recreated from scratch every frame. Due to this, I couldn't add any longer-running transparency effects because I didn't want to use the inefficient offscreening.\r\n\r\nFor this release, I reworked how offscreening works in niri: it reuses the intermediate texture whenever possible, and it correctly tracks damage both \"inside\" and \"outside\" the offscreen. So when an offscreened window redraws, only the damaged part will redraw inside the intermediate texture, and this damage will be propagated out, to be used when compositing the texture itself.\r\n\r\nPractically, this means slightly improved animation efficiency for window opening and resizing. It also enables using offscreening for longer-running effects. In particular, I could finally make windows semitransparent as you're dragging them around, making it easier to see where they will land inside the tiling layout.\r\n\r\nhttps://github.com/user-attachments/assets/632093d3-6332-4801-bec6-d384578ee0eb\r\n\r\nAnimations for tabbed columns also use transparency. Before, they didn't use offscreens, resulting in blending artifacts in some conditions. Now they use the new offscreens, so transparency always looks correct.\r\n\r\n![Comparing before and after in the middle of a tabbed column animation with orange inactive border.](https://github.com/user-attachments/assets/b07e7c91-8493-45e6-9b1b-ed79ef5e9616)\r\n\r\nRegular window opacity does not use offscreening, so border or focus ring [may still show through](https://github.com/YaLTeR/niri/wiki/FAQ#why-are-transparent-windows-tinted--why-is-the-borderfocus-ring-showing-up-through-semitransparent-windows).\r\n\r\nAnother improvement from the offscreening rework is that offscreens now track which surfaces are visible \"inside\" the temporary texture. If a surface is completely obscured or otherwise invisible \"inside\" the temporary texture, it will no longer get frame callbacks. This is a minor efficiency improvement, but it happens to work around an issue with Firefox's experimental subsurface compositor.\r\n\r\n## `baba-is-float` layer rule\r\n\r\nThe last niri release had a secret April Fools' feature: the [`baba-is-float`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#baba-is-float) window rule that makes windows FLOAT up and down. Now this widely acclaimed feature is available [for layer surfaces](https://github.com/YaLTeR/niri/wiki/Configuration:-Layer-Rules#baba-is-float) too!\r\n\r\n```kdl\r\n// Make fuzzel FLOAT.\r\nlayer-rule {\r\n    match namespace=\"^launcher$\"\r\n    baba-is-float true\r\n}\r\n```\r\n\r\nhttps://github.com/user-attachments/assets/3f4cb1a4-40b2-4766-98b7-eec014c19509\r\n\r\n## Other improvements in this release\r\n\r\n- Fixed cursor hiding with [`hide-when-typing`](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#hide-when-typing) or [`hide-after-inactive-ms`](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#hide-after-inactive-ms) breaking tooltips, and input in some first-person games (thanks @bbogdan-ov).\r\n- Added a [`background-color`](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#background-color) setting to `layout {}` that sets the background color for all workspaces/outputs.\r\n- Added anchors to links throughout the wiki. Thanks @chinatsu for implementing anchor support in the wiki deployment GitHub action that we use, and for fixing the links.\r\n- Added `niri completions` subcommand to generate shell completions (thanks @titaniumtraveler).\r\n- Added `top`, `bottom`, `left`, `right` values for [`default-floating-position relative-to=`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#default-floating-position) which align the window to the center of a side of a monitor (thanks @Mandarancio).\r\n- Added support for negative [shadow](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#shadow) spread (thanks @LunarEclipse363).\r\n- Added the [`honor-xdg-activation-with-invalid-serial`](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options#honor-xdg-activation-with-invalid-serial) debug flag that fixes focusing the window when clicking on a tray icon for Discord, Telegram, and some other apps. (It is a bug in the apps or their toolkits that they need this debug flag.)\r\n- Added `niri msg action toggle-keyboard-shortcuts-inhibit`—the bind was added last release, but we forgot the CLI/IPC action (thanks @sodiboo).\r\n- Renamed ISO_Level3/5_Shift to Mod5/3 in the Important Hotkeys dialog.\r\n- In the default config, added custom Important Hotkeys titles for the spawn binds.\r\n- Fixed window opening animation being off-center during a concurrent resize animation.\r\n- Fixed clicking on a partially offscreen window with animations disabled hitting the window at its final position, rather than its visible (initial) position. This makes the behavior consistent with enabled animations.\r\n- Fixed putting `center-focused-column \"always\"` in the config not updating the view position right away.\r\n- Fixed swipe and DnD scroll gestures not taking into account the time between the last pointer movement and button release, leading to unintended jumps.\r\n- Made it possible for the view position to animate during a DnD scroll. This makes windows scroll into view when \"dragging out\" the first or the last window on a workspace, like they used to two releases ago.\r\n- Removed cancellation for the workspace-switch gesture. Now when you add or lift a finger during the gesture, it will complete as if you lifted all fingers, rather than resetting back to the starting position.\r\n- Fixed swipe gesture forgetting the previous workspace when starting and stopping on the same workspace.\r\n- Fixed a jump when \"catching\" a workspace-switch animation with a workspace-switch gesture.\r\n- Made xdg-activation also consider pointer focus for token validity.\r\n- Fixed popups showing up inside the animating resizing window (in addition to rendering normally on top).\r\n- Fixed panic at startup when the configured xkb keymap fails to compile.\r\n- Fixed panic when trying to interactively resize from a tab indicator.\r\n- Fixed panic and broken frames with some overdamped [spring](https://github.com/YaLTeR/niri/wiki/Configuration:-Animations#spring) animation settings.\r\n- Fixed tab indicator width, gap, gaps_between being able to round down to 0 physical pixels when they are set to above 0 in the config.\r\n- Fixed the interactively moved window getting input on all outputs rather than just the correct one (you could observe this with a combination of touchscreen and mouse input).\r\n- Fixed wrong min/max size computation for windows while going out of fullscreen.\r\n- Fixed interactively moved window not always updating properly.\r\n- Fixed removing a window that is going into fullscreen not resetting the stored unfullscreen view position.\r\n- Fixed interactively resizing a window that is going out of fullscreen not resetting the stored unfullscreen view position.\r\n- Fixed DnD scroll not stopping when interactively moving a fullscreen window that unfullscreens to floating.\r\n- Changed logging to go to stderr rather than stdout (thanks @titaniumtraveler).\r\n- Updated Smithay:\r\n    - Fixed panic on monitor hotplugging.\r\n    - Fixed panic on some ARM devices.\r\n    - Fixed panic upon receiving negative damage width/height from a Wayland client.\r\n    - Fixed panic upon receiving subsurface place_above/below with no parent.\r\n    - Fixed presentation feedback getting discarded for subsurfaces.\r\n    - Fixed some popups going off-screen instead of shrinking.\r\n    - Fixed cursor shape sometimes getting stuck in Chromium.\r\n\r\n## Funding\r\n\r\nI work on niri in the spare time that I have from my university studies. If you like what I do, you can support my work on [GitHub Sponsors](https://github.com/sponsors/YaLTeR). Big thanks to all current and past sponsors!\r\n\r\n----\r\n\r\nAnd here's a bonus for everyone who got all the way through this huge release, an ASUS Eee PC from 2008 running the overview!\r\n\r\nhttps://github.com/user-attachments/assets/a0332c82-b412-461b-a1e8-094ec041f127\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v25.05'>v25.05</a>.</em>",
      "created_at": "2025-05-17T13:19:10Z",
      "updated_at": "2025-05-30T18:14:16Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af_71",
      "number": 1696,
      "title": "How to change the global font preference?",
      "body": "I know it is a silly question, it might be a global environment variable, but I can not find the right place to change it.",
      "created_at": "2025-05-29T10:05:24Z",
      "updated_at": "2025-05-29T14:53:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ayxhw",
        "body": "The general answer is:\r\n\r\n1. Setup fontconfig, using `/etc/fonts/` for setting it globally instead of per-user (e.g. `~/.config/fontconfig/`), to set your preferred fonts with a config like this:\r\n    - Use `fc-match --sort {sans-serif,serif,monospace}` to check that your preferred fonts are ordered correctly, as well as `pango-view --font {sans-serif,serif,monospace,system-ui,mono-system-ui} -t \"Some text\"` to test it in action (the `*system-ui` aliases were needed in my case to make `--font {mono-,}system-ui` respect these preferences).\r\n    - Don't forget to execute `fc-cache -f` to reload the fontconfig cache, otherwise, your config changes won't apply immediately.\r\n\r\n```\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<!DOCTYPE fontconfig SYSTEM \"fonts.dtd\">\r\n<fontconfig>\r\n\t<!-- These two aliases must be defined before the others to apply -->\r\n\t<alias>\r\n\t\t<family>system-ui</family>\r\n\t\t<prefer><family>sans-serif</family></prefer>\r\n\t</alias>\r\n\r\n\t<alias>\r\n\t\t<family>mono-system-ui</family>\r\n\t\t<prefer><family>monospace</family></prefer>\r\n\t</alias>\r\n\r\n\t<alias>\r\n\t\t<family>sans-serif</family>\r\n\t\t<prefer>\r\n\t\t\t<family>Adwaita Sans</family>\r\n\t\t\t<family>Liberation Sans</family>\r\n\t\t</prefer>\r\n\t</alias>\r\n\r\n\t<alias>\r\n\t\t<family>serif</family>\r\n\t\t<prefer>\r\n\t\t\t<family>Liberation Serif</family>\r\n\t\t</prefer>\r\n\t</alias>\r\n\r\n\t<alias>\r\n\t\t<family>monospace</family>\r\n\t\t<prefer>\r\n\t\t\t<family>Adwaita Mono</family>\r\n\t\t\t<family>Liberation Mono</family>\r\n\t\t</prefer>\r\n\t</alias>\r\n</fontconfig>\r\n```\r\n\r\n2. Some things do not read fontconfig, like parts of the GTK UI, so for those, set the values for the following `gsettings` keys:\r\n    - `gsettings get org.gnome.desktop.interface {document-font-name,monospace-font-name,font-name}`\r\n    - `gsettings get org.gnome.desktop.wm.preferences titlebar-font`\r\n    - Note that these aren't part of a global config, and I'm not aware of a way to make them global, and are instead stored inside the `~/.config/dconf/user` file.\r\n"
      },
      "user": {
        "login": "YaQia",
        "avatar_url": "https://avatars.githubusercontent.com/u/61108050?u=d88c0c570ff35520701bd06a3a2923c112d2f9e7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af_3F",
      "number": 1694,
      "title": "add dwt to window rules",
      "body": "In the context of https://github.com/YaLTeR/niri/discussions/1657 and https://github.com/YaLTeR/niri/discussions/1693, I think adding a dwt option to window rules, if feasible, would be an elegant way to solve the interference of dwt with e.g. gaming by adding the possibility to override the global setting on a per match basis.",
      "created_at": "2025-05-29T08:28:14Z",
      "updated_at": "2025-05-29T12:05:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "frdiener",
        "avatar_url": "https://avatars.githubusercontent.com/u/51481761?u=5cf2e4103b73539117a20e4ac00beabd9ea25e10&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af_29",
      "number": 1693,
      "title": "Add ability to toggle dwt on the fly",
      "body": "In the same vein as https://github.com/YaLTeR/niri/discussions/1657, the ability to toggle dwt via something\r\nlike\r\n```\r\nniri msg input <device> dwt <enable|disable>\r\n```\r\nmight really come in handy in the context of a game launcher for instance.",
      "created_at": "2025-05-29T08:24:50Z",
      "updated_at": "2025-05-29T08:24:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "frdiener",
        "avatar_url": "https://avatars.githubusercontent.com/u/51481761?u=5cf2e4103b73539117a20e4ac00beabd9ea25e10&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af-n0",
      "number": 1692,
      "title": "[Feature Request] Better moonlight/sunshine screencast support",
      "body": "Hello, thank you for your niri software. I really enjoy using it, and I even wish I could use it on my mobile devices like phones/tablets. Currently, a more feasible solution is to mirror the desktop to the phone/tablet, but I encountered some difficulties when trying to use sunshine/moonlight. Against this backdrop, I am submitting this Feature Request, hoping to improve the sunshine/moonlight mirroring experience from the perspective of the niri software.\r\n\r\n### Software-based Virtual Display Support\r\n\r\nThe first issue I encountered is that I wanted to use the mirroring software on my phone to connect to my host while the monitor was turned off, but sunshine requires a hardware display to be on for it to properly capture the video signal output by the graphics card.\r\n\r\nTherefore, it would be very helpful if niri could support virtual displays (as some previous work has provided better support for mirroring software, perhaps this is also within niri's consideration?).\r\n\r\n### Forced Virtual Display Resolution Settings\r\n\r\nA simple workaround for virtual display issues is to physically connect a monitor to the graphics card. To save power, this monitor can be non-functional—it merely simulates a physical display to interact with the graphics card, providing EDID information and tricking the GPU into outputting video signals. However, this approach has a drawback: most commercially available display emulators only support a fixed set of resolutions, and their built-in EDID information may not align well with mobile devices. This further reduces the already limited display area on mobile devices, significantly impacting the user experience. I hope niri can support configuring EDID information for display emulators to facilitate Moonlight streaming. Of course, this may fall outside niri's intended scope, so any alternative implementation would also be acceptable.\r\n\r\n### Send All Workspaces to the Current Screen\r\n\r\nWhen dealing with a malfunctioning display, we may need a one-click feature to retrieve and send missing workspaces to the current screen, perhaps named something like `move-all-workspace-to-current-monitor`. Currently, commands like `move-workspace-to-monitor-next` are available, but they require focusing on a workspace from another display before execution. When the display cannot show any content, this operation becomes nearly impossible to complete.\r\n",
      "created_at": "2025-05-28T08:10:10Z",
      "updated_at": "2025-05-28T08:37:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "luochen1990",
        "avatar_url": "https://avatars.githubusercontent.com/u/2309868?u=c71f5215826e245448fd2293e6a596e21eced3a9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af-C9",
      "number": 1689,
      "title": "Allow configuring a cooldown for the hot corner",
      "body": "Right now, the hot corner can be triggered repeatedly, with minimal delay between the triggers, which can be problematic if the user slightly shakes or jitters the mouse while it's in the corner. Ideally, there would be a way to configure a cooldown to prevent accidental (un)activations, like this:\r\n\r\n```\r\ngestures {\r\n\thot-corners {\r\n\t\tcooldown-ms 200\r\n\t}\r\n}\r\n```",
      "created_at": "2025-05-27T18:30:52Z",
      "updated_at": "2025-05-27T18:34:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Winterhuman",
        "avatar_url": "https://avatars.githubusercontent.com/u/86165318?u=a747d681f3cfae7c8702df89004a3add23952899&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af9-4",
      "number": 1687,
      "title": "Slack screncast asks to pick the target twice",
      "body": "I am not using xwayland. Instead I use the ELECTRON_OZONE_PLATFORM_HINT variable\r\nscrencasting works fine.\r\n\r\nThe only annoyance I have is that it asks me to chose the target twice. Once I select the window it takes me to a preview of the window I have to click on and then it asks me to chose the window again and only then does it finally share the screen.\r\n\r\nThis doesn't happen for example when I try to screenshare from the browser (google meet) I just pick the window and it shares, it doesn't do the preview thing.",
      "created_at": "2025-05-27T17:02:48Z",
      "updated_at": "2025-05-27T17:14:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "vikigenius",
        "avatar_url": "https://avatars.githubusercontent.com/u/12724810?u=07dd0c45ea796547433ee76d27d7a2fea9ea8b31&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af9vX",
      "number": 1686,
      "title": "Dimensional rule for floating windows",
      "body": "Hello. Currently we can choose the size of windows on opening with rules using default-column-width and default-window-height but I would find it useful to be able to have equivalent rules for switching to floating mode. When a window switches to float mode, it will take on the size specified by these parameters, but it can still be enlarged or reduced, unlike using max-height.",
      "created_at": "2025-05-27T14:27:03Z",
      "updated_at": "2025-05-27T17:04:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "fadri14",
        "avatar_url": "https://avatars.githubusercontent.com/u/99951044?u=11b9997c6308e24a511954a1e9fb72df94a8de93&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af80i",
      "number": 1680,
      "title": "Enable/Disable Animation Based on Power Profile",
      "body": "I have been experiementing with the power-profiles-daemon dbus api in Rust. It got me wondering on possible use cases for it.\r\n\r\nOne idea I have is disabling animations when in power-saver mode. I have not dug deep into how animations affect power usage so cannot say if it will make a significant impact or not. Just throwing this idea out there.\r\n\r\nThoughts?",
      "created_at": "2025-05-26T20:17:20Z",
      "updated_at": "2025-05-27T04:51:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Lyndeno",
        "avatar_url": "https://avatars.githubusercontent.com/u/13490857?u=2a9d497f9377cda356ea5aa2feffca86ea21ed0c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af89S",
      "number": 1683,
      "title": "Slack screenshare popup appears as a separate column instead of floating",
      "body": "When I share screen on Slack. I see that `Stop Sharing Your Screen` popup window. But it is being treated as a separate column and not as floating. How do I resolve this?\r\n\r\n![image](https://github.com/user-attachments/assets/01b53430-3fbe-4b8c-b868-fa54a7361d14)\r\n",
      "created_at": "2025-05-27T01:26:26Z",
      "updated_at": "2025-05-27T16:55:11Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ayp0A",
        "body": "This is presumably Xwayland, meaning that there's a chance the newest git xwayland-satellite fixed it. Otherwise, you could try to make a window rule with open-floating true"
      },
      "user": {
        "login": "vikigenius",
        "avatar_url": "https://avatars.githubusercontent.com/u/12724810?u=07dd0c45ea796547433ee76d27d7a2fea9ea8b31&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af7EI",
      "number": 1659,
      "title": "How to turn off Overview activation with top-left corner?",
      "body": "Couldn't find the setting for it :)",
      "created_at": "2025-05-24T15:07:40Z",
      "updated_at": "2025-05-26T08:58:58Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ayk3P",
        "body": "Here https://github.com/YaLTeR/niri/wiki/Configuration:-Gestures#hot-corners"
      },
      "user": {
        "login": "reflog",
        "avatar_url": "https://avatars.githubusercontent.com/u/109876?u=578ac9a325c07ecf7b0dd7b5742a1c3eac923bcf&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaOjM",
      "number": 479,
      "title": "focus last over monitors",
      "body": "`focus-workspace-previous` and `workspace-auto-back-and-forth` seem to work within a single monitor, and it would be nice to have actions that span monitors as well, as in `focus-workspace-previous-over-monitors` and `workspace-auto-back-and-forth-over-monitors` so that with a single key press we colud jump to last workspace on another monitor and back-and-forth would be jumping back across monitors as well.\r\n\r\nfor example. monitor A has named workspaces \"1\" \"2\" \"3\", and B has \"4\" \"5\" \"6\". \r\nassume we are on \"5\", and back-and-forth is active, so focusing 2 and then again focusing 2 will focus \"1\" or \"3\" which is surprising, if one expects to land back on \"5\". and `focus-workspace-previous-over-monitors` is a simple action allowing to Alt-Tab between monitors with ease. They are in the same idea thread, because they carry a same idea behind, of switching between monitors with repeated keypress of a single key.\r\n\r\n`focus-workspace-previous-over-monitors` does not mean to focus other monitor in every instance, but actual last workspace. in example above with A and B, if we are on \"5\" and previous was \"6\", the action is supposed to select \"6\", but if previous was \"2\", then jump to \"2\", keeping history list across monitors.",
      "created_at": "2024-06-29T04:22:35Z",
      "updated_at": "2025-05-26T07:46:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "d3m1gd",
        "avatar_url": "https://avatars.githubusercontent.com/u/3992031?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af70C",
      "number": 1672,
      "title": "SCHED_RR",
      "body": "Compositors like sway or hyprland can set SCHED_RR on the main thread to improve responsiveness. Wouldn't it be nice to add this capability to niri?",
      "created_at": "2025-05-25T18:26:17Z",
      "updated_at": "2025-05-25T19:34:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ayles",
        "avatar_url": "https://avatars.githubusercontent.com/u/22452676?u=72b4742acab0c50600e3990675a8057058a82bcc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af7L2",
      "number": 1660,
      "title": "Two 50% windows protrude from the screen",
      "body": "Hello. First of all, thank you very much for your excellent work. It really is an incredible project.\r\n\r\nI have a behavior that I find strange in my windows but it may be due to my configuration. I've chosen a basic proportion of 50% for window opening. The problem is that when I open two windows, there's an offset that creates unnecessary space, whereas both windows can be displayed at the same time without any problem. Here's a photo to illustrate the problem.\r\n![ from 19-55-26](https://github.com/user-attachments/assets/c7e7fed8-3ce8-41d8-aa1c-b12e770938dd)\r\n\r\nHere is the link to my niri config: https://github.com/fadri14/dotfiles/blob/main/myconfig/niri/config.kdl\r\n\r\nThanks in advance for your help and congratulations on this project.",
      "created_at": "2025-05-24T17:56:11Z",
      "updated_at": "2025-05-25T16:40:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "fadri14",
        "avatar_url": "https://avatars.githubusercontent.com/u/99951044?u=11b9997c6308e24a511954a1e9fb72df94a8de93&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af7Z0",
      "number": 1664,
      "title": "Clarification of niri --session behavior on non systemd distros",
      "body": "What does niri --session do on non systemd distros?\r\n\r\nDo I need to do:\r\n\r\n`dbus-run-session niri --session`\r\n\r\nor does niri automatically creates a DBUS session bus?\r\n\r\nI am using greetd as my login manager",
      "created_at": "2025-05-25T03:35:31Z",
      "updated_at": "2025-05-25T15:12:04Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "vikigenius",
        "avatar_url": "https://avatars.githubusercontent.com/u/12724810?u=07dd0c45ea796547433ee76d27d7a2fea9ea8b31&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af5Is",
      "number": 1646,
      "title": "Can some share his/her experience of transitioning from hyprland to niri ? :-))",
      "body": "I am currently on hyprland and it is the first wm for me and i am quite comfortable with it now, but i like to try new things and since this project works similarly like hyprland , i want to gain some kind of review/experience of someone who has transitioned from hyprland to niri, Like i want to know what all problems you are facing and are they minor ones or big ones. \r\n\r\nBasically this time i want to mentally prepare myself before experimenting (to save time) and so i am thinking to gain some other users experience through this discussion section :-)) ",
      "created_at": "2025-05-22T15:10:43Z",
      "updated_at": "2025-05-25T13:45:46Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Greatz08",
        "avatar_url": "https://avatars.githubusercontent.com/u/55040435?u=1d3751acf272cf5597b70db85c4d0d4422740dfd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af7qR",
      "number": 1666,
      "title": "Cycle through preset column widths backwards.",
      "body": "Hello,\r\n\r\nI would really like to see a simple way to cycle through the preset column widths backwards.\r\nPresets are really neat, because unlike shrinking or growing a column by a fixed size, you can guarantee\r\nto make _N_ windows to fit onto the available screen space where each window occupies some fraction of it.\r\n\r\nOne 'hack' I did, was this kind of configuration, where I would just manually build a cycle:\r\n```\r\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\r\n    preset-column-widths {\r\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\r\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\r\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\r\n        proportion 0.33333\r\n        proportion 0.5\r\n        proportion 0.66667\r\n        proportion 1.0\r\n        proportion 0.66667\r\n        proportion 0.5\r\n        // Fixed sets the width in logical pixels exactly.\r\n        // fixed 1920\r\n      }\r\n```\r\n\r\nHowever, there is an issue: Given the size of a window, I do not know, if my next button press will cause the window to grow or to shrink. I want to be able to manually control this.\r\n\r\nMy feature request is thereby introducing a new command `switch-preset-column-width-back`, which cycles through the presets in reverse order.\r\n\r\nThe changes necessary are very few. The following diff will basically provide all the logic necessary and one only needs to introduce the appropriate changes to make this feature available for the IPC etc.\r\n\r\n```diff\r\ndiff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs\r\nindex e2d3a6d..2ac8a63 100644\r\n--- a/src/layout/scrolling.rs\r\n+++ b/src/layout/scrolling.rs\r\n@@ -4437,6 +4437,14 @@ impl<W: LayoutElement> Column<W> {\r\n     }\r\n \r\n     fn toggle_width(&mut self, tile_idx: Option<usize>) {\r\n+        self._toggle_width::<true>(tile_idx)\r\n+    }\r\n+\r\n+    fn toggle_width_back(&mut self, tile_idx: Option<usize>) {\r\n+        self._toggle_width::<false>(tile_idx)\r\n+    }\r\n+\r\n+    fn _toggle_width<const B: bool>(&mut self, tile_idx: Option<usize>) {\r\n         let tile_idx = tile_idx.unwrap_or(self.active_tile_idx);\r\n \r\n         let preset_idx = if self.is_full_width {\r\n@@ -4446,7 +4454,7 @@ impl<W: LayoutElement> Column<W> {\r\n         };\r\n \r\n         let preset_idx = if let Some(idx) = preset_idx {\r\n-            (idx + 1) % self.options.preset_column_widths.len()\r\n+            (if B { idx + 1 } else { 2 * idx - 1 }) % self.options.preset_column_widths.len()\r\n         } else {\r\n             let tile = &self.tiles[tile_idx];\r\n             let current_window = tile.window_expected_or_current_size().w;\r\n```",
      "created_at": "2025-05-25T12:47:07Z",
      "updated_at": "2025-05-25T12:52:33Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "two-horned",
        "avatar_url": "https://avatars.githubusercontent.com/u/95277266?u=eca01e8064b4788015ee2f08fa22c1d6b7a6ecc5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af7lK",
      "number": 1665,
      "title": "Tweak three finger swipe speed",
      "body": "I'm using the three finger swiping a lot to move between windows and workspaces.\r\nChanging a workspace, so swiping up and down, works quite easily. But for moving left or right I either need to swipe uncomfortably fast or uncomfortably far to change windows (when they're fullscreen).\r\n\r\nIt would be cool if you could change the behavior so that swiping a set amount scrolls by number of windows as opposed to distance.",
      "created_at": "2025-05-25T10:32:01Z",
      "updated_at": "2025-05-25T11:07:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kiaraly",
        "avatar_url": "https://avatars.githubusercontent.com/u/29002762?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af7PM",
      "number": 1661,
      "title": "thank you for having niri_ipc and niri_config be seperate cargo packages",
      "body": "Yeah... so I wound up learning rust even though I said I'd make my settings app in typescript. Definitely a much better experience, especially now that I can use niri_config directly! Plus relm4 is honestly a lot easier than anything out there for gjs.",
      "created_at": "2025-05-24T19:18:53Z",
      "updated_at": "2025-05-25T05:21:23Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "alicealysia",
        "avatar_url": "https://avatars.githubusercontent.com/u/35021050?u=ded3a507afc26687bb40b8db245903fae47fc2cc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AddbU",
      "number": 884,
      "title": "Window \"tagging\" via window rules",
      "body": "A pair of keywords for window rules, `tag \"name\"` and `remove-tag \"name\"`; they simply add or remove entries from an array of strings `tags` returned as part of the json object corresponding to the window in question for `niri msg -j windows` and `niri msg -j focused-window`.\r\n\r\nThis would allow defining quick rules for particular windows within your compositor settings for your setup's external tooling to operate upon, such as, for example, tweaking your power profile depending on whether or not you have a game currently focused.",
      "created_at": "2024-12-21T00:08:09Z",
      "updated_at": "2025-05-24T04:47:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zetaPRIME",
        "avatar_url": "https://avatars.githubusercontent.com/u/6675194?u=1ef93e5dff6c7e2be413230d1aa28525254185b3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfpJZ",
      "number": 1543,
      "title": "Application switcher",
      "body": "Hi everyone!\r\n\r\nThanks for making niri! It's been a pleasure to use over the last couple of weeks. However, the one thing I've been missing is a way to find the correct application, when I have multiple applications open. The excellent addition of the overview has helped but I still find myself reaching for `Alt-Tab` (like in Gnome) or `Mod+1,2,3,4,5,6` (like in Sway) to quickly try to remember where I put the damn window.\r\n\r\nI browsed around for a solution, but could not find a good option. So I decided to make my own :-)\r\n\r\nIntroducing [niriswitcher](https://github.com/isaksamsten/niriswitcher) version 0.0 (just a proof-of-concept so far). It uses the `niri msg event-stream` to keep track of windows and allows the user to open a application switcher similar to the one found in Gnome in MRU order. I've limited to select windows only from the current workspace, but this could be made configurable in the future.\r\n\r\nhttps://github.com/user-attachments/assets/619bd1c2-88af-4fe5-9bf0-34217bd37336\r\n\r\nIt works pretty well for the few applications I use on my system, but some notable exceptions lack a proper application icon defined in their `.desktop`-file, so I guess one should search for the icons in the icon-theme somehow, but that's on the TODO list.\r\n\r\nWhile it's far from production-ready I invite those of you who has been missing an application switcher to try it out and give feedback! It's my first attempt at a GTK application, so I'm sure there are plenty of room for improvement!\r\n\r\nOn my TODO so far:\r\n- Improve the way icons are identified\r\n- Implement dark/light mode switching (you can already change the look by modifying the style.css-file with an override in `.confg/niriswitcher/style.css`.\r\n- Configure key properties such as maximum width, icon sizes and so on\r\n\r\n",
      "created_at": "2025-05-08T13:59:21Z",
      "updated_at": "2025-05-23T21:37:51Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "isaksamsten",
        "avatar_url": "https://avatars.githubusercontent.com/u/167128?u=979afbc235bfba4b1b593d176fc2e32ccc04f168&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af6LH",
      "number": 1655,
      "title": "Per-workspace focus",
      "body": "I want Firefox to spawn at startup, but I don't want it to steal focus. So far, so good:\r\n```kdl\r\nspawn-at-startup \"firefox\"\r\nwindow-rule {\r\n    match at-startup=true\r\n    \r\n    open-focused false\r\n}\r\n```\r\n\r\nHowever, I have many windows open, so when I eventually go to the browser workspace, I'd like the window I last used in my previous session to be focused. My idea is: disallow stealing focus, but remember, which window last wanted to steal focus in a workspace. When you open that workspace, the window should be the first one focused. It might be too specific to what I do, but still, what are your thoughts?",
      "created_at": "2025-05-23T13:47:02Z",
      "updated_at": "2025-05-23T14:01:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "hubertwas",
        "avatar_url": "https://avatars.githubusercontent.com/u/16193899?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af3eI",
      "number": 1628,
      "title": "Per window key binds?",
      "body": "Sorry if this was asked before, but what I'm trying to accomplish is this:\r\n\r\n1. Use Super-Space for keyboard layout switching everywhere \r\n2. Except Emacs window where Super-Space should translate to Control-\\ (which is the preferred way to do mutliple layouts in Emacs)\r\n\r\nIs such a scenario possible? ",
      "created_at": "2025-05-21T09:20:02Z",
      "updated_at": "2025-05-23T09:50:58Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "dolzenko",
        "avatar_url": "https://avatars.githubusercontent.com/u/43391?u=f95ea25a9a74393abd99b0dbddb4539bcbe42050&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af5hM",
      "number": 1651,
      "title": "How to resize floating windows",
      "body": "Is there any way to resize floating windows on a laptop (using touchpad)? Some windows that I like floating can be a bit too big so I'd like to make them smaller.",
      "created_at": "2025-05-23T00:29:26Z",
      "updated_at": "2025-05-23T13:45:27Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Aygx7",
        "body": "With `Mod` pressed, right click and drag?"
      },
      "user": {
        "login": "64-bitman",
        "avatar_url": "https://avatars.githubusercontent.com/u/60551350?u=cd14c4af9a4f97bb3abefd27463216400caff03a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfXoo",
      "number": 1448,
      "title": "A new `focus-or-spawn` action",
      "body": "I usually have two or three apps which I always start at the beginning of a session and to which I frequently need to return to. For those, it would be convenient if  there was some action `focus-or-spawn --app-id=\"foo\" --title=\"bar\" -- \"foo\" \"foo-arg1\" \"foo-arg2\"` which would focus an existing window matching the given app-id and title or spawn the given program. \r\n\r\nIf there are more than one matching window, it would be great if it could cycle through all of them when executing the action repeatedly.\r\n",
      "created_at": "2025-04-20T12:00:13Z",
      "updated_at": "2025-05-23T04:22:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tsdh",
        "avatar_url": "https://avatars.githubusercontent.com/u/103854?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab1qK",
      "number": 724,
      "title": "Toggle option for powering monitor on and off.",
      "body": "When I play games, watch a movie, or just want a single monitor to focus on something I've been going into the config and add `off` to one of the monitor output sections to make it so only one screen is on. It reduces ambient light and helps me focus.\r\n\r\nIt'd be cool to have a command that I can bind to toggle a monitor between on and off so I didn't have to go into the config to do so. Something like:\r\n```\r\nbinds {\r\n    Super+p { spawn \"niri\" \"msg\" \"toggle-monitor\" \"DP-1\" }\r\n}\r\n```\r\nOr maybe a way to pipe this into fuzzel so that we have a Windows-esque Primary Only, Secondary Only, Extend, and Duplicate option.",
      "created_at": "2024-10-09T22:58:46Z",
      "updated_at": "2025-05-23T01:59:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "deadbody13",
        "avatar_url": "https://avatars.githubusercontent.com/u/57448148?u=24378a66eb085665f17964aba26e46f962d4b3e0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af4k_",
      "number": 1638,
      "title": "Crystal dock wlroots compatible now",
      "body": "For anyone who love(d) docks: https://github.com/dangvd/crystal-dock\r\n\r\nSome features can be seen here:\r\n\r\nhttps://github.com/user-attachments/assets/7988d772-623d-493e-bcdd-98f4dc2a060b\r\n\r\n",
      "created_at": "2025-05-22T07:01:29Z",
      "updated_at": "2025-05-22T07:01:30Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "stefonarch",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?u=a2928499988ebbb05ef99547bd768ab7bbcf2fd2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af4bx",
      "number": 1637,
      "title": "Eventual return of stationary background?",
      "body": "Hello!\r\n\r\nI'll start off by saying thank you for all the time and effort that you put into this project. I know that I can speak for many in saying that after giving Niri a try, there's no way I can go back to a traditional tiling WM. With the most recent release, the Overview has come out, and I am incredibly impressed with it! \r\n \r\nIn previous Niri releases, I really liked how the background remained stationary while the windows moved around on top of it when changing workspaces. Is there a chance this behavior can come back eventually? I know that the release notes for 25.05 mention:\r\n\r\n> To make the spatial model work for the overview, niri now draws a separate background under each workspace.\r\n\r\nbut it would be cool for it to eventually be an option to set in configs. \r\n\r\nThank you! ",
      "created_at": "2025-05-22T03:40:10Z",
      "updated_at": "2025-05-22T06:12:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mmesner",
        "avatar_url": "https://avatars.githubusercontent.com/u/91919268?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af1w4",
      "number": 1615,
      "title": "Always on pipewire.",
      "body": "It would be nice to have an always on pipewire output mode (much like what gamescope has) This would obviously have to be off by default for security reasons. However it would be really nice for testing stuff, Recording, remote desktop etc. \r\n\r\nI currently have a usecase where pipewire is preferential to wlr capture, and if possible, avoiding portals would be best as it is added overhead and I would like to avoid as much as possible. (both for performance and squeezing out as much space as possible). \r\n\r\nIt could be possible for me to make use of `ext-image-copy-capture` for it, but it would be ideal for me to have a \"pipewire only\" mode.",
      "created_at": "2025-05-19T17:49:19Z",
      "updated_at": "2025-05-21T19:55:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Quackdoc",
        "avatar_url": "https://avatars.githubusercontent.com/u/74831516?u=1a21ee96e1e754a955dfa63cb3b4c755e76b8ac1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af37F",
      "number": 1631,
      "title": "Is it possible to disable the double-click-to-maximize behavior?",
      "body": "Hello, \r\n\r\nI haven't managed to find a way to disable this behavior. (Hold Mod and double click on edge to maximize/shrink the window)\r\n \r\nIs it possible? Thanks\r\n\r\n![image](https://github.com/user-attachments/assets/47928659-e7b6-446d-bbf2-ce00de9b992d)\r\n",
      "created_at": "2025-05-21T16:57:11Z",
      "updated_at": "2025-05-21T17:55:36Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "wSzki",
        "avatar_url": "https://avatars.githubusercontent.com/u/59784520?u=c25c44ad1c878231ba53a7f388c5b463d787865a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af2__",
      "number": 1624,
      "title": "Switch workspace on vertical focus-window ?",
      "body": "Hello, and thanks for the awesome work with niri !\r\n\r\nIs it currently possible to switch the workspace to the bottom one when focusing a window down that doesn't exist ? \r\n\r\nThat seems reasonable given the design of niri !",
      "created_at": "2025-05-20T21:30:49Z",
      "updated_at": "2025-05-21T06:30:12Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyaaC",
        "body": "`focus-window-or-workspace-down`"
      },
      "user": {
        "login": "Quentin-Spottt",
        "avatar_url": "https://avatars.githubusercontent.com/u/196631637?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af3SS",
      "number": 1627,
      "title": "How to map the Super_L+p key?",
      "body": "One of the keys on my laptop emits this keycode. I tried mapping it with Super_L+p but Niri gave an error. Is it possible to map this key?",
      "created_at": "2025-05-21T06:00:51Z",
      "updated_at": "2025-05-21T06:11:36Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ayadf",
        "body": "Just Super+P?"
      },
      "user": {
        "login": "64-bitman",
        "avatar_url": "https://avatars.githubusercontent.com/u/60551350?u=cd14c4af9a4f97bb3abefd27463216400caff03a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af3Gl",
      "number": 1626,
      "title": "window rule match is-maximized?",
      "body": "this may sounds dumb but when an application like mpvpaper that rely on \r\n`surface frame callback`\r\nwouldnt work correctly when there is a widget like ags, the wallpaper doesnt pause automatically\r\nso my workaround would be something like\r\n```\r\nwindow-rule {\r\n match is-maximized=true\r\n on-action-start spawn \"tell mpvpaper to pause\"\r\n on-action-stop spawn \"tell it to continue\" //yes i know these two are non existance\r\n}\r\n```\r\n\r\nor is there a way to just fake the surface frame callback to be full on maximized even thought there is a widget on the screen?\r\n\r\n<details><summary>more infomation about mpvpaper autopause</summary>\r\n<br>\r\n *Limitations of automagic:\r\n\r\n              mpvpaper manipulates a feature of Wayland called a \"surface frame callback\"\r\n\r\n              This feature of Wayland allows mpvpaper to draw/render only when it makes sense to do so.  And one reason mpvpaper might not draw/render is if it´s \"hidden\".  This is the  magic\r\n              behind the automagic pause/stop options.\r\n\r\n              Whatever  \"hidden\" means is up to compositor. As for Sway, \"hidden\" is if there is a fullscreen window in the way of the wallpaper. mpvpaper will still draw/render even if there\r\n              is a normal window blocking the wallpaper view entirely.\r\n\r\n              This feature is at best a hack that works on some compositors.  Usability of these auto options will vary and may not work as intended or at all.  In such a case, other features\r\n              like the \"watch lists\" mentioned above should be used instead.\r\n</details>",
      "created_at": "2025-05-21T01:17:34Z",
      "updated_at": "2025-05-21T06:34:46Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyaZy",
        "body": "What's the problem? If a surface is completely obscured by other opaque elements (check with bind below, should be blue) then it won't receive frame callbacks.\r\n\r\n```kdl\r\n    Mod+Shift+Ctrl+O { debug-toggle-opaque-regions; }\r\n```"
      },
      "user": {
        "login": "anispwyn",
        "avatar_url": "https://avatars.githubusercontent.com/u/36318840?u=f57bd0e7b00662dfd5918d2d8d89bb5962099300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af3Bi",
      "number": 1625,
      "title": "Systemd not import environment variables",
      "body": "I set the following environment variables, but found that without these variables, the x program of xdg-autostart could not be executed correctly.\r\n```kdl\r\nenvironment  {\r\n\tLANG \"zh_TW.UTF-8\"\r\n\t// xwayland-satellite\r\n\tDISPLAY \":0\"\r\n\tELECTRON_OZONE_PLATFORM_HINT \"auto\"\r\n\tZED_WINDOW_DECORATIONS \"server\"\r\n}\r\n```\r\nTried\r\n```kdl\r\nspawn-at-startup \"systemctl\" \"--user\" \"import-environment\"\r\nspawn-at-startup \"dbus-update-activation-environment\" \"--systemd\" \"--all\"\r\n```\r\nHowever it seems to be executed only after autostart has failed.\r\nIs there any way to make systemd read environment{} before xdg-autostart-generator？",
      "created_at": "2025-05-20T22:33:22Z",
      "updated_at": "2025-05-21T09:34:46Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyaZ4",
        "body": ">  Is there any way to make systemd read environment{} before xdg-autostart-generator？\r\n\r\nNo. You need to use some systemd way to set environment instead"
      },
      "user": {
        "login": "The-Lost-Light",
        "avatar_url": "https://avatars.githubusercontent.com/u/8400760?u=786b7b9c702ca099049b24262f7d2ae6af132977&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af1Ek",
      "number": 1606,
      "title": "Does niri start in a login shell",
      "body": "I'm asking this because the $SHLVL in a Niri session is 2. Is there a reason why it is not 1 like in a desktop environment?",
      "created_at": "2025-05-19T05:18:55Z",
      "updated_at": "2025-05-21T23:40:05Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyWzO",
        "body": "Nevermind that doesn't work but oh well"
      },
      "user": {
        "login": "64-bitman",
        "avatar_url": "https://avatars.githubusercontent.com/u/60551350?u=cd14c4af9a4f97bb3abefd27463216400caff03a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af22G",
      "number": 1623,
      "title": "Hot edge?",
      "body": "I like the hot corner, but I think it's a bit too hard to trigger especially on large monitors and workspaces. I would find it much more useful if the entire top *edge* could be a single \"hot edge\". As a side note, the hot corner is also awkward when in multiple monitor setups, and in practice to hit it you need to first move up to the top edge and then \"slide\" along that edge to the left monitor boundary.\r\n\r\nAnother minor note is that, comparing against e.g. the GNOME implementation of the hot edge, merely reaching the display edge is not enough to trigger the hot edge on GNOME, you actually have to slightly *overshoot* it, i.e. drag the cursor against the edge for a few dozen pixels, before it will trigger. I think that kills any and all unintentional triggers from simply trying to click on something near the top of the screen.\r\n\r\nI'm not sure how difficult it would be to internally expand this functionality to make it a bit more flexible, but some food for thought nonetheless.",
      "created_at": "2025-05-20T17:46:17Z",
      "updated_at": "2025-05-20T23:02:59Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "haasn",
        "avatar_url": "https://avatars.githubusercontent.com/u/1149047?u=166016eb8b35ba4b436e8de60c223d2583c54d3c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af2zr",
      "number": 1622,
      "title": "adding animations to notifications and more",
      "body": "is there a way to add animations to notifications daemon like mako or dunst? for example ease in out on popup and close, or more",
      "created_at": "2025-05-20T16:57:15Z",
      "updated_at": "2025-05-20T17:22:34Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyZAf",
        "body": "Not atm"
      },
      "user": {
        "login": "anispwyn",
        "avatar_url": "https://avatars.githubusercontent.com/u/36318840?u=f57bd0e7b00662dfd5918d2d8d89bb5962099300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af1Gz",
      "number": 1608,
      "title": "Cannot open minecraft-launcher",
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.02\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon Vega Series\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 5800H\n",
      "created_at": "2025-05-19T05:39:04Z",
      "updated_at": "2025-05-20T16:51:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "levihuayuzhang",
        "avatar_url": "https://avatars.githubusercontent.com/u/68364307?u=a9c4034a55e80d056ecf73fd31e2e585d6324400&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfJ2V",
      "number": 1391,
      "title": "Add a timeout to the \"screenshot captured\" notification",
      "body": "Right now after taking a screenshot the notification just stays there forever, a configurable timeout should probably be used for this.",
      "created_at": "2025-04-04T13:54:52Z",
      "updated_at": "2025-05-20T14:57:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "altacountbabi",
        "avatar_url": "https://avatars.githubusercontent.com/u/82091823?u=da00c6cab5b6c946a8832f9f9fd481115d03fa5a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af1G0",
      "number": 1609,
      "title": "binds with sh -c not work for me",
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n    \n`Mod+T { spawn \"sh\" \"-c\" \"notify-send hello && exec alacritty\"; }`\njust uncomment this line, and not work\nand I want to use this\n `Mod+Shift+C { spawn \"sh\" \"-c\" \"grim -g '${slurp}' - | wl-copy\"; }`\nnot work too\n\nand check log with\n`journalctl --user-unit niri.service -e`\nlooks nothing useful\n<!-- Attaching your full niri config can help diagnose the problem. -->\n\n```kdl\n// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a full description of the configuration:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\n\n// Input device configuration.\n// Find the full list of options on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\ninput {\n    keyboard {\n        xkb {\n            // You can set rules, model, layout, variant and options.\n            // For more information, see xkeyboard-config(7).\n\n            // For example:\n            // layout \"us,ru\"\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\n        }\n    }\n\n    // Next sections include libinput settings.\n    // Omitting settings disables them, or leaves them at their default values.\n    touchpad {\n        // off\n        tap\n        // dwt\n        // dwtp\n        // drag false\n        // drag-lock\n        natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"two-finger\"\n        // disabled-on-external-mouse\n    }\n\n    mouse {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"no-scroll\"\n    }\n\n    trackpoint {\n        // off\n        // natural-scroll\n        // accel-speed 0.2\n        // accel-profile \"flat\"\n        // scroll-method \"on-button-down\"\n        // scroll-button 273\n        // middle-emulation\n    }\n\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\n    // warp-mouse-to-focus\n\n    // Focus windows and outputs automatically when moving the mouse into them.\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\n    // focus-follows-mouse max-scroll-amount=\"0%\"\n}\n\n// You can configure outputs by their name, which you can find\n// by running `niri msg outputs` while inside a niri instance.\n// The built-in laptop monitor is usually called \"eDP-1\".\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\n// Remember to uncomment the node by removing \"/-\"!\n/-output \"eDP-1\" {\n    // Uncomment this line to disable this output.\n    // off\n\n    // Resolution and, optionally, refresh rate of the output.\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\n    // for the resolution.\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\n    mode \"1920x1080@120.030\"\n\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\n    scale 2\n\n    // Transform allows to rotate the output counter-clockwise, valid values are:\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\n    transform \"normal\"\n\n    // Position of the output in the global coordinate space.\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\n    // The cursor can only move between directly adjacent outputs.\n    // Output scale and rotation has to be taken into account for positioning:\n    // outputs are sized in logical, or scaled, pixels.\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\n    // If the position is unset or results in an overlap, the output is instead placed\n    // automatically.\n    position x=1280 y=0\n}\n\noutput \"HDMI-A-1\" {\n    transform \"90\"\n}\n\n// Settings that influence how windows are positioned and sized.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\nlayout {\n    // Set gaps around windows in logical pixels.\n    gaps 16\n\n    // When to center a column when changing focus, options are:\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\n    //   or right edge of the screen.\n    // - \"always\", the focused column will always be centered.\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\n    //   together with the previously focused column.\n    center-focused-column \"never\"\n\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\n    preset-column-widths {\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\n        proportion 0.33333\n        proportion 0.5\n        proportion 0.66667\n\n        // Fixed sets the width in logical pixels exactly.\n        // fixed 1920\n    }\n\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\n    // preset-window-heights { }\n\n    // You can change the default width of the new windows.\n    default-column-width { proportion 0.5; }\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\n    // default-column-width {}\n\n    // By default focus ring and border are rendered as a solid background rectangle\n    // behind windows. That is, they will show up through semitransparent windows.\n    // This is because windows using client-side decorations can have an arbitrary shape.\n    //\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\n    // Niri will draw focus ring and border *around* windows that agree to omit their\n    // client-side decorations.\n    //\n    // Alternatively, you can override it with a window rule called\n    // `draw-border-with-background`.\n\n    // You can change how the focus ring looks.\n    focus-ring {\n        // Uncomment this line to disable the focus ring.\n        // off\n\n        // How many logical pixels the ring extends out from the windows.\n        width 4\n\n        // Colors can be set in a variety of ways:\n        // - CSS named colors: \"red\"\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\n\n        // Color of the ring on the active monitor.\n        active-color \"#7fc8ff\"\n\n        // Color of the ring on inactive monitors.\n        inactive-color \"#505050\"\n\n        // You can also use gradients. They take precedence over solid colors.\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\n        // The angle is the same as in linear-gradient, and is optional,\n        // defaulting to 180 (top-to-bottom gradient).\n        // You can use any CSS linear-gradient tool on the web to set these up.\n        // Changing the color space is also supported, check the wiki for more info.\n        //\n        // active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\n\n        // You can also color the gradient relative to the entire view\n        // of the workspace, rather than relative to just the window itself.\n        // To do that, set relative-to=\"workspace-view\".\n        //\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can also add a border. It's similar to the focus ring, but always visible.\n    border {\n        // The settings are the same as for the focus ring.\n        // If you enable the border, you probably want to disable the focus ring.\n        off\n\n        width 4\n        active-color \"#ffc87f\"\n        inactive-color \"#505050\"\n\n        // active-gradient from=\"#ffbb66\" to=\"#ffc880\" angle=45 relative-to=\"workspace-view\"\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\n    }\n\n    // You can enable drop shadows for windows.\n    shadow {\n        // Uncomment the next line to enable shadows.\n        // on\n\n        // By default, the shadow draws only around its window, and not behind it.\n        // Uncomment this setting to make the shadow draw behind its window.\n        //\n        // Note that niri has no way of knowing about the CSD window corner\n        // radius. It has to assume that windows have square corners, leading to\n        // shadow artifacts inside the CSD rounded corners. This setting fixes\n        // those artifacts.\n        // \n        // However, instead you may want to set prefer-no-csd and/or\n        // geometry-corner-radius. Then, niri will know the corner radius and\n        // draw the shadow correctly, without having to draw it behind the\n        // window. These will also remove client-side shadows if the window\n        // draws any.\n        // \n        // draw-behind-window true\n\n        // You can change how shadows look. The values below are in logical\n        // pixels and match the CSS box-shadow properties.\n\n        // Softness controls the shadow blur radius.\n        softness 30\n\n        // Spread expands the shadow.\n        spread 5\n\n        // Offset moves the shadow relative to the window.\n        offset x=0 y=5\n\n        // You can also change the shadow color and opacity.\n        color \"#0007\"\n    }\n\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\n    // Left and right struts will cause the next window to the side to always be visible.\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\n    // layer-shell panels and regular gaps.\n    struts {\n        // left 64\n        // right 64\n        // top 64\n        // bottom 64\n    }\n}\n\n// Add lines like this to spawn processes at startup.\n// Note that running niri as a session supports xdg-desktop-autostart,\n// which may be more convenient to use.\n// See the binds section below for more spawn examples.\n\n// This line starts waybar, a commonly used bar for Wayland compositors.\n// spawn-at-startup \"waybar\"\nspawn-at-startup \"fcitx5\" \"-d\" \"-r\"\nspawn-at-startup \"fcitx5-remove\" \"-r\"\nspawn-at-startup \"alacritty\"\n// spawn-at-startup \"swaybg\" \"-i\" \"~/Pictures/waves.jpg\"\n// spawn-at-startup \"swayidle\" \"-w\" \"timeout 900\" \"swaylock\" \"-f\"\n\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\n// If the client will specifically ask for CSD, the request will be honored.\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\n// After enabling or disabling this, you need to restart the apps for this to take effect.\n// prefer-no-csd\n\n// You can change the path where screenshots are saved.\n// A ~ at the front will be expanded to the home directory.\n// The path is formatted with strftime(3) to give you the screenshot date and time.\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\n\n// You can also set this to null to disable saving screenshots to disk.\n// screenshot-path null\n\n// Animation settings.\n// The wiki explains how to configure individual animations:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\nanimations {\n    // Uncomment to turn off all animations.\n    // off\n\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\n    // slowdown 3.0\n}\n\n// Window rules let you adjust behavior for individual windows.\n// Find more information on the wiki:\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\n\n// Work around WezTerm's initial configure bug\n// by setting an empty default-column-width.\nwindow-rule {\n    // This regular expression is intentionally made as specific as possible,\n    // since this is the default config, and we want no false positives.\n    // You can get away with just app-id=\"wezterm\" if you want.\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\n    default-column-width {}\n}\n\n// Open the Firefox picture-in-picture player as floating by default.\nwindow-rule {\n    // This app-id regular expression will work for both:\n    // - host Firefox (app-id is \"firefox\")\n    // - Flatpak Firefox (app-id is \"org.mozilla.firefox\")\n    match app-id=r#\"firefox$\"# title=\"^Picture-in-Picture$\"\n    open-floating true\n}\n\n// Example: block out two password managers from screen capture.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\n\n    block-out-from \"screen-capture\"\n\n    // Use this instead if you want them visible on third-party screenshot tools.\n    // block-out-from \"screencast\"\n}\n\n// Example: enable rounded corners for all windows.\n// (This example rule is commented out with a \"/-\" in front.)\n/-window-rule {\n    geometry-corner-radius 12\n    clip-to-geometry true\n}\n\nbinds {\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\n    // in the end. To find an XKB name for a particular key, you may use a program\n    // like wev.\n    //\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\n    // when running as a winit window.\n    //\n    // Most actions that you can bind here can also be invoked programmatically with\n    // `niri msg action do-something`.\n\n    // Mod-Shift-/, which is usually the same as Mod-?,\n    // shows a list of important hotkeys.\n    Mod+Shift+Slash { show-hotkey-overlay; }\n\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\n    // Mod+T hotkey-overlay-title=\"Open a Terminal: alacritty\" { spawn \"alacritty\"; }\n    Mod+T { spawn \"sh\" \"-c\" \"notify-send hello && exec alacritty\"; }\n    Mod+Shift+C { spawn \"sh\" \"-c\" \"grim -g '${slurp}' - | wl-copy\"; }\n    Mod+B hotkey-overlay-title=\"Open firefox\" { spawn \"firefox\"; }\n    Mod+D hotkey-overlay-title=\"Run an Application: fuzzel\" { spawn \"fuzzel\"; }\n    Super+Alt+L hotkey-overlay-title=\"Lock the Screen: swaylock\" { spawn \"swaylock\"; }\n\n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\n    // Note: the entire command goes as a single argument in the end.\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\n\n    // Example volume keys mappings for PipeWire & WirePlumber.\n    // The allow-when-locked=true property makes them work even when the session is locked.\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\n\n    // Open/close the Overview: a zoomed-out view of workspaces and windows.\n    // You can also move the mouse into the top-left hot corner,\n    // or do a four-finger swipe up on a touchpad.\n    Mod+O { toggle-overview; }\n\n    Mod+Q { close-window; }\n\n    Mod+Left  { focus-column-left; }\n    Mod+Down  { focus-window-down; }\n    Mod+Up    { focus-window-up; }\n    Mod+Right { focus-column-right; }\n    Mod+H     { focus-column-left; }\n    Mod+J     { focus-window-down; }\n    Mod+K     { focus-window-up; }\n    Mod+L     { focus-column-right; }\n\n    Mod+Ctrl+Left  { move-column-left; }\n    Mod+Ctrl+Down  { move-window-down; }\n    Mod+Ctrl+Up    { move-window-up; }\n    Mod+Ctrl+Right { move-column-right; }\n    Mod+Ctrl+H     { move-column-left; }\n    Mod+Ctrl+J     { move-window-down; }\n    Mod+Ctrl+K     { move-window-up; }\n    Mod+Ctrl+L     { move-column-right; }\n\n    // Alternative commands that move across workspaces when reaching\n    // the first or last window in a column.\n    // Mod+J     { focus-window-or-workspace-down; }\n    // Mod+K     { focus-window-or-workspace-up; }\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\n\n    Mod+Home { focus-column-first; }\n    Mod+End  { focus-column-last; }\n    Mod+Ctrl+Home { move-column-to-first; }\n    Mod+Ctrl+End  { move-column-to-last; }\n\n    Mod+Shift+Left  { focus-monitor-left; }\n    Mod+Shift+Down  { focus-monitor-down; }\n    Mod+Shift+Up    { focus-monitor-up; }\n    Mod+Shift+Right { focus-monitor-right; }\n    Mod+Shift+H     { focus-monitor-left; }\n    Mod+Shift+J     { focus-monitor-down; }\n    Mod+Shift+K     { focus-monitor-up; }\n    Mod+Shift+L     { focus-monitor-right; }\n\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\n    // ...\n\n    // And you can also move a whole workspace to another monitor:\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\n    // ...\n\n    Mod+Page_Down      { focus-workspace-down; }\n    Mod+Page_Up        { focus-workspace-up; }\n    Mod+U              { focus-workspace-down; }\n    Mod+I              { focus-workspace-up; }\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\n    // ...\n\n    Mod+Shift+Page_Down { move-workspace-down; }\n    Mod+Shift+Page_Up   { move-workspace-up; }\n    Mod+Shift+U         { move-workspace-down; }\n    Mod+Shift+I         { move-workspace-up; }\n\n    // You can bind mouse wheel scroll ticks using the following syntax.\n    // These binds will change direction based on the natural-scroll setting.\n    //\n    // To avoid scrolling through workspaces really fast, you can use\n    // the cooldown-ms property. The bind will be rate-limited to this value.\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\n\n    Mod+WheelScrollRight      { focus-column-right; }\n    Mod+WheelScrollLeft       { focus-column-left; }\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\n\n    // Usually scrolling up and down with Shift in applications results in\n    // horizontal scrolling; these binds replicate that.\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\n\n    // Similarly, you can bind touchpad scroll \"ticks\".\n    // Touchpad scrolling is continuous, so for these binds it is split into\n    // discrete intervals.\n    // These binds are also affected by touchpad's natural-scroll, so these\n    // example binds are \"inverted\", since we have natural-scroll enabled for\n    // touchpads by default.\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\n\n    // You can refer to workspaces by index. However, keep in mind that\n    // niri is a dynamic workspace system, so these commands are kind of\n    // \"best effort\". Trying to refer to a workspace index bigger than\n    // the current workspace count will instead refer to the bottommost\n    // (empty) workspace.\n    //\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\n    // will all refer to the 3rd workspace.\n    Mod+1 { focus-workspace 1; }\n    Mod+2 { focus-workspace 2; }\n    Mod+3 { focus-workspace 3; }\n    Mod+4 { focus-workspace 4; }\n    Mod+5 { focus-workspace 5; }\n    Mod+6 { focus-workspace 6; }\n    Mod+7 { focus-workspace 7; }\n    Mod+8 { focus-workspace 8; }\n    Mod+9 { focus-workspace 9; }\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\n\n    // Alternatively, there are commands to move just a single window:\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\n\n    // Switches focus between the current and the previous workspace.\n    // Mod+Tab { focus-workspace-previous; }\n\n    // The following binds move the focused window in and out of a column.\n    // If the window is alone, they will consume it into the nearby column to the side.\n    // If the window is already in a column, they will expel it out.\n    Mod+BracketLeft  { consume-or-expel-window-left; }\n    Mod+BracketRight { consume-or-expel-window-right; }\n\n    // Consume one window from the right to the bottom of the focused column.\n    Mod+Comma  { consume-window-into-column; }\n    // Expel the bottom window from the focused column to the right.\n    Mod+Period { expel-window-from-column; }\n\n    Mod+R { switch-preset-column-width; }\n    Mod+Shift+R { switch-preset-window-height; }\n    Mod+Ctrl+R { reset-window-height; }\n    Mod+F { maximize-column; }\n    Mod+Shift+F { fullscreen-window; }\n\n    // Expand the focused column to space not taken up by other fully visible columns.\n    // Makes the column \"fill the rest of the space\".\n    Mod+Ctrl+F { expand-column-to-available-width; }\n\n    Mod+C { center-column; }\n\n    // Finer width adjustments.\n    // This command can also:\n    // * set width in pixels: \"1000\"\n    // * adjust width in pixels: \"-5\" or \"+5\"\n    // * set width as a percentage of screen width: \"25%\"\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\n    Mod+Minus { set-column-width \"-10%\"; }\n    Mod+Equal { set-column-width \"+10%\"; }\n\n    // Finer height adjustments when in column with other windows.\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\n\n    // Move the focused window between the floating and the tiling layout.\n    Mod+V       { toggle-window-floating; }\n    Mod+Shift+V { switch-focus-between-floating-and-tiling; }\n\n    // Toggle tabbed column display mode.\n    // Windows in this column will appear as vertical tabs,\n    // rather than stacked on top of each other.\n    Mod+W { toggle-column-tabbed-display; }\n\n    // Actions to switch layouts.\n    // Note: if you uncomment these, make sure you do NOT have\n    // a matching layout switch hotkey configured in xkb options above.\n    // Having both at once on the same hotkey will break the switching,\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\n    // Mod+Space       { switch-layout \"next\"; }\n    // Mod+Shift+Space { switch-layout \"prev\"; }\n\n    Print { screenshot; }\n    Ctrl+Print { screenshot-screen; }\n    Alt+Print { screenshot-window; }\n\n    // Applications such as remote-desktop clients and software KVM switches may\n    // request that niri stops processing the keyboard shortcuts defined here\n    // so they may, for example, forward the key presses as-is to a remote machine.\n    // It's a good idea to bind an escape hatch to toggle the inhibitor,\n    // so a buggy application can't hold your session hostage.\n    //\n    // The allow-inhibiting=false property can be applied to other binds as well,\n    // which ensures niri always processes them, even when an inhibitor is active.\n    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }\n\n    // The quit action will show a confirmation dialog to avoid accidental exits.\n    Mod+Shift+E { quit; }\n    Ctrl+Alt+Delete { quit; }\n\n    // Powers off the monitors. To turn them back on, do any input like\n    // moving the mouse or pressing any other key.\n    Mod+Shift+P { power-off-monitors; }\n}\n```\n\n<!--\nIf you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to \"see\" only X11 windows.\n\nYou can also check what process the window PID belongs to:\n\n$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe\n\nIf this points to xwayland-satellite, then it's an X11 window.\n\nPlease report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues\n-->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: \nniri stable v25.05 (commit ae89cb6017668f3a81ccd92461cbbc70ab8377d0)\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: \nnixos 25.01\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \nnvidia 1060\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:\n12th Gen Intel(R) Core(TM) i5-12400F",
      "created_at": "2025-05-18T15:18:01Z",
      "updated_at": "2025-05-20T14:02:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyU9R",
        "body": "a silly question, I don't have notify-send\r\nand then, bash -c to use slurp & grim & wl-copy should like this:\r\n`Mod+Shift+C { spawn \"bash\" \"-c\" \"geometry=$(slurp) && grim -g \\\"$geometry\\\" - | wl-copy\";}`\r\n"
      },
      "user": {
        "login": "liu0fanyi",
        "avatar_url": "https://avatars.githubusercontent.com/u/3987452?u=f3490dd2086d265f5fc1b63b826aa100e32f7db0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af2cW",
      "number": 1619,
      "title": "Output Mirroring",
      "body": "I found the comment in the code that mirroring isn't supported, but I couldn't find an open issue for this.\r\n\r\nI run 3 monitors at my office, two identical and run side by side; one smaller monitor used as a Teleprompter.\r\n\r\nI want my Teleprompter to mirror one of my main monitors.\r\n\r\nIs this something that would be could be supported?\r\n\r\n```kdl\r\n// Always laptop screen\r\noutput \"eDP-1\" {\r\n\tscale 2.0\r\n\tposition x=0 y=0\r\n}\r\n\r\n// Office monitors\r\noutput \"DP-1\" {\r\n\tscale 2.0\r\n\tposition x=0 y=0\r\n\tfocus-at-startup\r\n}\r\n\r\noutput \"DP-2\" {\r\n\tscale 2.0\r\n}\r\n\r\n// Home monitor\r\noutput \"Samsung Electric Company LS32A70 HK2WB00305\" {\r\n\tscale 1.75\r\n}\r\n\r\n// Teleprompter\r\noutput \"Invalid Vendor Codename - RTK Field Monitor J257M96B00FL\" {\r\n    scale 2.0\r\n    mode \"1920x1080@60.000\"\r\n    transform \"180\"\r\n    // Let's just move it out of the way, the mouse cannot get here.\r\n    // It's used purely as a Teleprompter anyway.\r\n    // Do this until niri supports mirroring.\r\n    position x=0 y=1080\r\n}\r\n```\r\n\r\n",
      "created_at": "2025-05-20T10:46:55Z",
      "updated_at": "2025-05-20T10:48:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rawkode",
        "avatar_url": "https://avatars.githubusercontent.com/u/145816?u=f080bb722a4d659609e29c098269f2eae314c62c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af1la",
      "number": 1614,
      "title": "Matrix Space",
      "body": "Currently, Niri has two rooms on Matrix: the [main room](https://matrix.to/#/#niri:matrix.org) and the [offtopic room](https://matrix.to/#/#niri-offtopic:zimward.moe). Since there isn't much information about the offtopic room, its hard to discover. Additionally, the lack of specialized rooms for other topics leads to the main room being a bit of a mess at times.\r\n\r\nThe matrix protocol supports organizing multiroom conversations into [spaces](https://ems-docs.element.io/books/element-support/page/getting-started-creating-a-space). I think Niri's community is getting to the point it could benefit from this. Existing rooms can be added to a newly formed space, ensuring people and message history automatically join.\r\n\r\nAn initial space could contain the following:\r\n- `#general` - migrated from the current main room\r\n- `#nix-flake` - dedicated to Nix/OS & HM questions\r\n- `#apps` - dedicated to complementary tools, ricing and config\r\n- `#offtopic` - migrated from the current offtopic room\r\n- `#development` - dedicated to Niri development",
      "created_at": "2025-05-19T14:32:19Z",
      "updated_at": "2025-05-19T15:33:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ixxie",
        "avatar_url": "https://avatars.githubusercontent.com/u/20320695?u=6cef2360dce4665fa8661ad6c9bd4f89deb9f244&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af1gp",
      "number": 1612,
      "title": "Ordered output positioning",
      "body": "# challenge\r\n\r\nThe current positioning system for outputs is very precise in exchange for some rough edges:\r\n- Users need to calculate positioning manually to configure monitor positions to their liking\r\n- Configuration is not easily adaptable to variable output connections, e.g. if I use my HDMI output for various projectors and screens, I would need to configure them all manually\r\n\r\n# proposal\r\n\r\nAdd a secondary mechanism for positioning outputs called **ordered positioning**, which is configured with integer values:\r\n\r\n```kdl\r\noutput \"eDP-1\" {\r\n     position order=0\r\n}\r\n\r\noutput \"HDMI-A-1\" {\r\n    position order=100\r\n}\r\n\r\noutput \"HDMI-A-2\" {\r\n    position order=-100\r\n}\r\n\r\n// connected to HDMI-A-2\r\noutput \"Some Company CoolMonitor 1234\" {\r\n    // more specific than the connector, so overrides the previous\r\n    position order=50\r\n}\r\n```\r\n\r\n- When provided, orders would override output name in the [automatic positioning algorithm](https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs#automatic-positioning).\r\n- Orders would not be compatible with absolute positions, and Niri will throw a configuration error if the user tries to do this.\r\n- When unconfigured monitors are added, their order is automatically chosen to be greater than the largest current value. If multiple monitors need to be assigned a position, they are sorted by their names as the absolute mode does.\r\n\r\nThis would already be valuable; what follows is extra 'nice to have' features that could be omitted or added later.\r\n\r\n# bonus\r\n\r\n## configuration\r\n\r\nGlobal configuration options would allow tweaking things:\r\n```kdl\r\nordered-positioning {\r\n   direction \"right-to-left\" // default is \"left-to-right\"\r\n   align-to \"center\" // or \"top\" or \"bottom\", maybe even \"stretch\"\r\n   auto-delta 100 // what value to add to automatically added output orders\r\n}\r\n```\r\n\r\n## action\r\n\r\nWhen configuring outputs and the global `auto-delta`, you will have noticed I used `100` as the default different. This allows ad-hoc insertion of monitors *between* standard configured monitors. For example, in the above config example, the company monitor would go between the laptop monitor and the `HDMI-A-1` output.\r\n\r\nLikewise an action would allow setting the order:\r\n```\r\nniri msg action set-output-order \"HDMI-A-1\" 200\r\n```\r\n\r\n",
      "created_at": "2025-05-19T13:25:51Z",
      "updated_at": "2025-05-19T15:08:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ixxie",
        "avatar_url": "https://avatars.githubusercontent.com/u/20320695?u=6cef2360dce4665fa8661ad6c9bd4f89deb9f244&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af1h6",
      "number": 1613,
      "title": "Just wishes",
      "body": "Просто слова поддержки. Спасибо за [wl-clipboard-rs](https://github.com/YaLTeR/wl-clipboard-rs) и [niri](https://github.com/YaLTeR/niri) продолжай в том же духе братюнь)\r\nRust это power)",
      "created_at": "2025-05-19T13:44:19Z",
      "updated_at": "2025-05-19T14:17:53Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "p2ndemic",
        "avatar_url": "https://avatars.githubusercontent.com/u/162058065?u=1886d509c11dc986609adbc43eccb804ddd9025b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0BT",
      "number": 1587,
      "title": "layer shell animation support?",
      "body": "switch to niri recently, really like it, wonder that how can I add animation for layer shell? such as rofi, swaync. I check the animation section on wikli, but there is no information about animation for layer?  if this function is not available now, will add animation for layer shell in the future? ",
      "created_at": "2025-05-17T12:50:37Z",
      "updated_at": "2025-05-19T11:54:30Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "DENG-XC",
        "avatar_url": "https://avatars.githubusercontent.com/u/153186602?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afvhi",
      "number": 1570,
      "title": "[feature request] window confirmation for actions",
      "body": "Since Niri has this confirmation window for quitting, I thought: could we have it for actions? that way, the user can have a confirmation step before doing something, and different from quit, which has a skip-confirmation, that could be opt-in instead.\r\n\r\nI don't know if this is already available and I just haven't found it, or if someone has already suggested it (I've done a quick search, just didn't find it).",
      "created_at": "2025-05-14T02:05:14Z",
      "updated_at": "2025-05-19T11:22:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "datsfilipe",
        "avatar_url": "https://avatars.githubusercontent.com/u/76636791?u=bf59290b00da8b7b61684458ccf6b5c63866ee8d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0lV",
      "number": 1598,
      "title": "niri with 1Password / op CLI",
      "body": "I have 1Password \"working\" via xsatellite-wayland and the majority of functionality is working fine.\r\n\r\nHowever, `op signin` doesn't work. It says it's trying to show an authentication prompt, but it's not actually showing on the screen.\r\n\r\nHas anyone worked this out yet?",
      "created_at": "2025-05-18T11:22:02Z",
      "updated_at": "2025-05-18T21:10:12Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyTZV",
        "body": "If anyone finds this in the future, the problem was rather trivial:\r\n\r\n\r\nMake sure polkit-gnome is running :)"
      },
      "user": {
        "login": "rawkode",
        "avatar_url": "https://avatars.githubusercontent.com/u/145816?u=f080bb722a4d659609e29c098269f2eae314c62c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0ot",
      "number": 1600,
      "title": "kitty's quick-access-panel doesn't work on Niri",
      "body": "In the [compatibility panel](https://sw.kovidgoyal.net/kitty/kittens/panel/#panel-compat) it says Niri doesn't work properly, locking the keyboard focus when unmapping, and in the PR it says that [Niri's wlr-layer-shell implementation is buggy](https://github.com/kovidgoyal/kitty/issues/8592#issuecomment-2843880165). Is this a known issue? Is it going to be resolved?",
      "created_at": "2025-05-18T13:31:52Z",
      "updated_at": "2025-05-18T14:08:37Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyS3z",
        "body": "Possible. See #1592 "
      },
      "user": {
        "login": "arthsmn",
        "avatar_url": "https://avatars.githubusercontent.com/u/150680976?u=3a2e561433c635e51d949cbf746c9db7cfc4a3a6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfF8f",
      "number": 1374,
      "title": "Does anyone have a solution for window-rules targeting Firefox extensions?",
      "body": "Annoying, when opening an extension pop-up, Firefox starts it with the title \"Mozilla Firefox\" before changing it to a relevant title.\r\n\r\nExample from the event-stream:\r\n\r\n```\r\nWorkspace 1: active window changed to Some(70)\r\nWindow opened or changed: Window { id: 70, title: Some(\"Mozilla Firefox\"), app_id: Some(\"firefox\"), pid: Some(1143664), workspace_id: Some(1), is_focused: true, is_floating: false }\r\nWindow opened or changed: Window { id: 70, title: Some(\"Extension: (Bitwarden Password Manager) - — Mozilla Firefox\"), app_id: Some(\"firefox\"), pid: Some(1143664), workspace_id: Some(1), is_focused: true, is_floating: false }\r\nWindow opened or changed: Window { id: 70, title: Some(\"Extension: (Bitwarden Password Manager) - Bitwarden — Mozilla Firefox\"), app_id: Some(\"firefox\"), pid: Some(1143664), workspace_id: Some(1), is_focused: true, is_floating: false }\r\n```\r\n\r\nI would like, for example, Bitwarden pop-ups to be floating, but not all firefox windows.\r\n\r\nShort of writing a script to follow the event-stream and watch for these title-changes, does anyone have a good way of doing this? Maybe something like \"match based on the parent process's app_id and title\" would work for this.\r\n\r\nI've been loving niri, by the way! It's so great!",
      "created_at": "2025-03-31T18:13:26Z",
      "updated_at": "2025-05-18T12:16:19Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "paholg",
        "avatar_url": "https://avatars.githubusercontent.com/u/4908217?u=aa2979e5485bbe544c42fad53ea4642bb077b21d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0jT",
      "number": 1595,
      "title": "A way to dynamically create a workspace before first",
      "body": "I know of the configuration option `empty-workspace-above-first`. I do have it enabled, but it is a bit too much for the need that it fulfills. I think it'd be good if there was a way to create the new first workspace ONLY when it's actually needed. With the mentioned option enabled, the empty workspace always sits there in the first index, when it really is needed only when I want to move some window there. This empty workspace being there all the time often makes me \"overshoot\" when I want to quickly go up to the first workspace (via repeatedly invoking \"focus-workspace-up\", because I cannot get used to Super+1 somehow).\r\n\r\nI think it'd be great if one of the following got implemented:\r\n\r\n- you can use `niri msg action move-window-to-workspace-up --create-new-if-top-reached` or something similar to create the workspace dynamically when moving windows.\r\n- allow `niri msg action move-window-to-workspace -1` to create the new workspace via script (and then move window there via the same script)",
      "created_at": "2025-05-18T09:52:43Z",
      "updated_at": "2025-05-18T10:41:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0iC",
      "number": 1594,
      "title": "Niri's Dynamic Cast Target as default?",
      "body": "I'm using xdg-desktop-portal-gnome since I'm on Fedora Workstation. My question is about the new Niri Dynamic Cast Target. This feature is so awesome, that I don't think I'd have any use case for selecting any other cast target from now on.\r\nHowever, when starting the sharing, I have to always click through the sharing window's options to be able to select the right target. The window always opens up on the \"Displays\" section. When I go to the \"Windows\" section, the order of entries seems random, which makes it difficult to quickly select the Dynamic target. Are there any ways to make this selection faster? Not sure how much control Niri has over this process. Even just moving Niri Dynamic Target to the top (or last option) would be an improvement, it would make it clear where I have to look for it.\r\n\r\n![image](https://github.com/user-attachments/assets/22bb816f-2185-4685-b805-fb8d5749308f)\r\n",
      "created_at": "2025-05-18T09:04:49Z",
      "updated_at": "2025-05-18T09:57:48Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AySjo",
        "body": "Unfortunately we can't really make it better unless we make our own Screencast portal. Which is something we should do at some point either way, just it's work, so yeah"
      },
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Af0UZ",
      "number": 1590,
      "title": "Not possible to make device specific input configurations.",
      "body": "Hello,\r\n\r\nsometimes different keyboards need different layouts.\r\nConsider these lines from a sway-config:\r\n```\r\ninput 2821:6582:Asus_Keyboard {\r\n        xkb_layout \"de\"\r\n}\r\n\r\ninput 7847:2311:SEMITEK_USB-HID_Gaming_Keyboard {\r\n    xkb_layout us,de\r\n    xkb_options grp:rctrl_toggle\r\n    repeat_delay 180\r\n    repeat_rate 37\r\n}\r\n\r\ninput 6645:12885:NuPhy_NuPhy_Air60_V2 {\r\n    xkb_layout eu,de\r\n    xkb_options grp:shifts_toggle,lv3:rwin_switch\r\n    repeat_delay 180\r\n    repeat_rate 37\r\n}\r\n```\r\n\r\nTo my knowledge this is not possible under Niri (or atleast not documented).\r\n\r\nRegards.\r\n-S",
      "created_at": "2025-05-17T22:33:36Z",
      "updated_at": "2025-05-18T09:06:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "two-horned",
        "avatar_url": "https://avatars.githubusercontent.com/u/95277266?u=eca01e8064b4788015ee2f08fa22c1d6b7a6ecc5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaPui",
      "number": 486,
      "title": "Bind Mouse Buttons",
      "body": "Ability to configure mouse buttons (at least side \"back\" and \"forward\") actions.\r\n\r\nFor instance, in hyprland I have:\r\n\r\n`bind = , mouse:275, exec, wtype -M ctrl -k w -m ctrl     # mouse \"back\" -> ctrl+w (close tab)`",
      "created_at": "2024-06-30T16:08:45Z",
      "updated_at": "2025-05-18T04:46:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rrveex",
        "avatar_url": "https://avatars.githubusercontent.com/u/91850165?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfylK",
      "number": 1582,
      "title": "My niri setup.",
      "body": "Hi all!\r\nThis is my current niri setup. It uses eww for the bar and the desktop widgets.\r\nHope you like it.\r\n\r\n![Screenshot-2025-05-16 09-46-58](https://github.com/user-attachments/assets/4688cc80-8552-4017-aadc-a1eb6b945dc4)\r\n\r\n",
      "created_at": "2025-05-16T07:48:54Z",
      "updated_at": "2025-05-16T08:16:59Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "antoniocorbi",
        "avatar_url": "https://avatars.githubusercontent.com/u/7315145?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfycN",
      "number": 1580,
      "title": "Non",
      "body": "I also have been writing a wm for the last few years (DK) and I'm sorry to post it as an issue but I really like your work and documentation but didn't know how else to say it. Please keep up the great work and introducing new concepts to the WM space, I really like some of your ideas for monitor handling.\n\nCheers,\nNate",
      "created_at": "2025-05-15T23:56:07Z",
      "updated_at": "2025-05-16T05:20:15Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "natemaia",
        "avatar_url": "https://avatars.githubusercontent.com/u/29465624?u=287c5af759ee12f27d1354a4a87edf555fd73b4a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad1Hi",
      "number": 972,
      "title": "Add `default-floating-position relative-to=\"cursor\"` window rule",
      "body": "Useful to have particularly poorly behaved windows spawn by the cursor.",
      "created_at": "2025-01-13T15:19:18Z",
      "updated_at": "2025-05-15T15:54:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Supreeeme",
        "avatar_url": "https://avatars.githubusercontent.com/u/7882157?u=00b9be59810b4811d4378441aef703e35eb970ec&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aepwl",
      "number": 1203,
      "title": "Add support for custom modes for outputs",
      "body": "setting custom screen resolution is the only way i can use all of my pixels on my 5120x1440 monitor. currently, the max available resolution in wlr-randr is 3840x1080, and there is no way to use a bigger one. on Hyprland, i can set my actual size and it supports it, but someone somewhere said me, that niri does not support custom screen resolutions as Hyprland does, so i write this issue\r\n(i cant find any similar issue and that's definitely a feature i'd like to request)\r\ni use opensource nvidia drivers for my 3060, and they work great (on Hyprland at least), so i dont have any reason to switch back to proprietary ones (that might support my native resolution out of the box in niri)",
      "created_at": "2025-03-03T21:14:50Z",
      "updated_at": "2025-05-15T14:50:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ralencode",
        "avatar_url": "https://avatars.githubusercontent.com/u/74360792?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfxCY",
      "number": 1576,
      "title": "how do i organize named workspaces",
      "body": "so i have this config\r\n```\r\nworkspace \"browser\"\r\n\r\nwindow-rule {\r\n  match at-startup=true app-id=\"zen\"\r\n  open-on-workspace \"browser\"\r\n  open-maximized true\r\n}\r\n\r\nworkspace \"chat\"\r\n\r\nwindow-rule {\r\n  match at-startup=true app-id=\"vesktop\"\r\n  open-on-workspace \"chat\"\r\n  open-maximized true\r\n}\r\n```\r\n\r\ni would like to have browser as like, the first workspace and chat as a 2nd workspace and so on and so fourth",
      "created_at": "2025-05-15T04:05:54Z",
      "updated_at": "2025-05-15T04:36:13Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AyLRB",
        "body": "After you restart it will be in order they are in the config file. At runtime you can move workspaces around with Mod+Shift+PgUp/Down"
      },
      "user": {
        "login": "anispwyn",
        "avatar_url": "https://avatars.githubusercontent.com/u/36318840?u=f57bd0e7b00662dfd5918d2d8d89bb5962099300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfwkS",
      "number": 1573,
      "title": "Don'y allow starting apps to steal focus",
      "body": "There are cases where I want to open multiple apps, one after another. I usually do that with Fuzzel. So, I open Fuzzel, look for the app, press enter, open Fuzzel again, look for another app, and so on...\r\n\r\nThe problem is that when I command some app to open, and reopen Fuzzel, the app steals the focus when its window opens, which in turn closes Fuzzel and sometimes, by accident, I type in the next app's name into the app that just opened instead of into Fuzzel.\r\n\r\nI think it could be a good idea to disable this automatic focus switch to new windows in some predefined cases. For example, when the app being focused is fuzzel, there could be some rule that disallows any other window to get automatic focus.\r\nWhat do you think?",
      "created_at": "2025-05-14T15:56:30Z",
      "updated_at": "2025-05-14T18:33:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfenQ",
      "number": 1483,
      "title": "Any way to focus browser automatically when another app opens a tab?",
      "body": "When opening some link within any app (like mail client or terminal), a new tab gets created in an open browser instance (Firefox in my case). Is there any way to automatically focus the browser window with that new webpage open? Currently, when opening links, we need to manually find the browser window to see the webpage.",
      "created_at": "2025-04-27T18:27:57Z",
      "updated_at": "2025-05-14T15:52:29Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afwhu",
      "number": 1572,
      "title": "Add `is-fullscreen` and `is-windowed-fullscreen` match criteria for window rules.",
      "body": "Add a match criteria can match the windows that are `fullscreen` or `windowed-fullscreen`. For my use case I would like to have different border color for a window that is `windowed-fullscreen`. So that those windows can be distinguished with windows that have max column width.",
      "created_at": "2025-05-14T15:27:08Z",
      "updated_at": "2025-05-14T15:52:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "voidstar-null",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?u=9284ed0b1e1f71e30306d1672bfc0f045ddf9003&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfdrS",
      "number": 1480,
      "title": "Add support for Nerd Font icons on the Hotkey Overlay",
      "body": "Amazing project. Still getting surprised by how good it is!\r\n\r\nI'd like to add custom [nerd font icons](https://www.nerdfonts.com/cheat-sheet) to my custom `hotkey-overlay-title`s.",
      "created_at": "2025-04-27T05:10:24Z",
      "updated_at": "2025-05-13T14:22:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "andradei",
        "avatar_url": "https://avatars.githubusercontent.com/u/2653546?u=b4877fa47bdbd776c28ea0e1a59068c9e322d74b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab2eM",
      "number": 726,
      "title": "[Feature request] Pointer emulation",
      "body": "Would it be possible to add touch pointer emulation to Niri? By that I mean the ability to simulate mouse clicks with touch/pen input in clients which don't support touch input directly (for instance [yambar](https://codeberg.org/dnkl/yambar), see [this issue](https://codeberg.org/dnkl/yambar/issues/359))\r\n\r\nIf I'm not mistaken [this](https://github.com/swaywm/sway/pull/5229) is the implementation of pointer emulation in Sway. I didn't find anything in Smithay or Cosmic upstream though.\r\n\r\nI'd be happy to help in testing this functionality.",
      "created_at": "2024-10-10T15:09:42Z",
      "updated_at": "2025-05-13T11:50:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "itshog",
        "avatar_url": "https://avatars.githubusercontent.com/u/130040841?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae4nI",
      "number": 1292,
      "title": "Shake cursor to find",
      "body": "Since , I'm used to having small cursor sizes on my desktop, but sometimes its just hard to locate the cursor if the background color is same as the cursor. So, having a \"Shake to find cursor\" option seem viable in this case. KDE has this by default now, and there are some extensions for gnome that do that. Its also achievable in Hyprland via a [plugin](https://github.com/VirtCode/hypr-dynamic-cursors). \r\n\r\nIk this is a niche use case,but I'm still posting it, hoping this ever becomes a thing in niri.\r\n\r\nAgain, thanks for this awesome project!",
      "created_at": "2025-03-18T03:16:51Z",
      "updated_at": "2025-05-12T15:20:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "voidstar-null",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?u=9284ed0b1e1f71e30306d1672bfc0f045ddf9003&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfKTS",
      "number": 1394,
      "title": "Center multiple columns",
      "body": "Thanks for your work on Niri, and apologies if I missed a previous discussion on this topic, or if this is already possible.\r\n\r\nI'd like to be able to center multiple columns.\r\n\r\nMy primary motivator is that I often have a 1/2 width editor and a 1/3 width terminal open, which leads to this awkward layout:\r\n\r\n```\r\n┌─────────────────────────────┐\r\n│        ┌───────────┐┌──────┐│\r\n│        │           ││      ││\r\n│        │           ││      ││\r\n│        │           ││      ││\r\n│        │           ││      ││\r\n│        │           ││      ││\r\n│        │           ││      ││\r\n│        │           ││      ││\r\n│        └───────────┘└──────┘│\r\n└─────────────────────────────┘\r\n```\r\n\r\nInstead, I'd like to be able to view this like this:\r\n```\r\n┌─────────────────────────────┐\r\n│    ┌───────────┐┌──────┐    │\r\n│    │           ││      │    │\r\n│    │           ││      │    │\r\n│    │           ││      │    │\r\n│    │           ││      │    │\r\n│    │           ││      │    │\r\n│    │           ││      │    │\r\n│    │           ││      │    │\r\n│    └───────────┘└──────┘    │\r\n└─────────────────────────────┘\r\n```\r\n\r\nOff the top of my head, the way I'd imagine this working is one or both of\r\n1. a setting akin to `always-center-single-column` that centers all columns, if they fit \r\n1. a `center-visible-columns` action that centers all columns that are currently entirely on screen",
      "created_at": "2025-04-05T03:44:22Z",
      "updated_at": "2025-05-12T14:01:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jonascarpay",
        "avatar_url": "https://avatars.githubusercontent.com/u/3593851?u=1dc9325c8968f5dbad5db6e7512a231011eef96e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfsU_",
      "number": 1559,
      "title": "Few questions (focus behavior after closing window, external keyboard layout change)",
      "body": "Hello. I have a few questions:\r\n- Is it possible to control the focus behavior after closing a window (Mod+Q)? Currently it can switch to previous or next column (for me it feels unpredictable). I want it to always focus on the previous column (or focus on next window only if first window in column was closed).\r\n- How can I temporary change input->keyboard->xkb->layout/variant settings from external script or via bash command? I need to periodically switch between 2 layout groups (ex. us,ru  mac,mac <-> us,ua mac,macOS). Switching between 3 layouts is a pain if you aren't in macOS.\r\n",
      "created_at": "2025-05-11T09:30:11Z",
      "updated_at": "2025-05-11T12:22:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ax_tC",
        "body": "1: Not possible. The way it works is: if you open and close a window without focusing anything else, it goes back to previous. Otherwise to next. Like tabs in browsers.\r\n2: You can edit the config which is live reloaded. You can also use the `switch-layout` action/bind that can do by index or by next/prev, if that's more helpful."
      },
      "user": {
        "login": "vulpes-vulpeos",
        "avatar_url": "https://avatars.githubusercontent.com/u/40931454?u=e66969cbfec2f641958608afa0abec311406129e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfsGG",
      "number": 1556,
      "title": "Is it possible to start app in bellow current window instead of creating new column?",
      "body": "Thanks",
      "created_at": "2025-05-11T00:36:18Z",
      "updated_at": "2025-05-14T02:29:08Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "yangyingchao",
        "avatar_url": "https://avatars.githubusercontent.com/u/990329?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfsGb",
      "number": 1557,
      "title": "`ext-image-copy-capture` support",
      "body": "While not much currently supports `ext-image-copy-capture` it is upstream wayland and adding support for this would allow us to use cosmic-portals for screen recording which is a desirable feature. There is also a possibility of this replacing wlr capture protocols at some point in the future.",
      "created_at": "2025-05-11T00:45:10Z",
      "updated_at": "2025-05-11T05:08:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Quackdoc",
        "avatar_url": "https://avatars.githubusercontent.com/u/74831516?u=1a21ee96e1e754a955dfa63cb3b4c755e76b8ac1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfryM",
      "number": 1554,
      "title": "[Feature request] Add pointer emulation for clients that don't support touch/tablet input natively",
      "body": "As the title says, some clients don't support proper touch and/or tablet input: some compositors work around this issue by implementing some kind of \"pointer emulation\" which I believe allows to send some sort of mouse clicks to clients when using a touchscreen (correct me if I'm wrong) and thus makes those clients usable with a touchscreen. Would it be possible to implement this feature in Niri?\r\n\r\nMy main use case would be switching workspace when in tablet mode (I have a foldable laptop) using [i3bar-river](https://github.com/MaxVerevkin/i3bar-river) or [yambar](https://codeberg.org/dnkl/yambar) (the latter isn't maintained anymore since a few days ago, but these are at the moment the best options for a lightweight, minimal bar with Niri support and they both lack proper touch handling).\r\n\r\nSee for reference [this issue](https://github.com/MaxVerevkin/i3bar-river/issues/23) I created on the i3bar-river repo and the answer of the author. [This](https://codeberg.org/river/river/issues/1025) is instead the relevant issue on River side, which also lack pointer emulation at the moment. ",
      "created_at": "2025-05-10T18:08:59Z",
      "updated_at": "2025-05-10T18:10:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "itshog",
        "avatar_url": "https://avatars.githubusercontent.com/u/130040841?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afnj9",
      "number": 1536,
      "title": "[Feature Request] let spawned processes inherit stdout/stderr",
      "body": "Currently niri [redirects](https://github.com/YaLTeR/niri/blob/17343a6740bcc4ef4a87542b508620778032e3b5/src/utils/spawning.rs#L108) the stdout/stderr of spawned process to `Stdio::null()`. When a `spawn` key binding or `spawn-at-startup` does not work, it is hard to debug.",
      "created_at": "2025-05-07T07:14:14Z",
      "updated_at": "2025-05-10T14:01:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nicolas-yangli",
        "avatar_url": "https://avatars.githubusercontent.com/u/4900149?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afo3X",
      "number": 1542,
      "title": "Laptop goes to sleep after login with multiple display managers when lid is closed at boot",
      "body": "Hi,\r\nI've tried niri with multiple display managers (gdm, lightdm, sddm, greetd with regreet and agreety). On most configurations my laptop (Thinkpad T480) goes to sleep after login. I'm still trying to pin down the issue exactly. Here's what I got so far:\r\n\r\n- This only happens when the lid is closed at boot. Kinda makes sense since closing the lid should send the laptop to sleep, just not directly after login.\r\n- when I use agreety with greetd the issue also does not happen\r\n- I have noticed that the laptop goes to sleep when I run `niri msg action quit`\r\n- I have only tried regreet inside a rudimentary niri session so far no other compositor, laptop goes to sleep after login\r\n- with gdm, lightdm and sddm the laptop goes to sleep\r\n- niri is the only compositor/de/window-manager this has happened with so far\r\n\r\nIs this an issue only I am experiencing? Has someone found a workaround?\r\n\r\nEDIT:\r\nMy current workaround involves using greetd as my login manager. I added the following to my `/etc/greetd/config.toml`:\r\n\r\n```toml\r\n[initial_session]\r\ncommand = \"niri-session\"\r\nuser = \"username\"\r\n```\r\n\r\nThis logs me in automatically. To lock the system I have configured swayidle and swaylock as suggested in the wiki. Also I configured PAM, so that swaylock is able to unlock gnome-keyring as outlined in [this reddit thread](https://www.reddit.com/r/hyprland/comments/17zo1qp/unlock_gnomekeyring_with_swaylock/). This is fine for me for the time being. Nevertheless this behaviour makes it hard to recommend niri to someone who just wants to try it out and does not necessarily want to change their login/display manager. So I would be happy about other suggestions. I would also like to hear from folks with other laptops.",
      "created_at": "2025-05-08T10:21:03Z",
      "updated_at": "2025-05-10T11:12:39Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "80KiloMett",
        "avatar_url": "https://avatars.githubusercontent.com/u/55050097?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afq5k",
      "number": 1551,
      "title": "Invoke external command with key \"E\" after screenshot is taken",
      "body": "Sometimes I need to add some markup after a screenshot is taken, using extra tools like [satty](https://github.com/gabm/Satty). It would be great if this could be done automatically with the built-in screenshot feature.\r\n\r\nInitial idea:\r\n\r\n1. Add in the config file:\r\n```\r\nexternal-command-after-screenshot=\"my-satty-wrapper\"\r\n```\r\n\r\n2. If the above command is set, add a tip string in the screenshot UI to prompt the user to:\r\n```\r\nPress \"E\" to open with external app.\r\n```\r\n\r\n3. When \"E\" is pressed, save the screenshot to a file and open it with the external command.\r\n\r\n4. Wait until the command finishes, and show a notification.\r\n",
      "created_at": "2025-05-09T23:29:00Z",
      "updated_at": "2025-05-09T23:29:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "yangyingchao",
        "avatar_url": "https://avatars.githubusercontent.com/u/990329?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afplm",
      "number": 1547,
      "title": "Master/stack layout",
      "body": "I know one of the design choices in niri is to avoid resizing existing windows when spawning new ones, but that comes at the cost of scrolling the screen to the right and losing view and context of the windows on the left. I think the master/stack layout is a nice alternative, where the first window in a workspace is in its own column, and subsequent windows spawn within the right-most column that is currently visible. Possibly related to https://github.com/YaLTeR/niri/discussions/1159 but only when there is already a \"master\" column on the left.\r\n\r\n```\r\n    ┌─────────────────────┐┌─────┐\r\n    │                     ││  B  │\r\n    │                     │└─────┘\r\n    │                     │┌─────┐\r\n    │     A               ││  C  │\r\n    │                     │└─────┘\r\n    │                     │┌─────┐\r\n    │                     ││  D  │\r\n    └─────────────────────┘└─────┘\r\n```",
      "created_at": "2025-05-08T20:54:56Z",
      "updated_at": "2025-05-09T04:49:56Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "chcore",
        "avatar_url": "https://avatars.githubusercontent.com/u/83099052?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaEcu",
      "number": 446,
      "title": "Shared workspaces across monitors",
      "body": "As mentioned niri is inspired by PaperWM. Which I absolutely love, btw! One feature of PaperWM however, which I heavily used, is missing in my opinion and that one is, that the workspaces are shared across the monitors.\r\n\r\nWhile it looks a bit messy, code wise, to implement that I don't think it's too far off and it would be a super cool feature, or am I the only one feeling that?",
      "created_at": "2024-06-18T07:50:33Z",
      "updated_at": "2025-05-08T17:34:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "YannikSc",
        "avatar_url": "https://avatars.githubusercontent.com/u/29106482?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfpKu",
      "number": 1544,
      "title": "The overview should always enable edge scrolling.",
      "body": "We already scroll the viewport when the mouse hits the edge of the screen for DnD.  This is also supported in the overview.  \r\n\r\nIt seems like it should be a default to always enable this behavior while in the overview (not just for DnD).  So hitting the left edge will scroll to the left and hitting the top will scroll up, etc.  This would make all window navigation possible directly by the mouse without additional clicks or holding a keyboard modifier.  \r\n\r\nRight now, it's not possible to navigate windows in the overview with the mouse alone unless you have a horizontal scroll wheel, since a keyboard modifier would need to be pressed for horizontal cycling.  If we implement this in the overview, you'll be able to trigger the overview and then pan the screen using the mouse alone.",
      "created_at": "2025-05-08T14:10:30Z",
      "updated_at": "2025-05-08T14:28:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "richardmurri",
        "avatar_url": "https://avatars.githubusercontent.com/u/725138?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afn19",
      "number": 1539,
      "title": "move-output-to-monitor-up, move-output-to-monitor-down, move-output-to-monitor-left, move-output-to-monitor-up",
      "body": "I might be wrong, but I could not find a command, or set of commands that will accomplish this. I have two stacked monitors (top & bottom), and I put hypnotix (TV) on the top, and work on the bottom with something else. If something interesting comes on hypnotix, in LeftWM I can swap the outputs with Mod+W and watch hypnotix on the bottom monitor, and then hit Mod+W again and put it back on the top monitor. I call it swap monitors. Thank you for your attention.",
      "created_at": "2025-05-07T11:51:53Z",
      "updated_at": "2025-05-07T21:10:55Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "grndplane",
        "avatar_url": "https://avatars.githubusercontent.com/u/6069678?u=ab75993d17b236c2a5a4c85de260ad560ab7257c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfoWV",
      "number": 1541,
      "title": "add `is-in-tab-layout` match for window rules",
      "body": "\nIn #1510, I touch on how the tab overlay line doesn't always provide enough contrast. What ends up happening is that sometimes I don't notice that a given column is in the tab layout.\n\nIt would be nice if I could style tab layout columns differently, to help with making it more visually clear. A matching rule that checks if a given window is currently in the tab layout would completely solve this.\n\nAdditionally, a rule like this would allow to change the otherwise 4 rounded corners of a window to become only 2, so that the tab indicator can be made flush with the window *and not look off*.\n",
      "created_at": "2025-05-07T19:48:10Z",
      "updated_at": "2025-05-07T20:11:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Axlefublr",
        "avatar_url": "https://avatars.githubusercontent.com/u/101342105?u=d83eb94a87455ab03dc949683fddd938f5806ca8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AezRf",
      "number": 1252,
      "title": "Layer‐Shell Components animation option",
      "body": "Part of what makes Niri great for me is how responsive and smooth it feels. I think the only thing that could be implemented to make that even nicer is the option to animate a launcher opening and closing, a bar if it hides for example, and notifications.",
      "created_at": "2025-03-13T00:56:47Z",
      "updated_at": "2025-05-07T13:49:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Reffler",
        "avatar_url": "https://avatars.githubusercontent.com/u/88559687?u=2ced2e06aa782c03263629fa447a57a3a6b30168&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab-gr",
      "number": 748,
      "title": "Scratch windows",
      "body": "Hi, I have been loving Niri so far. Although it is missing some xwayland features but it is way faster and lighter on resources than paperwm. As I saw on Github that it has been inspired from paperWM, I thought that scratch space would also be available but could not find anything in the documentation. Is it in the roadmap?",
      "created_at": "2024-10-17T21:25:37Z",
      "updated_at": "2025-05-07T11:46:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ConsularParadi",
        "avatar_url": "https://avatars.githubusercontent.com/u/79075392?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afnrw",
      "number": 1538,
      "title": "Enabling window CSD for KDE/Qt applications",
      "body": "How do I enable client-side decorations (CSD) only for KDE/Qt applications?",
      "created_at": "2025-05-07T09:11:20Z",
      "updated_at": "2025-05-07T10:45:05Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "horhenaniB55",
        "avatar_url": "https://avatars.githubusercontent.com/u/200414334?u=f9cfddeea9371a64a480f363cd8a568fe4ccc406&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfmoX",
      "number": 1532,
      "title": "Add support for monitor bit depth configuration",
      "body": "Currently you can set resolution, refresh rate, vrr, scale, transform, etc for each output. However, there's no way to control the bit depth of a display through Niri (Such as running a display in 8 or 10 bit mode).\r\n\r\nThis seems like a strange thing to not have access to considering all of the other output options available. Maybe it was just forgotten?",
      "created_at": "2025-05-06T10:12:18Z",
      "updated_at": "2025-05-06T10:13:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Gwenodai",
        "avatar_url": "https://avatars.githubusercontent.com/u/14289733?u=967f742572b02a5a522f1b93d0742c4d46c3c347&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AflWO",
      "number": 1527,
      "title": "Custom events for the IPC",
      "body": "In Hyprland I have a script which is triggered via keybindings and takes actions based on which window is focused. I use it for window movement so in order to not spawn a binary a dozen times I use Hyprland's `event` dispatcher which makes the IPC emit arbitrary custom data. This also lets me have my script in a nice high-level language (specifically, TypeScript), otherwise Dash would be used to minimize startup time.\r\n\r\nWould something like this be desirable for Niri?\r\n\r\nIt could look something like this:\r\n```kdl\r\nbinds {\r\n  Mod+Up { ipc-emit \"\"\"\r\n    { \"foo\": \"bar\" }\r\n    \"\"\";\r\n  }\r\n}\r\n```",
      "created_at": "2025-05-04T22:40:35Z",
      "updated_at": "2025-05-05T09:41:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "postsolar",
        "avatar_url": "https://avatars.githubusercontent.com/u/120750161?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aepav",
      "number": 1202,
      "title": "Add an option for silent moving of windows to workspaces in niri msg actions",
      "body": "`niri msg action move-window-to-workspace` does not allow moving windows silently (i.e. not following the window to the workspace), could this feature be added?",
      "created_at": "2025-03-03T14:48:03Z",
      "updated_at": "2025-05-05T04:26:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "GregorySchwartz",
        "avatar_url": "https://avatars.githubusercontent.com/u/2490088?u=2c0820da39629b52aa56124751c1aa80b449bcbb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AflGI",
      "number": 1524,
      "title": "Easy wasy to record the screen",
      "body": "Sometimes there's a need to record some short video, mostly to capture some bug or similar.\r\nI tested a few apps from flathub, and I found that the ones I used to use in other environments do not work under Niri:\r\n\r\n- [Kooha](https://flathub.org/apps/io.github.seadve.Kooha)\r\n- [Blue Recorder](https://flathub.org/apps/sa.sy.bluerecorder)\r\n\r\nThe only one that's working is https://flathub.org/apps/com.dec05eba.gpu_screen_recorder. The issue is that it can only record the whole screen, and not a part of it.\r\nProbably the other option would be OBS, but it seems a bit heavy for the simple use case I have. Also, it seems to have some learning curve, I wasn't able to start the recording myself, probably I'll have to find some tutorial :smile: \r\n\r\nDoes anyone know any other options? Or maybe, is built-in screen recorder planned for Niri, next to its screenshot tool?",
      "created_at": "2025-05-04T12:34:46Z",
      "updated_at": "2025-05-04T17:17:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AxtNT",
        "body": "I use wl-screenrec along with slurp.\r\n\r\n[https://github.com/russelltg/wl-screenrec](url)\r\n\r\n`aplay ~/Music/click.wav && pkill wl-screenrec || wl-screenrec -g \"$(slurp)\" -f ~/Videos/Screencasts/$(date +'%s_vid.mp4')`\r\n\r\nThis will play a sound and record a section of the screen. I have it saved as a bash script that I call with key bind.\r\n\r\n`Super+Ctrl+Shift+F12 { spawn \"sh\" \"-c\" \"windowrec.sh\"; }`\r\n\r\nThe key bind acts as a toggle to start and stop recording."
      },
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AflF6",
      "number": 1523,
      "title": "Output specific proportions?",
      "body": "## The problem:\r\n\r\nI have an ultrawide (32:9) monitor and a 16:9 TV connected to the same computer.\r\nWhen I open a terminal on my ultrawide it is currently set to open at 25% width, which is perfect, but is way too small on the 16:9 monitor.\r\n\r\n## Idea:\r\n\r\nAs you would probably want to set this both globally, and in window rules (basically, anywhere you set `default-column-width` and `preset-window-widths`), maybe you could set some sort of proportion multiplier on an output?\r\n\r\nSomething like:\r\n\r\n```\r\noutput \"32:9 Ultrawide\" {\r\n  mode \"5120x1440@120.000\"\r\n  transform \"normal\"\r\n  background-color \"#000000\"\r\n  window-width-scale 0.5 // <-----\r\n}\r\n\r\noutput \"16:9 TV\" {\r\n  mode \"2560x1440@119.998\"\r\n  transform \"normal\"\r\n  background-color \"#000000\"\r\n  scale 1.5\r\n}\r\n\r\nlayout {\r\n    default-column-width { proportion 0.5; } // 50% on TV, 25% on Ultrawide\r\n    preset-column-widths {\r\n        proportion 0.5 // 50% on TV, 25% on Ultrawide\r\n        proportion 0.85 // 85% on TV, 42.5% on Ultrawide\r\n        proportion 1 // 100% on TV, 50% on Ultrawide\r\n        // Weird part here is if you want a 100% preset for the ultrawide, would you put a 2 here? Not ideal.\r\n    }\r\n}\r\n```\r\n\r\nBut in the end, as long as it would be possible to have different preset widths based on output, however it would be achieved, I would be happy :+1: \r\n\r\nThanks for Niri, it is basically the killer app for ultrawide displays :smile: ",
      "created_at": "2025-05-04T12:24:12Z",
      "updated_at": "2025-05-04T17:29:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "PaddyCo",
        "avatar_url": "https://avatars.githubusercontent.com/u/1817423?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afk1B",
      "number": 1520,
      "title": "Allow scrolling throughout a window at ≥100% width",
      "body": "Currently, if I use `set-window-width` to make a window >100%, it will always be clipped to the left, and I can't fix the view on an arbitrary section of the window.\r\n\r\nTUI text editors could benefit from this being allowed (e.g. open many splits within a single window instead of opening new windows)",
      "created_at": "2025-05-03T22:35:35Z",
      "updated_at": "2025-05-04T05:22:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "postsolar",
        "avatar_url": "https://avatars.githubusercontent.com/u/120750161?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfkZ1",
      "number": 1516,
      "title": "`environment { }` doesn't set any environment variables",
      "body": "No environment variables set in `config.kdl` are being reflected in any shell spawned within a `niri-session`.\n\nThis is true even if my `niri/config.kdl` is as small as `environment { MYVAR \"myval\"; }`.\n\nThis persists across shells (including `chsh`ing to a `/bin/bash` with no profile or config), and across restarts, but does NOT persist across users with a fresh home folder, and potentially doesn't persist despite an identical `.config` folder (I rsynced across from my user, but couldn't change any text reference to my home folder within the files).\n\nI don't have an impression of what changed in the home folder between the mechanic functioning or not, as I've been learning niri and changing the env vars at the same time as setting up the system, but I can give an overview of the user configuration that exists to try to debug this:\n\nMy `.config/systemd` has services for running a graphical polkit agent, swaybg, swaync, xdg-desktop-portal-gnome, foot-server, xwayland-satellite, emacs and syncthing. All the `user-dirs.dirs` are changed. Otherwise, everything in `.config/` is individual apps with some style config. `.local/share/` has unique icons and fonts. There's `gvfs-metadata` I don't recognise, but otherwise its just individual apps. Otherwise in my home folder there is `.pki` `.gnupg` I don't recognise, and the rest is apps and my own folders.\n\nMy system really doesn't have much out of the ordinary. Without a default window manager, endeavouros installed very few arch packages.\n\nHere's the output of pacman -Qqt which gives all 98 non-dependency packages on the system\n[mypackages.txt](https://github.com/user-attachments/files/20018138/mypackages.txt)\n\n### System Information\n\n* niri version: `niri 25.02 (unknown commit)`\n\n* Distro: `EndeavourOS Linux x86_64`\n\n* GPU: `Intel UHD Graphics 620`\n* GPU: `NVIDIA GeForce 940MX`\n\n* CPU: `Intel i7-8550U (8) @ 4.000GHz`\n",
      "created_at": "2025-05-02T20:43:48Z",
      "updated_at": "2025-05-03T16:12:32Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AxrTX",
        "body": "`mod+delete { spawn \"footclient\"; }`\r\n`ctrl+mod+delete { spawn \"fuzzel\"; }`\r\nbut AHA!!! I just used fuzzel to spawn a footclient and a foot, and the latter DOES have the niri environment changes! `foot-server.service` is started via `~/.config/systemd/user/niri.service.wants`, so that isn't the behaviour I'd expect, but that's the site of the issue!"
      },
      "user": {
        "login": "laurapigeon",
        "avatar_url": "https://avatars.githubusercontent.com/u/55944518?u=039c0c874687e1684d762e08535524e5a95004c4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfjjK",
      "number": 1513,
      "title": "Not a bug, but super annoying - git version - maybe hot corner related?!",
      "body": "Hello everyone!\r\n\r\nSince some git versions, I have the problem, that on my vertical monitor, but also my left-most horizontal monitor, I can't really use Apps like e.g. signal, because I can't click every part of the app.\r\n\r\nSo, e.g. I can't click the \"Message\" input box to actually be able to input a message.\r\n\r\nI assume this has to do with hot-corners but I don't know the actual reason.\r\n\r\nSo, this is my config:\r\n\r\n`// This config is in the KDL format: https://kdl.dev\r\n// \"/-\" comments out the following node.\r\n// Check the wiki for a full description of the configuration:\r\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\r\n\r\nspawn-at-startup \"i3bar-river\"\r\nspawn-at-startup \"wpaperd\"\r\nspawn-at-startup \"polkit-gnome-authentication-agent-1\"\r\nspawn-at-startup \"xwayland-satellite\"\r\n\r\nprefer-no-csd\r\n\r\nenvironment {\r\n  DISPLAY \":0\"\r\n  PASSWORD_STORE_X_SELECTION \"clipboard\"\r\n}\r\n\r\ncursor {\r\n  hide-when-typing\r\n}\r\n\r\nworkspace \"steam\" {\r\n  open-on-output \"DP-1\"\r\n}\r\n\r\nworkspace \"obs\" {\r\n  open-on-output \"DP-1\"\r\n}\r\n\r\nworkspace \"code\" {\r\n  open-on-output \"DP-2\"\r\n}\r\n\r\nwindow-rule {\r\n  match title=\"idea\"\r\n  open-on-workspace \"code\"\r\n}\r\n\r\nwindow-rule {\r\n  match at-startup=true title=r#\"Steam\"#\r\n  open-on-workspace \"steam\"\r\n}\r\n\r\nwindow-rule {\r\n  match at-startup=true title=r#\"OBS\"#\r\n  open-on-workspace \"obs\"\r\n}\r\n\r\n/*\r\nwindow-rule {\r\n  match title=\"Firefox\"\r\n  open-floating true\r\n  default-floating-position x=0 y=0 relative-to=\"bottom-right\"\r\n  default-column-width { fixed 500; }\r\n  default-window-height { fixed 500; }\r\n} */\r\n\r\nwindow-rule {\r\n  match title=\"Thunderbird\" \r\n  match title=\"Signal\" \r\n  //match app-id=\"idea\"\r\n  match app-id=\"rider\"\r\n  //match title=\"supersecretapp\"\r\n  match app-id=\"sublime\"\r\n  //match app-id=\"ghostty\"\r\n  block-out-from \"screencast\"\r\n}\r\n\r\n// Block out mako notifications from screencasts.\r\nlayer-rule {\r\n    match namespace=\"^notifications$\"\r\n    block-out-from \"screencast\"\r\n}\r\n\r\nwindow-rule {\r\n  match title=\"Overlay\"\r\n  open-floating true\r\n  default-floating-position x=0 y=0 relative-to=\"top-left\"\r\n  focus-ring {\r\n    off\r\n  }\r\n  border {\r\n    off\r\n  }\r\n  shadow {\r\n    off\r\n  }\r\n  tab-indicator {\r\n    active-color \"blue\"\r\n  }\r\n\r\n  min-width 2560 \r\n  min-height 1440 \r\n  max-width 2560 \r\n  max-height 1440 \r\n  clip-to-geometry false \r\n}\r\n\r\n// Input device configuration.\r\n// Find the full list of options on the wiki:\r\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Input\r\ninput {\r\n    keyboard {\r\n        xkb {\r\n            // You can set rules, model, layout, variant and options.\r\n            // For more information, see xkeyboard-config(7).\r\n\r\n            // For example:\r\n            // layout \"us,ru\"\r\n            // options \"grp:win_space_toggle,compose:ralt,ctrl:nocaps\"\r\n            layout \"us,de\"\r\n            variant \",nodeadkeys\"\r\n            options \"grp:alt_shift_toggle,caps:escape\"\r\n        }\r\n    }\r\n\r\n    // Next sections include libinput settings.\r\n    // Omitting settings disables them, or leaves them at their default values.\r\n    touchpad {\r\n        // off\r\n        tap\r\n        // dwt\r\n        // dwtp\r\n        natural-scroll\r\n        // accel-speed 0.2\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"two-finger\"\r\n        // disabled-on-external-mouse\r\n    }\r\n\r\n    mouse {\r\n        // off\r\n        // natural-scroll\r\n        // accel-speed 0.2\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"no-scroll\"\r\n    }\r\n\r\n    trackpoint {\r\n        // off\r\n        // natural-scroll\r\n        // accel-speed 0.2\r\n        // accel-profile \"flat\"\r\n        // scroll-method \"on-button-down\"\r\n        // scroll-button 273\r\n        // middle-emulation\r\n    }\r\n\r\n    // Uncomment this to make the mouse warp to the center of newly focused windows.\r\n    // warp-mouse-to-focus\r\n\r\n    // Focus windows and outputs automatically when moving the mouse into them.\r\n    // Setting max-scroll-amount=\"0%\" makes it work only on windows already fully on screen.\r\n    // focus-follows-mouse max-scroll-amount=\"0%\"\r\n}\r\n\r\n// You can configure outputs by their name, which you can find\r\n// by running `niri msg outputs` while inside a niri instance.\r\noutput \"DP-1\" {\r\n  position x=0 y=0\r\n  mode \"2560x1440\"\r\n  scale 1 \r\n}\r\n\r\noutput \"DP-2\" {\r\n  position x=2560 y=0\r\n  mode \"2560x1440\"\r\n}\r\n\r\noutput \"DP-3\" {\r\n  position x=5120 y=0\r\n  mode \"1920x1080\"\r\n  transform \"270\"\r\n  scale 1 \r\n} \r\n\r\n// The built-in laptop monitor is usually called \"eDP-1\".\r\n// Find more information on the wiki:\r\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs\r\n// Remember to uncomment the node by removing \"/-\"!\r\n/-output \"eDP-1\" {\r\n    // Uncomment this line to disable this output.\r\n    // off\r\n\r\n    // Resolution and, optionally, refresh rate of the output.\r\n    // The format is \"<width>x<height>\" or \"<width>x<height>@<refresh rate>\".\r\n    // If the refresh rate is omitted, niri will pick the highest refresh rate\r\n    // for the resolution.\r\n    // If the mode is omitted altogether or is invalid, niri will pick one automatically.\r\n    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.\r\n    mode \"1920x1080@120.030\"\r\n\r\n    // You can use integer or fractional scale, for example use 1.5 for 150% scale.\r\n    scale 2\r\n\r\n    // Transform allows to rotate the output counter-clockwise, valid values are:\r\n    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.\r\n    transform \"normal\"\r\n\r\n    // Position of the output in the global coordinate space.\r\n    // This affects directional monitor actions like \"focus-monitor-left\", and cursor movement.\r\n    // The cursor can only move between directly adjacent outputs.\r\n    // Output scale and rotation has to be taken into account for positioning:\r\n    // outputs are sized in logical, or scaled, pixels.\r\n    // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,\r\n    // so to put another output directly adjacent to it on the right, set its x to 1920.\r\n    // If the position is unset or results in an overlap, the output is instead placed\r\n    // automatically.\r\n    position x=1280 y=0\r\n}\r\n\r\n// Settings that influence how windows are positioned and sized.\r\n// Find more information on the wiki:\r\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout\r\nlayout {\r\n    // Set gaps around windows in logical pixels.\r\n    gaps 0 \r\n\r\n    // When to center a column when changing focus, options are:\r\n    // - \"never\", default behavior, focusing an off-screen column will keep at the left\r\n    //   or right edge of the screen.\r\n    // - \"always\", the focused column will always be centered.\r\n    // - \"on-overflow\", focusing a column will center it if it doesn't fit\r\n    //   together with the previously focused column.\r\n    center-focused-column \"never\"\r\n\r\n    // You can customize the widths that \"switch-preset-column-width\" (Mod+R) toggles between.\r\n    preset-column-widths {\r\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\r\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\r\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\r\n        proportion 0.33333\r\n        proportion 0.5\r\n        proportion 0.66667\r\n\r\n        // Fixed sets the width in logical pixels exactly.\r\n        // fixed 1920\r\n    }\r\n\r\n    // You can also customize the heights that \"switch-preset-window-height\" (Mod+Shift+R) toggles between.\r\n    // preset-window-heights { }\r\n\r\n    // You can change the default width of the new windows.\r\n    default-column-width { proportion 0.5; }\r\n    // If you leave the brackets empty, the windows themselves will decide their initial width.\r\n    // default-column-width {}\r\n\r\n    // By default focus ring and border are rendered as a solid background rectangle\r\n    // behind windows. That is, they will show up through semitransparent windows.\r\n    // This is because windows using client-side decorations can have an arbitrary shape.\r\n    //\r\n    // If you don't like that, you should uncomment `prefer-no-csd` below.\r\n    // Niri will draw focus ring and border *around* windows that agree to omit their\r\n    // client-side decorations.\r\n    //\r\n    // Alternatively, you can override it with a window rule called\r\n    // `draw-border-with-background`.\r\n\r\n    // You can change how the focus ring looks.\r\n    focus-ring {\r\n        // Uncomment this line to disable the focus ring.\r\n\r\n        // How many logical pixels the ring extends out from the windows.\r\n        width 4\r\n\r\n        // Colors can be set in a variety of ways:\r\n        // - CSS named colors: \"red\"\r\n        // - RGB hex: \"#rgb\", \"#rgba\", \"#rrggbb\", \"#rrggbbaa\"\r\n        // - CSS-like notation: \"rgb(255, 127, 0)\", rgba(), hsl() and a few others.\r\n\r\n        // Color of the ring on the active monitor.\r\n        active-color \"#7fc8ff\"\r\n\r\n        // Color of the ring on inactive monitors.\r\n        inactive-color \"#505050\"\r\n\r\n        // You can also use gradients. They take precedence over solid colors.\r\n        // Gradients are rendered the same as CSS linear-gradient(angle, from, to).\r\n        // The angle is the same as in linear-gradient, and is optional,\r\n        // defaulting to 180 (top-to-bottom gradient).\r\n        // You can use any CSS linear-gradient tool on the web to set these up.\r\n        // Changing the color space is also supported, check the wiki for more info.\r\n        //\r\n        // active-gradient from=\"#80c8ff\" to=\"#bbddff\" angle=45\r\n\r\n        // You can also color the gradient relative to the entire view\r\n        // of the workspace, rather than relative to just the window itself.\r\n        // To do that, set relative-to=\"workspace-view\".\r\n        //\r\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\r\n    }\r\n\r\n    // You can also add a border. It's similar to the focus ring, but always visible.\r\n    border {\r\n        // The settings are the same as for the focus ring.\r\n        // If you enable the border, you probably want to disable the focus ring.\r\n        off\r\n\r\n        width 4\r\n        active-color \"#ffc87f\"\r\n        inactive-color \"#505050\"\r\n\r\n        // active-gradient from=\"#ffbb66\" to=\"#ffc880\" angle=45 relative-to=\"workspace-view\"\r\n        // inactive-gradient from=\"#505050\" to=\"#808080\" angle=45 relative-to=\"workspace-view\"\r\n    }\r\n\r\n    // Struts shrink the area occupied by windows, similarly to layer-shell panels.\r\n    // You can think of them as a kind of outer gaps. They are set in logical pixels.\r\n    // Left and right struts will cause the next window to the side to always be visible.\r\n    // Top and bottom struts will simply add outer gaps in addition to the area occupied by\r\n    // layer-shell panels and regular gaps.\r\n    struts {\r\n        // left 64\r\n        // right 64\r\n        // top 64\r\n        // bottom 64\r\n    /*\r\n        top 0\r\n        left 0\r\n        bottom 0\r\n        right 600 */\r\n    }\r\n}\r\n\r\n// Add lines like this to spawn processes at startup.\r\n// Note that running niri as a session supports xdg-desktop-autostart,\r\n// which may be more convenient to use.\r\n// See the binds section below for more spawn examples.\r\n// spawn-at-startup \"alacritty\" \"-e\" \"fish\"\r\n\r\n// Uncomment this line to ask the clients to omit their client-side decorations if possible.\r\n// If the client will specifically ask for CSD, the request will be honored.\r\n// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.\r\n// This option will also fix border/focus ring drawing behind some semitransparent windows.\r\n// After enabling or disabling this, you need to restart the apps for this to take effect.\r\n// prefer-no-csd\r\n\r\n// You can change the path where screenshots are saved.\r\n// A ~ at the front will be expanded to the home directory.\r\n// The path is formatted with strftime(3) to give you the screenshot date and time.\r\nscreenshot-path \"~/pictures/screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\r\n\r\n// You can also set this to null to disable saving screenshots to disk.\r\n// screenshot-path null\r\n\r\n// Animation settings.\r\n// The wiki explains how to configure individual animations:\r\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations\r\nanimations {\r\n    // Uncomment to turn off all animations.\r\n    // off\r\n\r\n    // Slow down all animations by this factor. Values below 1 speed them up instead.\r\n    // slowdown 3.0\r\n}\r\n\r\n// Window rules let you adjust behavior for individual windows.\r\n// Find more information on the wiki:\r\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\r\n\r\n// Work around WezTerm's initial configure bug\r\n// by setting an empty default-column-width.\r\nwindow-rule {\r\n    // This regular expression is intentionally made as specific as possible,\r\n    // since this is the default config, and we want no false positives.\r\n    // You can get away with just app-id=\"wezterm\" if you want.\r\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\r\n    default-column-width {}\r\n}\r\n\r\n// Example: block out two password managers from screen capture.\r\n// (This example rule is commented out with a \"/-\" in front.)\r\n/-window-rule {\r\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\r\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\r\n\r\n    block-out-from \"screen-capture\"\r\n\r\n    // Use this instead if you want them visible on third-party screenshot tools.\r\n    // block-out-from \"screencast\"\r\n}\r\n\r\n// Example: enable rounded corners for all windows.\r\n// (This example rule is commented out with a \"/-\" in front.)\r\n/-window-rule {\r\n    geometry-corner-radius 12\r\n    clip-to-geometry true\r\n}\r\n\r\nbinds {\r\n    // Keys consist of modifiers separated by + signs, followed by an XKB key name\r\n    // in the end. To find an XKB name for a particular key, you may use a program\r\n    // like wev.\r\n    //\r\n    // \"Mod\" is a special modifier equal to Super when running on a TTY, and to Alt\r\n    // when running as a winit window.\r\n    //\r\n    // Most actions that you can bind here can also be invoked programmatically with\r\n    // `niri msg action do-something`.\r\n\r\n    // Mod-Shift-/, which is usually the same as Mod-?,\r\n    // shows a list of important hotkeys.\r\n    Mod+Shift+Slash { show-hotkey-overlay; }\r\n\r\n    // Suggested binds for running programs: terminal, app launcher, screen locker.\r\n    Mod+Return{ spawn \"ghostty\"; }\r\n    Mod+D { spawn \"onagre\"; }\r\n    Super+Alt+L { spawn \"swaylock\"; }\r\n\r\n    // You can also use a shell. Do this if you need pipes, multiple commands, etc.\r\n    // Note: the entire command goes as a single argument in the end.\r\n    // Mod+T { spawn \"bash\" \"-c\" \"notify-send hello && exec alacritty\"; }\r\n\r\n    // Example volume keys mappings for PipeWire & WirePlumber.\r\n    // The allow-when-locked=true property makes them work even when the session is locked.\r\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\r\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\r\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\r\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\r\n\r\n    Mod+Q { close-window; }\r\n\r\n    Mod+Left  { focus-column-left; }\r\n    Mod+Down  { focus-window-down; }\r\n    Mod+Up    { focus-window-up; }\r\n    Mod+Right { focus-column-right; }\r\n    Mod+H     { focus-column-left; }\r\n    Mod+J     { focus-window-down; }\r\n    Mod+K     { focus-window-up; }\r\n    Mod+L     { focus-column-right; }\r\n\r\n    Mod+Ctrl+Left  { move-column-left; }\r\n    Mod+Ctrl+Down  { move-window-down; }\r\n    Mod+Ctrl+Up    { move-window-up; }\r\n    Mod+Ctrl+Right { move-column-right; }\r\n    Mod+Ctrl+H     { move-column-left; }\r\n    Mod+Ctrl+J     { move-window-down; }\r\n    Mod+Ctrl+K     { move-window-up; }\r\n    Mod+Ctrl+L     { move-column-right; }\r\n\r\n    // Alternative commands that move across workspaces when reaching\r\n    // the first or last window in a column.\r\n    // Mod+J     { focus-window-or-workspace-down; }\r\n    // Mod+K     { focus-window-or-workspace-up; }\r\n    // Mod+Ctrl+J     { move-window-down-or-to-workspace-down; }\r\n    // Mod+Ctrl+K     { move-window-up-or-to-workspace-up; }\r\n\r\n    Mod+Home { focus-column-first; }\r\n    Mod+End  { focus-column-last; }\r\n    Mod+Ctrl+Home { move-column-to-first; }\r\n    Mod+Ctrl+End  { move-column-to-last; }\r\n\r\n    Mod+Shift+Left  { focus-monitor-left; }\r\n    Mod+Shift+Down  { focus-monitor-down; }\r\n    Mod+Shift+Up    { focus-monitor-up; }\r\n    Mod+Shift+Right { focus-monitor-right; }\r\n    Mod+Shift+H     { focus-monitor-left; }\r\n    Mod+Shift+J     { focus-monitor-down; }\r\n    Mod+Shift+K     { focus-monitor-up; }\r\n    Mod+Shift+L     { focus-monitor-right; }\r\n\r\n    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }\r\n    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }\r\n    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }\r\n    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }\r\n    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }\r\n    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }\r\n    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }\r\n    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }\r\n\r\n    // Alternatively, there are commands to move just a single window:\r\n    // Mod+Shift+Ctrl+Left  { move-window-to-monitor-left; }\r\n    // ...\r\n\r\n    // And you can also move a whole workspace to another monitor:\r\n    // Mod+Shift+Ctrl+Left  { move-workspace-to-monitor-left; }\r\n    // ...\r\n\r\n    Mod+Page_Down      { focus-workspace-down; }\r\n    Mod+Page_Up        { focus-workspace-up; }\r\n    Mod+U              { focus-workspace-down; }\r\n    Mod+I              { focus-workspace-up; }\r\n    Mod+Ctrl+Page_Down { move-column-to-workspace-down; }\r\n    Mod+Ctrl+Page_Up   { move-column-to-workspace-up; }\r\n    Mod+Ctrl+U         { move-column-to-workspace-down; }\r\n    Mod+Ctrl+I         { move-column-to-workspace-up; }\r\n\r\n    // Alternatively, there are commands to move just a single window:\r\n    // Mod+Ctrl+Page_Down { move-window-to-workspace-down; }\r\n    // ...\r\n\r\n    Mod+Shift+Page_Down { move-workspace-down; }\r\n    Mod+Shift+Page_Up   { move-workspace-up; }\r\n    Mod+Shift+U         { move-workspace-down; }\r\n    Mod+Shift+I         { move-workspace-up; }\r\n\r\n    // You can bind mouse wheel scroll ticks using the following syntax.\r\n    // These binds will change direction based on the natural-scroll setting.\r\n    //\r\n    // To avoid scrolling through workspaces really fast, you can use\r\n    // the cooldown-ms property. The bind will be rate-limited to this value.\r\n    // You can set a cooldown on any bind, but it's most useful for the wheel.\r\n    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }\r\n    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }\r\n    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }\r\n    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }\r\n\r\n    Mod+WheelScrollRight      { focus-column-right; }\r\n    Mod+WheelScrollLeft       { focus-column-left; }\r\n    Mod+Ctrl+WheelScrollRight { move-column-right; }\r\n    Mod+Ctrl+WheelScrollLeft  { move-column-left; }\r\n\r\n    // Usually scrolling up and down with Shift in applications results in\r\n    // horizontal scrolling; these binds replicate that.\r\n    Mod+Shift+WheelScrollDown      { focus-column-right; }\r\n    Mod+Shift+WheelScrollUp        { focus-column-left; }\r\n    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }\r\n    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }\r\n\r\n    // Similarly, you can bind touchpad scroll \"ticks\".\r\n    // Touchpad scrolling is continuous, so for these binds it is split into\r\n    // discrete intervals.\r\n    // These binds are also affected by touchpad's natural-scroll, so these\r\n    // example binds are \"inverted\", since we have natural-scroll enabled for\r\n    // touchpads by default.\r\n    // Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\r\n    // Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\r\n\r\n    // You can refer to workspaces by index. However, keep in mind that\r\n    // niri is a dynamic workspace system, so these commands are kind of\r\n    // \"best effort\". Trying to refer to a workspace index bigger than\r\n    // the current workspace count will instead refer to the bottommost\r\n    // (empty) workspace.\r\n    //\r\n    // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on\r\n    // will all refer to the 3rd workspace.\r\n    Mod+1 { focus-workspace 1; }\r\n    Mod+2 { focus-workspace 2; }\r\n    Mod+3 { focus-workspace 3; }\r\n    Mod+4 { focus-workspace 4; }\r\n    Mod+5 { focus-workspace 5; }\r\n    Mod+6 { focus-workspace 6; }\r\n    Mod+7 { focus-workspace 7; }\r\n    Mod+8 { focus-workspace 8; }\r\n    Mod+9 { focus-workspace 9; }\r\n    Mod+Ctrl+1 { move-column-to-workspace 1; }\r\n    Mod+Ctrl+2 { move-column-to-workspace 2; }\r\n    Mod+Ctrl+3 { move-column-to-workspace 3; }\r\n    Mod+Ctrl+4 { move-column-to-workspace 4; }\r\n    Mod+Ctrl+5 { move-column-to-workspace 5; }\r\n    Mod+Ctrl+6 { move-column-to-workspace 6; }\r\n    Mod+Ctrl+7 { move-column-to-workspace 7; }\r\n    Mod+Ctrl+8 { move-column-to-workspace 8; }\r\n    Mod+Ctrl+9 { move-column-to-workspace 9; }\r\n\r\n    // Alternatively, there are commands to move just a single window:\r\n    // Mod+Ctrl+1 { move-window-to-workspace 1; }\r\n\r\n    // Switches focus between the current and the previous workspace.\r\n    // Mod+Tab { focus-workspace-previous; }\r\n\r\n    // Consume one window from the right into the focused column.\r\n    Mod+Comma  { consume-window-into-column; }\r\n    // Expel one window from the focused column to the right.\r\n    Mod+Period { expel-window-from-column; }\r\n\r\n    // There are also commands that consume or expel a single window to the side.\r\n    Mod+BracketLeft  { consume-or-expel-window-left; }\r\n    Mod+BracketRight { consume-or-expel-window-right; }\r\n\r\n    Mod+R { switch-preset-column-width; }\r\n    Mod+Shift+R { switch-preset-window-height; }\r\n    Mod+Ctrl+R { reset-window-height; }\r\n    Mod+F { maximize-column; }\r\n    Mod+Shift+F { fullscreen-window; }\r\n    Mod+C { center-column; }\r\n\r\n    // Finer width adjustments.\r\n    // This command can also:\r\n    // * set width in pixels: \"1000\"\r\n    // * adjust width in pixels: \"-5\" or \"+5\"\r\n    // * set width as a percentage of screen width: \"25%\"\r\n    // * adjust width as a percentage of screen width: \"-10%\" or \"+10%\"\r\n    // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,\r\n    // set-column-width \"100\" will make the column occupy 200 physical screen pixels.\r\n    Mod+Minus { set-column-width \"-10%\"; }\r\n    Mod+Equal { set-column-width \"+10%\"; }\r\n\r\n    // Finer height adjustments when in column with other windows.\r\n    Mod+Shift+Minus { set-window-height \"-10%\"; }\r\n    Mod+Shift+Equal { set-window-height \"+10%\"; }\r\n\r\n    // Actions to switch layouts.\r\n    // Note: if you uncomment these, make sure you do NOT have\r\n    // a matching layout switch hotkey configured in xkb options above.\r\n    // Having both at once on the same hotkey will break the switching,\r\n    // since it will switch twice upon pressing the hotkey (once by xkb, once by niri).\r\n    // Mod+Space       { switch-layout \"next\"; }\r\n    // Mod+Shift+Space { switch-layout \"prev\"; }\r\n\r\n    Print { screenshot; }\r\n    Ctrl+Print { screenshot-screen; }\r\n    Alt+Print { screenshot-window; }\r\n\r\n    // The quit action will show a confirmation dialog to avoid accidental exits.\r\n    Mod+Shift+E { quit; }\r\n    Ctrl+Alt+Delete { quit; }\r\n\r\n    // Powers off the monitors. To turn them back on, do any input like\r\n    // moving the mouse or pressing any other key.\r\n    Mod+Shift+P { power-off-monitors; }\r\n}`",
      "created_at": "2025-05-02T08:45:38Z",
      "updated_at": "2025-05-02T23:20:10Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "mogambro",
        "avatar_url": "https://avatars.githubusercontent.com/u/97800396?u=7a91e0ca6350db03d097ff5df07a6b6a4d217663&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afjht",
      "number": 1511,
      "title": "Debian packaging",
      "body": "May I try packaging this to Debian?",
      "created_at": "2025-05-02T08:17:10Z",
      "updated_at": "2025-05-02T14:40:40Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "ravish0007-nh",
        "avatar_url": "https://avatars.githubusercontent.com/u/125554751?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfjHW",
      "number": 1508,
      "title": "A way to launch a set of apps on predefined workspaces",
      "body": "Is there some easy way to create some kind of \"scenarios\" which I could bind to some keys to launch a specified set of apps on predefined workspaces?\r\nFor example, I'd have a \"work\" scenario where I'd launch the usual apps I use at work, like a mail client, chat app, terminal, browser, etc., all on the right monitors and workspaces. \r\n\r\nThe only solution I can think of is to write a shell script that would spawn all those apps, but then how would I make them appear on the right monitors/workspaces?",
      "created_at": "2025-05-01T19:08:42Z",
      "updated_at": "2025-05-01T19:13:46Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfjFr",
      "number": 1506,
      "title": "nonzero dGPU usage when using iGPU",
      "body": "I'm using niri 25.02 in archlinux. I have a mobile amd 9955hx with iGPU and a 5070ti dGPU. My rendering device is my iGPU. When I run nvidia-smi, I get:\r\n![图片](https://github.com/user-attachments/assets/7c851969-dccb-42ba-8902-26663c8754b1)\r\nwhen I run nvtop, I get:\r\n![图片](https://github.com/user-attachments/assets/86b1a842-f9e4-4822-92e0-fbbe8c746466)\r\nwhich may prevent my dGPU from being suspended by nvidia D3 power management(although it's just one of the reasons).\r\nBy the way, setting debug option render-drm-device seems to move some tasks from dGPU to iGPU or vice versa, but niri always use both. I also tried to launch niri from tty instead of sddm, the issue also exists.\r\nIt's kind of like https://github.com/YaLTeR/niri/discussions/683 . but I'm not sure it's exactly the same thing.",
      "created_at": "2025-05-01T18:24:09Z",
      "updated_at": "2025-05-01T18:43:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jdksjfisdf",
        "avatar_url": "https://avatars.githubusercontent.com/u/80867768?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afi9K",
      "number": 1505,
      "title": "How to set tablet sensitivity",
      "body": "I have a [One by Wacom](https://www.wacom.com/en-us/products/pen-tablets/one-by-wacom) and it works OOTB, pretty neat actually! I'm just wondering how to configure the sensitivity, I could do it on Gnome in the gnome-control-center.",
      "created_at": "2025-05-01T15:09:25Z",
      "updated_at": "2025-05-01T15:47:54Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "arthsmn",
        "avatar_url": "https://avatars.githubusercontent.com/u/150680976?u=3a2e561433c635e51d949cbf746c9db7cfc4a3a6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afi4j",
      "number": 1504,
      "title": "Dynamic keyboard selection",
      "body": "I have recently switched to Niri after many years as an X11 AwesomeWM user.  All of my machines are configured with the same dots where I use a script to detect if one of my external programmable keyboards is attached.  \r\n\r\nThe external keyboard is pre-configured with Colemak-dhm layout. If it is detected I (use to) switch the native PC/laptop layout to \"gb\" using:\r\n\r\n```\r\nsetxkbmap -model pc105 -layout gb -option\r\n```\r\nIf the keyboard is not detected and I have a standard keyboard attached I switch is over to custom configuration (using [BigBagKbdTrixXKB](https://github.com/DreymaR/BigBagKbdTrixXKB)).\r\n```\r\nsetxkbmap -model pc105awide -layout gb(cmk_ed_ks) -option 'misc:extend,lv5:caps_switch_lock,grp:shifts_toggle,compose:menu,misc:cmk_curl_dh'\r\n```\r\n\r\nI know I cannot do this in Wayland, so I have Niri config setup like this:\r\n```\r\n    keyboard {\r\n        xkb {\r\n            layout \"gb\"\r\n            // model \"pc105awide\"\r\n            // layout \"gb(cmk_ed_ks)\"\r\n            // options \"misc:extend,lv5:caps_switch_lock,grp:shifts_toggle,compose:menu,misc:cmk_curl_dh\"\r\n            // file \"~/.config/niri/keymap.xkb\"\r\n        }\r\n    }\r\n```\r\nOf the various options above, all work as expected, apart from the file import method.\r\n\r\nMy thinking was to use the file import, still using my detection script at logon, and switch over the `file \"~/.config/niri/keymap.xkb\"` using a symlink.\r\n\r\nHowever I cannot get a simple file import working at all.  I have tried many different formats of the following content\r\n```\r\nkeymap.xkb\r\n\r\n    model pc105\r\n    layout gb\r\n    options\r\n```\r\n\r\nWhen I save Niri's config after pointing to this file I see the following in `journalctl` output.\r\n```\r\nniri[288273]: xkbcommon: ERROR: [XKB-769] (input string):1:1: syntax error\r\nniri[288273]: xkbcommon: ERROR: Failed to parse input xkb string\r\nniri[288273]: 2025-05-01T12:45:26.819398Z  WARN niri::niri: error reloading xkb_file: failed to set keymap\r\nniri[288273]: Caused by:\r\nniri[288273]:     Libxkbcommon could not load the specified keymap\r\n```\r\n\r\nI have tested this on 3 machines, running Arch and Ubuntu 24.04, all result in the same error above.\r\n\r\nAre there any example files that have been tested with Niri that can be provided as way of an example?\r\n\r\nThanks!",
      "created_at": "2025-05-01T13:43:00Z",
      "updated_at": "2025-05-01T13:55:28Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Axm7R",
        "body": "You could write two lines of xkb settings, one commented out. Then use sed to uncomment the right one.\r\n\r\n```\r\n// layout \"gb\"; model \"pc105awide\"; ...\r\nlayout \"us\"; ...\r\n```"
      },
      "user": {
        "login": "kevclark",
        "avatar_url": "https://avatars.githubusercontent.com/u/236309?u=22b50c3f10aeb05afdc83b0f301ed6cee5521031&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Affi1",
      "number": 1490,
      "title": "Overview: Workspace shadows",
      "body": "Add configuration options for the workspace shadows. Currently the default for me looks not ideal, because the shadows are too big and overlap",
      "created_at": "2025-04-28T13:37:21Z",
      "updated_at": "2025-05-01T07:54:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cptn-cosmo",
        "avatar_url": "https://avatars.githubusercontent.com/u/7382310?u=41a22cda0e1d6cbe8b7452974e2bfdb87473d7fb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfhZa",
      "number": 1496,
      "title": "Window Blur Support?",
      "body": "Hello there,\r\n\r\nwanted to ask if (and how) blur of transparent windows is supported.\r\n\r\nwould mainly like to get blur behind ghostty (which has blur implemented, but only for KWin), and if it would be useful to ask for blur support for niri in ghostty.\r\n\r\nThanks for awnsering and sorry if i am missing something or the question makes no sense.",
      "created_at": "2025-04-30T06:38:59Z",
      "updated_at": "2025-04-30T07:07:16Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfhM7",
      "number": 1495,
      "title": "Suggested wiki addition: fixing awful fonts on some Java apps",
      "body": "Text in a .jar game I have looks awful and blurry. Some googling makes me think this is a wayland issue? Anyway, the fix I found is setting an environmental variable, so I want to share in case this is something that would help someone else:\r\n\r\n_JAVA_OPTIONS=\"-Dawt.useSystemAAFontSettings=on\"",
      "created_at": "2025-04-30T00:43:40Z",
      "updated_at": "2025-04-30T05:11:21Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "amichaitea",
        "avatar_url": "https://avatars.githubusercontent.com/u/145942558?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aff_Q",
      "number": 1492,
      "title": "Single key bind support",
      "body": "I've looked everywhere in the wiki and across both closed and open feature requests but I haven't found any mention of this feature anywhere, I'd like to be able to press only the Mod key and have it open my application launcher, if I go to set anything to simply \"Mod\" the config fails to validate, it seems I have to have Mod+<key> for it to be a valid bind, if this is an existing feature please guide me to the right place, thank you in advance",
      "created_at": "2025-04-28T23:26:47Z",
      "updated_at": "2025-04-29T14:57:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Funtimes909",
        "avatar_url": "https://avatars.githubusercontent.com/u/68979259?u=3cc29093f474fa253886b462a8c28798508781b5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfI8h",
      "number": 1388,
      "title": "Add support for includes in config.kdl",
      "body": "Please add support for including external files in config.kdl. It would be nice to have a generic base config in SCM and have a local include for local settings, e.g.; output blocks.",
      "created_at": "2025-04-03T15:25:19Z",
      "updated_at": "2025-04-28T14:36:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kevinclevenger",
        "avatar_url": "https://avatars.githubusercontent.com/u/484148?u=98686af1afb68de45c95419ef5dbd63e5c1c6b2f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Affic",
      "number": 1489,
      "title": "Make Overview per output",
      "body": "It would be nice to have an option to toggle the overview on a per-display basis (if not with shortcuts then at least with the hot corner). In this context it would also be nice to allow the hot corner to work on a specific display with a fullscreen application running.\r\n\r\nExample for this would be, I am playing a game in fullscreen on my main output - I don't want the hot corner for the overview to work there. However, at the same time I am watching a video in fullscreen on a secondary display. I also have other workspaces open on the secondary display and would like to be able to trigger the overview only for the workspaces on that display with the hot corner even with the fullscreen video playing, while not triggering the overview on my main output.\r\n\r\nSimilarly it would be nice to have an option to move the hot corner per output. Currently both outputs have it in the top left corner, but since my secondary output is to the left of the main output it feels awkward to trigger the overview with hot corner on the main output. Allowing me to move it to the top-right corner on the main output would be nice.",
      "created_at": "2025-04-28T13:31:38Z",
      "updated_at": "2025-04-28T13:35:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cptn-cosmo",
        "avatar_url": "https://avatars.githubusercontent.com/u/7382310?u=41a22cda0e1d6cbe8b7452974e2bfdb87473d7fb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AffU5",
      "number": 1487,
      "title": "Port to macOS",
      "body": "I feel I need this in my life and I'm not really willing to switch to Linux.\r\n\r\nAny interest in wrapping the necessary OS parts and seeing if it's possible to port this over? Or would that be entirely impossible?\r\n\r\nI can give it a try but pretty sure that I won't get _that_ far just by myself.",
      "created_at": "2025-04-28T09:43:38Z",
      "updated_at": "2025-04-28T11:30:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alperchoco",
        "avatar_url": "https://avatars.githubusercontent.com/u/205641817?u=42ddc465e6145292c28d22ad1f1c3149fa0e9689&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afc7v",
      "number": 1476,
      "title": "Origin of the name 'niri'",
      "body": "What is the origin of the name Niri?",
      "created_at": "2025-04-26T00:16:26Z",
      "updated_at": "2025-04-28T07:23:14Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Axadw",
        "body": "The compositor name \"niri\" officially doesn't mean or stand for anything. But the way I came up with the word was, more or less, by chopping off the \"k\" from \"nirik\" (from MLP)."
      },
      "user": {
        "login": "ixxie",
        "avatar_url": "https://avatars.githubusercontent.com/u/20320695?u=6cef2360dce4665fa8661ad6c9bd4f89deb9f244&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AffGh",
      "number": 1486,
      "title": "GTK windows",
      "body": "Can someone help me get rid of this white sharp corner on gtk windows?\r\n![image](https://github.com/user-attachments/assets/f67defba-063a-4bcf-85c1-c2b822a93cf1)\r\n",
      "created_at": "2025-04-28T05:38:30Z",
      "updated_at": "2025-04-28T06:38:24Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "horhenaniB55",
        "avatar_url": "https://avatars.githubusercontent.com/u/200414334?u=f9cfddeea9371a64a480f363cd8a568fe4ccc406&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfesG",
      "number": 1484,
      "title": "Include column number in `Window` struct",
      "body": "When there are many windows open in a single workspace, I often need to switch columns multiple times to locate the window I need. I find it difficult to maintain a mental map of where my windows are. It would be really nice to have a widget on my bar to show the spatial layout of workspaces.\r\n\r\nCurrently I have a window list that shows what windows are in each workspace, but I cannot find a way to order them to show their locations. I wish `Window` objects could have a column number.",
      "created_at": "2025-04-27T19:26:38Z",
      "updated_at": "2025-04-27T19:36:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "realSaltyFish",
        "avatar_url": "https://avatars.githubusercontent.com/u/64259296?u=4d77819cda071ab01f5499fda8bcc877e277fe0b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYJLr",
      "number": 247,
      "title": "Allow creating workspace above top workspace",
      "body": "Currently, when you're on the topmost workspace, if you want to move a single window above, you have to manually move all the other windows on the workspace to a workspace below, and this could be problematic if you already had a workspace below that you wanted to keep separate. If it was allowed to send a window to a new workspace above the topmost workspace, this would be alleviated.",
      "created_at": "2024-03-06T04:37:53Z",
      "updated_at": "2025-04-27T17:19:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Supreeeme",
        "avatar_url": "https://avatars.githubusercontent.com/u/7882157?u=00b9be59810b4811d4378441aef703e35eb970ec&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfeY_",
      "number": 1481,
      "title": "What is the state of windows in unfocused workspaces?",
      "body": "Hey I've been daily driving niri the past month and really liked it so far.\r\n\r\nI have one issue with Discord specifically where it won't trigger the notifications from the channel I left it on. So if my Discord is in workspace 1, and I'm on say a channel called #chat, when I switch to other workspaces, notifications from any other channels trigger but ones from the #chat channel won't. It's as if Discord sees itself being focused. Funnily enough this doesn't happen if I run Discord on xwayland.\r\n\r\nWhat might be the issue here?",
      "created_at": "2025-04-27T15:23:08Z",
      "updated_at": "2025-04-27T15:56:06Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AxcZR",
        "body": "The toplevel state remains Activated but the windows lose keyboard focus. There's some common bug in Chromium/Electron where they wrongly treat Activated as having keyboard focus."
      },
      "user": {
        "login": "norinorin",
        "avatar_url": "https://avatars.githubusercontent.com/u/69400842?u=b4537f37aad8258b36c3478cf057bcab277bd216&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Afcq5",
      "number": 1474,
      "title": "Overview: Toggle Bind",
      "body": "An option to bind action/scripts with the overview trigger that runs when overview is toggled on and off.\r\n\r\nExamples:\r\n1. For only showing \"waybar\" on overview, I could bind waybar-toggle.sh to the overview toggle bind and so each time I open the overview, the waybar toggle runs and again when i close the overview the waybar also toggles off.\r\n2. One could launch a launcher when on overview and hide it when overview is closed, so that the \"gnome\" like ability to search/launch apps when overview can be scripted instead of creating it in the overview itself.",
      "created_at": "2025-04-25T16:38:08Z",
      "updated_at": "2025-04-25T16:50:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "scientiac",
        "avatar_url": "https://avatars.githubusercontent.com/u/58177655?u=20fde69edf11863efc11aef3016084d4368cfac2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfbHb",
      "number": 1464,
      "title": "Random reboots fixed by experimental xe driver",
      "body": "Before [switching to the `xe` driver](https://wiki.archlinux.org/title/Intel_graphics#Testing_the_new_experimental_Xe_driver), my laptop screen sometimes went dark after some hours of using Niri and rebooted. A NixOS user in #877 fixed this by updating the Nvidia driver. I have an integrated Intel Iris Xe GPU and suspect that the default `i915` driver causes the random reboots: with `xe` I achieved an uptime of 6 days and my session is still going. I only encountered one problem with `xe` so far: Anki's GUI was mostly empty; but this could be fixed by selecting Vulkan as \"Video driver\" in Tool → Preferences instead of OpenGL.\r\n\r\nDid anybody else have a similar experience? I'm happy I can finally switch away from river/sway/Hyprland.",
      "created_at": "2025-04-24T07:25:12Z",
      "updated_at": "2025-04-25T14:54:20Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Ordoviz",
        "avatar_url": "https://avatars.githubusercontent.com/u/37733333?u=9e84dc7e36b9ca931c87564bfa0c68e1c7cf5dff&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfZxc",
      "number": 1461,
      "title": "Named workspaces",
      "body": "I don't miss positional indices for workspaces, that's just crude. However, I do miss workspaces having a persistent stable identity, independent from the their current ordering and parent monitor.\r\n\r\nFor example, if I reboot my computer, and restore many browser windows, for projects _X_, _Y_, and _Z_, I want to create workspaces named _X_, _Y_, and _Z_, and send those browser windows to those workspaces.\r\n\r\nI think this would interact very nicely with the \"overview\" mode described in #850: labels need not appear when working in a single workspace, but when in the overview mode, each workspace would be labeled with its name.",
      "created_at": "2025-04-22T22:11:30Z",
      "updated_at": "2025-04-24T20:30:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Ericson2314",
        "avatar_url": "https://avatars.githubusercontent.com/u/1055245?u=c9769cefdf870911a6981ddc77c1b6d6502e4155&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYj79",
      "number": 272,
      "title": "v0.1.4",
      "body": "Before we begin: [downgrade `xz` to v5.4](https://www.openwall.com/lists/oss-security/2024/03/29/4). Done? Good, let's get to the release.\r\n\r\nNiri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nHere are the improvements from the last release.\r\n\r\n## Block out windows from screencasts\r\n\r\nYou can now instruct niri to block out certain windows from screencasts with a [window rule](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#block-out-from). This can be useful for apps like password managers or messengers that you don't want to accidentally show during meetings or streams.\r\n\r\n![Screenshot showing a visible Secrets window and an OBS window screencasting the screen where there's a black rectangle instead of the Secrets window.](https://github.com/YaLTeR/niri/assets/1794388/8a703432-e223-4e3e-aa60-70e45e5df573)\r\n\r\nThe compositor (niri in this case) is the perfect place for this functionality since it is solely responsible for the video frames sent to displays and screencast clients like OBS. Plus, the compositor has the entire window tree, and can selectively block out individual windows while retaining correct layered compositing.\r\n\r\nThis blocking out also seamlessly works with the built-in screenshot UI. You can capture a screenshot with interactive area selection while seeing all windows normally, and on a screencast, this entire process, including the interactive selection UI, will have the windows correctly blocked out.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/3c1f7b0b-1571-439b-8d74-fa425196049e\r\n\r\nUnfortunately, this kind of tight integration is not possible with third-party screenshot annotation/preview tools. To avoid accidentally showing windows even when using third-party screenshot tools, niri provides a more aggressive mode that blocks out the window from *all* screen capture tools, not just xdg-desktop-portal screencasts.\r\n\r\n## Dynamic window rules\r\n\r\nWindow rules, introduced in the last release, let you adjust behavior for individual windows. For this release, I did the necessary refactors to support *dynamic* window rules that apply continuously to open windows.\r\n\r\nThe main example of course is the rule to block out windows from screencasts (described above), but you can also [override whether borders draw with a solid background](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#draw-border-with-background), change the [window size limits](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#size-overrides) and adjust [window opacity](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#opacity).\r\n\r\nAs an example, you can replicate the \"inactive windows become semitransparent\" effect:\r\n\r\n```\r\nwindow-rule {\r\n    match is-active=false\r\n    opacity 0.9\r\n}\r\n```\r\n\r\n![Screenshot showing three apps, the middle one focused, and the ones on the side are semitransparent.](https://github.com/YaLTeR/niri/assets/1794388/5181bd0f-2e97-4cf9-93b5-c0d22e1171e1)\r\n\r\nCheck out the [window rules wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules) for a complete list of properties that you can set.\r\n\r\nBy the way, I also added a little `niri msg focused-window` IPC command that shows you the title and app ID of the focused window, to aid in writing rule matchers.\r\n\r\n## Warp mouse to focus & focus follows mouse\r\n\r\nTwo popular features among tiling WMs, now in niri.\r\n\r\n[Warp mouse to focus](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#warp-mouse-to-focus), implemented by @FluxTape  (thanks!), will automatically move the mouse into windows as you focus them. [Focus follows mouse](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#focus-follows-mouse) on the other hand will automatically focus windows under the cursor as you move it around.\r\n\r\nThese two actually work very well together, give it a try!\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/b243d7d5-3733-4034-8718-f261e3605e6b\r\n\r\n## Mouse and touchpad scroll bindings\r\n\r\nIt is now possible to bind mouse wheel and touchpad scrolls to perform actions or spawn commands. Mouse scrolling activates every wheel \"tick\", whereas touchpad scrolling emulates scroll \"ticks\" based on finger distance traveled.\r\n\r\nAdditionally, you can now set a cooldown for binds to avoid triggering them too often with scrolling.\r\n\r\n```\r\nbinds {\r\n    Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }\r\n    Mod+WheelScrollUp   cooldown-ms=150 { focus-workspace-up; }\r\n\r\n    Mod+TouchpadScrollDown { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02+\"; }\r\n    Mod+TouchpadScrollUp   { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.02-\"; }\r\n}\r\n```\r\n\r\nCheck the [wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Key-Bindings#scroll-bindings) for more details.\r\n\r\n## `wlr-gamma-control`\r\n\r\nNiri now implements the `wlr-gamma-control` protocol that is required for \"Night Light\" tools like [wlsunset](https://sr.ht/~kennylevinsen/wlsunset/) and [gammastep](https://gitlab.com/chinstrap/gammastep). Thanks @phuhl for working on this!\r\n\r\n> [!NOTE]\r\n> As it turns out, setting the gamma is pretty slow, at least on my system. I suggest using [wlsunset](https://sr.ht/~kennylevinsen/wlsunset/) because it only sets the gamma when it needs to change, rather than, say, every few seconds unconditionally.\r\n\r\n## xdg-desktop-portal-gnome 46.0\r\n\r\nI implemented more of the Mutter D-Bus interface to support xdg-desktop-portal-gnome 46.0 with its new screencast monitor selector with visual positions:\r\n\r\n![Screenshot of the new monitor selector in xdg-desktop-portal-gnome 46.0.](https://github.com/YaLTeR/niri/assets/1794388/79e94d9d-7825-496f-af33-1f2a9e3b51de)\r\n\r\n## Documentation\r\n\r\nAs you've noticed, I've been linking the wiki pages a lot. The reason for this is that over the past week I went through the entire config and wrote detailed documentation and examples for every single option.\r\n\r\nCheck out all this documentation here on the wiki: https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\r\n\r\nA major benefit of this is that it allowed me to declutter the [default config](https://github.com/YaLTeR/niri/blob/v0.1.4/resources/default-config.kdl) by removing some of the less important things and instead linking the wiki. This will improve the experience for people trying out niri as they no longer need to sift through the entire window rule and animation examples.\r\n\r\nIf you find a mistake, feel free to open a pull request against the `wiki/` folder of the repository.\r\n\r\nAlso, shoutouts to great reference-style docs @sodiboo had been writing for the nix flake: https://github.com/sodiboo/niri-flake/blob/main/docs.md#programsnirisettings\r\n\r\n## Other improvements in this release\r\n\r\n- When opening and closing a window without switching focus in between (think various dialogs and temporary windows), niri focuses the previous window since that's where you came from. Now, when this happens, niri will also restore the view position, which makes the behavior more natural and less annoying.\r\n- Fixed wp-viewporter bugs in Smithay (thanks @cmeissl). Particularly, this prevented Chromium and Electron applications from accepting mouse input after resizing.\r\n- Added more information to `niri msg outputs` (logical output position, size, scale, transform, and current and preferred mode flags).\r\n- Added a [`click-method`](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#pointing-devices) input setting for touchpads (thanks @uetcis).\r\n- Added a [`workspace-auto-back-and-forth`](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#workspace-auto-back-and-forth) setting that causes switching to the same workspace by index twice to switch back to the previous workspace (thanks @FluxTape).\r\n- Added support for `ISO_Level3_Shift` / `Mod5` modifier (thanks @Trundle).\r\n- Added a once-per-second fallback timer that sends frame callbacks to off-screen windows, which fixes issues with vsynced games in [gamescope](https://github.com/ValveSoftware/gamescope).\r\n- The last folder in the screenshot path is now automatically created if it doesn't exist.\r\n- Corrected pointer location reported to lock screen surfaces.\r\n- Fixed niri crashing when a screencast is attempted after failing to initialize PipeWire.\r\n    - If on your system PipeWire is not started automatically, you need to make sure that it is started *before* niri for niri to have screencast support.\r\n- Fixed a crash that could happen when stopping the same screencast session twice with the right timing.\r\n- Relaxed checks for DRM render nodes, which in theory allows niri to run on more devices with split DRM display/render nodes (various ARM boards like Raspberry Pi).\r\n- Made the EGL wl-display extension optional on the TTY which makes niri work on some NVIDIA GPUs where it didn't before.\r\n- Niri now tries to reduce the max bits-per-channel output property to 8 which may result in more monitor configurations working.\r\n- Fixed building on musl.\r\n- Fixed mouse scrolling inside nested niri window sometimes being too slow.\r\n- Fixed hardcoding `us` as the keyboard layout when it is missing from the config (turns out libxkbcommon handles that one for us).\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.4'>v0.1.4</a>.</em>",
      "created_at": "2024-03-30T11:09:47Z",
      "updated_at": "2025-04-24T06:18:54Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfYtc",
      "number": 1456,
      "title": "Support for `xdg-toplevel-icon-v1` (for IPC)",
      "body": "I think it would be very useful to expose, especially for programs running through wine and/or xwayland where it's less likely that an icon is properly installed, would be very useful for window switchers and bars.\r\n\r\nSmithay supports it: https://github.com/Smithay/smithay/pull/1512 and I have a WIP xwayland-satellite implementation: https://github.com/Supreeeme/xwayland-satellite/pull/135\r\n\r\nThere are a couple of ways I can think of exposing it to clients:\r\n- Including the image data within IPC messages e.g. as base64 encoded data uri seems unreasonable, even limiting the size to 64x64 and compressing it they're order of magnitudes larger than everything else with 1000s of characters.\r\n- Windows only have a field pointing to an icon, and a special IPC request that returns the literal icon data instead of json. Instead of maintaining icon IDs we can use \"id of the first toplevel to use the icon\"\r\n- Fuse filesystem...?\r\n- A wayland protocol that allows `ext_foreign_toplevel_handle_v1` like `ext-image-capture-source-v1` & `ext-image-copy-capture-v1` (maybe reusing `ext_image_capture_source_v1`?). This the only relevant discussion I found: https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/196#note_2474923\r\n\r\nHonestly I was more optimistic when I started thinking of ideas, everything but a wayland protocol sounds pretty unworkable\r\n\r\nEdit: To clarify why I prefer it to be through the IPC, `fuzzel` explicitly doesn't want to implement a window switcher so it forces another tool in the middle and in general having things fragmented across the IPC and `ext` wayland protocols feels not great, currently the IPC is strictly \"more power\" (excluding surface capture) than `ext` protocols so #1273 is not an issue.",
      "created_at": "2025-04-21T20:17:07Z",
      "updated_at": "2025-04-23T15:38:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bbb651",
        "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfZOl",
      "number": 1459,
      "title": "Is there any way to use virtual monitors with Niri?",
      "body": "Hello, \r\n\r\nI'm currently mainly using i3 and Xorg allows me to create virtual monitors, so I can split my very large monitor into smaller more manageable ones. (Something like PIP - picture in picture mode, but much more configurable and doesn't require to use physical video output ports)\r\n\r\nI'm new to wayland, but if i understand correctly, there isn't a generic way to achieve this, correct? I think sway has this feature, but haven't came across anything similar for Niri\r\n\r\nDoes anyone know of a workaround?\r\n\r\nThanks !",
      "created_at": "2025-04-22T10:49:20Z",
      "updated_at": "2025-04-22T13:42:24Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AxP_a",
        "body": "Not sure there's a workaround for niri."
      },
      "user": {
        "login": "wSzki",
        "avatar_url": "https://avatars.githubusercontent.com/u/59784520?u=c25c44ad1c878231ba53a7f388c5b463d787865a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfZHg",
      "number": 1458,
      "title": "Development workflow",
      "body": "Currently I have 1 full screen of Neovim and then tests and the browser for viewing the frontend or the program running. [Git worktrees](https://github.com/9999years/git-prole) are used for reviewing code and development in parallel.\r\n\r\nScreen 1:\r\n```\r\n| 1 screen width | 1 screen width |\r\n| -------------- | -------------- |\r\nFirefox * 44 windows at near 100% screen width per window (I used to have these in tabs in Sway)\r\n| Spotify        |\r\n| Issue tracker  |\r\n| Adding minor patches to the same project | Later grows to multiple terminal instances |\r\n```\r\n\r\nScreen 2:\r\n```\r\n| 1 screen width | 1 screen width |\r\n| -------------- | -------------- |\r\n| Neovim         | test suite     |\r\n| Neovim         | test suite     |\r\n| frontend (half screen) | server (half screen) |\r\n```\r\n\r\nWhat do you use for session management in your browser and code editor? Do you use any?\r\n\r\nWhat's your development workflow? Do you have any recommendations?\r\n\r\nHow do you manage splits between your code editor and Niri? Do you have everything in Neovim/Tmux splits or in custom size Niri windows?\r\n\r\nDo you plan to support horizontal splits inside columns?\r\n\r\nWhat do you think of [nwin](https://github.com/glacambre/nwin) :D",
      "created_at": "2025-04-22T08:41:18Z",
      "updated_at": "2025-04-22T10:40:58Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "axelkar",
        "avatar_url": "https://avatars.githubusercontent.com/u/120189068?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfYg2",
      "number": 1452,
      "title": "Is it expected for window moved to another monitor to be a second window?",
      "body": "I noticed, that when I move some window to another monitor, the window does not get placed at the \"edge\" of the new monitor, but rather it gets placed as a second window column, behind some window that was already there. Is it an expected behavior, or is it a bug?",
      "created_at": "2025-04-21T15:28:31Z",
      "updated_at": "2025-04-21T18:46:34Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfV1a",
      "number": 1438,
      "title": "Red Screen of Death with Screenlockers and DPMS",
      "body": "I've used both swaylock and hyprlock as screen lockers, and consistently, if I turn off my monitors while locked, am greeted with a Red Screen of Death (i.e. Niri's locked screen background with no UI from the screenlocker). _Sometimes_, I can still type in my password blind and it will unlock (so the screenlocker must still be running but not rendering), other times nothing helps and it seems the screenlocker has crashed in the background. With swaylock, sometimes switching to another TTY and running `pkill -USR1 swaylock` worked, but sometimes the process had already crashed.\r\n\r\nI'm a bit hesitant to open an issue since the same problem seems to be tracked at hyprwm/hyprland#7276, but maybe it would be nice to at least have an IPC message to force-unlock the session from another TTY.",
      "created_at": "2025-04-17T19:48:09Z",
      "updated_at": "2025-04-21T13:55:55Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "jakesarjeant",
        "avatar_url": "https://avatars.githubusercontent.com/u/137307920?u=e31594b29350f9f255923add58b59c8ede55b76f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfWmm",
      "number": 1443,
      "title": "disable hide-while-typing based on window rules",
      "body": "When playing a game which uses the cursor such as Last Epoch, I do not want hide-while-typing on because it makes the cursor disappear when I use a keybinding. Adding a window matching rule option to disable hide-when-typing seems like the best option.\r\n\r\nThis could also disable the when idle option, or that could be split out.\r\n\r\ne.g. for disabling both\r\n```\r\nwindow-rule {\r\n  match app-id=r#\"^steam_app\"#\r\n  match is-focused=true\r\n  disable-cursor-hiding true\r\n}\r\n```\r\nOther possible names might be `force-showing-cursor` or `alway-show-cursor`.\r\n\r\nAs an alternative, allowing changing these settings per-window would be cool. e.g.\r\n```\r\nwindow-rule {\r\n  match app-id=r#\"^steam_app\"#\r\n  match is-focused=true\r\n  cursor-hide-when-typing false\r\n}\r\n```",
      "created_at": "2025-04-18T16:45:33Z",
      "updated_at": "2025-04-18T16:48:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dyfrgi",
        "avatar_url": "https://avatars.githubusercontent.com/u/1012426?u=4b67292b52c24338f675d7fa52cd40ddac665d59&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfWkf",
      "number": 1442,
      "title": "Ability to block specific instances of layer surfaces (fuzzel) from screencasts?",
      "body": "Hi, so I'm not 100% familiar with how the layer shell protocol works, so forgive me if this is strangely worded, but I use fuzzel for multiple things; one of these is a frontend for [pass](https://www.passwordstore.org/). Am I able to block it somehow?\r\n\r\nIt doesn't seem I can set an app ID per-instance (via CLI) on fuzzel (is this due to how the layer shell protocol works?) so I'm not sure what I could do. I see the namespace of fuzzel is always \"launcher\" and it's [hardcoded in](https://codeberg.org/dnkl/fuzzel/src/branch/master/wayland.c#L2383).\r\n\r\nIs this not possible?",
      "created_at": "2025-04-18T15:50:21Z",
      "updated_at": "2025-04-18T16:33:54Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "frostyfalls",
        "avatar_url": "https://avatars.githubusercontent.com/u/66235907?u=2f7f547e417542e01b03e184bbb762df006d56da&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZgm6",
      "number": 352,
      "title": "Add an overview/zooming feature",
      "body": "I'm wondering if it's feasible to add a zooming feature into niri, I'd be happy to work on it if pointed in the correct direction.\r\n\r\nI currently have the issue that windows and columns tend to get lost between workspaces and I think one the best ways to fix this is adding zoom functionality. Zooming out should show the workspace above and below, show additional columns left and right (if they exist), make the windows showing non-interactable, and you should be able to click on a column to focus it.",
      "created_at": "2024-05-18T12:46:44Z",
      "updated_at": "2025-04-18T12:48:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "TheCodedProf",
        "avatar_url": "https://avatars.githubusercontent.com/u/29029513?u=51ed7246829db075b0efdd8c94b2eee7e0f81eec&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfuVt",
      "number": 1566,
      "title": "xcursor-size doesn't apply to non-vector cursors",
      "body": "The cursor xcursor-size property works correctly when no cursor or a vector cursor theme is specified. But when the cursor theme is not a vector format the cursor will never be scaled according to the configured size and ends up very small.\n\nExample config:\n\n```kdl\ncursor {\n    xcursor-theme \"Kasane Teto\" // this is a pixel art cursor\n    xcursor-size 48\n}\n```\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->\n* niri version: niri 25.02 (unknown commit)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Arch Linux\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: AMD Radeon RX 6950 XT\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: AMD Ryzen 7 5800X3D\n",
      "created_at": "2025-04-18T07:49:49Z",
      "updated_at": "2025-05-13T07:55:39Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "pancakesmeow",
        "avatar_url": "https://avatars.githubusercontent.com/u/16013291?u=343a4607682054d87f2753ed270cc81a13f1e731&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfVz7",
      "number": 1436,
      "title": "Screen record active window",
      "body": "I love the screenshot-window behavior. Is there a way I could get the window geometry to make a screen recorder (wf-recorder) record the active window?",
      "created_at": "2025-04-17T19:25:04Z",
      "updated_at": "2025-04-17T22:31:43Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AxGa3",
        "body": "No, and even when IPC has this info, it won't really be able to work. You need to use some screen recording tool that uses the portal, like OBS Studio, then it can request a window stream."
      },
      "user": {
        "login": "GrantCuster",
        "avatar_url": "https://avatars.githubusercontent.com/u/679386?u=8904255af107eea60dce54fccc4c301d3f5e51e7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfVeB",
      "number": 1434,
      "title": "Allow floating windows to not always be on top",
      "body": "While coding, I usually have my code editor taking up most of the screen.\r\n\r\nWhile working on desktop apps, I have a Niri window-rule that positions the window in the same place.\r\n\r\nI often times want to make a quick change without needing to close the desktop app window, but the window occludes some of my code editor; It would be nice for it to momentarily hide when I focus a tiled window.\r\n\r\nI have `Mod+Tab { switch-focus-between-floating-and-tiling; }` in my Niri config to quickly switch between the two apps.\r\n\r\nI also have an EWW bar that shows all open windows, so I can easily get back to it that way too.\r\n\r\nI can see how this could be an issue if you don't have either of those two ways to get back to your floating window; You'd have to close all your tiling windows to find your floating window. So this certainly shouldn't be the default behavior.",
      "created_at": "2025-04-17T15:15:42Z",
      "updated_at": "2025-04-17T15:16:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "luveti",
        "avatar_url": "https://avatars.githubusercontent.com/u/4952718?u=c3a45e516be3a1a2d86b1da304955acd3a8fdf33&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfT2w",
      "number": 1431,
      "title": "Importing niri.kdl in non-rust languages",
      "body": "Hi everyone, currently I'm trying to make a gui for managing the niri config, and step 1 is to import the niri.kdl file and have it map nicely into a class/classes.\r\n\r\nI'll be honest, I don't know rust at all, the two languages I really understand are javascript and the java family of languages (Java, C#, Vala.) my strategy so far has been to rewrite the types in my language of choice, so that I can annotate it in kdl-js or Kadlet, or alternatively to then use regex to write a parser.\r\n\r\nWhat I want to know is whether there is a better way, or if I should keep doing what I'm doing?",
      "created_at": "2025-04-16T04:26:52Z",
      "updated_at": "2025-04-16T05:25:34Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AxBIK",
        "body": "I guess if the language has something like kdl-rs which does not impose a structure but instead lets you query paths, then you could use that. Would be more forwards-compatible too."
      },
      "user": {
        "login": "alicealysia",
        "avatar_url": "https://avatars.githubusercontent.com/u/35021050?u=ded3a507afc26687bb40b8db245903fae47fc2cc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfRy8",
      "number": 1424,
      "title": "Development updates",
      "body": "Some already know this, but I'm usually posting development updates in an ever-growing Mastodon thread: https://mastodon.online/@YaLTeR/110888616452027567\r\n\r\nThis is a **huge** thread that goes from the very start of niri, and I just keep appending to it. Currently the latest update is about halfway through the page on the scroll bar (below are random replies and spin-offs).\r\n\r\nI'm putting the `#niri` hashtag on these so I guess that's another way to follow updates. I also post them in [our Matrix room](https://matrix.to/#/#niri:matrix.org) of course.\r\n\r\n![image](https://github.com/user-attachments/assets/fbb11315-598c-44d7-88c3-74c0146178f1)",
      "created_at": "2025-04-14T06:46:33Z",
      "updated_at": "2025-04-14T06:46:34Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfQ3a",
      "number": 1423,
      "title": "Window rulez for OrcaSlicer",
      "body": "Hello. My problem is very application specific but I don't know where else to ask for advice so I'm trying it here anyway:\r\n\r\nI want to have OrcaSlicer's main window to open maximized and everything else to open floating. Problem is defining what those things are using just app-id and title because the title seems to change during window opening according to `niri msg event-stream`. Has anybody dealt with such problem or perhaps even solved it for OrcaSlicer specifically? Thanks",
      "created_at": "2025-04-12T18:49:50Z",
      "updated_at": "2025-04-12T18:49:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "WizardUli",
        "avatar_url": "https://avatars.githubusercontent.com/u/3875278?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfQz8",
      "number": 1422,
      "title": "Clarification about something related to workspaces.",
      "body": "I just can't seem to understand , what was the motivation behind empty workspaces being places at the start and at the end. \r\n\r\nThe reason I'm asking this is because, I just tried to move a window to the workspace with index 1 with the keybind `Mod+Shift+1` as I do with other wm's. So, when I try to access the window by switching to the first workspace, its empty as niri automatically created an empty workspace at the start as the previous workspace which was empty before is not empty now. So the window that I had moved to workspace 1, I have to switch to workspace 2 in order to access it, which is kinda uintuitive/confusing.\r\n\r\nI know this is the desired behaviour, as clearly stated in the wiki. But I just want to know the motivation behind this, and how can one adapt his/her workflow to it accordingly.",
      "created_at": "2025-04-12T16:33:42Z",
      "updated_at": "2025-04-12T17:15:43Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Aw4lA",
        "body": "At the start: you have to explicitly turn it on with https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#empty-workspace-above-first.\r\n\r\nAt the end: this is how you create new workspaces."
      },
      "user": {
        "login": "voidstar-null",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?u=9284ed0b1e1f71e30306d1672bfc0f045ddf9003&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfOpq",
      "number": 1413,
      "title": "WAYBAR NOT WORKING",
      "body": "I'm using Niri lately and want to use screen sharing for Google Meet. I'm using TTY login, and when I use 'niri --session', I can't use screen sharing. I did fix this using 'dbus-run-session niri --session'. Now my problem is that when using dbus-run-session, Waybar won't start using the autostart script or spawn at startup. Please help.\n\n",
      "created_at": "2025-04-10T06:34:45Z",
      "updated_at": "2025-04-11T14:45:47Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "horhenaniB55",
        "avatar_url": "https://avatars.githubusercontent.com/u/200414334?u=f9cfddeea9371a64a480f363cd8a568fe4ccc406&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfP4h",
      "number": 1418,
      "title": "Мake the tabs of the inactive column opaque",
      "body": "Add the ability to make the tabs of the inactive column opaque, as this may not correspond to the stylistic design.\r\nIt would also be good to add support for shadow there.",
      "created_at": "2025-04-11T10:31:24Z",
      "updated_at": "2025-04-11T14:42:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alexdev16",
        "avatar_url": "https://avatars.githubusercontent.com/u/3262292?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfKmM",
      "number": 1398,
      "title": "Does anyone have a set of window-rules that match dialogs and prompts?",
      "body": "Does anyone have a set of window-rules that match dialogs and prompts?\r\n\r\nI'm not sure if there's a general way to do this, or whether this would require 1 rule per windowing library (gtk, qt) or 1 rule per application?\r\n\r\nUse case: make all \"open-file dialogs\" floating.",
      "created_at": "2025-04-05T16:42:10Z",
      "updated_at": "2025-04-10T22:55:25Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AwlSC",
        "body": "> Use case: make all \"open-file dialogs\" floating.\r\n\r\nThis works out of the box if the app that spawns the dialog correctly uses xdg-foreign to parent it to itself. For example, GTK 4 apps or Telegram desktop, and nautilus as the file chooser.\r\n\r\nOtherwise you're left with matching them by name/app id somehow I guess."
      },
      "user": {
        "login": "andornaut",
        "avatar_url": "https://avatars.githubusercontent.com/u/737842?u=f27a9705d644b9d48de08b033ba7155e59fd74f4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfO7X",
      "number": 1415,
      "title": "Do not populate named workspaces by default",
      "body": "Niri is great. I've been using it exclusively for months now.\r\n\r\nI do get the concept of dynamic and named workspaces. But somehow it has not clicked for me, although your workspace workflow descriptions are very helpful. My narrow screen is the reason I use workspaces quite a lot.\r\n\r\nWhen I use named workspaces like this\r\n\r\n```\r\nworkspace \"browser\" {\r\n  ...\r\n}\r\n\r\nworkspace \"mail\" {\r\n  ...\r\n}\r\n\r\nworkspace \"todo\" {\r\n  ...\r\n}\r\n```\r\n\r\nthe actually strange thing is that \"browser\" is the the default workspace 1 nontheless, when niri is started.\r\n\r\nI could image that it makes sense to only populate named workspaces\r\n\r\n- if a window rule applies,\r\n- if you are on this workspace or\r\n- if you actively move windows to that workspace.\r\n\r\nSo, my proposal is to not populate named workspaces automatically. As a result, if you have three named workspaces, workspace 4 will be the default workspace. (Key bindings can be adjusted so that you can use default workspace 4 using key \"1\" if that's a problem.)\r\n\r\nMaybe, it would even make sense to exclude named workspaces from workspace counting altogether? This would require individual key bindings for named workspaces.\r\n\r\nDoes this make sense? Anything I didn't get here?\r\n\r\nThank you, guys!",
      "created_at": "2025-04-10T11:33:23Z",
      "updated_at": "2025-04-10T15:39:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Brixy",
        "avatar_url": "https://avatars.githubusercontent.com/u/1643010?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfOH8",
      "number": 1410,
      "title": "\"One big workspace\" mode for multiple monitors?",
      "body": "If I have two monitors side by side, is it possible to fuse both displays into acting like one big ultrawide display? Windows would seamlessly transition from one display to another. Perhaps with an option to make sure the bezel never bisects the focused window (or possibly, never bisects *any* window).\r\n\r\nAlternatively, maybe we could have two monitors represent two views into the same, shared, workspace? Though I think that would be less useful than just having a workspace per monitor.",
      "created_at": "2025-04-09T16:02:30Z",
      "updated_at": "2025-04-09T18:54:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "haasn",
        "avatar_url": "https://avatars.githubusercontent.com/u/1149047?u=166016eb8b35ba4b436e8de60c223d2583c54d3c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfMKp",
      "number": 1406,
      "title": "Expose Layout Information",
      "body": "I think it would be really useful to have \"layout information\" exposed via `niri msg` and the socket. \r\n\r\nBy layout information I mean the specific order of columns in workspaces, which column has focus, and whether the columns are rows or tabs (and which row has focus if relevant).\r\n\r\nThis is in contrast to the window based information we have exposed which is not in any particular order\r\n\r\nMy use case for this is that I want to create a column indicator.\r\n\r\nI noticed that I sometimes forget if I have windows off the the right since there is often no visual indicator that they are there. I prototyped a script for waybar which shows a visual indicator of the windows on a workspace so I can always see all of the windows I have on the active workspace with the active window highlighted. But since this doesn't correspond to the exact window placement the movement between windows gets a little confusing. Window positions in my indicator don't swap if the window positions are swapped for example, and since ordering is based off of ID the actual highlighting is pretty arbitrary. \r\n\r\nAlso if windows are organized in rows I can't account for that, they just appear next to each other in the indicator.\r\n\r\nHere's an example:\r\n\r\nThis is my entire workspace\r\n\r\n![image](https://github.com/user-attachments/assets/06142e66-4f67-4a82-a567-4d6cec07de29)\r\n\r\nAt the top you can see the prototype indicator (which is by window)\r\n\r\n![image](https://github.com/user-attachments/assets/48a77ded-10db-4cad-bb0d-df4eef134ca5)\r\n\r\nso this means I have three windows open but the rightmost window isn't visible onscreen at all. I know it is there because I can see three squares on my indicator. \r\n\r\nApologies if this was already discussed, I tried a few different searches to find information about it but couldn't find anything.\r\n\r\nAlso, I'm happy to contribute this feature, but I may need some tips on where to start looking to make changes",
      "created_at": "2025-04-07T19:33:38Z",
      "updated_at": "2025-04-07T19:38:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Queuecumber",
        "avatar_url": "https://avatars.githubusercontent.com/u/5865387?u=81292f94a622e2ca3bdba3e45e1e142f6ba36721&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfKVW",
      "number": 1396,
      "title": "Support for modular configs?",
      "body": "What I mean by modular config is that we can split settings into different sections and files and import it in main `config.kdl`  file\r\nThe file tree would look something like this: \r\n```\r\nniri/\r\n├── configs\r\n│   └── animation.kdl //Split config\r\n├── config.kdl\r\n```\r\nand we can import `animation.kdl` to main config file like:\r\n```kdl\r\ninclude \"configs/animation\"\r\n...\r\n// Other niri setup\r\n```",
      "created_at": "2025-04-05T05:40:53Z",
      "updated_at": "2025-04-07T19:19:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "greed-d",
        "avatar_url": "https://avatars.githubusercontent.com/u/58597122?u=ae16355d856b926298d9b0d34d5a3226647731af&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfKVA",
      "number": 1395,
      "title": "Anyway to hide `named-workspace` from waybar workspace indicator?",
      "body": "Is there a way to hide `named-workspace` from waybar workspace indicator unless they're occupied?\r\n\r\nNormally all the named workspace show in the waybar, which I don't want, so anyway to hide that?",
      "created_at": "2025-04-05T05:18:32Z",
      "updated_at": "2025-04-07T18:57:18Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AwqCx",
        "body": "For anyone looking into this [This](https://github.com/Alexays/Waybar/pull/4001) commit has a `display-condition` which shows only occupied workspace, I compiled the PR and am using it until it's merged in waybar, Just to remind you I've named all my workspace\r\n![image](https://github.com/user-attachments/assets/60d8a317-5744-4970-ad65-10652b264904)\r\n"
      },
      "user": {
        "login": "greed-d",
        "avatar_url": "https://avatars.githubusercontent.com/u/58597122?u=ae16355d856b926298d9b0d34d5a3226647731af&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfMHr",
      "number": 1405,
      "title": "Add support for Multi_key in valid modifiers",
      "body": "To help work around some physical left hand issues I can set something like this in sway/swayfx\r\n~~~\r\ninput type:keyboard {\r\n  xkb_layout us\r\n  xkb_variant altgr-intl\r\n  xkb_options compose:rctrl\r\n}\r\n\r\nbindsym Multi_key+left exec wtype -P home -p home\r\nbindsym Multi_key+right exec wtype -P end -p end\r\nbindsym Multi_key+down exec wtype -P next -p next\r\nbindsym Multi_key+up exec wtype -P prior -p prior\r\n~~~\r\n\r\nand get a 'right hand only' solution for home/end/pgup/pgdown on a laptop without having to use the fn modifier.\r\n\r\nIn niri I can do\r\n~~~\r\ninput {\r\n  keyboard {\r\n    xkb {\r\n      layout \"us\"\r\n      variant \"altgr-intl\"\r\n      options \"compose:rctrl\"\r\n    }\r\n  }\r\n  ...\r\n~~~\r\n\r\nand wev sees rctrl as Multi_key (key 105), but it's not in valid modifiers in Configuration:-Input.md and niri doesn't recognize it for mapping. Would it be possible to add Multi_key to the valid modifiers?",
      "created_at": "2025-04-07T18:29:40Z",
      "updated_at": "2025-04-07T18:39:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kevinclevenger",
        "avatar_url": "https://avatars.githubusercontent.com/u/484148?u=98686af1afb68de45c95419ef5dbd63e5c1c6b2f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZCII",
      "number": 312,
      "title": "Support Hyper for bindings",
      "body": "I see where Shift, Control, Super, and Alt are supported. Mod5/altgr is support as well; But I don't see where Hyper can be bound. The documentation doesn't seem to allow me to bind based on any custom key either.\r\n\r\nThis would be wonderful to also have available and is traditional to have on a Unix keyboard.",
      "created_at": "2024-04-26T03:43:46Z",
      "updated_at": "2025-04-07T15:42:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "morenathan",
        "avatar_url": "https://avatars.githubusercontent.com/u/98691858?u=303cae5d64147a6376a3ebc2f37f5269a7e0ee8d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfLz0",
      "number": 1404,
      "title": "List currently open windows in Fuzzel",
      "body": "Hey! Thank you for your work, really enjoying Niri!\r\n\r\nAfter a couple of days of not shutting down my laptop, I have forgotten what I've opened. So, is there a way to search among open Niri windows across all workspaces? I have both Fuzzel and Wofi installed, but I could not figure out how to utilize them for my need.",
      "created_at": "2025-04-07T12:30:06Z",
      "updated_at": "2025-04-07T15:23:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Awo7F",
        "body": "Hey, there are some scripts in discussions like https://github.com/YaLTeR/niri/discussions/1096#discussioncomment-12203850"
      },
      "user": {
        "login": "efrsw",
        "avatar_url": "https://avatars.githubusercontent.com/u/71254839?u=1fbc6885f466dc0407a9502740d347a4a81b7f1d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfLbV",
      "number": 1401,
      "title": "Ability to change tile direction",
      "body": "Although niri is a scrollable-tiling Wayland compositor, it is still a tiling Wayland compositor. So a tiling compositor without an ability to change tile direction from horizontal to vertical like i3wm is just really weird. ",
      "created_at": "2025-04-07T04:51:40Z",
      "updated_at": "2025-04-07T05:07:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "RQuarx",
        "avatar_url": "https://avatars.githubusercontent.com/u/117576142?u=bbbc97ae6e391096ad7ac33f10648a3b80acdc32&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfIKy",
      "number": 1381,
      "title": "Baba-is-float idea.",
      "body": "Tried the  `baba-is-float` April fools command and had a thought lol.\r\nCould we do a keybind to shift columns left or right?\r\nPaperwm has a similar keybind. This would fix a huge OCD issue with columns being off center. ",
      "created_at": "2025-04-02T21:03:05Z",
      "updated_at": "2025-04-06T14:35:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Plyply99",
        "avatar_url": "https://avatars.githubusercontent.com/u/103620143?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfKh5",
      "number": 1397,
      "title": "How to bind Super-Enter",
      "body": "I normally use Super-Enter to spawn my terminal application. I fail to see how that is possible right now with niri? Maybe I am missing something?",
      "created_at": "2025-04-05T14:17:43Z",
      "updated_at": "2025-04-05T14:57:46Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "matthiasbeyer",
        "avatar_url": "https://avatars.githubusercontent.com/u/427866?u=bff6afa0becc48e397ca2292eca04ef680dac1ca&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfKG3",
      "number": 1393,
      "title": "Add question about screenshot path to FAQ",
      "body": "The [screenshot-path](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#screenshot-path) configuration option is only documented under the \"Miscellaneous\" section of the config, and it's not very clear to look there if you are trying to debug screenshots not being saved when you lack the correct directories.\r\n\r\nI think it would be helpful to have the option mentioned on the FAQ, under a header like \"Where do screenshots get saved to?\"\r\n\r\nI'd be happy to write and pull request a section like this, just trying to feel out whether such a change would be well-recieved.",
      "created_at": "2025-04-04T19:28:50Z",
      "updated_at": "2025-04-05T12:26:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "almondheil",
        "avatar_url": "https://avatars.githubusercontent.com/u/68617358?u=a5eb06f369983b5a468247120fefe658f7d7b422&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfJ-M",
      "number": 1392,
      "title": "Add window focus history",
      "body": "Currently `focus-window-previous` toggles between the two most recently focused windows. I miss bspwm's ability to navigate through the complete focus history, which would allow me to select not only the most recently focused window but also the 2nd, 3rd, or any previously focused window in the sequence.\r\n\r\nIn bpswm this is implemented through the `older` and `newer` selectors.",
      "created_at": "2025-04-04T16:11:05Z",
      "updated_at": "2025-04-04T18:19:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "hubertwas",
        "avatar_url": "https://avatars.githubusercontent.com/u/16193899?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfEQR",
      "number": 1360,
      "title": "Extend Important Hotkeys",
      "body": "Hello and thanks for developing niri. Perhaps the Important Hotkeys splash screen could be extended to:\r\n\r\n- Show a welcome message on first use\r\n- Allow searching for hot keys by description and key sequence\r\n- Perhaps even have buttons/keys to open the configuration file in the default editor and open documentation in a browser\r\n",
      "created_at": "2025-03-29T12:32:28Z",
      "updated_at": "2025-04-04T18:14:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "FedericoCeratto",
        "avatar_url": "https://avatars.githubusercontent.com/u/91576?u=bbaec9860a2e3902a64f966d0fe749247fe5fac1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfIUe",
      "number": 1383,
      "title": "Run niri installed from nixpkgs on non-NixOS distro",
      "body": "I set out to get niri to run on Linux Mint 22.1 by installing the binary using the Nix package manager. I think that I got all the necessary pieces in place. I start `niri-session` from TTY but all I get is the dreaded black screen, presumably due to a failure to initialize the GPU. I can still Mod+Shift+e Enter to blindly exit. This happens on an older ThinkPad T440 and a newer ThinkPad P15v.\r\n\r\nInitial Nix setup in short\r\n```\r\n$ gpasswd -a myusername nix-users\r\n$ systemctl enable --now nix-daemon.service\r\n$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable\r\n$ nix-channel --update\r\n```\r\n\r\nBinary niri installation was quick and easy\r\n```\r\n$ nix-env -iA nixpkgs.niri\r\n```\r\n\r\nIncluded the relevant paths in `~/.profile` for launching\r\n```\r\nPATH=\"$HOME/.nix-profile/bin:$PATH\"\r\nXDG_DATA_DIRS=\"$HOME/.nix-profile/share:$XDG_DATA_DIRS\"\r\n```\r\n\r\nTo get Systemd to co-operate I created `~/.config/systemd/user.conf`\r\n```\r\n[Manager]\r\nManagerEnvironment=\"XDG_DATA_DIRS=/home/myusername/.nix-profile/share:/usr/local/share:/usr/share\"\r\n```\r\n`$ systemctl --user daemon-reload`\r\n\r\nI have tried the debug block in `config.kdl` to directly point `render-drm-device` to what I have in `/dev/dri/`.\r\n\r\nNot sure if this was needed but I installed nixpkgs `mesa` which admittedly is newer than the native system's version. I even installed nixpkgs `vpl-gpu-rt`, `vaapiIntel` and `intel-media-driver` for good measure.\r\n\r\nMy user account is a member of groups: video, render, input.\r\n\r\nI can't think of anything else at this point. Any suggestions what to try next?",
      "created_at": "2025-04-03T02:03:11Z",
      "updated_at": "2025-04-03T18:38:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Awgku",
        "body": "> Run niri installed from nixpkgs on non-NixOS distro\r\n\r\nwhy is this opened here and not in e.g. nixpkgs? this is a packaging issue lol\r\n\r\n---\r\n\r\nanyways have you tried nixGL?\r\n\r\n```sh\r\n$ nix run --impure github:nix-community/nixGL -- niri\r\n```"
      },
      "user": {
        "login": "wizetek",
        "avatar_url": "https://avatars.githubusercontent.com/u/13509213?u=91760420a1eadabf7184bdcdaba024956600585b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfJDw",
      "number": 1389,
      "title": "Actions returning values - grid layout",
      "body": "Hi, first of all niri is great :)\r\nI switched from sway, which wasn't too stable for me, and I have no issues with niri till now. Documentation is also superb!\r\n\r\nI tinkered my config to things I'm used to, and one of which is grid-like movement. I found that what I'm lacking is information if action was successful (changed state) like: `niri msg action focus-window-up` did it changed window or not?\r\n\r\nI made script to achieve it, so I can simplify movements around monitors/workspaces/windows:\r\n```\r\n➜ cat .config/niri/scripts/jump\r\n#!/usr/bin/bash\r\nHWND=`niri msg -j focused-window | jq \".id\"`\r\nniri msg action {$1}-${3:-window}-$2\r\n[[ $HWND -eq $(niri msg -j focused-window | jq \".id\") ]] && niri msg action $1-${3:-workspace}-$2\r\n```\r\nand my config ended like this:\r\n```\r\n    Mod+Up    { spawn \"~/.config/niri/scripts/jump\" \"focus\" \"up\"; }\r\n    Mod+Down  { spawn \"~/.config/niri/scripts/jump\" \"focus\" \"down\"; }\r\n    Mod+Right { spawn \"~/.config/niri/scripts/jump\" \"focus\" \"right\" \"column\" \"monitor\"; }\r\n    Mod+Left  { spawn \"~/.config/niri/scripts/jump\" \"focus\" \"left\" \"column\" \"monitor\"; }\r\n    ...\r\n    // same for move but I use Shift instead of Ctrl  so don't want to mess in people minds ;)\r\n```\r\nbut maybe it could be smth simpler like first correct action finish:\r\n```\r\n    Mod+Up    { focus-window-up; focus-monitor-up; }\r\n```\r\nor boolean logic:\r\n```\r\nMod+Up    { or; focus-window-up; focus-monitor-up; }\r\n```\r\nSo:\r\n1. can actions return value/state\r\n2. can we have some kind of logic of actions (and/or) to simplify some more complex actions without spawn.",
      "created_at": "2025-04-03T17:26:35Z",
      "updated_at": "2025-04-03T17:55:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kosz85",
        "avatar_url": "https://avatars.githubusercontent.com/u/2547425?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfIKn",
      "number": 1380,
      "title": "Flash window on focus",
      "body": "I like to have zero gaps or borders for maximum minimalism. But that makes it hard to see at a glance which window is currently focused. There is a plugin for hyprland which solves this problem perfectly: [hyprfocus](https://github.com/pyt0xic/hyprfocus). It flashes a window when it is focused. The flash can also be triggered by a keybind. Maybe this functionality could be added to Niri?",
      "created_at": "2025-04-02T20:58:39Z",
      "updated_at": "2025-04-03T14:21:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "senekor",
        "avatar_url": "https://avatars.githubusercontent.com/u/54984957?u=1ff809c95abe38c74daee3f24cecc8f81dbe3fff&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfIvn",
      "number": 1387,
      "title": "How to disable title bar?",
      "body": "IDK what these things are called ( the bar with buttons like close, minimize etc ) : \r\n![image](https://github.com/user-attachments/assets/8a918914-dbb7-423b-a405-7d8eba458253)\r\n\r\nBut some apps have them and some don't I looked through discussions and wiki but maybe because I don't know the actual name of that, couldn't find any answers",
      "created_at": "2025-04-03T11:52:14Z",
      "updated_at": "2025-04-03T13:34:03Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Awf4B",
        "body": "Hello, https://github.com/YaLTeR/niri/wiki/FAQ#how-to-disable-client-side-decorationsmake-windows-rectangular"
      },
      "user": {
        "login": "greed-d",
        "avatar_url": "https://avatars.githubusercontent.com/u/58597122?u=ae16355d856b926298d9b0d34d5a3226647731af&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfIlf",
      "number": 1386,
      "title": "Initial thought on Niri compositor",
      "body": "**Things I really like** : \r\n- Great window management philosophy, needed few minutes to get used to but after getting used to it it's really nice\r\n- `niri validate` really is a life saver\r\n- waybar config works out of the box\r\n\r\n**Skill issues**:\r\n- I haven't really explored the docs but my workflow depends on workspace numbers like `Mod+1` is browser, `Mod + 9` is discord and such, I find myself unknowingly pressing it even though it just sends me to blank screen. Also I've got bunch of window rule to spawn `browser` at WS1, `discord` at WS9 etc. I read through the `window-rule` wiki but couldn't find how to send apps to specific workspace\r\n\r\n-  I found : \r\n```\r\n    Mod+Shift+1 { move-column-to-workspace 1; }\r\n    Mod+Shift+2 { move-column-to-workspace 2; }\r\n    Mod+Shift+3 { move-column-to-workspace 3; }\r\n    Mod+Shift+4 { move-column-to-workspace 4; }\r\n    Mod+Shift+5 { move-column-to-workspace 5; }\r\n    Mod+Shift+6 { move-column-to-workspace 6; }\r\n    Mod+Shift+7 { move-column-to-workspace 7; }\r\n    Mod+Shift+8 { move-column-to-workspace 8; }\r\n    Mod+Shift+9 { move-column-to-workspace 9; }\r\n```\r\nbut it really doesn't move it to said workspace\r\nand\r\nhttps://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules\r\n\r\n- Cannot find scratchpad/special workspace\r\n\r\n**Things I miss** : \r\n- good blur\r\n\r\n**My current setup**:\r\n![image](https://github.com/user-attachments/assets/80f7ecb3-9d4a-4dbb-ac79-dd56a1b09371)\r\n![image](https://github.com/user-attachments/assets/cbc1c669-c7ea-4771-ac67-c223f4fb816d)\r\n\r\n",
      "created_at": "2025-04-03T08:57:57Z",
      "updated_at": "2025-04-03T11:01:27Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "greed-d",
        "avatar_url": "https://avatars.githubusercontent.com/u/58597122?u=ae16355d856b926298d9b0d34d5a3226647731af&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfIZe",
      "number": 1384,
      "title": "Things to look out for before jumping to niri",
      "body": "I've been really niri curious for a while now and don't know if I should make a jump from hyprland to niri or not\r\n\r\nAlso what are some things I'd have to look out for before making the jump?\r\n\r\nAnd a few questions :\r\n- Do stuff like AGS work with niri?\r\n- I've seen many rices, but most don't have workspace indicator, is that not necessary?\r\n- How feature rich is it? like I need xkb options to remap by shift to caps ( broken shift on both sides on laptop )\r\n- What are the features you think is missing compared to hyprland?",
      "created_at": "2025-04-03T05:03:33Z",
      "updated_at": "2025-04-03T07:15:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Awe1-",
        "body": "Hi\r\n\r\n1: Yes\r\n2: Idk, mine has one\r\n3: xkb works"
      },
      "user": {
        "login": "greed-d",
        "avatar_url": "https://avatars.githubusercontent.com/u/58597122?u=ae16355d856b926298d9b0d34d5a3226647731af&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfIHz",
      "number": 1379,
      "title": "Multiseat capabilities",
      "body": "Virtual seats: https://wayland.app/protocols/ext-transient-seat-v1\r\n\r\nDoes Smithay support it? COSMIC?\r\n\r\nThis isn't really important to me other than maybe for remote desktop\r\n\r\nAdd a :+1: reaction and upvote if you find this important.",
      "created_at": "2025-04-02T20:00:17Z",
      "updated_at": "2025-04-02T20:42:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "axelkar",
        "avatar_url": "https://avatars.githubusercontent.com/u/120189068?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfGz_",
      "number": 1377,
      "title": "How to move window below another window",
      "body": "Hey guys,\r\n\r\nso far I love this workflow which niri gives me. But I couldn't figure out how to move a window below another window via a shortcut. It's easy with the mouse, but when I have two windows next to each other and I want to move on below the other, how would I do that? What is the correct action / command I need to bind?",
      "created_at": "2025-04-01T14:46:23Z",
      "updated_at": "2025-04-02T14:11:22Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AwaI5",
        "body": "The default Mod+[ shortcut. consume-or-expand-window-left/right"
      },
      "user": {
        "login": "marekzan",
        "avatar_url": "https://avatars.githubusercontent.com/u/5881806?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfFgZ",
      "number": 1370,
      "title": "do-screen-transition: add new option `duration-ms`",
      "body": "We can already change the default `delay-ms`. It would be cool if we can do the same for the duration.",
      "created_at": "2025-03-31T09:58:05Z",
      "updated_at": "2025-03-31T11:45:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "r0skar",
        "avatar_url": "https://avatars.githubusercontent.com/u/33655345?u=87fe5f2ed3c73bee93097930d8a8dc534cca273f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfFkM",
      "number": 1371,
      "title": "What about a \"soft-deactivate\" toggle for workspaces not currently assigned to any monitor?",
      "body": "I know this is super niche but would it be possible to configure Niri to \"soft-deactivate\" all workspaces that isn't the \"active\" one?\r\n\r\nMy use case is this:\r\n\r\nI put Slack on Workspace 1, Firefox and some terminals on Workspace 2. Let's say i have a conversation with someone on Slack and send my message. I'll then wait for a reply and in the meantime switch to workspace 2. While i'm on workspace 2 the user replies, but since workspace is still in our conversation, i don't get any notification in workspace 2, making me miss replies from people.\r\n\r\nI realize this is super niche, but if a feature were to be developed that \"soft-deactivated\" the workspaces that's not currently on any monitors, that would completely solve this issue for me. \r\n\r\nThanks for Niri!",
      "created_at": "2025-03-31T11:21:44Z",
      "updated_at": "2025-03-31T11:23:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "vinylen",
        "avatar_url": "https://avatars.githubusercontent.com/u/98466471?u=ac4933f1117df889ac4f2f006574371a654700fc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfFdz",
      "number": 1368,
      "title": "Checking to see if the process is already in place",
      "body": "# Feature Request: Kill Existing Process on Restart in Niri\r\n\r\n**Summary:**\r\n\r\nThis proposal suggests adding a feature to Niri that allows users to automatically terminate an existing process before launching a new instance of the same process via a keyboard shortcut. This would prevent multiple instances of the same application from running simultaneously.\r\n\r\n**Problem:**\r\n\r\nCurrently, when a user repeatedly triggers a keyboard shortcut that launches an application (e.g., Wofi), multiple instances of that application are spawned. This can lead to resource consumption and an undesirable user experience.\r\n\r\n**Example:**\r\n\r\nIf Wofi is already running and the user presses the keyboard shortcut to launch Wofi again, a second instance of Wofi starts. Subsequent presses result in even more instances, leading to multiple Wofi windows.\r\n\r\n**Proposed Solution:**\r\n\r\nImplement a configuration option that allows users to specify that an existing process should be terminated before a new instance is launched.\r\n\r\n**Example Configuration:**\r\n`Mod+D kill-when-started=true { spawn \"wofi\" \"-I\"; }`",
      "created_at": "2025-03-31T09:11:20Z",
      "updated_at": "2025-03-31T10:36:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "IVKLD",
        "avatar_url": "https://avatars.githubusercontent.com/u/54883747?u=560384f91b0537e0bf425ccf21e9f051019c4fc9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfEkE",
      "number": 1362,
      "title": "A way to render the status bar above tiled windows?",
      "body": "It bugs me that when I switch between workspaces with animations enabled, the columns moving in/out of view cover up my status bar. Is there a way to force a status bar (I'm using yambar, dunno if that matters) to appear above tiled windows? The floating ones still ought to be on top though. Couldn't find anything in the docs or Issues/PRs/Discussions about this. Thanks.",
      "created_at": "2025-03-30T01:05:49Z",
      "updated_at": "2025-03-30T12:33:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AwULS",
        "body": "Yes, put it at the top layer-shell layer. There's usually a setting in the bar. \n\nIt will be on top of both tiled and floating, which is also normal and how it works elsewhere I think."
      },
      "user": {
        "login": "randoragon",
        "avatar_url": "https://avatars.githubusercontent.com/u/46251339?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfExu",
      "number": 1364,
      "title": "Yambar workspaces module",
      "body": "Hiya, picked niri a few days ago. Yambar is my status bar of choice, but unfortunately there is no native niri module, so I hacked my own with a shell script.\r\n\r\nThe module displays all workspace names containing windows, plus the currently focused one (in case it's empty). The focused workspace is marked with an `*` asterisk. The workspaces are sorted by niri index, so the module responds correctly to reordering them etc.  \r\nExample strings printed by the module:\r\n```\r\n*web  email  1\r\nemail  *web  1\r\nemail  web  *1\r\nemail  web  1  *_\r\n```\r\nI'm currently using a config which explicitly names workspaces 1-9, so I just use the `_` placeholder for unnamed ones. You might not like this if you're following niri's paradigm more closely (which I also might in the future, but rn I'm just getting accustomed). Either way, the script can be adjusted pretty easily.\r\n\r\nAnd here it is (up-to-date version will be on my [git repo](https://github.com/randoragon/nixos-config), search for \"niri-workspace\", currently on the `niri` branch, but will move to `main` someday):\r\n\r\n```sh\r\n#!/bin/sh -e\r\n\r\nupdate () {\r\n    printf 'str|string|'\r\n    {\r\n        echo '['\r\n        niri msg -j workspaces\r\n        echo ','\r\n        niri msg -j windows\r\n        echo ','\r\n        niri msg -j focused-output\r\n        echo ']'\r\n    } | jq -r '\r\n        .[2].name as $output |\r\n        INDEX(.[0].[]; .id) as $workspaces |\r\n\r\n        (.[0] | map(select(.is_active == true))) + [$workspaces[.[1].[].workspace_id | tostring]] |\r\n        map(select(.output == $output)) |\r\n        unique_by(.id) | sort_by(.idx) |\r\n        map(if .name == null then .name = \"_\" else . end) |\r\n        map(if .is_active == true then \"*\" + .name else .name end) |\r\n        join(\"  \")\r\n    '  # jq is fucking magic\r\n    echo\r\n}\r\n\r\nupdate\r\nniri msg -j event-stream | while read -r json; do\r\n    ws_changed=\"$(echo \"$json\" | jq -r '.WorkspaceActivated.id // .WorkspaceActiveWindowChanged.workspace_id // .WorkspacesChanged')\"\r\n    [ \"$ws_changed\" = null ] && continue\r\n    update\r\ndone\r\n```\r\n\r\nI wrote it to support multi-monitor setups, but I have not had the chance to test if that works yet. Unfortunately, there is a need to call `niri msg` *three times* every update, because we need `windows` to see which workspace ids are being used, then we need `workspaces` to map those ids to names, and finally we need `focused-output` to show only workspaces on the current monitor.  \r\nThere is some noticeable lag when switching, it's not instantaneous. But it's not too bad either. Might improve in the future (or I'll just contribute a native yambar module someday, idk).\r\n\r\nCheers!",
      "created_at": "2025-03-30T11:07:05Z",
      "updated_at": "2025-03-30T11:31:05Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "randoragon",
        "avatar_url": "https://avatars.githubusercontent.com/u/46251339?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfEw3",
      "number": 1363,
      "title": "focus-follows-mouse: disable for floating windows",
      "body": "Hey! I really like the fact that we can set a `max-scroll-amount` for the focus-follows-mouse option. And I personally like to keep it to \"0\". I wonder if we can add a new option that allows to ignore/skip floating windows?\r\n\r\nOr maybe instead of an explicit option such as `skip-if-focused`, we could also make it so the follow-mouse behavior is \"scoped\" to the current mode? eg.\r\n\r\n- in tiling mode: mouse focus will only honor tiled windows\r\n- in floating mode: mouse focus will only honor floating windows\r\n\r\nImo this would make sense, because if we explicitly switch focus to tiling (toggle `switch-focus-between-floating-and-tiling`), it feels wrong that a floating window can grab focus and therefor override the user's preference(?)",
      "created_at": "2025-03-30T10:36:57Z",
      "updated_at": "2025-03-30T10:49:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "r0skar",
        "avatar_url": "https://avatars.githubusercontent.com/u/33655345?u=87fe5f2ed3c73bee93097930d8a8dc534cca273f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbC8q",
      "number": 624,
      "title": "IPC to return a list of open windows in the workspace",
      "body": "I love scrollable tiling, but when I have many windows open in a workspace, it can be hard to keep track of which one is where, and I occasionally find myself aimlessly SUPER+H/SUPER+Ling around my workspace looking for the right window.\r\n\r\nI think it would be tremendously helpful if my bar could display an ordered list of open windows in the active workspace so that I can see at a glance where the window I'm looking for is. I imagine an IPC message kind of like:\r\n\r\n```\r\n$ niri msg layout \"DP-1\" 1\r\nColumn 1:\r\n    blender\r\n\r\nColumn 2:\r\n    kitty\r\n    kitty\r\n\r\nColumn 3:\r\n * firefox\r\n```\r\n\r\nSo that my bar can display the corresponding icons, e.g.\r\n\r\n![Screenshot from 2024-08-24 17-39-15](https://github.com/user-attachments/assets/c3f011bd-5002-4d85-a727-ea507414edf0)\r\n",
      "created_at": "2024-08-24T15:42:41Z",
      "updated_at": "2025-03-30T05:03:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jakesarjeant",
        "avatar_url": "https://avatars.githubusercontent.com/u/137307920?u=e31594b29350f9f255923add58b59c8ede55b76f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfD90",
      "number": 1357,
      "title": "`default-floating-position` relative to cursor-top-left",
      "body": "Would be very useful for fixing popups in XWayland applications like Ghidra.\r\n\r\nhttps://github.com/Supreeeme/xwayland-satellite/issues/110#issuecomment-2708902061",
      "created_at": "2025-03-29T00:04:50Z",
      "updated_at": "2025-03-29T00:05:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "axelkar",
        "avatar_url": "https://avatars.githubusercontent.com/u/120189068?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfDoF",
      "number": 1356,
      "title": "Support for keybinds that take in the mouse position as an argument",
      "body": "[Hyprland's bindm](https://wiki.hyprland.org/Configuring/Binds/#touchpad) has this feature where we can substitute window mouse dragging with keys instead, allowing for a more keyboard-centric workflow. I believe that this should be worth consideration. Do note that the fundamental workings of this mechanic is to replace the mouse click in the Super + Mouse keybind that we all use to move windows around with an actual key on the keyboard, or better yet, no keys at all (so you can just hold down Super while dragging the cursor and the window will move along).",
      "created_at": "2025-03-28T16:06:40Z",
      "updated_at": "2025-03-28T16:08:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "PokumeKachi",
        "avatar_url": "https://avatars.githubusercontent.com/u/108186213?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfDSt",
      "number": 1353,
      "title": "New action idea: focus-column-first-or-previous",
      "body": "Hi, I'm fresh to niri and just making my configuration for the first time.\r\n\r\nThis idea is undeniably a remnant of me being used to a master-stack workflow on other dynamic tiling WMs, but I'd like to have an action that works like `focus-column-first`, except it goes back to the previously focused window (column) when triggered on the first column. Same of course would apply to `move-column-to-first`. This would enable workflows in which the first window in the workspace is the \"main one\" that we keep coming back to while we work on subtasks further down the window stack. For completeness, I suppose the same actions would need to be implemented for `focus-column-last` etc.\r\n\r\nIs this something this project would be interested in? Or is my workflow already achievable in some different way? I'm curious to hear how experienced niri users do their work. Thanks.",
      "created_at": "2025-03-28T10:07:16Z",
      "updated_at": "2025-03-28T13:24:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "randoragon",
        "avatar_url": "https://avatars.githubusercontent.com/u/46251339?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfCwN",
      "number": 1352,
      "title": "Procedural autostart instead of paralell",
      "body": "I am having a small problem regarding autostarting apps. Right now I use Gentoo, pipewire and waybar as status bar. To launch pipewire server, Gentoo has a script, which you need to launch via the compositor. The problem is, when I add both pipewire and waybar (with pipewire module) in the autostart, they load in paralell (I suppose) and waybar disables pipewire module because it can't find running pipewire session, hence making pipewire module useless. How can I make loading autostart apps procedural, going from top of the config to the bottom in the order of `spawn-at-startup`?",
      "created_at": "2025-03-27T19:25:15Z",
      "updated_at": "2025-03-28T10:58:25Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Yappaholic",
        "avatar_url": "https://avatars.githubusercontent.com/u/153394729?u=626a508c4ea842d5ba4d32462a90e66fb162d0ba&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfBs2",
      "number": 1345,
      "title": "Allow offsets on `center-column` / changing what counts as \"center of the monitor\"",
      "body": "I have a ultrawide screen with a second vertical screen next to it. Here's a preview of the monitor layout as showed by KDE's monitor config:\r\n\r\n![image](https://github.com/user-attachments/assets/6e5d5322-0fbc-4490-b158-7476b44e3743)\r\n\r\nBecause of this I have the monitors layed out so I sit to the left of the ultrawide monitor:\r\n\r\n![image](https://github.com/user-attachments/assets/469faeec-9769-42dd-b369-2f734665020c)\r\n\r\nWhen I only have a single window open and press <kbd>Mod+C</kbd> to get it centered (triggering `center-column` action) the window is not right in front of me, but instead slightly to the right.\r\n\r\nThis is a very niche issue, I know :sweat_smile: but it would be nice to be able to configure what counts as \"center of the screen\" for the `center-column` action and the `center-focused-column` layout config. This would then also be a per-monitor setting for heterogeneous monitor setups.\r\n\r\nHow I imagine it is configs like:\r\n\r\n```kdl\r\nlayout {\r\n    center-focused-column \"always\"\r\n}\r\n\r\noutput \"eDP-1\" {\r\n    mode \"5120x1440@60\"\r\n    position x=1440 y=544\r\n\r\n    // Here's the new config\r\n    // The \"center\" config is only used when calculating where\r\n    // \"center of the screen is\" for \"center-column\" action.\r\n    // Defaults to center of the screen\r\n    center x=1536\r\n}\r\n```\r\n\r\nFor the positioning logic, it would have some simple clamping to make sure windows are not moved outside the monitor. Pseudo-code:\r\n\r\n```go\r\nwindow.x = monitor.x + monitor.center.x / 2 + window.width / 2\r\nif window.x - window.width < monitor.x {\r\n  window.x = monitor.x + window.width\r\n}\r\n```",
      "created_at": "2025-03-26T20:37:28Z",
      "updated_at": "2025-03-28T04:32:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "applejag",
        "avatar_url": "https://avatars.githubusercontent.com/u/2477952?u=9320e73c85a3c74accfaba4c1477d924cbcec7dd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AfCuj",
      "number": 1351,
      "title": "Virtual outputs for screencasting",
      "body": "I'm not sure if this exists in the GNOME screencast portal (I'm not running Niri yet), and if it does it could still be useful to be able to programmatically create these.\r\n\r\nThe dynamic screencast target is really useful but doesn't seem to support multiple dynamic targets and I use fullscreen monitors in some apps. There's still a problem when you want to cast something higher-resolution than a monitor of yours.\r\nWould this work by putting them on another workspace and fullscreening them?\r\n\r\nNote that I use gnome-network-displays as a replacement for connecting with HDMI.\r\nSway has `swaymsg create_output`",
      "created_at": "2025-03-27T18:58:47Z",
      "updated_at": "2025-03-27T19:56:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "axelkar",
        "avatar_url": "https://avatars.githubusercontent.com/u/120189068?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae-7b",
      "number": 1337,
      "title": "Screensharing from Firefox not working",
      "body": "When trying to screenshare I'm getting\r\n\r\n![image](https://github.com/user-attachments/assets/edc2b595-055d-4fa0-b961-a87e8ae90719)\r\n\r\nI have xdg-desktop-portal-gtk installed , what else should I check?",
      "created_at": "2025-03-24T09:47:06Z",
      "updated_at": "2025-03-26T11:10:13Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AwFI4",
        "body": "This does not look like a dialog from xdg-desktop-portal-gnome. It should look like this:\r\n\r\n![image](https://github.com/user-attachments/assets/ec9ad3e0-bdff-461d-ae09-82d70d56b380)\r\n"
      },
      "user": {
        "login": "dolzenko",
        "avatar_url": "https://avatars.githubusercontent.com/u/43391?u=f95ea25a9a74393abd99b0dbddb4539bcbe42050&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbzgT",
      "number": 721,
      "title": "Please add window geometry information to 'niri msg focused-window'",
      "body": "It would save some time fiddling around getting the window size exactly correct for 'default-column-width { fixed ... ; }'",
      "created_at": "2024-10-08T04:50:23Z",
      "updated_at": "2025-03-25T06:11:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kevinclevenger",
        "avatar_url": "https://avatars.githubusercontent.com/u/484148?u=98686af1afb68de45c95419ef5dbd63e5c1c6b2f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae_qa",
      "number": 1342,
      "title": "Add support for display mirroring",
      "body": "Add option for displays to show content from other displays. Without this making a presentations is difficult.",
      "created_at": "2025-03-25T01:32:09Z",
      "updated_at": "2025-03-25T04:34:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Kudasi",
        "avatar_url": "https://avatars.githubusercontent.com/u/78107836?u=eceb753cc334e7cad3bfd3872913a96997e437eb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae-ha",
      "number": 1330,
      "title": "key binding by key code",
      "body": "I am currently binding shortcuts to a small macropad which uses F13-F21 keys. My issue is that these keys are marked as `sym: NoSymbol` so i don't think I can use them as keybindings in niri? \r\n\r\n`wev` output:\r\n```\r\n[14:     wl_keyboard] key: serial: 931204; time: 18178531; key: 191; state: 1 (pressed)\r\n                      sym: NoSymbol     (0), utf8: ''\r\n[14:     wl_keyboard] key: serial: 931205; time: 18178657; key: 191; state: 0 (released)\r\n                      sym: NoSymbol     (0), utf8: ''\r\n[14:     wl_keyboard] key: serial: 931206; time: 18178951; key: 192; state: 1 (pressed)\r\n                      sym: NoSymbol     (0), utf8: ''\r\n[14:     wl_keyboard] key: serial: 931207; time: 18179041; key: 192; state: 0 (released)\r\n                      sym: NoSymbol     (0), utf8: ''\r\n[14:     wl_keyboard] key: serial: 931208; time: 18179348; key: 193; state: 1 (pressed)\r\n                      sym: NoSymbol     (0), utf8: ''\r\n[14:     wl_keyboard] key: serial: 931209; time: 18179457; key: 193; state: 0 (released)\r\n                      sym: NoSymbol     (0), utf8: ''\r\n```\r\n\r\nit would be nice to be able to map these by the `key` property directly",
      "created_at": "2025-03-23T20:55:28Z",
      "updated_at": "2025-03-24T13:49:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "not-reed",
        "avatar_url": "https://avatars.githubusercontent.com/u/86171134?u=26bb3357ca4e6653c554fa46c037264a9ff1215f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae-2L",
      "number": 1333,
      "title": "Support the Forign Toplevel protocol",
      "body": "Suppor the [foreign toplevel list protocol](https://wayland.app/protocols/ext-foreign-toplevel-list-v1).\r\n\r\n",
      "created_at": "2025-03-24T08:15:05Z",
      "updated_at": "2025-03-24T09:03:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tmccombs",
        "avatar_url": "https://avatars.githubusercontent.com/u/2541726?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae-nD",
      "number": 1331,
      "title": "Niri-IPC Scrolling position and column tiling position/width",
      "body": "I am trying to develop a scroll bar widget that can sit at the bottom/top of the screen and allow the user to scroll across the current workspace. I also want to show some indication of which apps are where along the scroll bar.\r\n\r\nTo make this work, I need the ability to get and set the current position of the \"camera\" along the workspace (as well as its overall width) as well as the position and width data of current columns.\r\n\r\nMy understanding of rust is quite limited, but I'm still willing to give this a shot. Just note that my implementation of it would likely be pretty bad.",
      "created_at": "2025-03-24T00:39:31Z",
      "updated_at": "2025-03-24T04:22:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alicealysia",
        "avatar_url": "https://avatars.githubusercontent.com/u/35021050?u=ded3a507afc26687bb40b8db245903fae47fc2cc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae-Oa",
      "number": 1328,
      "title": "Fullscreen option to set layout to fullscreen, without setting app to fullscreen mode",
      "body": "Currently, `fullscreen-window` does 2 things:  \r\n1. Setting the layout to fullscreen (no gap, no strut).  \r\n2. Signaling the app to switch to fullscreen mode.\r\n\r\nFor some apps, switching to fullscreen mode means showing an entirely different UI with undesirable behaviours (for example, [Chrome hides the tab bar when fullscreen](https://superuser.com/questions/184815/show-tabs-in-chrome-full-screen-mode), with no option for Linux users to disable this). My intention, however, is only to see the app with maximal screen estate.\r\n\r\nThis is also a problem I found with many WMs. It would be great if we had `fullscreen-window-layout-only` to only show the app with no gap & strut, while not putting it into fullscreen mode.\r\n\r\nBasically the couterpart of https://github.com/YaLTeR/niri/pull/1288\r\n",
      "created_at": "2025-03-23T11:16:59Z",
      "updated_at": "2025-03-23T23:02:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tri2820",
        "avatar_url": "https://avatars.githubusercontent.com/u/22129923?u=e4c92db3d1e259e5e1fce8bc14519d6e94f98607&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae92q",
      "number": 1325,
      "title": "Поддержка Xwayland",
      "body": "Композитор вообще заебись! Впервые вижу чтобы кто-то добавил отключение встроенного дисплея ноутбука при закрытии крышки, дабы не ебаться с kansh и ему подобным. Лучше любого хайперленда, но парни, почему вы не хотите добавить поддержу xwayland? По сути ваш композитор и так идеален, но блин, без xwayland странновато. Может я не прав, но все же( ",
      "created_at": "2025-03-22T18:46:02Z",
      "updated_at": "2025-03-23T06:15:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ritascarlet",
        "avatar_url": "https://avatars.githubusercontent.com/u/137996547?u=b44c036cfd5e006b42c8260beee34c7053b81c7a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae9Cf",
      "number": 1317,
      "title": "Add an 'open-on-workspace-by-index' window rule.",
      "body": "Currently I have like 7 named workspaces on my setup, like this:\r\n\r\n```\r\nworkspace \"init\" {\r\n}\r\n\r\nworkspace \"web\" {\r\n}\r\n\r\nworkspace \"files\" {\r\n}\r\n\r\nworkspace \"dev\" {\r\n}\r\n\r\nworkspace \"media\" {\r\n}\r\n\r\nworkspace \"chat\" {\r\n}\r\n\r\nworkspace \"misc\" {\r\n}\r\n\r\nworkspace \"scratchpad\" {\r\n}\r\n```\r\n\r\nSay, I'm currently on \"term\" and then I launch app2 that opens on \"scratchpad\". Since the \"named-workspaces\" are not dynamic (always exist), the compositor scrolls all the way through the 6 \"named-workpaces\". If a window rule like  'open-on-workspace-by-index' that could assign workspaces to programs  by their indices would have existed, I would not have to create this much \"named-workspaces\". \r\n\r\nAnother approach (too much work) to solve this issue would be to make the \"named-workspaces\" dynamic too, like other window managers like Hyprland, sway and then add a workspace rule like \"persistent true/false\" that would dictate if a workspace should be persistent or not ??",
      "created_at": "2025-03-21T14:53:59Z",
      "updated_at": "2025-03-22T10:26:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "voidstar-null",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?u=9284ed0b1e1f71e30306d1672bfc0f045ddf9003&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae9Mk",
      "number": 1320,
      "title": "preset a window ratio",
      "body": "I love `preset-column-widths` and `default-column-width`. Now I happen to have 3 different setups: only laptop, at home and at work.  The monitor settings are quiet different.  I would love to have a default preset ratio for new windows of 4x3.  The window should then take the most space of the screen that respects this ratio.\r\n\r\nNever needed this for other layout paradigms but this would definitely enhance the experience for a scrolling wm.",
      "created_at": "2025-03-21T17:50:41Z",
      "updated_at": "2025-03-21T19:31:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ecocode",
        "avatar_url": "https://avatars.githubusercontent.com/u/24841?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae9IU",
      "number": 1318,
      "title": "focus follows mouse monitor only",
      "body": "I want the focus to change to the mouse pointed monitor.  There should never be a focus change on window in any other case.  As partial workaround I use `focus-follows-mouse max-scroll-amount=\"0%\"`.  But that still issues window focus change when there are more than 1 window on a monitor.\r\n\r\nSo I'd like a dedicated `monitor-focus-follows-mouse` option.",
      "created_at": "2025-03-21T16:29:38Z",
      "updated_at": "2025-03-21T18:06:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ecocode",
        "avatar_url": "https://avatars.githubusercontent.com/u/24841?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae8Th",
      "number": 1311,
      "title": "Troubleshooting `window-rule`",
      "body": "Hello!\r\n\r\nI'm trying to figure out why my `window-rule`s aren't working all the time (or in some cases at all). Some I understand because the window title is changing after the window spawns, so it doesn't match when it's opened, thus doesn't trigger. For these I'll probably just use an IPC script to take actions on them after launch. Others, though, seem to match the rule on spawn, but still don't trigger the conditions (e.g. `open-on-workspace`). Would rather use IPC as little as possible, since I'd rather not do things \"the hard way\" if I can avoid it. Utilizing `window-rule`s feel cleaner. Maybe that's just a hangup, but anyway.\r\n\r\nAny tips for troubleshooting why some aren't working consistently or at all?\r\n\r\nThanks for any help!",
      "created_at": "2025-03-20T22:09:50Z",
      "updated_at": "2025-03-21T14:16:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Av9a5",
        "body": "For checking when the window is already open, I usually set a different border or focus ring color to see if it matches.\r\n\r\nFor checking before the window opens, try `niri msg event-stream` to see the window title/app ID changes."
      },
      "user": {
        "login": "tonydero",
        "avatar_url": "https://avatars.githubusercontent.com/u/29717593?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeyqL",
      "number": 1247,
      "title": "Pointer moves smoothly over some areas and tears over other",
      "body": "This kind of sound silly but it is what it is, e.g. in Firefox on Github moving pointer over areas with onhover behavior results in teared pointer movement, while moving over simple text is smooth.",
      "created_at": "2025-03-12T14:41:35Z",
      "updated_at": "2025-03-21T09:00:13Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "dolzenko",
        "avatar_url": "https://avatars.githubusercontent.com/u/43391?u=f95ea25a9a74393abd99b0dbddb4539bcbe42050&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae77C",
      "number": 1309,
      "title": "Toggling opacity of unfocused windows",
      "body": "Hey! Thanks for this great compositor.\r\n\r\nI just wanted to ask if there's a way to toggling opacity (to 100 %) for an unfocused window?\r\n\r\nMy configuration makes unfocused windows slightly transparent, but sometimes I'd want to \"lock\" an unfocused window at 100 % opacity. This is so that I can work in a different window, and still be able to clearly see what's in the unfocused window.\r\n\r\nIs this already possible?\r\n\r\nI've tried using `toggle-window-rule-opacity`, but that only seems to work for an active window that is transparent (which is not the case in my normal configuration).\r\n\r\nFor now, I'm using:\r\n```kdl\r\nwindow-rule {\r\n    match is-floating=true\r\n    opacity 1.0\r\n}\r\n```\r\nWhich at least is a way of accomplishing something **similar** to what I actually want.",
      "created_at": "2025-03-20T14:20:23Z",
      "updated_at": "2025-03-20T18:32:33Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "joncol",
        "avatar_url": "https://avatars.githubusercontent.com/u/194062?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae7v0",
      "number": 1308,
      "title": "Restore scroll position on un-fullscreen",
      "body": "When un-fullscreening, Niri currently places the un-fullscreened window on the left. This causes a gap if you un-fullscreen the right-most window.\r\n\r\nIt'd be great if there was an option to restore scroll position after un-fullscreening.",
      "created_at": "2025-03-20T11:37:46Z",
      "updated_at": "2025-03-20T11:54:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jf-uu",
        "avatar_url": "https://avatars.githubusercontent.com/u/181011550?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AesSh",
      "number": 1217,
      "title": "Any Plans on adding bars/widgets?",
      "body": "sorry if this is a stupid question, but are there any plans on adding builtin functionality for bars or widgets?\r\n\r\n",
      "created_at": "2025-03-06T08:18:20Z",
      "updated_at": "2025-03-19T22:25:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "theNoof",
        "avatar_url": "https://avatars.githubusercontent.com/u/173896447?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae7FS",
      "number": 1305,
      "title": "Always signify when there are more columns out of screen",
      "body": "I haven't been able to find a way to signify when there are more windows to the left or the right of a workspace than what is currently visible. I can't remember at all time all the windows I have opened and so I can never be sure that when a window ends at one border of my screen, there isn't more windows before or after them. Which means that I very often feel the urge to try and focus out of the screen to check if I haven't forgotten a window there...\r\n\r\nI think it would be nice to have a way of signifying visually when that is the case, either by showing some kind of visual cue like a configurable shadow or border, or by allowing to never put a window all the way to the end of the screen and instead always show a bit of the next window if there is one. To illustrate the second example, here is the current way windows are displayed if I open 3 windows with `proportion 0.66` and move the focus from the first to the second window:\r\n\r\n![2025_03_19-22_04_27](https://github.com/user-attachments/assets/ae199170-99b0-4778-a43f-6575e05cf942)\r\n\r\nHere is what it would look like with the solution I have in mind (simulated via Mod+wheel click & drag gesture):\r\n\r\n![2025_03_19-22_04_46](https://github.com/user-attachments/assets/03105e5e-0d29-44bf-a02d-0f4082c46d34)\r\n\r\nIdeally we could configure how much of the next window would be shown.\r\n\r\nThe only workaround I have found for this issue is using `center-focused-column \"always\"`, but this doesn't work in my case as I very often need to display two windows/columns at once.",
      "created_at": "2025-03-19T21:19:42Z",
      "updated_at": "2025-03-19T21:27:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "noomly",
        "avatar_url": "https://avatars.githubusercontent.com/u/9301991?u=9055473a44fcd39705e6363bbc6f02d7b4b96451&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae64G",
      "number": 1303,
      "title": "Conditional window-rules depending on connected monitors",
      "body": "Since I'm running `niri` on my companies laptop, I've two main places where I usually work: office and at home.\r\n\r\nAt my office, I've two additional monitors to connect with my notebook, whereas at home I only have one.\r\n\r\nTherefore, I would be great if `window-rule` and `output` in the config file could use kind of a condition, depending on which monitor is available. I'm not sure which syntax is possible with `kdl`, but maybe something like:\r\n\r\n```kdl\r\nwindow-rule \"DP-1\" {\r\n    match app-id=\"firefox\"\r\n    open-on-output \"DP-1\"\r\n}\r\n\r\nwindow-rule \"HDMI-A-1\" {\r\n    match app-id=\"firefox\"\r\n    open-on-output \"HDMI-A-1\"\r\n}\r\n```\r\n\r\nWhat do you think about that? (Or is it already possible and I missed it in the docs?)",
      "created_at": "2025-03-19T17:41:28Z",
      "updated_at": "2025-03-19T18:03:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "lukeflo",
        "avatar_url": "https://avatars.githubusercontent.com/u/103174551?u=55a1ca2e5a4cba8b97cbd7477dca5b2666250882&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae5VO",
      "number": 1298,
      "title": "Can't run apps installed with Nix in config",
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\nFirst of all, I'm not sure that this is definitley `niri`'s cause. But I haven't faced it with my other `niri` setups on different machines.\n\nI built niri from source and placed all files in the correct binaries on my company notebook, which is from Tuxedo and came with preinstalled Ubuntu with KDE. So far, niri works fine. I can run it from `sddm` as separate session without any problems, beside the following:\n\nSince Ubuntus software repos are not very up-to-date, I install many packages using `nixpkgs` and `home-manager`. Generally, that works fine, but I cannot run a programm installed this way from `niri`'s config file. E.g. starting `fuzzel` with `Mod+D { spawn \"fuzzel\"; } doesn't work.\n\nI can put in the full path (soemthing like `~/.nix-profile/bin/fuzzel`, which is only a symlink to Nix main folder) and it works; at least, partly. Since using the full path doesn't respect other env var like `XDG_DATA_DIRS`. Thus, if used with full path, `fuzzel` wont list other apps installed with Nix. Symlinking those `.desktop` file to `~/.local/share/applications` lets them appear in `fuzzel`, but the `Exec=` commands are not working.\n\nHowever, running plain `fuzzel` from the CLI inside the `niri` session works fine and also shows all apps installed with Nix, which work too.\n\nTherefore, it seems that not all Nix paths are respected when sourcing infos from `niri`'s config. It might also have something to do with `systemd`. Since I run a non-systemd distro on my main notebook (Void), I'm not very experienced with systemd.\n\nHas anyone faced a similar problem and knows a solution?\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: niri 25.02 (v25.02-22-g88fcf0c2)\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Tuxedo OS (Customized Ubuntu 24.04. with KDE by default)\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: Intel Corporation Meteor Lake-P [Intel Arc Graphics]\n\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU: Intel(R) Core(TM) Ultra 7 155H\n",
      "created_at": "2025-03-18T15:56:34Z",
      "updated_at": "2025-03-19T11:14:54Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Av4Ch",
        "body": "> If running the build in KDE Wayland session instead of niri, all Nix bins and .desktop files are accessible. There seems to be a different way of sourcing this stuff. But following the systemd del tree so far led to nothing...\r\n\r\nOk, that seems not to be fully true. When running `fuzzel` from inside KDE session it also can not access other Nix bins. So, its kind of a problem with sourcing Nix config and adding the bins to PATH.\r\n\r\nHowever, since this all is complicated to trace step after step, I just wrote a script which symlinks Nix bins and .desktop files to regular locations plus puts full bin path into the latter. Now it works fine!"
      },
      "user": {
        "login": "lukeflo",
        "avatar_url": "https://avatars.githubusercontent.com/u/103174551?u=55a1ca2e5a4cba8b97cbd7477dca5b2666250882&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae5JK",
      "number": 1296,
      "title": "Feature: windows always sum to 100% monitor height",
      "body": "I find myself sometimes unintentionally resizing windows vertically when I only mean to resize them horizontally. I always want (non-floating) columns (the windows that comprise them) to occupy the full monitor height.\r\n\r\nIt'd be great if I could prevent the mouse from vertically resizing non-floating windows or, alternatively, have an option to force non-floating windows in a column to sum to 100% monitor height.\r\n\r\n",
      "created_at": "2025-03-18T13:36:24Z",
      "updated_at": "2025-03-18T19:11:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "andornaut",
        "avatar_url": "https://avatars.githubusercontent.com/u/737842?u=f27a9705d644b9d48de08b033ba7155e59fd74f4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae5D2",
      "number": 1294,
      "title": "Feature: shrink-column-to-fit",
      "body": "Feature request:\r\n\r\nI often find myself manually shrinking some columns/windows, and then running `expand-column-to-available-width` on one of them in order to fit them all neatly on my screen. It'd be great if `niri` provided a couple of actions to make this easier.\r\n\r\nAction | Description\r\n--- | ---\r\n`shrink-column-to-fit-visible-columns-on-screen` | Shrink the current column until all other visible columns fit on the screen.\r\n`shrink-visible-columns-to-fit-on-screen` | Shrink all _visible_ columns proportionally until they all fit on the screen.\r\n\r\nThe goal with these actions would be to make all visible columns/windows fit neatly on the screen.\r\n\r\nEdge case: these won't work if the other currently visible columns are wider than the current screen, but this edge case can be left to the user to resolve.\r\n\r\n**Edit:** I noticed that feature request #1270 includes a similar request:  \"Add `pull-onscreen`\"",
      "created_at": "2025-03-18T12:25:29Z",
      "updated_at": "2025-03-18T18:29:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "andornaut",
        "avatar_url": "https://avatars.githubusercontent.com/u/737842?u=f27a9705d644b9d48de08b033ba7155e59fd74f4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae1xG",
      "number": 1270,
      "title": "Add `pull-onscreen` and `push-offscreen` actions.",
      "body": "I am a perfectionist and don't like having columns partially in view.\r\n\r\nI would like to propose two new actions: `pull-onscreen` and `push-offscreen`.\r\n\r\n`pull-onscreen` would shrink (fully) onscreen columns to pull any partially offscreen columns into view, and `push-offscreen` would do the opposite, growing (fully) onscreen columns to push partially offscreen columns fully offscreen. Space could be proportionally added/removed to/from all fully onscreen columns to maintain their previous width ratio.\r\n\r\nI'm not sure how this would work when there are two partially offscreen columns though since you probably don't want to act on both.",
      "created_at": "2025-03-14T22:37:28Z",
      "updated_at": "2025-03-18T13:13:56Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SamuelMcGowan",
        "avatar_url": "https://avatars.githubusercontent.com/u/26484217?u=5a5e36cdea87cb1ad5de8716f43bbe57fdf84e19&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae4TV",
      "number": 1290,
      "title": "Different scrolling method configurations for in-app and out-app",
      "body": "I'd like to use non-natural scrolling for in-app text scrolling while use natural scrolling for desktop switching (out-app). Is it easy to add such features?\r\n\r\nMoreover, I may want to use different scrolling methods for vertical and horizontal scrolling (like KDE).\r\n\r\nThanks!",
      "created_at": "2025-03-17T18:22:54Z",
      "updated_at": "2025-03-17T18:24:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "linsyking",
        "avatar_url": "https://avatars.githubusercontent.com/u/49303317?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa6Oq",
      "number": 599,
      "title": "Keybind / method set width to \"fill rest of screen\"?",
      "body": "I have a fairly unique requirement: I am streaming Factorio gameplay using niri, which requires me to make Factorio exactly 1920x1080. This part I have solved already, but what I would like to set obs' width to fill the rest of the screen space.\r\n\r\nI understand that this kind of thing is usually better served by i3/sway, but I can't use sway because it doesn't support pipewire window capture. Is there a way I can accomplish this?\r\n\r\nI would imagine something like `fill` in addition to the existing `proportion` and `fixed` layout rules.\r\n\r\n![image](https://github.com/user-attachments/assets/741774e3-c762-47c7-8589-2258210ac302)",
      "created_at": "2024-08-14T22:51:07Z",
      "updated_at": "2025-03-17T04:09:56Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AupXZ",
        "body": "Implemented in 92cc2b89f75fd13d83208626fa49724216fbbf9e. Please give it a try, see if it works as you expect."
      },
      "user": {
        "login": "raiguard",
        "avatar_url": "https://avatars.githubusercontent.com/u/3515394?u=f07fcd15fe695282f8527bf3822e584975fffad7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae2MP",
      "number": 1273,
      "title": "Associating Toplevels with Window IDs",
      "body": "Currently it's impractical to use standard wayland protocols in conjunction with the IPC for windows outside your application, as there's no reliable way to link wayland toplevels with window IDs.\r\n\r\nOne use case I thought of is making a [alttab](https://github.com/sagb/alttab) like program:\r\n> I think it's technically possible but currently very tricky to do because afaik there's no wayland protocol that can tell you when a toplevel focuses, so you have to track that through the ipc - conversly, screenshoting windows for thumbnails can only be done through wlr-screencopy - I don't think there's a practical way to link them up other than app_id + title + timing of window creation\r\n\r\nThis could be solved with a protocol:\r\n```xml\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<protocol name=\"niri_toplevel_id\">\r\n  <interface name=\"xdg_activation_v1\" version=\"1\">\r\n    <request name=\"get_id\">\r\n      <arg name=\"surface\" type=\"object\" interface=\"xdg_surface\"/>\r\n    </request>\r\n    <request name=\"get_foreign_id\">\r\n      <arg name=\"surface\" type=\"object\" interface=\"ext_foreign_toplevel_handle_v1\"/>\r\n    </request>\r\n    <request name=\"get_toplevel\">\r\n      <arg name=\"serial\" type=\"uint\" summary=\"the serial from the configure event\"/>\r\n    </request>\r\n\r\n    <event name=\"id\">\r\n      <arg name=\"id\" type=\"uint\"/>\r\n    </event>\r\n    <event name=\"toplevel\">\r\n      <arg name=\"surface\" type=\"object\" interface=\"xdg_surface\" allow-null=\"true\"/>\r\n    </event>\r\n    <event name=\"foreign_toplevel\">\r\n      <arg name=\"surface\" type=\"object\" interface=\"ext_foreign_toplevel_handle_v1\"/>\r\n    </event>\r\n    <event>\r\n  </interface>\r\n</protocol>\r\n```\r\nI originally had just `get_id` and `toplevel` and used `xdg_surface`s for everything but that doesn't make sense for foreign toplevels, it's a problem for both `get_id`, you might want to use either an `xdg_surface` or a `ext_foreign_toplevel_handle_v1` and for the `toplevel` event, if it's your surface getting a `ext_foreign_toplevel_handle_v1` doesn't make sense and possibly UB. But now `allow-null=\"true\"` for \"no toplevel with ID found\" is awkward because it's arbitrary which event it's a part of...\r\n\r\nAlternatively this could be entire entirely on the IPC side without a custom protocol, (ab)using [xdg-foreign](https://wayland.app/protocols/xdg-foreign-unstable-v2), it's more complicated but pushes the complexity to the IPC side instead of a protocol:\r\n### Toplevel -> Window ID\r\n- Export toplevel to handle\r\n- Use handle with IPC to get Window ID\r\n- Destroy exported object\r\n### Window ID -> Toplevel\r\n- Use ipc to get a handle from niri\r\n- Import it to get toplevel\r\n- Needs a special type of long lived ipc request to allow the ipc client to stay connected, and only remove the handle once it disconnects",
      "created_at": "2025-03-15T10:47:53Z",
      "updated_at": "2025-03-16T10:39:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bbb651",
        "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae2vD",
      "number": 1278,
      "title": "`spawn buffer-input=<ms>`",
      "body": "I often find myself opening a browser or a terminal, and having to wait until it starts when I already know what I want to start typing.\r\nInstead, when `buffer-input=<ms>` (or a generic duration with kdlv2 numeric suffixes, not important here) is set, input will be buffer until either the window spawns (probably relying on xdg-activation) or the duration passes, in either case the buffered input will then be inputted the application or discarded (seems better than the alternative of inputting it into an application we know is wrong).\r\nIt could be argued that this is a client issue, they should open a window as fast as possible to capture input and delay initialization, like e.g. `fuzzel` which opens instantly. That does not seem very realistic, especially with browsers, but it does makes this a bit of a hack.\r\n\r\nI think there'll be a ton of edge cases with binds and key suppression. Also is sending the original timestamps of the events valid? Reading the protocol it doesn't seem to say what they are relative to, is it to the time of connection or are they just relative to each other? ",
      "created_at": "2025-03-16T01:30:55Z",
      "updated_at": "2025-03-16T10:14:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bbb651",
        "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae2Ly",
      "number": 1272,
      "title": "swapactiveworkspaces",
      "body": "In hyprland I've got this ```swapactiveworkspaces```action that allows me to have Mod+tab to swap my main BIGGER monitor workspace, to whatever is on my second smaller monitor, e.g.: to quickly change a Spotify song or reply to a message in a chat without having to see it on the smaller monitor. \r\n\r\n```\r\nbind = $mainMod, tab, swapactiveworkspaces, $philips_monitor $dell_monitor\r\n``` \r\n\r\nThis instantly swaps one workspace for the other while remaining on the monitor that I was. \r\n\r\n![output](https://github.com/user-attachments/assets/4b4ceddb-18f9-4c45-9b27-1685e42e89ba)\r\n\r\nThe main advantage of this is my neck doesn't suffer. I can view things that move or change or alarms with my eyes without turning my head, but to read them in depth I move them to the screen in front of me instead of turning my neck. This has saved me from cervical pain. \r\n\r\nIt'll be nice to have this in Niri. \r\n",
      "created_at": "2025-03-15T10:34:27Z",
      "updated_at": "2025-03-15T11:58:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "maikelthedev",
        "avatar_url": "https://avatars.githubusercontent.com/u/29461493?u=f0dcac1e48d42e086a5e81b4855997fded0f127c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae1Sk",
      "number": 1268,
      "title": "Configurable buttons for drag/resize",
      "body": "Currently, moving/resizing windows by mouse is hardcoded (I think, didn't find anything in the docs).\r\n\r\nIt would be nice to have it configurable in some way (OpenBox allows this for example) so other keys can be used (or even no keys, and an alternative mouse button).\r\n\r\nIn my personal case, I have a mouse with a few more buttons, and I had my OpenBox configured so one of the buttons does move, the other resize, without the use of a Mod key.",
      "created_at": "2025-03-14T14:27:55Z",
      "updated_at": "2025-03-14T14:36:02Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "winged",
        "avatar_url": "https://avatars.githubusercontent.com/u/303759?u=22c3f4c8a8543a534f3bdc92d33f1d1846bb24f8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbHlt",
      "number": 637,
      "title": "If possible, do not show empty spaces",
      "body": "When navigating by columns, do not show empty spaces if all windows in the workspace are within the monitor borders. (for example: create three windows, the first with the maximum width and the other two on the second workspace with a width 50%. If you use gestures, you will see the difference in navigation between the first and second workspace)",
      "created_at": "2024-08-29T13:35:21Z",
      "updated_at": "2025-03-14T13:06:35Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "alexdev16",
        "avatar_url": "https://avatars.githubusercontent.com/u/3262292?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ae0k5",
      "number": 1263,
      "title": "Implement \"move-window-down-or-column-right\" and similar commands",
      "body": "I like having `focus-window-down-or-column-right` and `focus-window-up-or-column-left` as a way of navigating through all windows in a workspace in a logical order, without any additional mental load.\r\n\r\nI think the \"move\" equivalent of those commands would be really useful: `move-window-down-or-column-right` and `move-window-up-or-column-left`. For example, here is how `move-window-down-or-column-right` could work:\r\n\r\nIf the window is in a stacked column:\r\nMove it down the stack. If it's already the last one in the stack, it should move into the next column. If the next column is stacked, it goes to the top of the stack, otherwise it goes into its own column to the right of the next column.\r\n\r\nIf the window is not in a stacked column:\r\nIf the next column is stacked, it goes to the top of that stack. Otherwise, it goes into its own column to the right of the next column.\r\n\r\nHope that was clear enough. Thoughts?",
      "created_at": "2025-03-14T01:53:00Z",
      "updated_at": "2025-03-14T05:40:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "chcore",
        "avatar_url": "https://avatars.githubusercontent.com/u/83099052?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aez5V",
      "number": 1257,
      "title": "Не могу создать bind на Opera browser",
      "body": "<!-- Please describe the issue here at the top, then fill in the system information below. -->\n\n### System Information\n\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\n* niri version: 25.02\n\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\n* Distro: Gentoo\n\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\n* GPU: \nIntel Mobile 4 Series Chipset Integrated Graphics Controller \n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\n* CPU:ntel(R) Celeron(R) 900 @ 2.19 GHz\n\nНе могу создать бинд на браузер Опера, перепробовал все варианты\n1.Mod+M { spawn \"opera\"; } -не работает\nХотя запускаю в терминале\nopera  - работает\nПрописываю бинд \n2.Mod+M { spawn \"bash\" \"opera\"; } - -не работает\n3. Создал скрипт opera.sh:\n#! /bin/bash\nopera\nsudo cmod +x opera.sh\nЗапускаю : ./opera.sh -работает\nПрописываю бинд \nMod+M { spawn \"bash\" \"./opera.sh\"; } -не работает\n\nПодумал может кнопка М глючит, заменил команду -работает\n\nЧто не так? Что-то вообще не пойму\n\n![Image](https://github.com/user-attachments/assets/d533c0ce-5ab6-491b-b659-0720940da931)\n\n\n\n",
      "created_at": "2025-03-13T12:45:31Z",
      "updated_at": "2025-03-13T13:42:47Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "rediskap",
        "avatar_url": "https://avatars.githubusercontent.com/u/110164761?u=a4a8d6447403dc48b076ff2ca8366e23613407fe&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aes9D",
      "number": 1220,
      "title": "Head traking",
      "body": "A few days ago, I tinkered with opentrack to play a flight combat game, and these days I've been trying out niri—I’ve fallen in love with niri.\r\n\r\nJust now, it occurred to me that maybe I could switch windows and workspaces using head tracking, just like controlling the view with your head in a flight combat game.\r\n\r\nI'm really excited about this idea and plan to try making a prototype. It should be pretty simple—just converting opentrack's output data into niri commands—but I'll probably need to tweak the parameters repeatedly for a smooth experience.\r\n\r\nI wonder if anyone else is interested in this idea.",
      "created_at": "2025-03-06T21:02:26Z",
      "updated_at": "2025-03-13T08:23:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "uonr",
        "avatar_url": "https://avatars.githubusercontent.com/u/34709816?u=656394f58fb0d8ba26ed195a598d0846d0712b99&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aezh-",
      "number": 1254,
      "title": "Add support for multiple mice / trackballs / touchpad / keyboard",
      "body": "Hi,\r\n\r\nit would be a great feature to config mutiple input devices in the config file.\r\n\r\nIt would be very usefull for using a laptop as workstation. Like when its on a desk, there is an external keyboard which has a different layout.\r\nSame with trackballs or mice. I personally use a large trackball on my desk and a small mobile one on the road. \r\n\r\nIn sway one can use the indifier: https://man.archlinux.org/man/sway-input.5\r\n\r\nJust an idea and it would be nice. Thanks",
      "created_at": "2025-03-13T05:57:02Z",
      "updated_at": "2025-03-13T06:30:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {}
    },
    {
      "id": "D_kwDOKFkxdc4Aev7f",
      "number": 1241,
      "title": "autostart waybar on slackware",
      "body": "Вы очень хорошо написали [пример](https://github.com/YaLTeR/niri/wiki/Example-systemd-Setup) конфигурации waybar на systemd, хотелось бы узнать как правильно настраивать в других системах инициализации например на Slackware.у меня что то не выходит:\r\n Прописываю в конфиге\r\nspawn-at-startup \"waybar\" или spawn-at-startup \"bash\" \"waybar\" не работает",
      "created_at": "2025-03-10T13:09:17Z",
      "updated_at": "2025-03-11T11:51:52Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "rediskap",
        "avatar_url": "https://avatars.githubusercontent.com/u/110164761?u=a4a8d6447403dc48b076ff2ca8366e23613407fe&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aevrk",
      "number": 1240,
      "title": "Enable/Disable keyboard",
      "body": "In sway you can run `swaymsg input [KEYBOARD_IDENTIFIER] events toggle enabled disabled` to enable/disable a keyboard.\r\nIt is very useful when I'm travelling and using my laptop and want to use an external keyboard.",
      "created_at": "2025-03-10T08:38:14Z",
      "updated_at": "2025-03-10T09:00:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "giuxtaposition",
        "avatar_url": "https://avatars.githubusercontent.com/u/49444233?u=02c8bce6c682ac0b08c4931b45a9e79d547a3e77&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aet7z",
      "number": 1224,
      "title": "Use niri as window manager \"only\" for already existing DE?",
      "body": "Is there a working possibility to use `niri` \"only\" as window manager for an already set up distro including DE?\r\n\r\nOn my private laptop I'm running all `niri` (with `fuzzel`, `yambar` etc. set up by myself) on Void Linux. So far, its a *great* experience. Unfortunately, this is not a possible solution for my current job since I need some proprietary tools which are almost impossible to run under Void.\r\n\r\nThe laptop provided to me by my company is running a custom Ubuntu-based distro with KDE Plasma 6 DE (Tuxedo OS). Since standard Plasma window manager Kwin is a typical floating wm, I wanted to substitute it for my favored tiling solution. Plasma also offers some tiling extensions for Kwin (Krohnkite, Karousel ...), but neither of them works really good.\r\n\r\nIt would be great to run `niri` instead of Kwin simply as WM for Plasma 6. It is possible to substitute Kwin for e.g. `i3` on `xorg`, but I haven't found a working solution for Wayland since, at least as far as I understand it, the nature of Wayland makes it way more complicated to exchange a \"part\" like the WM only. I followed this [Arch hint](https://wiki.archlinux.org/title/KDE#Replacing_KWin_service) but, not very surprinsingly, its not working, since the WM in Wayland is not a simple binary as in Xorg.\r\n\r\n**Has anyone tried something similar with a Wayland based DE like KDE, Gnome whatever and had some success? Would be great to hear!**\r\n\r\nHowever, I'll keep figgering it out myself too and report, should I find a working solution...",
      "created_at": "2025-03-07T20:14:26Z",
      "updated_at": "2025-03-09T17:36:26Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "lukeflo",
        "avatar_url": "https://avatars.githubusercontent.com/u/103174551?u=55a1ca2e5a4cba8b97cbd7477dca5b2666250882&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeuUP",
      "number": 1227,
      "title": "Any way how to enable file drop into Xwayland client?",
      "body": "I'am running BricsCAD under manually started Xwayland with Openbox compositor. I need to run it in that way as under xwayland-satellite it doesn't work (Bricscad wants to manually position some contextual windows and that's not working with satellite).\r\n\r\nIf I try to drag a .dwg file from Nautilus and drop it to Bricscad under Xwayland, there is no reaction at all, no record in log if I run  Xwayland with -verbose 5 parameter. It seems, that Niri isn't passing drop to Xwayland at all.\r\n\r\nIs there any way how to make this working?",
      "created_at": "2025-03-08T12:00:54Z",
      "updated_at": "2025-03-08T13:16:56Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "VaclavC",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AesIL",
      "number": 1215,
      "title": "Add the ability to do binds on RightCtrl/Alt.",
      "body": "I have a **lofree flow 84** keyboard and I can't use the multimedia keys in any way, because otherwise **_F6_** won't work, as **_FN + F6_** is to increase the backlight of the keyboard. There is no way to bypass this with the driver. \r\n\r\n1) We can implement hook. Bind the FN button to RightCtrl/Alt. I didn't manage it (if you have suggestions how to do it - please).\r\n\r\n2) Bind to RightAlt all F1-12 (you can also bind to the “Option” key). Like AltR + F1 {spawn ...}.\r\n\r\n### In my case:\r\n```\r\nAltR + F7 {spawn “playerctl” “previous”; }\r\nAltR + F8 {spawn “playerctl” “play-pause”; }\r\nAltR + F9 {spawn “playerctl” “next”; }\r\n```",
      "created_at": "2025-03-06T03:55:10Z",
      "updated_at": "2025-03-06T05:07:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "IVKLD",
        "avatar_url": "https://avatars.githubusercontent.com/u/54883747?u=560384f91b0537e0bf425ccf21e9f051019c4fc9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aer_I",
      "number": 1213,
      "title": "Feat: Support for `pick_color`",
      "body": "Adding support for color pickers with the `pick_color` function in XDP Portal would allow for color-picking applications like [Bella](https://flathub.org/apps/io.github.josephmawa.Bella) to work\r\n\r\n### Resources\r\n- https://libportal.org/method.Portal.pick_color.html\r\n- https://amolenaar.pages.gitlab.gnome.org/pygobject-docs/Xdp-1.0/class-Portal.html#gi.repository.Xdp.Portal.pick_color",
      "created_at": "2025-03-05T23:59:57Z",
      "updated_at": "2025-03-06T04:55:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ThatOneCalculator",
        "avatar_url": "https://avatars.githubusercontent.com/u/44733677?u=a15c7592804dbcdf5f7690b8e95fcfde3ce3f5a3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AerPG",
      "number": 1211,
      "title": "Move between windows by moving mouse to the edge of monitor",
      "body": "Basically title says it, I already achieve this with focus-follows-mouse and struts for horizontal movement, but it doesn't work for vertical.",
      "created_at": "2025-03-05T08:13:41Z",
      "updated_at": "2025-03-05T15:56:36Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "dolzenko",
        "avatar_url": "https://avatars.githubusercontent.com/u/43391?u=f95ea25a9a74393abd99b0dbddb4539bcbe42050&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aeqn4",
      "number": 1208,
      "title": "Is there an option to hide focus ring if only a single window is visible?",
      "body": "In i3/sway this is called smart_no_gaps in config",
      "created_at": "2025-03-04T15:57:01Z",
      "updated_at": "2025-03-04T17:28:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tarasglek",
        "avatar_url": "https://avatars.githubusercontent.com/u/857083?u=873ec4347269c4cfcd2c65e02d41c021d3b0f908&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeqNF",
      "number": 1207,
      "title": "support for wp_cursor_shape_manager_v1",
      "body": "https://wayland.app/protocols/cursor-shape-v1\r\nhttps://www.phoronix.com/news/GNOME-Mutter-Cursor-Shape\r\n\r\nI am really tired of broken cursors in various apps/toolkits :)",
      "created_at": "2025-03-04T08:49:49Z",
      "updated_at": "2025-03-04T13:35:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "pg83",
        "avatar_url": "https://avatars.githubusercontent.com/u/1481268?u=1a6195217f665d028396922d51812cac9247e58e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeqGl",
      "number": 1205,
      "title": "Make focus/move actions wrap around",
      "body": "I.e. when I do focus-column-left and there are no columns to the left the rightmost column gets selected. Seems sensible and kind of similar to `workspace-auto-back-and-forth` option when having e.g. two windows will just allow switching back and fort with Mod+J.\r\n\r\nCheers for sharing this awesomest piece of software, it's been a great ride so far :heart: ",
      "created_at": "2025-03-04T06:51:06Z",
      "updated_at": "2025-03-04T07:07:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dolzenko",
        "avatar_url": "https://avatars.githubusercontent.com/u/43391?u=f95ea25a9a74393abd99b0dbddb4539bcbe42050&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdksW",
      "number": 903,
      "title": "Support custom screen resolution on nvidia opensource drivers (nouveau and NVK)",
      "body": "i have nvidia rtx 3060 and i mostly use opensource driver in mesa. lack of this feature (and ofc Xwayland but its manageable i guess) stops me from stwitching from Hyprland to niri: i have 5120x1440@120 monitor, but the highest resolution available on niri is 3840x1080, and everything is pretty blurry. i dont want to switch to proprietary driver full-time",
      "created_at": "2024-12-28T12:55:52Z",
      "updated_at": "2025-03-04T05:06:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ralencode",
        "avatar_url": "https://avatars.githubusercontent.com/u/74360792?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeoIP",
      "number": 1193,
      "title": "xwayland-satellite through spawn-at-startup not working/starting",
      "body": "I added xwayland-satellite into the config as written in the wiki.\r\n`spawn-at-startup \"xwayland-satellite\"`\r\nWhen I restart or log into niri, xwayland-satellite isn't running.\r\nIt works if I manually run xwayland-satellite but not through spawn-at-startup.",
      "created_at": "2025-03-01T21:03:03Z",
      "updated_at": "2025-03-02T14:23:35Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AvKeL",
        "body": "Is it in your $PATH that niri knows about? Maybe $PATH is only set by the terminal's shell? Try spawning with a full path."
      },
      "user": {
        "login": "JoFaHD",
        "avatar_url": "https://avatars.githubusercontent.com/u/73747175?u=596dd0c879e1bc07798d22ba0dc8298cc79ffd01&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aeoar",
      "number": 1195,
      "title": "Allow rebinding screenshot key",
      "body": "I dont have printscreen on my keyboard. Docs don't explain how to launch screenshot mode otherwise, don't offer an option to map another key.",
      "created_at": "2025-03-02T11:23:08Z",
      "updated_at": "2025-03-02T11:45:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tarasglek",
        "avatar_url": "https://avatars.githubusercontent.com/u/857083?u=873ec4347269c4cfcd2c65e02d41c021d3b0f908&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AenZQ",
      "number": 1190,
      "title": "move-window-down-or-to-top to match focus-window-down-or-top",
      "body": "I like to have move and focus keybindings that reflect each other nicely wherever possible. I think that adding a move-window-down-or-to-top command would make cycling focus and moving windows through tabs more intuitive for me (and probably some other users too).",
      "created_at": "2025-02-28T16:52:34Z",
      "updated_at": "2025-02-28T16:59:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zane-weissman",
        "avatar_url": "https://avatars.githubusercontent.com/u/25570596?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aem5p",
      "number": 1185,
      "title": "Animation: bounce when the focus is on the first/last column and we attempt to focus to the left/right",
      "body": "Similar to mobile devices, when the current focus is the first/last column bounce the view a bit if we attempt to go left/right (respectively) to have a visual indicator that we have reached the end. \r\n\r\nGives a bit of flair and makes the experience more familiar. Had this idea while I was iterating my keybindings.\r\n\r\nNotes:\r\n- This animation doesn't make sense when the action is to loop through the list of focused columns.\r\n- This might apply to workspaces as well",
      "created_at": "2025-02-28T07:47:13Z",
      "updated_at": "2025-02-28T08:23:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bphenriques",
        "avatar_url": "https://avatars.githubusercontent.com/u/4727729?u=902e82f8f52481fffdd804d4424f274c16d196e6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ael4k",
      "number": 1183,
      "title": "Give only focus to child popups on lxqt-panel",
      "body": "See https://github.com/lxqt/lxqt-panel/blob/a9838b3b2ba5492a19b82044a28b50b12dcf2650/panel/lxqtpanel.cpp#L262\r\n\r\nIn Kwin, wayfire and Hyprland  the panel doesn't steal focus if clicked or when focus-on-mouseover is used - it would be nice to have that also in Niri.",
      "created_at": "2025-02-27T09:13:55Z",
      "updated_at": "2025-02-27T13:23:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "stefonarch",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?u=a2928499988ebbb05ef99547bd768ab7bbcf2fd2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AelcU",
      "number": 1180,
      "title": "Implement 4 finger gestures to move applications",
      "body": "It would be cool to move applications within current workspace (horizontal swipe) or between workspaces (vertical swipe) with 4 fingers, since we already have 3 finger gestures to move focus.",
      "created_at": "2025-02-26T21:18:41Z",
      "updated_at": "2025-02-27T04:22:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sudoharun",
        "avatar_url": "https://avatars.githubusercontent.com/u/123123333?u=0e30ca9add331078eaba2ebb5139a56b06594f4e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aelbs",
      "number": 1179,
      "title": "Add window position id property to IPC",
      "body": "Title may be worded wrong, but here's the situation.\r\n\r\nI'm designing a dock which shows the open applications on the current workspace. Currently, I'm setting the position of each button (representing a window) based on it's ID, however this is flawed because if I were to move the positions of the windows, the position of the buttons wouldn't adjust and therefore they would be in the wrong order.\r\nPreferably, the windows position would be read left to right, up to down.",
      "created_at": "2025-02-26T21:07:38Z",
      "updated_at": "2025-02-26T21:08:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sudoharun",
        "avatar_url": "https://avatars.githubusercontent.com/u/123123333?u=0e30ca9add331078eaba2ebb5139a56b06594f4e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaR_A",
      "number": 500,
      "title": "Querying workspace dimensions and viewport position.",
      "body": "Hi there, I'm currently trying out Niri as I love the idea of not being constrained to the width of my tiny laptop screen.\r\n\r\nI was wondering if it's possible to query the state of a workspace and the viewport, something like `swaymsg get_tree` perhaps?\r\n\r\nI've noticed that I've started to loose track of where exactly I am in a workspace, and had the idea to add something like a scrollbar or a minimap within my ags bar to give myself a visual overview.",
      "created_at": "2024-07-02T09:25:29Z",
      "updated_at": "2025-02-25T15:01:55Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "olistrik",
        "avatar_url": "https://avatars.githubusercontent.com/u/17579507?u=1fbf0627be31be45b7a5d1c27fb548efc0e5aa72&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeiOe",
      "number": 1163,
      "title": "Open window below - i3/sway tile vertically",
      "body": "Hi, I've been heavy i3/sway for 10 years and I've just started evaluating niri today. So far it's looking great! And looking at release pace it seems that 2025 it's going to be a niri year ;)\r\n\r\nI'm using sway on ultrawide screen with 3-4 columns. By default new windows are opened in horizontal manner, new window will always open on the right. Sometimes I'm using sway tile vertically function\r\n![image](https://github.com/user-attachments/assets/429406ba-fef1-4cbc-b803-fdd454ee247d)\r\n \r\nWhenever I'm using tile vertically bottom border of focused window changes from green to purple. Whenever I open window afterwards it's created below focused one. \r\n\r\nhttps://github.com/user-attachments/assets/ae5ab79f-8a9a-4316-ae8b-210abf0968d6\r\n\r\n\r\nWhenever I open new window in niri it creates new column on the right. So if I want to move window I'd use:\r\n```kdl\r\n    Mod+BracketLeft  { consume-or-expel-window-left; }\r\n``` \r\nIf column has only one window open it's easy. But whenever there are multiple windows in one column and I'd like new window just below the top one there is a lot of window moving around. \r\n\r\nWould you consider adding this mode to niri?",
      "created_at": "2025-02-23T17:20:54Z",
      "updated_at": "2025-02-24T04:48:35Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alteriks",
        "avatar_url": "https://avatars.githubusercontent.com/u/6512767?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeiRr",
      "number": 1164,
      "title": "Superellipse/Squircle-like rounded corners",
      "body": "Most people have been shown to prefer a \"smoother\" look to their rounded corners that have a gradual transition from straight line to curved corner as opposed to the current rounded corners that harshly transition to the 90 degree curve of a quarter circle. Because of this I think the option to use a superellipse as the basis of the shape for the rounded corners would be a nice feature, especially for those who come from OS' that do actively apply this kind of rounding to corners. \r\n\r\nBelow is an example of the difference between the two shapes so it's clearer what I'm talking about\r\n\r\nhttps://www.shadertoy.com/view/4cG3R1",
      "created_at": "2025-02-23T19:17:06Z",
      "updated_at": "2025-02-24T04:46:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SproedKartoffelChip",
        "avatar_url": "https://avatars.githubusercontent.com/u/59844107?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AehAl",
      "number": 1160,
      "title": "add animations for moving workspaces up/down",
      "body": "Right now, when you do move-workspace-down or move-workspace-up, the only visible feedback is a change in your pager, assuming you show the current workspace position there. It would be nice to have some sort of visible feedback. The visible feedback which niri uses for everything else is animations, so that seems like the natural choice for moving a workspace up or down.\r\n\r\nWhat I imagine is something where the windows are picked up, moved over the workspace above, and then set down again. Ideally if moving more than one it shouldn't get put down until the move is complete. But there's lots of possibilities.\r\n\r\nRight now, I think there's no config hook to add such an animation to. I haven't looked at the animation system deeply yet, but it looks like it's all based on handling one window at a time. So the simplest thing would be one which could be called on all the windows in a workspace. That might also be re-usable to provide an animation for move-column-to-workspace-* actions.\r\n\r\nI don't know if there's already plans for this, or if it's written down anywhere, or if there are major changes planned for the animation system more generally.",
      "created_at": "2025-02-21T16:58:46Z",
      "updated_at": "2025-02-22T18:30:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dyfrgi",
        "avatar_url": "https://avatars.githubusercontent.com/u/1012426?u=4b67292b52c24338f675d7fa52cd40ddac665d59&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AehcV",
      "number": 1162,
      "title": "v25.02",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nHere are the improvements from the last release.\r\n\r\n> [!NOTE]\r\n> Packagers: I fixed the problem where some tests required `RAYON_NUM_THREADS=1` on a heavily multithreaded CPU. Please remove that variable if you had it set, so that we don't miss any new bugs.\r\n\r\nhttps://github.com/user-attachments/assets/a9e37678-5783-4de0-b2c7-a26094cd635f\r\n\r\n## Tabbed columns\r\n\r\nColumns can now present windows as tabs, rather than vertically stacked tiles. This is useful when you have limited vertical space, or when you frequently switch between two large windows and want to avoid scrolling.\r\n\r\nAdd this new bind to your config to switch a column to tabbed mode:\r\n```kdl\r\nbinds {\r\n   Mod+W { toggle-column-tabbed-display; }\r\n}\r\n```\r\n\r\nThis is *the only* new bind you will need. All other keyboard and mouse navigation works exactly the same as with regular columns: switch tabs with `focus-window-down/up`, add or remove windows with `consume-window-into-column`/`expel-window-from-column`, and so on. (Thanks @elkowar for this wonderful UX idea!)\r\n\r\nhttps://github.com/user-attachments/assets/5b357895-bcf3-42eb-a2e1-2b220d63d0c9\r\n\r\nThere are a few new actions that help navigate the tabs. All of them also work on regular columns.\r\n- `focus-window-top/bottom` focuses the topmost or the bottommost window in a column.\r\n- `focus-window-down-or-top` and `focus-window-up-or-bottom` cycle the navigation so the focus jumps from the last to the first window and vice versa.\r\n- `focus-window-in-column <index>` focuses a specific window by index.\r\n\r\nThe tab indicator can be customized in several ways and moved to top/bottom/right of the column. See [the wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#tab-indicator) for more details.\r\n\r\n![Tab indicator at the top of the column.](https://github.com/user-attachments/assets/cf8d1308-da36-4327-bbc6-dbb7a1f751d0)\r\n\r\nYou can also make windows open as tabbed columns by default [globally](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#default-column-display) or with a [window rule](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#default-column-display). This goes well with the `hide-when-single-tab` setting for the tab indicator.\r\n\r\n## Shadows\r\n\r\nNiri can now draw shadows behind windows. Apart from being a nice aesthetic effect, shadows help to delineate floating and otherwise overlapping windows. They are especially useful when you [disable](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#prefer-no-csd) or [clip away](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#clip-to-geometry) client-side decorations (which commonly include shadows of their own).\r\n\r\n![Shadows help to tell windows apart.](https://github.com/user-attachments/assets/c32f1911-4ef2-42d3-9b13-5c9db0268190)\r\n\r\nNiri shadows are not enabled by default to not clash with the shadows coming from client-side decorations. Turning them on is simple enough:\r\n```kdl\r\n// Enable shadows.\r\nlayout {\r\n    shadow {\r\n        on\r\n    }\r\n}\r\n\r\n// Also ask windows to omit client-side decorations, so that\r\n// they don't draw their own window shadows.\r\nprefer-no-csd\r\n```\r\n\r\nYou can customize properties like softness (blur radius), spread, offset, and color, both [globally](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#shadow) and [for individual windows](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#shadow). Like borders and focus rings, shadows will follow the window corner radius that you set via [`geometry-corner-radius`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#geometry-corner-radius).\r\n\r\n![Hard shadows example.](https://github.com/user-attachments/assets/18f6e622-652c-47a0-8f21-6805f21d7169)\r\n\r\nShadows also work on layer-shell surfaces. Due to the higher variety among layer-shell components, we don't enable shadows for them automatically; you need to explicitly enable them with a [layer rule](https://github.com/YaLTeR/niri/wiki/Configuration:-Layer-Rules#shadow). For example:\r\n\r\n```kdl\r\n// Add a shadow for fuzzel.\r\nlayer-rule {\r\n    match namespace=\"^launcher$\"\r\n    \r\n    shadow {\r\n        on\r\n    }\r\n\r\n    // Fuzzel defaults to 10 px rounded corners.\r\n    geometry-corner-radius 10\r\n}\r\n```\r\n\r\n![Shadow behind fuzzel.](https://github.com/user-attachments/assets/5149ab05-97e5-4dc7-9a2f-af32399b132b)\r\n\r\n## Drag-and-drop view scrolling\r\n\r\nIn this release I finally addressed one of the longer-standing UX issues: you can now scroll the view left and right during a drag-and-drop operation by moving the mouse close to the monitor's edge. This is similar to how you can scroll various lists and scrolling views in applications during drag-and-drop.\r\n\r\nThere's a small debounce delay before the scrolling starts so that it doesn't trigger when quickly moving the mouse across monitors. You can customize this, as well as other parameters like maximum scrolling speed, in [the new config section](https://github.com/YaLTeR/niri/wiki/Configuration:-Gestures).\r\n\r\nIn addition to drag-and-drop, this gesture will trigger when dragging a window in the tiling layout. Dragging floating windows however won't scroll the view.\r\n\r\nhttps://github.com/user-attachments/assets/9e1f166e-9194-4830-a482-34a00a9a2d61\r\n\r\n## Screencast target window rule\r\n\r\nThere's a new `is-window-cast-target=true` window rule that matches windows \"targetted\" by an individual-window screencast. You can use it, for example, to highlight the window that you're screensharing by changing its border/focus ring colors.\r\n\r\n```kdl\r\n// Indicate screencasted windows with red colors.\r\nwindow-rule {\r\n    match is-window-cast-target=true\r\n\r\n    focus-ring {\r\n        active-color \"#f38ba8\"\r\n        inactive-color \"#7d0d2d\"\r\n    }\r\n\r\n    border {\r\n        inactive-color \"#7d0d2d\"\r\n    }\r\n\r\n    shadow {\r\n        color \"#7d0d2d70\"\r\n    }\r\n\r\n    tab-indicator {\r\n        active-color \"#f38ba8\"\r\n        inactive-color \"#7d0d2d\"\r\n    }\r\n}\r\n```\r\n\r\n![Screencasted window highlighted in a red color.](https://github.com/user-attachments/assets/89163e0c-ddb4-470f-af40-9799cdeb0250)\r\n\r\nThanks @elkowar for the suggestion!\r\n\r\n## Custom titles for Important Hotkeys\r\n\r\nWe have an Important Hotkeys dialog in niri that pops up at startup with a list of the main binds to get you going. The binds in this list and their titles are hardcoded (so that you're not spammed with all the keys bound by default).\r\n\r\nIn this release, you can customize this list using the new `hotkey-overlay-title` property.\r\n- To add a bind to the dialog, or change an existing bind, set it to the title that you want to show:\r\n    ```kdl\r\n    binds {\r\n        Mod+Shift+S hotkey-overlay-title=\"Toggle Dark/Light Style\" { spawn \"some-script.sh\"; }\r\n    }\r\n    ```\r\n- To hide an existing bind from the dialog, set it to null:\r\n    ```kdl\r\n    binds {\r\n        Mod+Q hotkey-overlay-title=null { close-window; }\r\n    }\r\n    ```\r\n\r\nThis is especially useful for binds that `spawn` programs, as niri can't automatically deduce good titles for them. For example, here's my Important Hotkeys list where I gave nice titles to most spawn binds (everything below <kbd>PrtSc</kbd>):\r\n\r\n![Important Hotkeys with many customized titles.](https://github.com/user-attachments/assets/114d0d7c-e780-4d22-ad1c-6fb443027031)\r\n\r\nThese custom titles also support full [Pango markup](https://docs.gtk.org/Pango/pango_markup.html) which allows you to change styles, colors, and fonts.\r\n\r\n![Important Hotkeys with custom Pango markup.](https://github.com/user-attachments/assets/6594bd26-a803-4b42-b64d-e31db60ca14a)\r\n\r\nI also made two cosmetic changes to the key combo rendering:\r\n- <kbd>Ctrl</kbd> and <kbd>Shift</kbd> are now sorted before <kbd>Alt</kbd>, matching most other programs. However, when <kbd>Alt</kbd> is the <kbd>Mod</kbd> key (running niri as a window), then it will be sorted first to emphasize that.\r\n- <kbd>Space</kbd> is now rendered with capital S. These names come from xkb in all kinds of spelling variations, and we have to \"prettify\" them [manually](https://github.com/YaLTeR/niri/blob/b94a5db8790339cf9134873d8b490be69e02ac71/src/ui/hotkey_overlay.rs#L504) in niri. <kbd>Space</kbd> seems fairly common, so I added it to the code.\r\n\r\n## Expand to available width\r\n\r\nSometimes windows don't quite neatly divide into preset widths, making it hard to fill the space on the monitor exactly. The new `expand-column-to-available-width` bind addresses this: it expands the focused window to take up all remaining free space on the screen.\r\n\r\nSince windows on niri can scroll in and out of view, this bind considers the current window positions. All fully visible windows remain on screen.\r\n\r\nhttps://github.com/user-attachments/assets/cdb99398-77a3-42aa-8406-6a56e32559ca\r\n\r\n## Keyboard shortcuts inhibit protocol\r\n\r\n@sodiboo implemented the `keyboard-shortcuts-inhibit` Wayland protocol. It is used by apps like virtual machines or remote desktop clients to let them pass compositor bindings to the target system.\r\n\r\nYou can force-deactivate the inhibiting and get your niri shortcuts back using the following new action. Make sure to add it to your config:\r\n```kdl\r\nbinds {\r\n    Mod+Escape { toggle-keyboard-shortcuts-inhibit; }\r\n}\r\n```\r\n\r\nYou can also make certain binds ignore inhibiting with the new `allow-inhibiting=false` property. They will always be handled by niri and never passed to the window.\r\n\r\n```kdl\r\nbinds {\r\n    // This bind will always work, even when using a virtual machine.\r\n    Super+Alt+L allow-inhibiting=false { spawn \"swaylock\"; }\r\n}\r\n```\r\n\r\n## Screenshot without writing to disk\r\n\r\nThanks to @sornas, you can now capture screenshots only to the clipboard, without writing the image to disk. Simply press <kbd>Ctrl</kbd><kbd>C</kbd> in the screenshot UI instead of <kbd>Space</kbd> or <kbd>Enter</kbd>.\r\n\r\n`screenshot-screen` and `screenshot-window` binds can do this with a new `write-to-disk=false` flag:\r\n\r\n```kdl\r\nbinds {\r\n    Ctrl+Print { screenshot-screen write-to-disk=false; }\r\n    Alt+Print { screenshot-window write-to-disk=false; }\r\n}\r\n```\r\n\r\nOr, on the command line:\r\n\r\n```\r\n$ niri msg action screenshot-window --write-to-disk=false\r\n```\r\n\r\n## Other improvements in this release\r\n\r\n- @sodiboo implemented the `wlr-virtual-pointer` Wayland protocol required for tools like wayvnc and lan-mouse. These tools should now work with niri, however, keep in mind that you won't able to use niri *keyboard* binds through them due to a limitation of how the virtual *keyboard* protocol is currently implemented in Smithay.\r\n- @bbb651 added the `scroll-factor` window rule property. It works the same way as the input setting but can be set for a specific window.\r\n- @Faervan added the `toggle-window-rule-opacity` action which lets you temporarily make a window fully opaque, if it was semitransparent from a window rule.\r\n- @notpeelz added a setting to entirely disable the primary clipboard (middle click to paste selected text): `clipboard { disable-primary; }` at the top level of the niri config.\r\n- @Kirottu added two actions to move workspaces: `niri msg action move-workspace-to-index <INDEX>` moves a workspace to a specific position on its monitor, and `niri msg action move-workspace-to-monitor <OUTPUT>` moves a workspace to a different monitor.\r\n- @ezemtsov made `niri msg action switch-layout` accept a layout index (for example, `0` or `1` for the first or the second layout respectively) in addition to `next` and `prev`.\r\n- @m4rch3n1ng added a way to load the keyboard keymap from an .xkb file. See [the wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#layout) for details.\r\n- @pranaless made the horizontal view movement gesture play better with `center-focused-column \"on-overflow\"`: it will now snap a window to the center of the screen when it can't fully fit together with the adjacent window.\r\n- @zzzsyyy added a `drag-lock` input flag for touchpads that enables libinput [drag lock](https://wayland.freedesktop.org/libinput/doc/latest/tapping.html#tap-and-drag).\r\n- @JohnDowson added a `calibration-matrix` input setting for tablets. See [the wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#pointing-devices) for details.\r\n- @valpackett implemented the necessary D-Bus API to apply configuration changes from the Displays panel in `gnome-control-center`. These changes are transient, similarly to `niri msg output`: they are not written into your niri config and will be forgotten after a restart.\r\n- Enabled the fancy miette errors, which makes config parsing errors printed by niri clearer and easier to understand.\r\n- Changed idle activity notifications to happen at most once per event loop iteration, which fixes lags on some system configurations, especially when using high polling rate mice.\r\n- Fixed pointer clicks going \"through\" window borders to the layer-shell surface below.\r\n- Fixed a bug where the window corner radius did not always apply immediately after changing the config.\r\n- Fixed one of the longest-standing issues where a `fixed` preset column width did not take the focused window's border into account. (This went unfixed for so long because it required a refactor to column width handling.) From now on, all ways to set a `fixed` window size correctly operate on the window excluding the borders.\r\n- Fixed window focus inside a column jumping down when a window above disappeared. This seems to have been the longest-standing bug in niri to date: it was there from the [very first commit of the layout code](https://github.com/YaLTeR/niri/commit/95c810c855a27a28f4dfa7dc6b949fef0901c7b2), three days after I created the niri repository.\r\n- Fixed the <kbd>Enter</kbd> key press to confirm exiting niri also making its way to the window underneath and potentially triggering some action there.\r\n- Fixed a panic when using animations with overdamped springs.\r\n- Fixed the `niri-session` script incompatibility with POSIX sh (thanks @z-erica).\r\n- Fixed <kbd>Mod</kbd> + middle mouse button (to start a view scroll gesture) activating the window under the cursor on press.\r\n- Named workspaces no longer forget their *original monitor* when a new window opens on them. This change makes named workspaces \"stick\" to their original monitor more. For example, disconnecting a monitor with named workspaces, then doing some work, then connecting that monitor again, will move its named workspaces back. After this change, the only way to update a named workspace's *original monitor* is to explicitly move a named workspace to a different monitor with a bind.\r\n- Actions that move a workspace across monitors (like `move-workspace-to-monitor-right`) now update the workspace's *original monitor* even if the movement itself did nothing (for example, you tried to move to monitor right, but you were already on the rightmost monitor).\r\n- When live-reloading the config, niri now parses the config on a different thread, preventing a microstutter.\r\n- Niri will now send windows a single frame callback when asking them to resize or change state, even when they are currently invisible. This became relevant with tabbed columns where invisible windows (from other tabs) influence the column size.\r\n- Fixed windows receiving duplicate configure events when requesting un/fullscreen in some cases. (They weren't wrong events, just unnecessary.)\r\n- Fixed backend detection logic ignoring `WAYLAND_SOCKET` (thanks @bbb651).\r\n- Corrected behavior when opening or closing windows while no outputs are connected. Before, this likely caused problems and maybe even panics, but I haven't verified it.\r\n- @notpeelz fixed logging initialization happening too late and potentially missing one warning.\r\n- Changed client-server tests to work in-memory, without creating and using on-disk Wayland sockets. This fixes the problem where on highly multi-threaded CPUs it was possible to run out of Wayland socket numbers and fail the test.\r\n- Updated Smithay:\r\n    - Fixed an IME double-input bug in Chromium and Chromium-based apps.\r\n    - Fixed a panic after ~50 days of uptime due to an integer overflow.\r\n    - Implemented the `idle-notify` v2 protocol which lets tools monitor the user's input activity, ignoring any idle inhibitors.\r\n    - Implemented the `ext-data-control` protocol (same as `wlr-data-control` but graduated).\r\n\r\n## Funding\r\n\r\nI work on niri in the spare time that I have from my university studies. If you like what I do, you can support my work on [GitHub Sponsors](https://github.com/sponsors/YaLTeR). Big thanks to all current and past sponsors!\n\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v25.02'>v25.02</a>.</em>",
      "created_at": "2025-02-22T07:24:21Z",
      "updated_at": "2025-02-22T17:52:25Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AegCT",
      "number": 1155,
      "title": "Per-window Zoom",
      "body": "I read [this blog post](https://nickdiego.dev/blog/chromium-ozone-wayland-the-last-mile-stretch/) and it reminded me of an idea I had a while ago to (ab)use [fractional-scale-v1](https://wayland.app/protocols/fractional-scale-v1)'s ability to set the scale for each window independently to allow for window zoom (as in browser like zoom, not zooming the window in composting like #1070)\r\n\r\nI think we can have it as an action along with a per-window rule (this can also be used to workaround #524 if you set it such that the final scale will be integer. It would be easier if this had a `fixed` variant that ignores the monitor scale rather than multiply it, but I cannot think of another use case for it so I rather not have it):\r\n```kdl\r\nbinds {\r\n    Mod+Plus { set-window-zoom +0.1; } // Should this use 0.1 or 10%?\r\n    Mod+Minus { set-window-zoom -0.1; }\r\n    Mod+Shift+Plus { set-window-zoom *1.1; }\r\n    Mod+Shift+Minus { set-window-zoom *0.909; } // This needs to be weird to be the inverse\r\n    Mod+Alt+Plus { set-window-zoom ^1.1; } // zoom^1.1? Doesn't work with 1...\r\n    Mod+Alt+Minus { set-window-zoom ^-1.1; }\r\n    Mod+0 { set-window-zoom 1; }\r\n}\r\nwindow-rule {\r\n    match app-id=r#\"^psst-gui$\"#\r\n    default-window-zoom 1.5\r\n}\r\n```\r\nI feel like different methods go on a scale from \"most intuitive\" to \"most useful\", e.g. additive is the easiest to understand, but it's behavior is arguably the worst since you want precise control at the center. I'm not quite if there's a simple controllable way to give a wide variety of zoom behaviors (like the way exponential decay works for smoothing), e.g. [blender's zoom](https://github.com/blender/blender/blob/c114ac97bedb5d773ce40767694696434cc3d381/source/blender/blenkernel/intern/screen.cc#L1000-L1013) seems very specific.\r\n\r\nAlternatively or in addition, we can also have a list of zoom levels `layout.preset-window-zoom` like firefox's `toolkit.zoomManager.zoomLevels` (defaults to `.3,.5,.67,.8,.9,1,1.1,1.2,1.33,1.5,1.7,2,2.4,3,4,5`), I think unlike `preset-column-widths` and `preset-window-heights` I don't think we'll need different variants so it could just take a list of floats as arguments:\r\n```kdl\r\nlayout {\r\n    preset-window-zoom 0.3 0.5 0.67 0.8 0.9 1 1.1 1.2 1.33 1.5 1.7 2 2.4 3 4 5\r\n}\r\nbinds {\r\n    Mod+WheelScrollDown { window-zoom-increase; }\r\n    Mod+WheelScrollUp { window-zoom-decrease; }\r\n}\r\n```\r\n\r\nFor either of those to work well we also need a way to have actions target pointer focus instead of keyboard focus, since this is the way people will expect `Mod+WheelScroll*` to work, maybe `target=pointer`, bikeshedding the name because apparently I love naming everything target xD  (I don't remember where, but someone wanted a similar thing for #865 to be able to close a window on click, and it might be a stretch but I think it could be useful option for spawn, where the position of the spawned window would be as if you grabbed and dropped a window at the mouse cursor)\r\n\r\nWorth noting this will not work for clients not supporting fractional scaling, or ones that makes assumptions about the scale based on `wl_output` or `xdg_output`.",
      "created_at": "2025-02-20T18:49:43Z",
      "updated_at": "2025-02-20T19:01:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bbb651",
        "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeeLC",
      "number": 1147,
      "title": "Race condition with niri.service",
      "body": "I use niri with an IME. The IME does not work until it's manually restarted.\r\nI tested two IMEs. kime prints that no wayland compositor is found, and fcitx5 has no error log.\r\n\r\nAdding the delay between `graphical-target.session` and `fcitx5-daemon.service` and fcitx5 started working on boot.\r\n\r\n```nix\r\n  systemd.user.services.fcitx5-daemon = {\r\n    Service = {\r\n      ExecStartPre = \"/run/current-system/sw/bin/sleep 3\";\r\n    };\r\n  };\r\n```\r\n\r\nMany services rely on `graphical-session.target` for startup. Is there a cleaner solution that does not depend on an arbitrary delay?",
      "created_at": "2025-02-19T04:49:46Z",
      "updated_at": "2025-02-20T08:26:23Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "elbaro",
        "avatar_url": "https://avatars.githubusercontent.com/u/1851290?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AecMT",
      "number": 1137,
      "title": "Waybar on toggle",
      "body": "How to recreate e.g. Sway's \"hidden\" bar? I understand there's no `Mod` keup/down bindings, but I wouldn't mind manually toggling the bar with e.g. `Mod+W`.\r\n\r\nI couldn't turn a layer into floating, so I'm left figuring out my options.",
      "created_at": "2025-02-17T09:11:13Z",
      "updated_at": "2025-02-18T21:05:34Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "losnappas",
        "avatar_url": "https://avatars.githubusercontent.com/u/25119292?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aec4C",
      "number": 1140,
      "title": "Start windows maximized if it's the only one in workspace",
      "body": "I think this could be a cool feature option. If a window is the only one in the workspace, automatically execute \"maximize-column\" on it. Whenever another window opens, the original window returns to the default size. \r\n\r\nI'm a relative beginner, but I might try to implement this myself if you like the idea? ",
      "created_at": "2025-02-18T00:14:37Z",
      "updated_at": "2025-02-18T17:54:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "artogahr",
        "avatar_url": "https://avatars.githubusercontent.com/u/22445057?u=1091d63dab4ff5c524aed92ee326107b4d7983a2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AedBF",
      "number": 1141,
      "title": "`wp_single_pixel_buffer_manager_v1` support?",
      "body": "Hello! `wp_single_pixel_buffer_manager_v1` is required for some nifty utils like [`chayang`](https://git.sr.ht/~emersion/chayang). Is this something that would be worth looking at implementing? It's in the testing phase but it looks like the protocol is very simple and `smithay` has helpers for it (grain of salt since I've never personally worked on wayland compositors or clients).\r\n\r\nI would also be happy to try my hand at contributing this enhancement if it's deemed to be valuable.",
      "created_at": "2025-02-18T04:55:04Z",
      "updated_at": "2025-02-18T05:16:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Eliasin",
        "avatar_url": "https://avatars.githubusercontent.com/u/16994698?u=f005cd29b8cf6a49a5cd28dce85d0442b60ac771&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeTHf",
      "number": 1114,
      "title": "Per-output power management",
      "body": "Follow-up from https://github.com/YaLTeR/niri/pull/1108#issuecomment-2648594621 , I think if Niri is going to implement the wlr-output-power-management protocol, it needs to be able to control each output individually. However, Niri's current implementation of power management has some behaviors that conflict with this:\r\n\r\n1. The actions `PowerOffMonitors` and `PowerOnMonitors`, which set the state of all monitors.\r\n2.  Niri automatically powers on all monitors when user input is detected.\r\n\r\nThere are a few resolutions that we could consider:\r\n\r\n### (a) Share the same state / unify?\r\n\r\nFor example, if the per-output power management stores a power state for each output, `PowerOffMonitors` and `PowerOnMonitors` could set all of those states. But in that case, behavior 2 would constantly override the per-output values, defeating the point of adding per-output power management. In this case, it would make sense to remove behavior 2, or at least make it possible to disable it.\r\n\r\n### (b) Separate states?\r\n\r\nIf we want to keep the current behaviors (in particular, behavior 2) as a built-in \"screensaver\" feature, it could keep its state separate from the per-output states. When _not_ in screensaver mode, each output uses its own state to set its power mode. When the screensaver mode is turned on, it overrides the per-output states, blanking all displays.\r\n\r\n(How should this interact with the state reported by wlr-output-power-management? If it reports the displays as \"off\" during screensaver mode (as they really are off), and a wayland client tries to turn on a display in that state, what should happen?)\r\n\r\n",
      "created_at": "2025-02-10T18:40:36Z",
      "updated_at": "2025-02-17T15:56:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "agausmann",
        "avatar_url": "https://avatars.githubusercontent.com/u/6611767?u=8d6df03e691fb85097956439998d749bbf7d8be3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeZz9",
      "number": 1131,
      "title": "Add `focus-monitor-next` command",
      "body": "I only have two monitors (my laptop and one external monitor), so all the directional `focus-workspace-*` commands aren't very useful for me; however, at present I have to set two separate commands for moving between my monitors (`focus-workspace-up` and `focus-workspace-down`), whereas I would rather have just one `focus-monitor-next` command that wraps around the monitor list.\r\nMy need would also be served by `focus-workspace-down` (or `-up`) wrapping around.",
      "created_at": "2025-02-15T18:12:29Z",
      "updated_at": "2025-02-15T18:13:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "augustebaum",
        "avatar_url": "https://avatars.githubusercontent.com/u/52001167?u=aae43ab616096248fd3d5481f1d4c0dc4331e19d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeY1U",
      "number": 1127,
      "title": "Window rule for a single window in a workspace",
      "body": "Could there be a new window rule for a window opening in an empty workspace?\r\n\r\nThe rationale is that I like to have the first window be, by default, larger and centered if it is the only window in the workspace.",
      "created_at": "2025-02-14T15:25:34Z",
      "updated_at": "2025-02-14T15:43:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "GregorySchwartz",
        "avatar_url": "https://avatars.githubusercontent.com/u/2490088?u=2c0820da39629b52aa56124751c1aa80b449bcbb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa-SR",
      "number": 611,
      "title": "binds improvements",
      "body": "As I'm progressing in my niri journey there's 2 ideas I would love to see for binds, especially to make the \"Important Hotkeys\" dialog more useable\r\n\r\n1. Naming binds. \r\nSince I have a few binds that require to run them in a shell (i'm using `sh`), the hotkeys window now shows multiple entries named `sh`. It would be great to be able to name binds, so that the name is shown in the hotkeys list instead.\r\n\r\n2. Configure the hotlist. Don't get me wrong it's super useful. Actually so useful that I want to be able to configure the hotlist over time. The values shown per default are super helpful to remember the basics of my setup, but as I'm getting better in my workflow the hotkeys I have most problems remember are the less frequently used ones.\r\nA flag that allows me to control the content of the hotkeys for each bind would be super helpful. That way the dialog can \"grow\" along with me ;-)\r\n\r\nAlso huge thanks for making niri in the first place! It's soo much more joy to use than almost all other wayland based compositors",
      "created_at": "2024-08-19T12:43:52Z",
      "updated_at": "2025-02-13T21:57:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dantefromhell",
        "avatar_url": "https://avatars.githubusercontent.com/u/90508808?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeTDs",
      "number": 1113,
      "title": "Rounded tabbed indicators",
      "body": "Now that the PR for tabbed columns is merged. Is there any hope for rounded tabbed-layout indicators or atleast a way to make them rounded ??",
      "created_at": "2025-02-10T17:49:29Z",
      "updated_at": "2025-02-12T13:10:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "voidstar-null",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?u=9284ed0b1e1f71e30306d1672bfc0f045ddf9003&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeJ83",
      "number": 1080,
      "title": "`is-screencast` window rule matcher",
      "body": "When screencasting a window, it would be very neat if you could match against the screencasting state of a window in a window-rule. This would allow users to neatly add a colored indicator to the window, for example.\r\nI.e.:\r\n```\r\nwindow-rule {\r\n    match is-screencasted=true\r\n    border {\r\n        on\r\n        active-color \"#ff0000\"\r\n        inactive-color \"#dd0000\"\r\n    }\r\n}",
      "created_at": "2025-02-02T18:23:28Z",
      "updated_at": "2025-02-11T07:32:02Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "elkowar",
        "avatar_url": "https://avatars.githubusercontent.com/u/5300871?u=12d6338537eafc715032719236ac2842582a8118&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeQl1",
      "number": 1101,
      "title": "Defining window position on open",
      "body": "First I must say I am loving niri, the workflow just makes sense :)\r\n\r\nWhile on awesomewm for about a decade I heavily relied on a rofi script for my firefox tab/history etc management. In awesomewm I had it always open to the left of my browser. Currently, I am doing this kinda hackish workaround to get the same behavior.\r\n\r\n```shell\r\n#!/bin/bash\r\n# open rofi-firefox-{tab/history/search} on the left most/first column\r\n\r\nrun() {\r\n    rofi -x11 -modi blocks -show blocks -blocks-prompt 'tab' \\\r\n    -blocks-wrap $HOME/scripts/rofi_firefox/combi/firefox-combi-block-modi.lua \\\r\n    -eh 3 -kb-custom-1 ctrl-Delete -kb-custom-2 ctrl+o -kb-custom-3 ctrl-t -no-click-to-exit -monitor primary \\\r\n    -columns 1 -theme $HOME/.config/rofi/themes/left-quarter.rasi \\\r\n    -normal-window -pid /home/clu/.cache/rofi-tab.pid \\\r\n    -theme-str 'window { height: 1035px; border-radius: 6px;}' &\r\n}\r\n\r\nrun\r\nwhile [ \"$wid\" == \"\" ]; do\r\n    wid=$(jq -r --arg title \"rofi - tab\" '.[] | select(.title==$title) | .id' < <(niri msg -j windows))\r\ndone\r\n\r\nniri msg action focus-window --id $wid && niri msg action move-column-to-first\r\n```\r\n\r\nIt's not terrible, but naturally there is a small delay so the window opens on the right and moves across to the left. \r\n\r\nIs there a better approach? We have the `open-on-workspace` and `open-on-output` rules, perhaps there could be something like `open-column-leftmost` `open-column-rightmost`. Not sure how difficult this would be to implement, and maybe there is already a method I am overlooking? \r\n\r\nThanks for your time. \r\n\r\n",
      "created_at": "2025-02-08T23:02:01Z",
      "updated_at": "2025-02-09T20:43:47Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "vredesbyyrd",
        "avatar_url": "https://avatars.githubusercontent.com/u/22080838?u=fc17f1b79296416471d95ce860d494edebb3155d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeRWq",
      "number": 1105,
      "title": "Workspace back-and-forth",
      "body": "Switching from Hyprland to niri, one thing I miss is the `workspace_back_and_forth` feature, which allows to switch to the previous workspace, when trying to switch to currently focused workspace.",
      "created_at": "2025-02-09T16:53:11Z",
      "updated_at": "2025-02-09T17:08:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "voidstar-null",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?u=9284ed0b1e1f71e30306d1672bfc0f045ddf9003&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AePar",
      "number": 1095,
      "title": "window-rule: open windowB upon/below(vertically) focused windowA",
      "body": "Before:\r\n```\r\n______________\r\n|file manager|\r\n|  window A  |\r\n|____________|\r\n```\r\n\r\n---\r\nAfter:\r\n```\r\n______________\r\n|  window A  |\r\n|____________|\r\n______________\r\n| terminal B |\r\n|____________|\r\n```",
      "created_at": "2025-02-07T10:30:03Z",
      "updated_at": "2025-02-08T11:24:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "AClon314",
        "avatar_url": "https://avatars.githubusercontent.com/u/30747832?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeQL9",
      "number": 1097,
      "title": "Disable drag-and-drop for tab bar in floorp",
      "body": "Is there a way to disable title bar drag and drop interaction?\r\n\r\nI have `prefer-no-csd` enabled, but the tab bar in Floorp has a vertical scroll bar that triggers the drag and drop interaction. I suspect it is triggering the title-bar gesture where you can drag windows by it.\r\n\r\nDoesn't happen with the scroll-bar on the right btw, only the one with the tabs\r\n\r\nhttps://github.com/user-attachments/assets/be533d72-a82a-4dd2-a75c-22ff417203a3\r\n\r\n",
      "created_at": "2025-02-08T07:29:02Z",
      "updated_at": "2025-02-08T11:23:45Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Ladas552",
        "avatar_url": "https://avatars.githubusercontent.com/u/94762349?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeNv-",
      "number": 1091,
      "title": "clipboard manager setup",
      "body": "`    Mod+V {spawn \"cliphist\" \"list\" \"|\" \"rofi\" \"-dmenu\" \"|\" \"cliphist\" \"decode\" \"|\" \"wl-copy\"; }`\r\n\r\ni dont think this is the right way to setup cliphist with rofi :woomy:\r\nis there any examples I can look at or a way to configure this properly?",
      "created_at": "2025-02-05T17:34:05Z",
      "updated_at": "2025-02-05T17:44:45Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AuDbN",
        "body": "You want to do something like `spawn \"sh\" \"-c\" \"cliphist list | rofi -dmenu | cliphist decode | wl-copy\"`. See the sh -c examples here: https://github.com/YaLTeR/niri/wiki/Configuration:-Key-Bindings#spawn"
      },
      "user": {
        "login": "anispwyn",
        "avatar_url": "https://avatars.githubusercontent.com/u/36318840?u=f57bd0e7b00662dfd5918d2d8d89bb5962099300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeJ_L",
      "number": 1081,
      "title": "\"virtual\"  screencasted window allowing dynamically changing which window gets shown in screencast",
      "body": "## The problem\r\n\r\nIn many cases when screensharing, you end up wanting to show the contents of one window primarily, but sometimes wanting to show some other window for context. Currently, the only real solution here is to share your entire screen, which has several drawbacks:\r\n- If you have very high dpi, or a weird aspect-ratio (i.e. 21:9), sharing the entire screen is often a very bad experience for the viewers\r\n- You are also sharing stuff that you might not want to, or might move a window to the shared screen accidentally, leaking some information (yes, this is mostly solved by `block-out-from`, however doing that for a browser window might be very fragile and not necessarily convenient)\r\n- You're including other stuff around the window, which is distracting and takes up space\r\n\r\n## The proposed solution\r\n\r\nNiri could create a sort of \"virtual\" window that is only seen by xdg-desktop-portal screencast clients. This window then mirrors the contents of whatever the user currently wants to show, allowing the user to quickly switch what is shown on stream through niri, rather than having to go through the screenshare-menu of the users video-calling software.\r\n\r\nI'd propose three different modes here, which should be toggleable via regular actions (-> niri IPC, keybinds, etc):\r\n1. `follow-focus`: niri always casts the currently focused window. When the user focuses something else, the other window gets shown. Optimally, it should be possible to constrain this to a single workspace and/or display, such that you can still have a secondary monitor or workspace that the screencast does _not_ follow you to.\r\n2. `full-screen`: the equivalent of just sharing your entire screen. This would be still be useful because it'd allow the user to quickly switch between sharing the entire screen and singular, specific windows\r\n3. `fixed` / `manual`: share one specific window, specified via its ID. The user could then set up keybinds or other automations to switch which window is casted exactly how they want to -- i.e. creating a keybind that sets the window focused at that moment as the casted window.\r\n\r\nThis would work especially well in combination with #1080, as you'd then be able to nicely visualize which window you are sharing -- which is infinitely more important when that window might be changing very frequently and dynamically.\r\n",
      "created_at": "2025-02-02T18:35:45Z",
      "updated_at": "2025-02-04T10:28:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "elkowar",
        "avatar_url": "https://avatars.githubusercontent.com/u/5300871?u=12d6338537eafc715032719236ac2842582a8118&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdYgs",
      "number": 876,
      "title": "Support tabs by optionally displaying multiple windows in a column as tabs",
      "body": "## Concept \r\n\r\nThis is a simple concept for how to add tabs into niri, without conflicting with any of the other potential ideas for future 2D scrolling, etc, and without requiring an additional set of navigation keybinds.\r\nInstead of adding tabs as a completely separate feature, the idea is to allow any columns (vertically stacked windows) to alternatively be displayed as a set of tabs, rather than a vertical stack of windows.\r\n\r\n![image](https://github.com/user-attachments/assets/b676907d-15a8-42ca-8ede-8f42033ee725)\r\n\r\nWhile this still brings some limitations (you couldn't have a tab group be horizontally split), this, in return, solves most of the issues regarding the fact that tabs require a completely new set of keybinds, have complex and often unclear interactions with the rest of the UX, etc.\r\nThe semantics of the keybinds from columns would carry over 1:1, as the tab list could be displayed vertically.\r\n\r\nThis would require one additional keybind, to toggle a column between those two states, as well as one additional configuration option to define the default mode for columns.\r\n\r\n## Alternatives\r\n\r\nThere have been many different ideas floating around, such as allowing each column to scroll vertically (which would serve the same usecase, but with different UX), or adding a more general 2D scrolling concept.\r\n\r\nAdditionally, some of the usecases for tabbing could be served by having a \"sticky\".\r\n\r\nAll of these are much larger design questions, probably more complex to implement, and have way more difficult to answer questions in regard to how they interact with the rest of niri.\r\n\r\nAn additional variant of this would be to just resize the windows, which you can technically already hack together a bad version of via `is-active-in-column` and min/max-height in a window rule:\r\n![image](https://github.com/user-attachments/assets/3923f03f-471f-48a3-8af5-bbe03c360708)\r\n",
      "created_at": "2024-12-17T16:38:42Z",
      "updated_at": "2025-02-04T08:24:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "elkowar",
        "avatar_url": "https://avatars.githubusercontent.com/u/5300871?u=12d6338537eafc715032719236ac2842582a8118&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeHLF",
      "number": 1070,
      "title": "Add scale or set-zoom-level or struts to window-rule?",
      "body": "I have currently this:\r\n\r\n![20250130_16h31m24s_grim](https://github.com/user-attachments/assets/9aba785f-ca98-40ac-abe9-f43f6c509905)\r\n\r\nBut this is more of a hack, using transparent border to center the inactive windows. Scale or zoom out would be preferable.\r\nHaving scale in window role would enable a lot more layouts too.\r\nAdditionally, would it be possible to center window vertically?\r\n\r\nRelevant config:\r\n```\r\nlayout {\r\n    gaps 8\r\n    center-focused-column \"always\"\r\n    border { off; }\r\n}\r\nwindow-rule {\r\n    match is-active=false\r\n    match is-focused=false\r\n    opacity 0.7\r\n    geometry-corner-radius 12\r\n    min-width 500\r\n    max-width 500\r\n    min-height 950\r\n    max-height 950\r\n    border {\r\n        // off\r\n        on\r\n        width 50\r\n        active-color \"#60606000\"\r\n        inactive-color \"#40404000\"\r\n    }\r\n    // scale 0.7\r\n    // set-zoom-level \"+10%\"\r\n    /*\r\n     struts {\r\n     left 64\r\n     right 64\r\n     top 64\r\n     bottom 64\r\n    }*/\r\n}\r\n```",
      "created_at": "2025-01-30T15:48:22Z",
      "updated_at": "2025-02-03T12:16:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Baerbeisser",
        "avatar_url": "https://avatars.githubusercontent.com/u/22264628?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeKQj",
      "number": 1082,
      "title": "Window rule to keep focus",
      "body": "I've run into a scenario where i'd like a window to keep focus if it already has it when another window opens. but when the specific window doesn't have focus (or isn't open) then apps should grab focus when they open.\r\n\r\nRight now there's the `open-focused` config, i kind of want the inverse ... i want to default to `open-focused true` except if one specific window already has focus.\r\n\r\nFor example: I might use my launcher to open an application, then while it's opening i trigger the launcher again to do something else. While I'm typing in the launcher, the new app opens and steals focus. In this case I want the launcher to keep focus.  \r\n",
      "created_at": "2025-02-02T21:46:18Z",
      "updated_at": "2025-02-03T05:01:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "emenel",
        "avatar_url": "https://avatars.githubusercontent.com/u/13215?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeJIj",
      "number": 1077,
      "title": "Adding a check for a default cursor icon",
      "body": "as the title says it might be a good idea to Add a check for a default cursor icon that writes a new default cursor into ~/.local/share/icons if no cursor is found. because else the fallback cursor used isn't resizable and not connected to the $XCURSOR_SIZE variable\r\n\r\nI don't know if this is possible but I would be willing to implement this",
      "created_at": "2025-02-02T01:34:05Z",
      "updated_at": "2025-02-02T19:30:40Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "CaliOn2",
        "avatar_url": "https://avatars.githubusercontent.com/u/170101967?u=c4764ac92a2cdf9c9a5283df7201cd3b9aff6ada&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeJRz",
      "number": 1079,
      "title": "Cursor theme for xwayland-satellite",
      "body": "How tonset curaor theme for apps that running with xwayland-satellite? If running on wayland theme applied normal",
      "created_at": "2025-02-02T09:16:57Z",
      "updated_at": "2025-02-02T10:16:43Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "xaolanx",
        "avatar_url": "https://avatars.githubusercontent.com/u/49628247?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeJK2",
      "number": 1078,
      "title": "Separte config files",
      "body": "How to split config files? Like for output to output.kdl",
      "created_at": "2025-02-02T03:36:18Z",
      "updated_at": "2025-02-02T04:38:53Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "xaolanx",
        "avatar_url": "https://avatars.githubusercontent.com/u/49628247?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdkVs",
      "number": 901,
      "title": "Add an option to copy screenshots to the clipboard without saving them as files",
      "body": "Currently, taking a screenshot in Niri always saves the image as a file, which can lead to unnecessary accumulation of files. This makes it tedious to manually select which screenshots to keep and which to delete.  \r\n\r\nI propose adding an option in the screenshot UI to copy the image directly to the clipboard without saving it as a file. This would enhance the workflow, especially for users who only need temporary access to screenshots, and reduce the need for manual cleanup.  \r\n\r\n**Expected benefits**:  \r\n- Minimized file accumulation.  \r\n- Improved usability of the screenshot system.  \r\n- Faster workflows for tasks that only require temporary image sharing.\r\n\r\nattached evidence 😞 \r\n![image](https://github.com/user-attachments/assets/0ad2a850-b277-497b-99e9-16980da452cb)\r\n",
      "created_at": "2024-12-28T03:44:09Z",
      "updated_at": "2025-02-01T19:43:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SergioRibera",
        "avatar_url": "https://avatars.githubusercontent.com/u/56278796?u=9e3dac947b4fd3ca2f1a05024e083c64e4c69cfe&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeHcX",
      "number": 1073,
      "title": "Beginner Q: Are portals implementations required?",
      "body": "Sorry if this is a dumb question. I use X11 right now (no experience with wayland, still learning). I want to try niri, but have some questions.\r\n\r\nAre portals implementations required? I don't use them in my bspwm/sxhkd setup right now (only gnome-keyring). Instead, I have a sxhkd config to set keybindings to open programs.\r\n\r\nCan I not just do the same in niri - I would need to modify niri's keybindings anyway.\r\n\r\nA portal \"implementation\" that enabled a simple mapping between required functions and programs (maybe with xdg-settings for default values) would be fine too.\r\n\r\nThe niri wiki says portals will be very likely needed, but it doesn't say required.\r\n\r\nWhen I try to install niri in arch, I have to choose a portal. I'm not even sure what some of these portal functions do so I wouldn't be using the programs packaged in them.\r\n\r\n",
      "created_at": "2025-01-30T21:09:02Z",
      "updated_at": "2025-01-31T22:48:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4At1I4",
        "body": "Portals cover a ton of cross-desktop APIs like screencast, file chooser, secrets, notifications, ... (Actually, the global hotkeys portal that you're probably referring to isn't implemented in niri yet.)\r\n\r\nThey are mainly useful for sandboxed apps, since that's the only way for those apps to do all of those things. Outside sandboxed apps, the main important portal for niri is Screencast which lets browsers, OBS and others record the screen.\r\n\r\nWhen installing, pick xdg-desktop-portal-gtk (the default fallback portal) and xdg-desktop-portal-gnome (required by niri for screencasting). And gnome-keyring wouldn't hurt which provides the Secrets portal."
      },
      "user": {
        "login": "kpa28-git",
        "avatar_url": "https://avatars.githubusercontent.com/u/15056154?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeHWv",
      "number": 1072,
      "title": "Switching between applications using Super + Tab",
      "body": "Is there a way to switch between applications in niri similar to GNOME's Alt + Tab?\r\n\r\nWhen using that interface, a strip shows up in the middle of the screen that shows icons for each application, and if you hold Alt and press tab, then you can quickly tab to another application. Alt + Shift + Tab reverses the direction, and pressing ESC while holding the alt button cancels the operation.\r\n\r\nAs an extension of this, if you hit the back-tick button between the Tab and ESC keys while holding Alt, graphical previews show up for a given application below its icon, letting you choose between specific windows.\r\n\r\nI'm used to that kind of workflow, and it would be nice to see it in niri too. What do you think?",
      "created_at": "2025-01-30T19:00:01Z",
      "updated_at": "2025-01-30T19:04:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "leaf-node",
        "avatar_url": "https://avatars.githubusercontent.com/u/342930?u=5b4333a404702b628e7ab67637a190e420a99b22&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaFbk",
      "number": 450,
      "title": "Swap orientation (vertical strip and horizontal workspaces)",
      "body": "Hi!\r\n\r\nI'm using a multi-monitor setup with vertical (portrait) displays placed side-by-side.\r\n\r\nI'd like to try niri, but I don't see in the documentation whether it would be possible to have tiles scrolling vertically instead of horizontally.\r\n\r\nIs this kind of setup supported?",
      "created_at": "2024-06-19T08:31:06Z",
      "updated_at": "2025-01-30T16:43:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AlcOa",
        "body": "Hey, it's not supported unfortunately and it would likely be quite annoying to implement. So maybe in the future sometime"
      },
      "user": {
        "login": "pacien",
        "avatar_url": "https://avatars.githubusercontent.com/u/1449319?u=e4c19eab42d42aad9bd163f9e3fd1ddcf9503e0e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcFFQ",
      "number": 757,
      "title": "Feature request (Vertical scrolling)",
      "body": "Hello developers!\n\nI saw this project and thought to me, man. I really need this, however there is one thing that stood in the way between me installing it.\nDoes Niri support horizontal scrolling? \nIf not, I'd like to contribute (;",
      "created_at": "2024-10-23T17:36:26Z",
      "updated_at": "2025-01-30T16:41:12Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SomeRandoLameo",
        "avatar_url": "https://avatars.githubusercontent.com/u/100494326?u=a3114b7325c62b726ef680b2fde499a13e652851&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeEhp",
      "number": 1058,
      "title": "Move named workspaces on output plug events",
      "body": "Hi. I've been using `awesomewm` for almost a decade. Other than getting frustrated with gnome/wayland a few times over the last couple years wayland is completely new to me. The last couple weeks i've been testing different wayland compositors and `niri` seems to be a good fit.  I'm really enjoying the scrollable wm workflow, as well as the thorough documentation :) \r\n\r\nI'm using named workspaces:\r\n\r\n```\r\nworkspace \"main\" {\r\n    open-on-output \"eDP-1\"\r\n}\r\n\r\nworkspace \"server\" {\r\n    open-on-output \"eDP-1\"\r\n}\r\n\r\nworkspace \"media\" {\r\n    open-on-output \"HDMI-A-1\"\r\n}\r\n\r\nworkspace \"photo\" {\r\n    open-on-output \"HDMI-A-1\"\r\n}\r\n``` \r\nI saw commit 852da57 implemented `move-workspace-to-index and move-workspace-to-monitor IPC actions`.  My understanding of those actions is they are only intended for use as keybindings, the workspace to move has to be focused, is that correct?\r\n\r\nMy end goal is to move named workspaces back to their defined output on display plug events. In a normal workday I have to dock/undock quite often. Is something like `niri msg action move-workspace-to-monitor workspace_foo output_bar` already possible and I am just missing it? \r\n\r\nMaybe with named workspaces the sanest default behavior would be to always move the workspace to the defined output if it exists. Otherwise move them to the \"primary/built in display\".  \r\n\r\nThanks for your time.  ",
      "created_at": "2025-01-27T19:47:33Z",
      "updated_at": "2025-01-30T04:15:43Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Atsx8",
        "body": "Hey,\r\n\r\n> My understanding of those actions is they are only intended for use as keybindings, the workspace to move has to be focused, is that correct?\r\n\r\nNot necessarily. They both accept a `--reference` CLI argument where you pass the workspace to move. `niri msg action move-workspace-to-monitor --reference workspace_foo output_bar`\r\n\r\n> Maybe with named workspaces the sanest default behavior would be to always move the workspace to the defined output if it exists.\r\n\r\nI was thinking about a similar change. Normally, a workspace is \"assigned\" to their current output when you explicitly move it there, or when you open a new window after the workspace automatically moved (e.g. due to monitor disconnection). I was thinking to disable that second heuristic for named workspaces, which should fix this problem for at least some cases."
      },
      "user": {
        "login": "vredesbyyrd",
        "avatar_url": "https://avatars.githubusercontent.com/u/22080838?u=fc17f1b79296416471d95ce860d494edebb3155d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeFy9",
      "number": 1064,
      "title": "Ability to disable touch screen, like other input devices",
      "body": "My laptop has a cracked screen, which results in the touch detection being inaccurate and constantly touching the left side of the screen. This could be an incredibly useful feature for such scenarios where it is not working correctly.",
      "created_at": "2025-01-29T06:19:01Z",
      "updated_at": "2025-01-29T11:28:59Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "coatlessali",
        "avatar_url": "https://avatars.githubusercontent.com/u/61166135?u=df6c36ba859eb16651f56f20b8e57ef4e061081c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeDlO",
      "number": 1054,
      "title": "Is there a way to horizontal scroll on single column or window",
      "body": "Hi yalter, thank you for working on niri and making it an wonderful package.\r\n\r\nI wonder if we can horizontally scroll a single window/column with increased column width.\r\n\r\nUse cases are for firefox or wide windows, which can hide side windows and makes readable part focused.\r\n\r\nThis can be almost achieved by having another column/window beside the current one.\r\n\r\nwith \r\n`center-focused-column \"never\"`, it behaves as I wanted. \r\nBut the only con is, we need another window beside this.\r\n\r\nThis is not a dire requirement, just a thought.\r\nActually I suppose this might even break workflow for others, since it is not expected by many users.\r\nBut it still makes sense to me as niri is all about scrolling.\r\n\r\nCheers ;) ",
      "created_at": "2025-01-27T06:08:22Z",
      "updated_at": "2025-01-27T06:08:23Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "idlip",
        "avatar_url": "https://avatars.githubusercontent.com/u/117019901?u=00b0ab3c406d8a46970b968bc29169e275f5ff1f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeDjG",
      "number": 1053,
      "title": "The workspace id returned by `Event::WorkspaceActivated` is weird, is that intentional?",
      "body": "i only got 3 workspaces that has content inside, but the next just directly jump to the workspace which id=6.\r\n \r\nhttps://github.com/user-attachments/assets/d3ad5750-a056-4342-b3b9-643b148b40cf\r\n\r\n",
      "created_at": "2025-01-27T05:40:20Z",
      "updated_at": "2025-01-27T06:11:03Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AtpGi",
        "body": "Workspace id is not the same as workspace index, which is likely what you expected: https://yalter.github.io/niri/niri_ipc/struct.Workspace.html#structfield.id"
      },
      "user": {
        "login": "ogios",
        "avatar_url": "https://avatars.githubusercontent.com/u/96933655?u=09108f0f354534e0706b13ad19f105cf8adc7d44&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeCce",
      "number": 1051,
      "title": "Toggle all floating windows",
      "body": "Hi!\r\n\r\nThanks for this great project.\r\n\r\nComing from PaperWM, I'm trying to figure out if there is a way to create a key binding that toggles the entire floating layer on/off. For example, I might put my music player in a floating window and then hide it while it's playing, but using a quick keybind to bring it back up as needed.",
      "created_at": "2025-01-26T17:48:19Z",
      "updated_at": "2025-01-26T19:25:07Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "emenel",
        "avatar_url": "https://avatars.githubusercontent.com/u/13215?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeBrr",
      "number": 1049,
      "title": "horizontal view movement gestures don't respect center-focused-column on-overflow",
      "body": "as per title, horizontal view movement gestures don't respect `center-focused-column \"on-overflow\"`, behaving as if the option was set to `\"never\"`\n\n### System Information \n* niri version: release 25.01 from nixpkgs as well as commit e05bc269e678ecf828b96ae79c991c13b00b38a5 via niri-flake\n* Distro: nixos unstable\n<!-- is this at all relevant for this issue?\n* GPU: \n* CPU:\n-->\n",
      "created_at": "2025-01-25T17:59:19Z",
      "updated_at": "2025-01-26T14:29:46Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "pranaless",
        "avatar_url": "https://avatars.githubusercontent.com/u/119703249?u=ce5ddc5e2458558ebf5c8850b5350bc9c81031e4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeBGn",
      "number": 1044,
      "title": "Proposal: Introduce child columns for a classical two column use case",
      "body": "Coming from classical tiling window managers I have to say that niri is fantastic. Thank you very much for niri.\r\n\r\nAs a single-monitor user, for one use case I still prefer the classical solution: development with two permanently visible columns. When one column is resized the other one is resized accordingly so that they always fill the screen width. This is handy for use cases with e.g. one terminal window and a browser.\r\n\r\nOne way of mapping this use case in niri would be to introduce child columns.\r\n\r\nThe parent column would behave behave like a single ordinary column; the current flow behavior would not be affected at all. But the sub columns would always fill 100% of its parent column.\r\n\r\nAs this would probably only make sense for a parent column always only containing two child columns, another way to understand this would be a column pair within a default column.\r\n\r\n## Example\r\n\r\nYou have a regular/parent column `A` with two child columns `a1` and `a2`. `A` fills N% of the screen width. `a1` and `a2` have a width of 50% each. When `a1` is resized to 66%, `a2` is automatically resized to 33%, always filling 100% of `A`. Yet, the actual column `A` itself is never affected.\r\n\r\n## UI\r\n\r\nAs the parent column is just a regular column, everything would just work as currently. (I know: This is just \"easy\" in theory 😉)\r\n\r\nThe child columns yet would need separate borders.\r\n\r\nI don't know whether commands like `focus-window-right` should rather only affect the parent columns only or also child columns, like in a scenario `A–B(b1–b2)–C`. (`focus-window-right` could either jump from `A` to `B` or from `A` to `b1`). This is where this simple idea gets tricky.\r\n\r\n---\r\n\r\nThis would be a solution to combine advantages of a classical and a floating WM without touching niri's [design principles](https://github.com/YaLTeR/niri/wiki/Design-Principles).\r\n\r\nI hope this idea is not too strange.",
      "created_at": "2025-01-25T08:58:15Z",
      "updated_at": "2025-01-25T20:16:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Brixy",
        "avatar_url": "https://avatars.githubusercontent.com/u/1643010?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad_qK",
      "number": 1036,
      "title": "(Touch) Scroll-factor per app",
      "body": "I just noticed that we can [now](https://github.com/YaLTeR/niri/commit/128b01e04905d833214f52a3c6fab308bcc15ce0) use per app scroll-factor which is really awesome. I'm already using it and it works well.\r\n\r\nIt made me think that I could also use a specific setting just for Touchkpads per app.\r\n\r\nIn Godot my mouse scrolls just fine but using the trackpad it scrolls like I have set the scroll-factor to 1000 or something. But in the browser the touchpad scrolls normally.\r\n\r\nIn fact something that would be really cool is being able to nest configs like this:\r\n```\r\nwindow-rule {\r\n    match app-id=r#\"^godot$\"#\r\n    touchpad {\r\n        tap\r\n        natural-scroll\r\n        scroll-factor 0.01\r\n    }\r\n    mouse {\r\n        // natural-scroll\r\n        accel-speed 0.3\r\n        accel-profile \"adaptive\"\r\n        scroll-factor 1.5\r\n    }\r\n}\r\n```\r\n\r\nBut maybe that's too much to ask for. ;)\r\nAnyway, thanks for your hard work!",
      "created_at": "2025-01-23T17:22:57Z",
      "updated_at": "2025-01-25T06:31:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sommerper",
        "avatar_url": "https://avatars.githubusercontent.com/u/1512048?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeAxy",
      "number": 1041,
      "title": "Bug-report: Floating windows open in disproportionate sizes.",
      "body": "When I open a window, it is somewhat likely to open too small and interface elements may not fit in the window. When I press Win+RMB, the window takes its normal size. Specifically I could only find with PortProton, but the same problem was encountered with the .run installation files\r\nI apologize for the low information, I don't know how to provide more information about this problem\r\n![Screenshot from 2025-01-24 21-36-09](https://github.com/user-attachments/assets/8ec4e97d-b318-4620-b559-01859b9205a0)\r\n![Screenshot from 2025-01-24 21-36-18](https://github.com/user-attachments/assets/89bf25b8-03e6-4cda-9dfa-fae8f76c40be)\r\n",
      "created_at": "2025-01-24T18:51:19Z",
      "updated_at": "2025-01-24T19:29:26Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "win-hafus",
        "avatar_url": "https://avatars.githubusercontent.com/u/94008982?u=bce2bbf2114c127819f64ab50aea7c6bc436f151&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeAdq",
      "number": 1040,
      "title": "unable to change to other keyboard variants",
      "body": "```\r\n    keyboard {\r\n        xkb {\r\n            // You can set rules, model, layout, variant and options.\r\n            // For more information, see xkeyboard-config(7).\r\n\r\n            // For example:\r\n            layout \"us,th\"\r\n            variant \"dvorak\"\r\n            options \"grp:ctrl_space_toggle\"\r\n        }\r\n    \r\n            repeat-delay 200\r\n            repeat-rate 100\r\n    }\r\n\r\n```\r\n\r\nI've set variant to dvorak but qwerty is still be used",
      "created_at": "2025-01-24T13:22:55Z",
      "updated_at": "2025-01-24T13:25:56Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Atj1Y",
        "body": "You probably want `dvorak,` with a comma since you have two layouts."
      },
      "user": {
        "login": "anispwyn",
        "avatar_url": "https://avatars.githubusercontent.com/u/36318840?u=f57bd0e7b00662dfd5918d2d8d89bb5962099300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AeAac",
      "number": 1039,
      "title": "add wildcard selector for output configuration",
      "body": "I'd like some rules to be applied to all connected outputs, mainly to set the background colour. There doesn't seem to be a wildcard output selector, so I'd like to add it.\r\n\r\nExample:\r\n```kdl\r\noutput \"DP-2\" {\r\n    background-color \"#0f0d0a\"\r\n}\r\n\r\noutput \"DP-4\" {\r\n    background-color \"#0f0d0a\"\r\n}\r\n```\r\n\r\ninto\r\n```\r\noutput \"*\" {\r\n    background-color \"#0f0d0a\"\r\n}\r\n```\r\nI saw [this](https://github.com/YaLTeR/niri/discussions/617) discussion which seems similar, but doesn't suggest wildcard groups.\r\nI'm pretty sure I'm able to implement this, please let me know if there is something you'd like me to take into account. ",
      "created_at": "2025-01-24T12:19:28Z",
      "updated_at": "2025-01-24T13:13:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "0C3L0T",
        "avatar_url": "https://avatars.githubusercontent.com/u/27887267?u=ed11dbca98b6b91dfc17a41410244ad8d0718730&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad999",
      "number": 1032,
      "title": "How to disable scaling when watching videos, playing games in fullscreen",
      "body": "I have a 4k display that i've set to scale to 1.5 to make it more legible.\r\n\r\nHowever, when i watch a video or play a game in fullscreen, i would like to see it in 4k and not in the lower resolution that is scaled up. \r\n\r\nIs there a way to do this? ",
      "created_at": "2025-01-22T07:55:21Z",
      "updated_at": "2025-01-22T09:52:29Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AtcUd",
        "body": "Clients that support the fractional-scale protocol will already show you the full resolution, like mpv for videos, and running games in gamescope. Otherwise you could bind `niri msg output \"yourname\" scale 1` and vice versa."
      },
      "user": {
        "login": "Schweber",
        "avatar_url": "https://avatars.githubusercontent.com/u/64630479?u=d3a79244cac2fc22782dfe29dde79e9637b61ee7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdH1G",
      "number": 851,
      "title": "Drop Shadow",
      "body": "Hi!\r\n\r\nIt would be nice if we could have drop shadows for windows! With settings similar to https://github.com/yshui/picom or such!",
      "created_at": "2024-12-08T18:09:44Z",
      "updated_at": "2025-01-21T20:45:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "GhishNchips",
        "avatar_url": "https://avatars.githubusercontent.com/u/42581623?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad9XD",
      "number": 1029,
      "title": "incorrect keyboard input in Remmina",
      "body": "The question is not about niri, but maybe someone was able to solve it:\r\nIn the Remmina application, when connecting to an RDP session, keyboard input is not transmitted correctly. There is no such problem in Gnome. If you install and run Remmina from Flathub, then keyboard input works correctly.\r\nI noticed that in Fedora RPM, the remmina package is compiled with freerdp3, and in Flathub with the freerdp2 version, and in Gnome, the problem with freerdp3 was somehow solved.",
      "created_at": "2025-01-21T15:09:42Z",
      "updated_at": "2025-01-21T15:26:01Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "alexdev16",
        "avatar_url": "https://avatars.githubusercontent.com/u/3262292?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad8LB",
      "number": 1022,
      "title": "Window rule: Close when focus lost",
      "body": "I trying to create a text based application launcher for the terminal. I will be doing this by executing alacritty with the title 'alacritty launcher' and then executing a command in it (this is easily done and works well). I have added a window rule which makes any window with this title float, this is also working. But I want this window to close when the window loses focus. This could be (afaik) easily implemented using a simple window rule. ",
      "created_at": "2025-01-20T10:06:32Z",
      "updated_at": "2025-01-21T13:23:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "gro-david",
        "avatar_url": "https://avatars.githubusercontent.com/u/99834433?u=b5c808570d075c40266c9c9173cf32d0ac02b236&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad8lD",
      "number": 1025,
      "title": "Allow setting a first/primary display",
      "body": "As is, niri uses the first monitor found as a psuedo-primary display. While the concept of a \"primary\" display isn't part of Wayland, a monitor must still be chosen for operations when niri has started. A setting choosing a display as a default would be useful.\r\n\r\nIdeally, such a setting will re-order the internal list of monitors as xwayland-satellite seems to choose the first display as the primary display for the X server as well. This is easily resolved through xrandr, but being able to set a first/primary display in niri would likely resolve this issue implicitly as well.\r\n\r\nThis is merely a slight annoyance, though. My home setup requires me to switch monitor as my first action every time niri starts up as my side monitor is selected every time on startup. My work setup is \"lucky\" in that the big center screen out of three is incidentally the first one detected.",
      "created_at": "2025-01-20T18:37:53Z",
      "updated_at": "2025-01-20T19:42:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Toesmasher",
        "avatar_url": "https://avatars.githubusercontent.com/u/39797590?u=4727cb067664996b82f8f4839645b9075761670c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad8db",
      "number": 1023,
      "title": "change finger amount on trackpad",
      "body": "i would like to use 4 fingers instead of 3 fingers to scroll and do stuff, how can I achieve that?",
      "created_at": "2025-01-20T15:41:45Z",
      "updated_at": "2025-01-20T16:16:17Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "anispwyn",
        "avatar_url": "https://avatars.githubusercontent.com/u/36318840?u=f57bd0e7b00662dfd5918d2d8d89bb5962099300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad8Jc",
      "number": 1020,
      "title": "`frame` is no triggering a `frame_callback`",
      "body": "https://github.com/user-attachments/assets/9412bf94-e3ca-4364-9a9a-d6f01dc6d6f7\r\n\r\nidk if the fault is on my side, but it works on hyprland.\r\n\r\nthis is the repo for test: https://github.com/ogios/gf-bar",
      "created_at": "2025-01-20T09:39:43Z",
      "updated_at": "2025-01-20T13:55:27Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "ogios",
        "avatar_url": "https://avatars.githubusercontent.com/u/96933655?u=09108f0f354534e0706b13ad19f105cf8adc7d44&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad8Kx",
      "number": 1021,
      "title": "Subsecond precision in `screenshot-path`",
      "body": "Would be nice. Sometimes it's needed to make more than one screenshot per second.",
      "created_at": "2025-01-20T10:00:40Z",
      "updated_at": "2025-01-20T12:29:28Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "neunato",
        "avatar_url": "https://avatars.githubusercontent.com/u/23129307?u=897f570b61c290a249625664f66b6796e8dda418&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad6pR",
      "number": 1016,
      "title": "How to bind to just Mod or Super key",
      "body": "I want to press Super key. And if no other key is pressed while the Super key is let go, I want to launch rofi\r\n\r\nIs it possible?",
      "created_at": "2025-01-19T17:16:41Z",
      "updated_at": "2025-01-19T17:52:40Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AtVEf",
        "body": "You can't right now, there's no release bindings."
      },
      "user": {
        "login": "Aman9das",
        "avatar_url": "https://avatars.githubusercontent.com/u/39594914?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad4Wh",
      "number": 992,
      "title": "MouseMiddle as a modifier",
      "body": "Hi\r\n\r\nWould it be possible to enable mouse middle as a modifier, maybe this is a very niche usecase but I'd like to do Mod+MouseMiddle+WheelScrollDown as an example to focus-workspace-down\r\nI'm trying to do a heavily mouse focused keybind scheme and since it's a built in part of most mice that you can scroll while holding the middle mouse, that seems like a natural function to support as an additional modifier while scrolling, for example you could do super+wheelscrollup/down for volume then super+mousemiddle+wheelscrollup/down for focus up and down\r\n\r\nAlso it is a default gesture to do super + hold middlemouse and drag the mouse to switch workspaces, this would just simplify that further into a scroll instead of moving the mouse.\r\n\r\nHope that explanation makes sense.\r\nThanks",
      "created_at": "2025-01-16T22:20:18Z",
      "updated_at": "2025-01-19T16:53:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "CodedNil",
        "avatar_url": "https://avatars.githubusercontent.com/u/5075747?u=48bcd7918fc2c79b86f773cd0b2740ab5e3c664c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad42v",
      "number": 998,
      "title": "Open new terminal in current directory/xcwd alternative",
      "body": "Hi! Discovered niri this week, and I think it's getting me to finally leave i3. Thanks for the awesome work, everyone! :green_heart: \r\n\r\nOne feature I used all the time on X.Org is opening new terminal in the current working directory of my currently focused terminal, using [xcwd](https://github.com/schischi/xcwd). I used it like this:\r\n\r\n\tbindsym Mod4+Return exec kitty --working-directory=\"`xcwd`\"\r\n\r\nHas some found (or built) a Wayland version of xcwd? The way it works is to find the deepest child of the currently focused window, and look up its working directory. I guess one could cobble something together using `niri msg`?",
      "created_at": "2025-01-17T11:11:32Z",
      "updated_at": "2025-01-19T14:29:07Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AtT1r",
        "body": "Decided to write my own little tool for this, which I called [ycwd](https://github.com/blinry/ycwd) :) It allows you to write a key binding like this:\r\n\r\n```\r\nMod+Return { spawn \"bash\" \"-c\" \"kitty --working-directory=$(ycwd $(niri msg --json focused-window | jq .pid))\"; }\r\n```\r\n\r\nIt could be neat to even include the logic for how to find the focused window for different compositors?\r\n\r\nThanks for the pointer to `niri msg`, @YaLTeR!"
      },
      "user": {
        "login": "blinry",
        "avatar_url": "https://avatars.githubusercontent.com/u/81277?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad53P",
      "number": 1009,
      "title": "match in-workspace? workspace-rule ?",
      "body": "I've been attempting to make use of niri's features for blocking windows from screen capture, but have been struggling to work around firefox.  \r\nSeveral web applications are critical to my workflow so this is difficult. My current-best idea was to create a named \"Sensitive\" workspace; theoretically I could then match windows in that workspace and they would all be blocked from capture.  \r\nOnly _after_ creating the workspace and styling it in waybar did I learn there's no way to do this at present.  \r\n\r\n(Another workaround I considered and briefly used was just keeping all my sensitive data on a monitor I never intended on capturing. This worked fine, but one of my screens is smaller than the other, being a framework 16 connected to a full size desktop monitor.)",
      "created_at": "2025-01-18T21:57:03Z",
      "updated_at": "2025-01-19T05:53:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Bluberry-Kat",
        "avatar_url": "https://avatars.githubusercontent.com/u/20749209?u=a1f2c354fe79fe1ef07b4aa617ddea08319af6bc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad53W",
      "number": 1010,
      "title": "Mouse Binds for Window Move and Resize with a Touchpad",
      "body": "Using a touchpad to move or resize windows can be awkward in the current setup. For example:  \r\n- Moving windows with `Mod + Right Mouse Button` is cumbersome when using a touchpad, especially when not using \"tap to click.\".  \r\n- Resizing windows with `Mod + Left Mouse Button` is impractical and often doesn’t work on a lot of laptops.\r\n\r\nA configuration similar to what Hyprland offers ([reference link](https://wiki.hyprland.org/Configuring/Binds/#touchpad)) would greatly improve the experience for touchpad users.\r\n\r\n## Proposed Solution\r\n\r\n- Allow users to press `Mod + Left Ctrl` and drag the cursor with the touchpad to move a window, without requiring a physical click on the touchpad button.  \r\n- Similarly, pressing `Mod + Left Alt` should enable resizing a window by dragging the cursor with the touchpad, eliminating the need for a two-finger press or click-and-drag action, which is often unreliable on many laptops.\r\n\r\nThis feature would make window management significantly more intuitive and user-friendly for those relying on touchpads.",
      "created_at": "2025-01-18T22:00:35Z",
      "updated_at": "2025-01-19T05:42:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nakibrayane",
        "avatar_url": "https://avatars.githubusercontent.com/u/126190943?u=eda3bb4a1a17167877e6b65b2d4b069bbd1de5c5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad5k4",
      "number": 1005,
      "title": "Focus nearest window when clicking on background",
      "body": "With gaps enabled, this would make it possible to navigate left/right in the workspace by clicking on the very edge of the screen (when windows don't overflow on edges).\r\n\r\nAlso works around the problem discussed here https://github.com/YaLTeR/niri/discussions/984 when clicking on top/bottom gaps.",
      "created_at": "2025-01-18T11:15:06Z",
      "updated_at": "2025-01-18T18:04:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "neunato",
        "avatar_url": "https://avatars.githubusercontent.com/u/23129307?u=897f570b61c290a249625664f66b6796e8dda418&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad5mA",
      "number": 1006,
      "title": "Can I turn off keyboard shortcut for individual window?",
      "body": "I'am running one X app (Bricscad) under labwc. It works fine. But I have a global shortcut configured for window closing (Mod+Q in my case) and if I use it for Bricscad running under labwc, it goes to labwc window and closes it (and leaves that Bricscad running somewhere in some strange state). I need to turn off that Mod+Q shortcut for Niri managed labwc window and send it inside to close some Bricscad window. Is that possible? I have tried to put binds section in window-rule, but that's not allowed.",
      "created_at": "2025-01-18T11:58:56Z",
      "updated_at": "2025-01-18T15:10:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "VaclavC",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad4Yy",
      "number": 993,
      "title": "Make single workspace",
      "body": "Make it possible to join multiple monitors together into one long workspace\r\n",
      "created_at": "2025-01-16T23:55:15Z",
      "updated_at": "2025-01-17T18:15:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "IogaMaster",
        "avatar_url": "https://avatars.githubusercontent.com/u/67164465?u=428b94e4da823d1e67483dcd3d126617d926dbff&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad4zT",
      "number": 997,
      "title": "Loading colour profiles",
      "body": "Is there or are there any plans to add support for loading ICC colour profiles?\r\n\r\nSway added this fairly recently. It's the only thing that seems to be missing in Niri for me.\r\n\r\nhttps://github.com/swaywm/sway/issues/1486\r\nhttps://github.com/swaywm/sway/pull/7681",
      "created_at": "2025-01-17T10:11:09Z",
      "updated_at": "2025-01-17T13:17:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kj",
        "avatar_url": "https://avatars.githubusercontent.com/u/628170?u=d41cb695bff706420a91d192eaac5d3d5ba625e6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad4vf",
      "number": 995,
      "title": "Support for wp_single_pixel_buffer_manager_v1",
      "body": "Hi! I'm packaging this project for Arch Linux and have started using it as well (albeit somewhat on and off).\r\n\r\nOne of the downsides that I have noticed is that waylock does not work:\r\n\r\n```\r\n$ waylock\r\nerror: wp_single_pixel_buffer_manager_v1 not advertised\r\nerror: failed to read password from pipe: EndOfStream\r\n```\r\n\r\nDo you have any plans for supporting `wp_single_pixel_buffer_manager_v1`?\r\n(I have no idea what that entails or whether this project is even the right one to ask this question in)",
      "created_at": "2025-01-17T08:56:13Z",
      "updated_at": "2025-01-17T08:57:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dvzrv",
        "avatar_url": "https://avatars.githubusercontent.com/u/432519?u=f3d7a596f4f938a656512867e6ea901852a80fbb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad3i5",
      "number": 989,
      "title": "When a workspace overflows the screen, allow offscreen columns to \"peek\" the edge",
      "body": "EDIT: This was originally written as a feature request, but it turns out that option A was already implemented as `struts`.\r\n\r\n## Motivation\r\n\r\nWhen your column widths perfectly fit the screen, I've noticed as a new user that it's easy to forget if there are any columns offscreen. Other users have mentioned similar things in the discussions of the \"overview\" feature request: https://github.com/YaLTeR/niri/discussions/352#discussioncomment-9722798, https://github.com/YaLTeR/niri/discussions/352#discussioncomment-9729786\r\n\r\n## High-level description\r\n\r\nThere is a solution that doesn't require overviews - we could reserve some space on the edges of the output, where if there is an offscreen column, it peeks over the edge, so the user can see it.\r\n\r\nAs a side effect, this would make navigation with a mouse a little bit easier - the user can see and click on the edge of offscreen columns to focus them and bring them onscreen.\r\n\r\n(Note, this is mainly applicable to the mode `center-focused-column \"never\"` - I will assume it is in this mode for this discussion)\r\n\r\n## Implementation\r\n\r\n### A) Easy user configs\r\n\r\nJust add this as a config parameter - how much width should each output reserve for column peeking? Then niri does all the math internally (adjusting the proportional column widths to make it work, calculating where a newly-focused column needs to scroll in order to keep a peek next to it)\r\n\r\n### B) Hacky user configs, but maybe simpler to implement internally\r\n\r\nRecognize that part of the solution to this is already available to users - instead of using preset widths at exactly 1/2, 1/3, etc. of the output width, we could make them slightly smaller. For example, remove 4% from each width preset (i.e. scale the values by 96%). That way, if all columns use preset widths that add up to 96%, they leave 4% of the width for peeking.\r\n\r\nThen, if the onscreen content is perfectly centered, that would be 2% on both sides for offscreen peeking. However, there isn't currently a setting in Niri that can quite do this. With `center-focused-column \"never\"`, it will only scroll _just_ far enough to put the newly-focused column onscreen.\r\n\r\nThe minimum change that would enable something like this: Add a configuration option to set a \"scroll offset\" or a \"margin\" to be used by `center-focused-column \"never\"`. When it needs to focus an offscreen column, bring it onscreen and scroll an additional offset to put a peek next to the newly-focused column. (Additionally, consider any column that intersects that offset region as \"offscreen\", even if it is technically fully visible, forcing it to scroll further onscreen to satisfy the offset value)\r\n\r\n## Alternatives\r\n\r\nHot-edges - when the cursor is on/near the edge of the output, scroll slightly so the user can see the column that is off that edge (if any).\r\n\r\nMain drawbacks:\r\n- This may not work well for multi-monitor setups where the outputs are laid out side-by-side.\r\n- Could be an annoying behavior if the user was trying to interact with a window, overshoots a bit, and hits the edge.",
      "created_at": "2025-01-16T04:51:08Z",
      "updated_at": "2025-01-17T06:50:11Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AtNRr",
        "body": "Adding left and right struts to your config should do what you want, making them 32px will always leave 32px at the left and right of the screen for other windows. It does not peek though"
      },
      "user": {
        "login": "agausmann",
        "avatar_url": "https://avatars.githubusercontent.com/u/6611767?u=8d6df03e691fb85097956439998d749bbf7d8be3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abakn",
      "number": 671,
      "title": "Implement org.gnome.Mutter.IdleMonitor D-Bus interface in Niri",
      "body": "Based on the discussions at https://github.com/YaLTeR/niri/issues/660 and https://github.com/YaLTeR/niri/pull/665, I'm requesting that Niri implement the org.gnome.Mutter.IdleMonitor D-Bus interface so that Workrave can work in Niri without the `org.freedesktop.Screensaver` or Wayland idle-inhibit protocols interfering with it.\r\n\r\n",
      "created_at": "2024-09-15T15:17:41Z",
      "updated_at": "2025-01-16T02:35:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jjramsey",
        "avatar_url": "https://avatars.githubusercontent.com/u/25332524?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adyen",
      "number": 956,
      "title": "v25.01",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nHere are the improvements from the last release... hang on, how come we jumped from v0.1 all the way to v25?\r\n\r\nStarting now, niri ~~escapes [ZeroVer](https://0ver.org)~~ is switching to year.month versioning. In **25.01**, the \"25\" is year 2025, and \"01\" is month 01 (January). So version 25.01 tells you that this release was tagged in January of 2025.\r\n\r\nHotfix releases will use the third component. For example, the first hotfix for the 25.01 release would be called 25.01.1.\r\n\r\nThere are a few reasons for this change.\r\n- For niri, semver isn't very useful. Big and small features are added every release, and so far we've managed to avoid any breaking changes to the config file. Calendar versioning at least tells you how old of a version you're running.\r\n- v0.1.x left no place for a hotfix version. I couldn't even put v0.1.10.1 into `Cargo.toml` because it has four components instead of three. The new versioning has just two components, leaving one extra for the hotfix version.\r\n- I feel like niri is now sufficiently featureful to graduate from v0.1. :) I expanded the [Status section](https://github.com/YaLTeR/niri/blob/main/README.md#status) of the README to cover some of the frequently asked \"is this thing supported\" questions.\r\n\r\nSimilar versioning is also used in other projects like [Helix](https://github.com/helix-editor/helix), [NixOS](https://nixos.org) and [Ubuntu](https://ubuntu.com/).\r\n\r\nWith this change, the niri releases remain unscheduled: once every few months, and not bound to any particular cycle. Whenever I feel that it's a good time for a new version.\r\n\r\n> [!NOTE]\r\n> Packagers: niri now requires Rust 1.80. Also, there are new environment variables to override the niri version string and commit: `NIRI_BUILD_VERSION_STRING` and `NIRI_BUILD_COMMIT`. The new [Packaging niri](https://github.com/YaLTeR/niri/wiki/Packaging-niri) wiki page shows how to use them, along with everything else important for packaging.\r\n>\r\n> New niri tests need `XDG_RUNTIME_DIR` to be set. You can use `export XDG_RUNTIME_DIR=\"$(mktemp -d)\"`.\r\n>\r\n> If some tests fail with `Err::AlreadyInUse` on a heavily multi-threaded CPU, set `RAYON_NUM_THREADS=1`. This is tracked in #953.\r\n\r\n## Floating windows\r\n\r\nFloating windows are here! It took a big refactor and a good month of hard work, but the most *liked* niri feature request is done.\r\n\r\n![](https://github.com/user-attachments/assets/8bfa023f-3a8f-4482-bade-7d01c334ae95)\r\n\r\nLike other WMs, niri will auto-float dialogs and fixed-size windows. With no extra configuration, this release does away with most of the annoying dialog scrolling.\r\n\r\nhttps://github.com/user-attachments/assets/d560582c-07fd-4fcb-bf86-9ed305df515f\r\n\r\n<div align=\"center\"><i>Opening LibreOffice no longer causes the view to shift an ultrawide worth to the right.</i></div><br>\r\n\r\nBeing a scrolling WM, there were several options and design decisions to consider for how floating windows should work. I opted for a setup familiar from other tiling WMs: floating windows are on a separate \"layer\" that always shows on top of the tiled windows, and the floating layout does not scroll. Each workspace/monitor has its own floating layout, just like each workspace/monitor has its own tiling layout.\r\n\r\n![](https://github.com/user-attachments/assets/4bc2f71e-3d2f-490e-a7f2-3fdce98dd67f)\r\n\r\n<div align=\"center\"><i>Finally, you can properly showcase your scrollable-tiling WM setup.</i></div><br>\r\n\r\nThere's a surprising number of features and small details that go into a good floating experience. Things like correct parent-child stacking, focus-follows-mouse activating but not raising the window, or restoring the floating size and position after moving the window to the tiling layout and back.\r\n\r\nhttps://github.com/user-attachments/assets/376ef176-c546-400e-a977-b21a679dda81\r\n\r\nSince floating windows live on a workspace, and workspaces can move between monitors, it's important that floating windows never end up \"out of bounds\" and unreachable outside the monitor.\r\n\r\nInternally, niri remembers floating window positions relative to the monitor size, and will always push windows slightly away from the monitor edges. This way, windows are always visible, and moving the workspace to a smaller monitor will roughly preserve the window layout. Furthermore, moving the workspace to a smaller monitor and back will restore the original window positions exactly.\r\n\r\nIn the following demo, I'm resizing a nested niri with three floating windows, simulating monitor resolution changes.\r\n\r\nhttps://github.com/user-attachments/assets/3c4d43bf-4e95-4682-acc2-4598ec06cd20\r\n\r\nThere's a set of actions for focusing the floating or the tiling layout, and for moving windows around. The updated default config includes `switch-focus-between-floating-and-tiling` bound to <kbd>Mod</kbd><kbd>Shift</kbd><kbd>V</kbd> and `toggle-window-floating` bound to <kbd>Mod</kbd><kbd>V</kbd>. All relevant existing binds keep working when the focus is on the floating layout, e.g. `focus-column-right` will activate the next floating window to the right.\r\n\r\nAdditionally, on a mouse, you can easily move a window between floating and tiling by right-clicking while dragging it. You can tell which of the two it \"targets\" by the presence of the tiling insertion hint.\r\n\r\nhttps://github.com/user-attachments/assets/c09496b1-db40-48a5-9ba4-90ef55768dac\r\n\r\nThere's a new [`is-floating`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#is-floating) window rule matcher, and new [`open-floating`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#open-floating) and [`default-floating-position`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#default-floating-position) rules.\r\n\r\nYou can use `open-floating` to float some window that isn't covered by the auto-floating heuristics, like the Firefox Picture-in-Picture player. And `default-floating-position` supports putting floating windows relative to the four corners of a monitor:\r\n\r\n```kdl\r\n// Open the Firefox Picture-in-Picture window at the bottom-left corner of the screen\r\n// with a small gap.\r\nwindow-rule {\r\n    match app-id=\"firefox$\" title=\"^Picture-in-Picture$\"\r\n\r\n    open-floating true\r\n    default-floating-position x=32 y=32 relative-to=\"bottom-left\"\r\n}\r\n```\r\n\r\nMeanwhile, *real* tiling WM users like @algernon can set a blanket `open-floating false` rule to disable all auto-floating heuristics. Rest assured that our new set of [3135 snapshot tests](https://github.com/YaLTeR/niri/tree/d574341f1f00dfeb7bedbd592d53f62e2911752d/src/tests/snapshots) across all possible window opening settings will keep this working.\r\n\r\nAll in all, this release contains a fairly complete per-workspace floating layout. Going forward, we can expand the functionality, for example by adding a sticky/show on all workspaces window flag. Or perhaps by putting modal dialogs as floating right into the scrolling layout.\r\n\r\nAlso, when resizing tiled windows, their height is now clamped to the monitor height. It used to be unlimited so that you could take window screenshots larger than the monitor size, but now you can do that with a floating window.\r\n\r\n## Layer-shell improvements\r\n\r\nThis release has several fixes to layer-shell handling.\r\n\r\n- @cmeissl fixed the problem where the pop-up menu on Waybar and other GTK 3 bars would sometimes get stuck and fail to open. The way it was fixed disables keyboard navigation in those menus, but this is consistent with other compositors like Sway.\r\n- @cmeissl also fixed some clients crashing when opening nested pop-up menus (like lxqt-panel app menus).\r\n- @calops fixed niri not always activating the window below when clicking through layer-shell surfaces. Previously, that code didn't account for the surface's input region.\r\n- Pop-up menus from all layer-shell surfaces now render on top of regular windows. So putting Waybar at the top layer is no longer necessary for usable context menus.\r\n- Niri will now give bottom and background layer-shell surfaces on-demand keyboard focus and allow them to take pop-up grabs.\r\n- Certain actions like `focus-column-right` will now move the focus from an on-demand layer-shell surface back to the main layout, allowing you to \"escape\" layer-shell with just a keyboard.\r\n\r\nCombined, these improvements make the desktop icons components from LXQt and Xfce \"just work\" on niri. Thanks @stefonarch from LXQt for helping me test this and working on the LXQt niri session.\r\n\r\n![](https://github.com/user-attachments/assets/7d579b28-5f16-4c57-b8fe-88f6dac4d133)\r\n\r\n<div align=\"center\"><i>Xfce desktop icons with a context menu, terminal, and file manager on niri.</i></div>\r\n\r\n## Layer rules\r\n\r\nAt last, you can block out layer-shell notifications from screencasts [just like windows](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#block-out-from):\r\n\r\n```kdl\r\n// Block out mako notifications from screencasts.\r\nlayer-rule {\r\n    match namespace=\"^notifications$\"\r\n    block-out-from \"screencast\"\r\n}\r\n```\r\n\r\n![](https://github.com/user-attachments/assets/9a844c1e-97d8-4968-a132-1a92d3c643a7)\r\n\r\nLayer rules work very similarly to window rules but with a different set of matchers and properties. See the [wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Layer-Rules) for more details.\r\n\r\nYou can currently match by layer-shell namespace, and set `block-out-from` and `opacity`. To find out the namespace, use `niri msg layers` which lists all currently open layer-shell surfaces.\r\n\r\n## Drag-and-drop focus switch\r\n\r\nDrag-and-dropping something will now focus the output where you dropped it. This makes dragging a Firefox tab to a different output open it on that output.\r\n\r\nhttps://github.com/user-attachments/assets/de062b76-d3dc-4025-bbb0-289b04209c87\r\n\r\nSuccessful drag-and-dropping (when the target window accepts the drop) will also now activate the target window. This should reduce the confusion when you try to press some app shortcut right after a DnD and it ends up in the wrong (previous) window.\r\n\r\n## IPC and `niri msg` improvements\r\n\r\nI've expanded the [IPC interface](https://github.com/YaLTeR/niri/wiki/IPC) and `niri msg` a bit in this release:\r\n\r\n- Added the [process ID](https://yalter.github.io/niri/niri_ipc/struct.Window.html#structfield.pid) and whether the window [is floating](https://yalter.github.io/niri/niri_ipc/struct.Window.html#structfield.is_floating) to `niri msg windows`.\r\n- Added `niri msg layers` which shows information about [layer-shell surfaces](https://yalter.github.io/niri/niri_ipc/struct.LayerSurface.html).\r\n- Added the `set-window-width`, `switch-preset-window-width`, and `center-window` actions that mirror the corresponding `-column` actions, but can accept their target window by `--id`.\r\n- Actions that can accept negative sizes like `niri msg set-column-width -10%` no longer require a double-dash before the negative size. (I set the argument parser option that allows these arguments to start with a hyphen.)\r\n\r\n## Mouse click bindings\r\n\r\nThanks to @bbb651, you can now bind actions to mouse clicks:\r\n\r\n```kdl\r\nbinds {\r\n    Mod+Ctrl+MouseLeft { close-window; }\r\n    Mod+MouseMiddle    { maximize-column; }\r\n}\r\n```\r\n\r\nThese mouse-click binds will operate on the window that was focused at the time of the click, not the window you're clicking.\r\n\r\n## Window swapping\r\n\r\n@rustn00b added the `swap-window-left/right` actions that swap windows between two adjacent columns. They can be useful for a master/stack-like layout.\r\n\r\nhttps://github.com/user-attachments/assets/7c7db95f-805a-4b72-8c05-a9eec402259c\r\n\r\n## New window focusing\r\n\r\nThanks to @cmeissl, niri will now pass an xdg-activation token to the processes it spawns (with `spawn` binds or `niri msg action spawn`). As such, new windows that correctly activate themselves from the token will now get focused even when opening on a different workspace, or from a fullscreen window.\r\n\r\nWhen developing Wayland applications, you can verify that you use the xdg-activation token correctly with the new [`strict-new-window-focus-policy`](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options#strict-new-window-focus-policy) debug flag. It disables all heuristic automatic focusing, so only those new windows that use xdg-activation will get focused.\r\n\r\n## Lazy PipeWire initialization and resilience\r\n\r\nInstead of at compositor startup, niri will now initialize PipeWire on-demand (at the first screencast attempt). This makes it possible to run PipeWire after niri startup (e.g. with `spawn-at-startup \"pipewire\"`).\r\n\r\nAlso, niri now handles PipeWire restarts, and will reinitialize PipeWire next time it's needed. So restarting PipeWire should no longer make it impossible to screencast.\r\n\r\n## Other improvements in this release\r\n\r\n- Added the [`empty-workspace-above-first`](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#empty-workspace-above-first) layout option (thanks @FluxTape). If set, niri will always keep an empty workspace at the very start, in addition to the empty workspace at the very end.\r\n- Added the `focus-window-previous` action (thanks @zeroeightysix).\r\n- Added the `focus-monitor-next/previous`, `move-window/column/workspace-to-monitor-next/previous` actions (thanks @julianschuler). These use internal monitor ordering (that should be consistent across reboots) and loop around.\r\n- Added the `un/set-workspace-name` actions that can be useful in scripts to change workspace names at runtime (thanks @rustn00b).\r\n- Added the [`open-focused true/false`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#open-focused) window rule to force or prevent a window from getting focused on opening.\r\n- Added the [`default-window-height`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#default-window-height) window rule that works similarly to the existing `default-column-width`, but for height.\r\n- `expel-window-from-column` now always expels the bottom-most window in a column (rather than the focused one), and doesn't switch focus to the expelled column. This way, it becomes the exact opposite of `consume-window-from-column`. If you prefer the old behavior, use `consume-or-expel-window-right`.\r\n- Changed `is-active-in-column` window rule matcher to match `true` during the initial window opening (thanks @TheZoq2). This makes sense as a new window always opens in a separate column, therefore it is active in its column right away.\r\n- Niri will now power on monitors when the session is unlocked (thanks @salman-farooq-sh). This helps with fingerprint and other unlocking methods that don't generate an input event.\r\n- Fixed xdg-desktop-portal notifications by setting niri to use the gtk impl for the Notification portal.\r\n- Fixed `border { off; }` unable to override an earlier `border { on; }` window rule.\r\n- Fixed a crash when connecting two monitors with identical make/model/serial (or one monitor through both HDMI and DP). Niri will detect this and automatically unname the second monitor. So the [`disable-monitor-names`](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options#disable-monitor-names) debug flag is no longer necessary for such setups.\r\n- Fixed windows on other workspaces losing their Activated state (becoming visually inactive). This was a v0.1.10 regression. Windows keep their Activated state when switching workspaces to reduce unnecessary visual changes.\r\n- Fixed a crash when calling `move-window-to-workspace` to an unfocused monitor.\r\n- Fixed several actions applying to the windows below while interactively moving a window.\r\n- Fixed a potential crash when disconnecting a monitor while screencasting it.\r\n- Fixed potentially misaligned borders on the interactively moved window when hot-reloading the output scale config in-flight.\r\n- Fixed a wrong visual position when disconnecting a monitor while the primary monitor is in the middle of a workspace switch.\r\n- Fixed initial window size requested by niri not honoring min/max size from window rules.\r\n- Fixed potential crash when dropping an interactively moved window on a different monitor with a workspace switch in progress.\r\n- Added Xrgb and Xbgr as preferred formats for the primary plane (previously only Argb and Abgr were preferred). I haven't seen it affect anything thus far, but maybe it fixes a bandwidth limitation on some setups.\r\n- Refactored animation timing. This shouldn't have changed much visually (maybe some tiny issues were fixed), but it made the system much more robust, and let me write tests for many more scenarios. I wrote a [wiki page](https://github.com/YaLTeR/niri/wiki/Animation-Timing) about the new system if you're curious about the technical details.\r\n- Added the [`force-pipewire-invalid-modifier`](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options#force-pipewire-invalid-modifier) debug flag that forces PipeWire screencasting to use the invalid modifier.\r\n- Added the [`restrict-primary-scanout-to-matching-format`](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options#restrict-primary-scanout-to-matching-format) debug flag.\r\n- Debug flags for [`enable-overlay-planes`](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options#enable-overlay-planes) and [`disable-cursor-plane`](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options#disable-cursor-plane) now apply immediately, without having to reconnect the monitor.\r\n- Updated Smithay:\r\n    - Fixed some clients crashing when opening nested pop-up menus (lxqt-panel app menus).\r\n    - Implemented presentation-time v2 protocol (well-defined refresh rate reporting for VRR).\r\n    - Fixed xdg-foreign assigning window parents in reverse, so now portal dialogs are correctly parented.\r\n - Updated rustix:\r\n     - Fixed a crash at startup on M2 Apple and other AArch64 devices.\r\n\r\n## Funding\r\n\r\nI work on niri in the spare time that I have from my university studies. If you like what I do, you can support my work on [GitHub Sponsors](https://github.com/sponsors/YaLTeR). Big thanks to all current and past sponsors!\n\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v25.01'>v25.01</a>.</em>",
      "created_at": "2025-01-11T17:27:52Z",
      "updated_at": "2025-01-15T18:25:30Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZjZO",
      "number": 360,
      "title": "Mouse cursor inconsistent in Firefox and Waybar",
      "body": "Hi all.\r\n\r\nI have the following in my Niri config:\r\n\r\n```kdl\r\ncursor {\r\n    xcursor-theme \"breeze_cursors\"\r\n    xcursor-size 24\r\n}\r\n```\r\n\r\nWhen my mouse cursor is over my desktop, or a `kitty` terminal my mouse cursor is Breeze, an expected. However, when I hover over a Firefox window, or my Waybar, I seem to have a default cursor that's smaller. Does anyone know what could be causing this?",
      "created_at": "2024-05-20T09:51:10Z",
      "updated_at": "2025-01-15T09:21:33Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AkN_7",
        "body": "Firefox and Waybar use GTK 3, it probably has a different idea of where to load the cursors from than the XCURSOR env variable. You'll need to look into GTK 3 settings I guess"
      },
      "user": {
        "login": "ocharles",
        "avatar_url": "https://avatars.githubusercontent.com/u/20878?u=8024ace78ed022fed2feebad035a5d9f6610ead5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad0a5",
      "number": 965,
      "title": "Implicit help command is outputted to stdout instead of stderr",
      "body": "Currently, all of the following command output their respective help message to stdout:\r\n`niri help`\r\n`niri --help`\r\n`niri msg help`\r\n`niri msg --help`\r\n`niri msg action help`\r\n`niri msg action --help`\r\n\r\nWhile the following output to stderr:\r\n`niri msg`\r\n`niri msg action`\r\n\r\nThis is the default clap behavior, e.g. `cargo report` does the same thing.\r\nI think this is intended on clap's side to make turning subcommands optional forward compatible..? But I might be overthinking it, it could just be a bug.\r\nEither way I don't think this behavior makes sense for niri, `niri msg` and `niri msg action` will never be standalone commands, and this makes it annoying to grep them.\r\n\r\nSomething that's more of a feature request but related: Should `--json` apply to help commands? I think it can useful to e.g. make a hotkey that pipes all actions into a launcher. For `--help` and implicit help it doesn't make sense, but for `help` explicitly I think it does:\r\n```\r\n$ niri msg -j action help\r\n{\"action\":\"quit\",\"description\":\"Exit niri\",...}\r\n```\r\n\r\n### System Information\r\n\r\n<!-- Paste the output of `niri -V`, e.g. niri 0.1.0-beta.1 (v0.1.0-beta.1) -->\r\n* niri version: niri 0.1.10-1 (unknown commit)\r\n* Also tested with latest main (6e41220dbfa0c7d6291f669a842dde2b562e383b)\r\n\r\n<!-- Write your distribution, e.g. Fedora 40 Silverblue -->\r\n* Distro: Archlinux\r\n\r\n<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->\r\n* GPU: N/A\r\n\r\n<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->\r\n* CPU: N/A\r\n",
      "created_at": "2025-01-12T22:52:43Z",
      "updated_at": "2025-01-13T19:12:49Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "bbb651",
        "avatar_url": "https://avatars.githubusercontent.com/u/53972231?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad1HB",
      "number": 971,
      "title": "Is there a way to toggle center-column-on-focus on/off?",
      "body": "I usually want the focused window to be centered. However, sometimes when I need to look at two windows very often, I would like to disable this behavior. \r\n\r\nIdeally there would be an action or a keybind which I could define in the config to toggle between these states. ",
      "created_at": "2025-01-13T15:10:38Z",
      "updated_at": "2025-01-13T18:36:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "adwaymalhotra",
        "avatar_url": "https://avatars.githubusercontent.com/u/9569615?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ad01E",
      "number": 968,
      "title": "Consider enabling more aggressive optimizations like Fat LTO and codegen-units = 1 for Release profile",
      "body": "Hi!\r\n\r\nI see that the project already uses ThinLTO in the Release profile in the root `Cargo.toml` file. However, ThinLTO is usually less efficient from the perspective of performed optimizations than Fat (aka Full) LTO. Additionally, I decided to enable `codegen-units = 1` (CG1) option to see the results. Enabling more advanced optimizations allows us to reduce the binary size further (always a good thing) and improve the application performance more. If you already considered Fat LTO earlier instead of Thin, could you please elaborate on your current choice?\r\n\r\nIf enabling Fat LTO is considered to \"heavy\" for the default Release profile, we can prepare one more profile like `[profile.heavy-optimizations]`, and build the project with this profile for actual Releases. In this case, users will get a more optimized Niri version.\r\n\r\nBasically, it can be enabled with the following change:\r\n```\r\n[profile.release]\r\n...\r\ncodegen-units = 1\r\nlto = true\r\n```\r\n\r\nI have made quick local tests (Fedora 41, Rust 1.84, the latest version of this project at the moment) - the results are below. I show only binary size changes since it's easier to measure them compared to performance differences in this app.\r\n\r\n* Current Release profile: 115 Mib\r\n* Release + Fat LTO + `codegen-units = 1`: 91 Mib\r\n\r\nThank you.",
      "created_at": "2025-01-13T09:52:18Z",
      "updated_at": "2025-01-13T11:34:22Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AtFeW",
        "body": "> You Fedora example is also great - it shows that LTO is not enabled by default. So as far as I understand, your COPRs for now don't have enabled Fat LTO for the delivered to the users binaries.\r\n\r\nHm. Maybe they missed it? Other settings seem there, like codegen-units = 1 and opt-level = 3.\r\n\r\nHeh, I went to look it up and found your own question: https://discussion.fedoraproject.org/t/link-time-optimization-lto-for-rust-packages-by-default-in-fedora/140086\r\n\r\n> E.g. Debian [request](https://salsa.debian.org/rust-team/rust/-/merge_requests/41) - no recent activity.\r\n\r\nNot sure applications should be responsible for this particular kind of distro issue.\r\n\r\n> For development purposes I can recommend you to add a dedicated [profile.release-dev] where you can enable reasonable amount of optimizations and use this profile during development and testing (in addition to the already existing dev profile). In this scenario, an additional profile will be used by you, and the default Release profile will be used by everyone else. If any user will decide to disable LTO (or any other \"heavy\" thing) - they will be able to opt-out it. So, mainly speaking, it's more about \"opt-in vs opt-out\" choice - I am trying to convince you to use \"opt-out\" approach here :)\r\n\r\nArguably, someone dealing with the niri repo directly is much more likely to do development, so it makes sense to default to development settings (i.e. no super-heavy LTO).\r\n\r\n> However, since the Release profile is used by people (and many maintainers) as a default profile for building the Release binary - enabling better optimizations in the Release profile consequently enables more optimizations to all downstream use cases (where the profile is not overridden ofc): maintainers\r\n\r\nHm, but is it really so? If you look at other widespread build systems like meson, I don't think downstream projects are expected to mess with optimization flags? Distros then set CFLAGS and have their `%meson_build` or `arch-meson` commands with customizations. If they don't yet for cargo, that seems like they just haven't caught up yet?\r\n\r\n> and simple `cargo install` users.\r\n\r\nUsing `cargo install` on a compositor like niri doesn't make much sense, so this one doesn't apply to us."
      },
      "user": {
        "login": "zamazan4ik",
        "avatar_url": "https://avatars.githubusercontent.com/u/7355383?u=e660e0683b9637e93454f3ab385ee71cf65b5194&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adyoc",
      "number": 957,
      "title": "Just installed a new system and can't resize Wezterm",
      "body": "I'm wondering if other are experiencing the same thing.\r\n\r\nI just bought a new laptop and I'm trying to set it up the same way as my old desktop.\r\nI copied over all my old dot files and installed Wezterm and Niri and both are basically using the same configs as the other machine.\r\n\r\nWhen I try to execute any of the two commands\r\n```\r\nMod+f { set-column-width \"-5%\"; }\r\nMod+u { set-column-width \"+5%\"; }\r\n```\r\n\r\nIt works on all windows except Wezterm.\r\n\r\nThis is my Wezterm rule from the Niri config\r\n```\r\nwindow-rule {\r\n    // This regular expression is intentionally made as specific as possible,\r\n    // since this is the default config, and we want no false positives.\r\n    // You can get away with just app-id=\"wezterm\" if you want.\r\n    // The regular expression can match anywhere in the string.\r\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\r\n    default-column-width { }\r\n}\r\n```\r\n\r\nIt looks like there are no keybindings in Wezterm that could take priority from Niri.\r\n\r\n\r\nI find this really strange because it works on the other machine.\r\n\r\nIs it me/my new setup or could it be a bug?\r\n\r\nThank you!",
      "created_at": "2025-01-12T00:40:30Z",
      "updated_at": "2025-01-12T16:58:19Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AtDT9",
        "body": "Hey, it's a WezTerm bug. I described it here in the second paragraph: https://github.com/YaLTeR/niri/wiki/Application-Issues#wezterm You can work around by commenting out `prefer-no-csd`. Also #951 once implemented will work around this (hopefully WezTerm is fixed by then though, there are open PRs)."
      },
      "user": {
        "login": "sommerper",
        "avatar_url": "https://avatars.githubusercontent.com/u/1512048?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adyp-",
      "number": 958,
      "title": "Freeze the screen",
      "body": "I think, the addition of something like `niri msg actioin freeze` to freeze the screen(exit with `Esc`) might be helpful for color picking like stuff.Currently I'm using grim and slurp to pick some colors from a window, but as soon as slurp gets active, the window loses focus and changes some of its colors.",
      "created_at": "2025-01-12T02:26:30Z",
      "updated_at": "2025-01-12T07:35:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "voidstar-null",
        "avatar_url": "https://avatars.githubusercontent.com/u/97352165?u=9284ed0b1e1f71e30306d1672bfc0f045ddf9003&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adqw1",
      "number": 928,
      "title": "Can one name layouts and reuse different layouts for different workspaces?",
      "body": "Hello!\r\n\r\nI am sorry, if I've missed it on the wiki, but can one name a layout and have map different workspaces to different layouts?\r\n\r\nMy usecase is that I want to have a struts with a \"sidebar\" where I have some floating windows now that they have landed on main. I don't want to have that layout on every workspace though.\r\n\r\nSorry again if I've missed it!",
      "created_at": "2025-01-04T14:40:10Z",
      "updated_at": "2025-01-11T11:02:44Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "mogambro",
        "avatar_url": "https://avatars.githubusercontent.com/u/97800396?u=7a91e0ca6350db03d097ff5df07a6b6a4d217663&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adu-Y",
      "number": 945,
      "title": "xdg-autostart runs before spawn-at-startup/xwayland-satellite",
      "body": "Hi,\r\n\r\nI'm having trouble with Remmina in combination with xwayland-satellite and I hope someone can help :-)\r\n\r\nI have Remmina set up to autostart using a .destop file in ~/.config/autostart:\r\n\r\n```\r\n[Desktop Entry]\r\nVersion=1.0\r\nName=Remmina Applet\r\nComment=Connect to remote desktops through the applet menu\r\nIcon=org.remmina.Remmina\r\nExec=remmina -i\r\nTerminal=false\r\nType=Application\r\nHidden=false\r\n```\r\n\r\nAlso I have xwayland-satellite start up in my niri config:\r\n```\r\nspawn-at-startup \"xwayland-satellite\"\r\n```\r\n\r\nBoth commands work (i.e. Remmina and xwayland-satellite are running) but Remmina seems to start before the X Display is available. This means that my keyboard is not working as supposed in RDP sessions and I have to restart Remmina. Writing this I actually just got the idea to just move remmina-startup to my niri config. I'll try this and update again :-)",
      "created_at": "2025-01-07T19:47:36Z",
      "updated_at": "2025-01-11T02:49:12Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4As4Z6",
        "body": "To do this reliably I'm afraid you need to make a systemd service for xwayland-satellite that waits for its startup notification, then order the Remmina service to start after the xwayland-satellite service. \n\nOr I guess just spawn-at-startup with a short sleep via sh -c."
      },
      "user": {
        "login": "JaCoB1123",
        "avatar_url": "https://avatars.githubusercontent.com/u/642504?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adx3o",
      "number": 954,
      "title": "Shortcut overlay functionality",
      "body": "I was wondering if the shortcut overlay was modifiable in some way, I'd like to use it for notes and such, seems convenient. It would generally be cool to make it into a sort of widget system, I can image quite a lot of useful, coherent, integrated widgets to be made. ",
      "created_at": "2025-01-10T17:04:21Z",
      "updated_at": "2025-01-10T18:43:13Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Punff",
        "avatar_url": "https://avatars.githubusercontent.com/u/54313873?u=5d3cae10d5a5bc017f499a4271e41ee532037aed&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adqgt",
      "number": 924,
      "title": "Restrict cursor movements?",
      "body": "Hello! Thanks you for Niri, it's wondeful🥳\n\nA bit of an odd issue to have, my laptop's screen is faulty and having a column of black pixels on the left edge avoids some graphical glitches. I used to solve this by displaying a 1- pixel-wide black bar rainmeter widget (windows) or by shifting the display by one pixel to the right (linux, using xrandr's transform). I've started playing around with Niri and Wayland, and there's no way (as far as I can tell) to offset the display by one pixel.\n\nBut using a 1-pixel-wide waybar on the overlay layer sounds good enough for me! I am just wondering if there is any way to forbid the cursor from entering the waybar area? As it triggers the graphical glitches if it reaches the left edge of the screen. Maybe using the `zwp_pointer_constraints_v1` protocol ? (No idea on the how)\n\nDoes anyone have any idea on what's possible?\n\n",
      "created_at": "2025-01-04T03:56:14Z",
      "updated_at": "2025-01-10T04:19:02Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AswIM",
        "body": "Hello! Hmm, I'm not sure you can restrict the pointer like that. I guess you could patch niri to always draw a solid black column on top of everything though, that will also include fullscreen and lock surfaces, should be relatively straightforward. I can tell where if you're up for it"
      },
      "user": {
        "login": "matthieucx",
        "avatar_url": "https://avatars.githubusercontent.com/u/11246353?u=a08712c616d2a8b7e1803766327a195ea5f20bf2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adq48",
      "number": 929,
      "title": "Eclipse modal windows are shown as new top level windows",
      "body": "I have tried to run Eclipse with Niri. If I try, for example, Ctrl+Shift+T, the new window should appear as modal over Eclipse, but it is displayed alongside. Perhaps Niri does not follow some hints from Java applications?",
      "created_at": "2025-01-04T19:52:28Z",
      "updated_at": "2025-01-09T14:19:17Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AsyRO",
        "body": "So the proper answer here is to use Niri from Git as current release (0.1.10.1) doesn't have floating windows."
      },
      "user": {
        "login": "VaclavC",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdwuT",
      "number": 950,
      "title": "Nvidia + Ubuntu 24.04 + Xwayland",
      "body": "Perhaps it will help somebody. If you have a Nvidia card and Ubuntu 24.04, there is one caveat with Xwayland. Ubuntu 24.04 has Xwayland 23.2.6 which doesn't support explicit sync. If you want flicker free X applications, you need Xwayland 24. It can be simply achieved by downloading Xwayland package from Ubuntu 24.10, extracting it manually and copying Xwaynd binary to /usr/local/bin.\r\n\r\nHopefully Xwayland 24 will make it to backports for Ubuntu 24.04 in the future, this may be used as workaround in the meanwhile.",
      "created_at": "2025-01-09T12:15:14Z",
      "updated_at": "2025-01-09T13:06:56Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "VaclavC",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdvwZ",
      "number": 948,
      "title": "Inspect window layout via IPC",
      "body": "It would be nice to have some API (most likely within Niri IPC) to inspect window layout, such as order of columns on the workspace and windows inside them. It should be pretty easy to implement due to the simplicity of Niri window layout system.\r\n\r\nThis feature will make possible writting good taskbars for Niri with clients in the same order as on the workspace, which is pretty useful feature for scrolling window managers like Niri.",
      "created_at": "2025-01-08T13:49:41Z",
      "updated_at": "2025-01-08T13:51:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "liferooter",
        "avatar_url": "https://avatars.githubusercontent.com/u/54807745?u=7e9fa22203bc3ceeb2b493ff38564ba8932a6d6c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Adu5t",
      "number": 943,
      "title": "Is possible to map something to Mod key tap?",
      "body": "To get launcher behavior similar to Gnome? Currently I can't map anything to sole Mod key, if I'am not doing something wrong, of course.",
      "created_at": "2025-01-07T18:08:45Z",
      "updated_at": "2025-01-07T18:28:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "VaclavC",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdtxQ",
      "number": 939,
      "title": "Window rule matcher for window width/height",
      "body": "I have a (poorly written) application that spawns what are essentially ghetto notifications that I'd like to mark as floating, but they have the same title and app-id as the main window. It would be convenient to be able to match on the window size in this case. Maybe something like:\r\n```\r\nwindow-rule {\r\n    match  app-id=\"BadAppId\" width=\"<200\" height=\"<200\"\r\n    open-floating true\r\n}\r\n``` \r\nOr maybe they should support percentages or something for different DPIs.",
      "created_at": "2025-01-06T17:06:16Z",
      "updated_at": "2025-01-06T17:19:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Supreeeme",
        "avatar_url": "https://avatars.githubusercontent.com/u/7882157?u=00b9be59810b4811d4378441aef703e35eb970ec&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdsX9",
      "number": 935,
      "title": "Focus window on different monitor without cursor jumping around",
      "body": "Hi,\r\n\r\nI am currently playing around with writing a taskbar for niri since I really like having one. So far it is functional with `niri msg action focus-window` but when I focus a window on another workspace my cursor leaves my taskbar and goes to the other screen which is kinda annoying.\r\n\r\nI would really like an option to focus a window without the cursor moving, even when the window is on another output.",
      "created_at": "2025-01-06T00:22:14Z",
      "updated_at": "2025-01-06T11:38:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "prog-r-amer",
        "avatar_url": "https://avatars.githubusercontent.com/u/3518176?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdgNq",
      "number": 891,
      "title": "Feat: Accent colour through GNOME Portal",
      "body": "For a little bit now, we have had a proper accent color API that was implemented in KDE and eventually GNOME\r\n\r\nBecause we use the `xdg-desktop-portal-gnome` we should be able to pass accent colour information using it (as far as I understand) based on a value set in Niri's configuration, think maybe a `accent-color` that then accepts the same (non-gradient) values as the `focus-ring` or `border` do\r\n\r\nOf course GNOME Apps don't accept just any color, from behavior I've seen on KDE it seems to choose the closest GNOME Color, so a megenta-ish color would become GNOME's purple, an ultramarine color would become GNOME's blue, etc\r\n\r\nMaybe also a way to sync the accent with (one of) the `focus-ring` or `border` colors? Not sure how useful that'd be though...\r\n\r\nOh, and to get that out of the way, there is probably a way to do this with dbus that I simply don't know about, just thought proper config for this would be cool :woozy_face: ",
      "created_at": "2024-12-23T05:26:25Z",
      "updated_at": "2025-01-05T22:59:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cyrneko",
        "avatar_url": "https://avatars.githubusercontent.com/u/58338843?u=9ba7494e43d409a979a54c43ef0d0c1bf4a18beb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdrGp",
      "number": 931,
      "title": "Pinned floating windows",
      "body": "Would really appreciate something like Hyprland's `pin` window rule; making the floating window always stay, regardless of workspace switching, or otherwise \"follow\" the current workspace.\r\nThis would be useful for, for instance, picture-in-picture popout windows, letting you still see them while switching workspaces frequently",
      "created_at": "2025-01-05T06:25:00Z",
      "updated_at": "2025-01-05T06:42:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "oatmealine",
        "avatar_url": "https://avatars.githubusercontent.com/u/23474882?u=f0bacc9b24ffbebcb815273bb66bc9071601f94a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdqqH",
      "number": 926,
      "title": "Is possible to have alternate monitor configs and switch between them?",
      "body": "For example one layout with laptop and external monitor enabled and second with only external monitor enabled. Is possible to have them configured both and switch between them by some special key?",
      "created_at": "2025-01-04T10:28:30Z",
      "updated_at": "2025-01-04T17:43:18Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AswZB",
        "body": "You can do it with third-party tools like [kanshi](https://sr.ht/~emersion/kanshi/). But also niri will automatically disable the laptop screen when the lid is closed."
      },
      "user": {
        "login": "VaclavC",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdqqD",
      "number": 925,
      "title": "Is possible to lock a workspace to one monitor and switch workspaces only on another?",
      "body": "Is possible to have one \"fixed\" workspace at one screen (laptop screen in this case) and switch workspace only on external monitor, even if cursor is actually on laptop screen?",
      "created_at": "2025-01-04T10:25:46Z",
      "updated_at": "2025-01-04T10:45:50Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AswY8",
        "body": "The workspace switches on the focused monitor. I guess you could modify the binds to focus the external monitor first, before switching the workspace. I don't think there's an easier way rn."
      },
      "user": {
        "login": "VaclavC",
        "avatar_url": "https://avatars.githubusercontent.com/u/10547969?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdpeC",
      "number": 919,
      "title": "Outer gaps without inner gaps",
      "body": "Hi!\r\n\r\nIs it possible to have outer gaps without any inner gaps? I may not have correctly understood how struts work.",
      "created_at": "2025-01-02T17:40:01Z",
      "updated_at": "2025-01-02T17:47:12Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "GhishNchips",
        "avatar_url": "https://avatars.githubusercontent.com/u/42581623?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdoSC",
      "number": 911,
      "title": "Help on making niri black and white (grayscale) to improve concentration",
      "body": "I have my Xiaomi MIUI phone with a grayscale filter and reading mode enabled, it looks amazing with it's AMOLED screen.\r\n![VID-20241230-WA0006.webm](https://github.com/user-attachments/assets/21e7835a-ab19-44c3-8e84-cf1a2a002361)\r\nMakes my phone less distracting and less appetizing to doomscroll.\r\n\r\nI was wondering if I could replicate a similar look on wayland now that the new Lenovo Legion Go is about to come out in a few months, I've read on [reddit something about shaders on Hyprland](https://www.reddit.com/r/hyprland/comments/1es6xdk/how_to_have_greyscale_in_hyprland/), I recall having seen something about shaders on this [niri github wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Animations). It could be done with the current version? `niri --version` `niri 0.1.10-1 (unknown commit)\r\n`?\r\n\r\nI'm using `Arch Linux` btw that's really important to know.\r\n\r\nBest of wishes to Dev Yalter <3",
      "created_at": "2024-12-31T22:52:00Z",
      "updated_at": "2025-01-02T07:53:30Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AsrYQ",
        "body": "Opened an issue: https://github.com/YaLTeR/niri/issues/913"
      },
      "user": {
        "login": "thepragandsensdiary",
        "avatar_url": "https://avatars.githubusercontent.com/u/182240812?u=a93d9c21c0e0c1ce194c2613e992593cb4cd9355&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdeQA",
      "number": 887,
      "title": "KDL 2.0.0 support",
      "body": "[KDL 2.0.0 has been released!](https://github.com/kdl-org/kdl/releases/tag/2.0.0)\r\n\r\nAlong with this new spec release, I've released [`kdl-rs@6.0.0`](https://github.com/kdl-org/kdl-rs/releases/tag/v6.0.0), which supports both KDL 1.0.0 and KDL 2.0.0, and is able to translate document text between both versions.\r\n\r\nThis means that Niri would not need to move away from `knuffel` to add 2.0 support: by pulling in `kdl-rs` and enabling the `v1-fallback` feature, you can basically do something like this:\r\n\r\n```rust\r\nlet mut doc = kdl::parse(input)?;\r\ndoc.ensure_v1();\r\n\r\nlet config: NiriConfig = knuffel::parse(\"example.kdl\", doc.to_string()).expect(\"This should always succeed because `ensure_v1()` should guarantee a valid v1 doc, if the initial parse succeeded\");\r\n\r\n...continue as usual.\r\n```\r\n\r\nNothing else would have to change about Niri's code unless you want to do your own heuristics around error management/fallbacks.\r\n\r\n`kdl-rs`'s 2.0 parser is able to collect many syntax errors in a single pass, and so can give richer error messages than either the 1.0 parser (for now), or knuffel's parser.\r\n\r\nAlways happy to answer questions! I hope this is useful to y'all!",
      "created_at": "2024-12-22T03:32:57Z",
      "updated_at": "2025-01-02T01:08:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zkat",
        "avatar_url": "https://avatars.githubusercontent.com/u/17535?u=99aea32aa6a8d9953a29c1b7bb9d34c38f864991&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdkHG",
      "number": 900,
      "title": "Workspace descriptions for unnamed workspaces, like what is possible in `i3` with `i3wsr`",
      "body": "I need all help I can get to remember which workspace has which app open.",
      "created_at": "2024-12-27T19:40:23Z",
      "updated_at": "2025-01-01T18:50:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "JohnDowson",
        "avatar_url": "https://avatars.githubusercontent.com/u/40003182?u=ef68b18acd7ad69c688c30b8a19e18b623413e9f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdnTy",
      "number": 907,
      "title": "Ghostty and Niri",
      "body": "Has anyone else tried Ghostty on Niri yet?\r\nI am just checking it out but I can't get its background to become transparent like I have it set up with Alacritty.\r\nI guess Ghostty does things differently with regards to CSD? Any ideas?",
      "created_at": "2024-12-30T12:42:22Z",
      "updated_at": "2024-12-30T12:54:50Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "rodafr",
        "avatar_url": "https://avatars.githubusercontent.com/u/93922866?u=2f9e545b50879b566b481d0d0dda3411c433fb10&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdkfK",
      "number": 902,
      "title": "Fix for Flatpak / Portals Notifications when using `xdg-desktop-portal-gnome`",
      "body": "I noticed that when using the GNOME Portal, Flatpak (and other portal-)notifications would not come through, presumably as the portal was trying to use GNOME Shell which...we don't have\r\n\r\nSo after looking up the correct string to use I've added this to `/usr/share/xdg-desktop-portal/niri-portals.conf`:\r\n```\r\norg.freedesktop.impl.portal.Notification=gtk;\r\n```\r\n\r\nSo, using the generic GTK portal for notifications specifically makes it correctly forward notifications to, for instance, `swaync` or `dunst`\r\n\r\nLeaving this here for anyone else that might need it, might also be interesting to change the default configuration to `gtk,gnome` or something else? :thinking: ",
      "created_at": "2024-12-28T05:24:19Z",
      "updated_at": "2024-12-28T11:27:28Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "cyrneko",
        "avatar_url": "https://avatars.githubusercontent.com/u/58338843?u=9ba7494e43d409a979a54c43ef0d0c1bf4a18beb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdjWj",
      "number": 898,
      "title": "Support for i3status-rust (or rather swaybar)",
      "body": "Ignore what I wrote here, I am an idiot :)",
      "created_at": "2024-12-26T20:46:13Z",
      "updated_at": "2024-12-27T18:17:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "mogambro",
        "avatar_url": "https://avatars.githubusercontent.com/u/97800396?u=7a91e0ca6350db03d097ff5df07a6b6a4d217663&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdfJg",
      "number": 890,
      "title": "ISO_LEVEL5_Shift also works",
      "body": "I know we've discussed this possibility in the past, but it came down to modifying your input library. The Wiki doesn't mention ISO_LEVEL5_Shift, but now it works. Maybe the library changed and this was missed in the documentation?\r\n\r\nEither way it makes me estactic since I have it mapped to right-control. I didn't see a way to change the page.",
      "created_at": "2024-12-22T18:32:30Z",
      "updated_at": "2024-12-23T17:03:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "morenathan",
        "avatar_url": "https://avatars.githubusercontent.com/u/98691858?u=303cae5d64147a6376a3ebc2f37f5269a7e0ee8d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdXLb",
      "number": 875,
      "title": "Option to omit empty workspaces on ends from bar unless focused",
      "body": "I'm not sure if the handling for this would be in the IPC or within the Waybar module, but being able to set things up such that empty workspaces on the ends of the set are only shown if focused would be a great look-and-feel tweak. Bonus points if said mode numbers `empty-workspace-above-first` as 0 until a window is opened there.",
      "created_at": "2024-12-16T21:53:12Z",
      "updated_at": "2024-12-23T05:37:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zetaPRIME",
        "avatar_url": "https://avatars.githubusercontent.com/u/6675194?u=1ef93e5dff6c7e2be413230d1aa28525254185b3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdZYy",
      "number": 878,
      "title": "Compose on alt keys with Kanata",
      "body": "I have a setup where I use [kanata](https://github.com/jtroo/kanata) to remap some keys, including to get compose when tapping either alt key.  I've used this setup successfully under both Sway and Hyprland, but with niri the alt keys always emits alt.\r\n\r\nThe other parts of the configuration work as expected, e.g. esc on tapping CAPS, and arrows on hjkl while holding CAPS.\r\n\r\nIs there something niri does that would explain this, and is it possible to configure it to not do it?\r\n\r\nMy full config for kanata:\r\n\r\n```\r\n(defcfg\r\n  linux-dev /dev/input/by-path/platform-i8042-serio-0-event-kbd\r\n  process-unmapped-keys yes\r\n)\r\n\r\n(defsrc\r\n  esc\r\n                                                                 p     lbrc\r\n  caps                            h     j       k        l       scln  apo\r\n  lmet  lalt                   ralt   rctrl    lft\r\n)\r\n\r\n(deflayer default\r\n  caps\r\n                                                                 _     _\r\n  @esc                            _     _       _        _       _     _\r\n  _     @comp                  @comp  lmet     rctrl\r\n)\r\n\r\n(deflayer navigation\r\n  _\r\n                                                                 pgup  home\r\n  _                               left  down    up       rght    pgdn  end\r\n  _      _                     _      _        _\r\n)\r\n\r\n(defalias\r\n  esc (tap-hold-press 150 150 esc (layer-toggle navigation))\r\n  comp (tap-hold-press 100 100 ralt lalt)\r\n  )\r\n```",
      "created_at": "2024-12-18T07:49:55Z",
      "updated_at": "2024-12-20T08:23:58Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "magthe",
        "avatar_url": "https://avatars.githubusercontent.com/u/327270?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdY4o",
      "number": 877,
      "title": "Debugging random crashes & hard reboots",
      "body": "I have had many days of rock solid performance using niri but sometimes, the screens go black straight to a restart of the whole system. \r\n\r\nI'm using NIxOS and am not sure how to capture what happened and where to look to see if there's any dump that could aid in knowing what in my computer would do this.\r\n\r\nWhat should I enable or where do I look for logs that could give me a clue to what is causing this.\r\n\r\nI'm also planning to start developing and tinkering with Niri to contribute fixes or enhancements. For that case I've seen others run Niri in Niri  as a way to do testing...and that seems to be good for that case...but perhaps we should document how one would capture the logs for Niri's root instance. ",
      "created_at": "2024-12-18T00:23:38Z",
      "updated_at": "2024-12-19T18:28:28Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AsQXS",
        "body": "Well, niri certainly never reboots the whole system. In any case, you could try the last boot's journal with `journalctl -b -1`"
      },
      "user": {
        "login": "mastoca",
        "avatar_url": "https://avatars.githubusercontent.com/u/121066551?u=1a690cc72327145b54b31c96c614d2b87c713d33&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ac1Wy",
      "number": 832,
      "title": "More acturate touchpad horizontal swipe gesture",
      "body": "I've been using niri for a while and have noticed that I cannot easily focus a window by swiping.\r\n\r\nIf I have three windows in a workspace and want to swipe from the first one to the second one, I have to swipe very carefully and avoid swiping too fast or too much distance, or I would skip over the second one and eventually focus the third one.\r\n\r\nThe swipe gesture now moves windows responsively, like what paperwm does, but there's no indicators telling me which window will be focused on fingers released. And windows don't stay where they are when releasing fingers, instead they snap to screen edges.\r\n\r\nFor this reason, I don't think it necessary to responsively move windows during swiping, we only need to move the \"focus ring\" to the correct window, indicating that the window would be focused, like what hyprscroller does.\r\n\r\nOr if we prefer moving windows responsively during swiping, we'd better also responsively indicate the focus ring to the correct window, and let windows stay where they are when swiping ends.",
      "created_at": "2024-11-26T12:42:50Z",
      "updated_at": "2024-12-18T20:38:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "lost-melody",
        "avatar_url": "https://avatars.githubusercontent.com/u/32810294?u=9a2ab36da66a03b7f8377d8a7b717a136d061e33&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdXK8",
      "number": 874,
      "title": "Center-when-focused override as a window rule; never-center-at-ends flag",
      "body": "Former should be fairly self-explanatory.\r\n\r\nAs for the latter, having the option for make it so that columns at either end of the flow won't center themselves automatically (unless they're alone on the workspace) would be a nice feel upgrade, especially if you can also override it per-window-rule.\r\n\r\nRe: conflicting window rules within the same column, I would suggest having later definitions take precedence the same as happens for individual windows?",
      "created_at": "2024-12-16T21:45:33Z",
      "updated_at": "2024-12-17T06:10:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zetaPRIME",
        "avatar_url": "https://avatars.githubusercontent.com/u/6675194?u=1ef93e5dff6c7e2be413230d1aa28525254185b3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdTLj",
      "number": 868,
      "title": "Interactive resize in between windows (changing the ratio of two windows)",
      "body": "It'd be really nice to have interactive resizing have an option to, instead of just changing the width of the window you're targetting, also change the width of the window next to it, the same way that resizing windows vertically works inside a column.\r\n\r\nImagine you have two windows open, tiled to 1/3 and 2/3rds of the screen respectively. Now you want to see a bit more the left window, so you grab the right side of the window and drag it rightwards. Now the right window is moved outside of the viewport, which is rarely desired.\r\n\r\nMy proposal would be to have a hitbox _in between_ windows that makes it such that interactive affects both windows equally, changing the ratio of them.\r\n\r\nThis hitbox should optimally have a configurable width that takes precedence over the current resize behavior hitbox for dragging from the side of a window -- that'd allow people to have this \"grab-inbetween-windows\" resize even if they have no gaps in the window.\r\n![image](https://github.com/user-attachments/assets/32fa5316-d003-4b6d-b023-fecd098caa84)\r\n",
      "created_at": "2024-12-14T15:29:00Z",
      "updated_at": "2024-12-15T05:03:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "elkowar",
        "avatar_url": "https://avatars.githubusercontent.com/u/5300871?u=12d6338537eafc715032719236ac2842582a8118&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdRBz",
      "number": 866,
      "title": "Grouped outputs support",
      "body": "# Environment\r\n\r\nI have setups: home office with single ultrawide screen and employer office with two equivalent 2k monitors placed side-by-side.\r\n\r\n# Problem\r\n\r\nI organised my work at home with stacked one-above-one workspaces with wide sliding window of output. But at work I have to use two independent stacks of workspaces, which is not very comfortable for me.\r\n\r\n# Solution\r\n\r\nI am thinking on creation the groups of outputs. Each group - is virtual output, with rectangle `((x0,y0),(x1,y1))`, where `(x0,y0)` - is top left corner of top left physical output, and `(x1,y1)` - is bottom right corner of bottom right output. \r\n\r\nEach workspaces now attaches to this virtual outputs (groups) instead of physical one. By default each physical output will be place to its own unique group.\r\n\r\n## Configuration\r\n\r\n### Output\r\n\r\nI suggest to add new field to output section\r\n\r\n```kdl\r\n\r\noutput \"eDP-1\" {\r\n// ...\r\n    group \"AllMonitors\"\r\n// ...\r\n}\r\n```\r\n\r\nThis option will output `eDP-1` to group `AllMonitors`.\r\n\r\n### Group\r\n\r\nI suggest to add new section of type `group`, to allow user to configure their groups. There can be no such section for configured in `output` groups - in such case, the defaults will be applied.\r\n\r\n```kdl\r\n\r\ngroup \"AllMonitors\" {\r\n\r\n    // How columns will synchronize their borders. Available values:\r\n    //    * fit-current-physical - columns borders will be placed and calculated according to borders of current physical output\r\n    //    * fit-maximum - columns borders will be placed and calculated according to full virtual output\r\n    //    * fit-maximum - columns borders will be placed and calculated according to intersection of verticals of physical output\r\n   column-fit \"fit-current-physical\"\r\n\r\n    // How windows will synchronize their borders. Available values:\r\n    //    * fit-current-physical - windows vertical borders will be placed and calculated according to borders of current physical output\r\n    //    * fit-maximum - windows vertical borders will be placed and calculated according to full virtual output\r\n    //    * fit-minimum - windows vertical borders will be placed and calculated according to intersection of verticals of physical output\r\n   window-fit \"fit-current-physical\"\r\n}\r\n\r\n```\r\n\r\n# Notes\r\n\r\nThis is will resolve #810",
      "created_at": "2024-12-13T11:22:52Z",
      "updated_at": "2024-12-13T12:18:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ein-shved",
        "avatar_url": "https://avatars.githubusercontent.com/u/3513222?u=431a89318f0563bf4d4912f4fe5a004736897878&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdPCn",
      "number": 862,
      "title": "Detect when a output interface has been disconnected",
      "body": "Hi,\r\n\r\nI successfuly setup a working solution that allows me to [setup my outputs configuration (internal/external/extended)](https://github.com/YaLTeR/niri/discussions/724#discussioncomment-11542061). However, I often unplug the HDMI cable of my laptop while it is in docked mode, and as far as I can tell there is no way in `niri` directly to detect when that happens so that I can revert back to the internal display. Currently, when I unplug the cable, no output is displayed and there is nothing I can do without rebooting the laptop.\r\n\r\nThis is what happens when I unplugin the cable:\r\n```json\r\n{\"WorkspacesChanged\":{\"workspaces\":[{\"id\":1,\"idx\":1,\"name\":\"coding\",\"output\":null,\"is_active\":false,\"is_focused\":false,\"active_window_id\":3},{\"id\":2,\"idx\":2,\"name\":\"browsing\",\"output\":null,\"is_active\":false,\"is_focused\":false,\"active_window_id\":5},{\"id\":3,\"idx\":3,\"name\":\"gaming\",\"output\":null,\"is_active\":false,\"is_focused\":false,\"active_window_id\":null}]}}\r\n```\r\n\r\nAll `output` are set to `null` which indicated that no `output` is available atm. I can work around so that I can listen to the event and enable `eDP-1` again. However, it is a side-channel and not a dedicated channel to get the event I am looking for.\r\n\r\nThis led me to:\r\n1. Would it make sense niri exposing events when `outputs` are connected/disconnected (at minimum)? I can run that on the background.\r\n2. Or.. to avoid extra scripting, exposing a configuration that prompts `niri` to keep at least one `output` enabled if the current ones are disconnected. I noticed that niri does not safeguard against that when setting one to `off` which I think is reasonable by design.\r\n3. Or...would it make sense for niri to have the notion of profiles similar to how `keishin` or similar tools ([`shikane`](https://github.com/hw0lff/shikane)). I ask this as I am unsure if my configuration should be mirrored on both `niri` or keishin/shikane configuration. I tried `keishin` but I found it unreliable but I don't have concrete proof.  I will try shikane in the mean-time. It is likely out-of-scope for niri but feels worthwhile asking given that it is very common use-case.\r\n\r\nRelates but not the same thing as:\r\n- https://github.com/YaLTeR/niri/discussions/834",
      "created_at": "2024-12-12T10:36:26Z",
      "updated_at": "2024-12-16T19:16:38Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "bphenriques",
        "avatar_url": "https://avatars.githubusercontent.com/u/4727729?u=902e82f8f52481fffdd804d4424f274c16d196e6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdN1Z",
      "number": 859,
      "title": "First window in workspace opens maximized",
      "body": "Hi! Is it currently possible to make it so that opening a window in an empty workspace opens it maximized while any following windows obey the default rules?",
      "created_at": "2024-12-11T15:46:45Z",
      "updated_at": "2024-12-11T16:04:27Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "GhishNchips",
        "avatar_url": "https://avatars.githubusercontent.com/u/42581623?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AdIqZ",
      "number": 852,
      "title": "Open Launcher in Tiled Mode",
      "body": "Is it possible to run app launcher in tiled mode instead of popup?\r\n\r\n![image](https://github.com/user-attachments/assets/e2dd8b71-f42e-4f64-a9f3-27229c797cf1)\r\n",
      "created_at": "2024-12-09T02:20:21Z",
      "updated_at": "2024-12-09T12:51:41Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ar4sw",
        "body": "If the launcher can open as a normal window, rather than layer-shell, then that will do the trick. Otherwise no, layer-shell surfaces are not part of the normal layout."
      },
      "user": {
        "login": "alliqmahbuby",
        "avatar_url": "https://avatars.githubusercontent.com/u/171209370?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ac96e",
      "number": 839,
      "title": "Toggle centered-column layout on and off (centered-2-columns??)",
      "body": "My workflow mostly involves working with full-screen (or almost fullscreen) windows by default. \r\nI use `center-focused-column \"always\"` but I have problems whenever I want to see two windows side to side. \r\n\r\nI propose a way to toggle \"center-focused-column\" on and off - or maybe even a way to focus 2 columns at a time (side by side view, where the columns align to the center instead of the left border of the screen). ",
      "created_at": "2024-12-02T01:58:49Z",
      "updated_at": "2024-12-06T09:35:02Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "druskus20",
        "avatar_url": "https://avatars.githubusercontent.com/u/43417195?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ac30Z",
      "number": 836,
      "title": "switch-preset-column-width but backwards",
      "body": "As far as I can tell, the `switch-preset-column-width` and `switch-preset-window-height` actions can only cycle forwards through presets. I have a decent number of presets configured, so it would be nice to have a second keybind to cycle backwards through them to access the one I want quicker.",
      "created_at": "2024-11-28T03:10:30Z",
      "updated_at": "2024-11-28T12:28:51Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "arm32x",
        "avatar_url": "https://avatars.githubusercontent.com/u/15364665?u=8c1d0e47d91fc4eb0be4735137f4099a71864b63&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ac186",
      "number": 834,
      "title": "Layout selector for output?",
      "body": "Hello! First of all, thank you for this amazing WM!\r\n\r\nI'm using niri on a laptop, but I'm also planning to get one of these ultra-wide screens.\r\n\r\n```\r\n    preset-column-widths {\r\n        // Proportion sets the width as a fraction of the output width, taking gaps into account.\r\n        // For example, you can perfectly fit four windows sized \"proportion 0.25\" on an output.\r\n        // The default preset widths are 1/3, 1/2 and 2/3 of the output.\r\n        proportion 0.33333\r\n        proportion 0.5\r\n        proportion 0.66667\r\n\r\n        // Fixed sets the width in logical pixels exactly.\r\n        // fixed 1920\r\n    }\r\n```\r\n\r\nI'm assuming that layout config for a 16:9 screen (see above) won't fit nicely into 21:9 dimensions. Screens with more square-like aspect ratios may prefer `center-focused-column \"never\"`, while aspect ratios that resemble a stretched-out rectangle would probably benefit from `always`; there may be more examples like this where a globally defined layout may not be the best way to organize windows between drastically different outputs.\r\n\r\nOne way to handle these cases would be to create some sort mapping between layouts and outputs, and then let windows / columns that are created / moved-to the output behave according to the output's layout. Let me know what you think, thanks!",
      "created_at": "2024-11-26T20:18:54Z",
      "updated_at": "2024-11-26T20:38:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "gman0",
        "avatar_url": "https://avatars.githubusercontent.com/u/1104680?u=756b51a552b19deea92b35f4b03475b627318087&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ac19d",
      "number": 835,
      "title": "Add stack/deck mode for column",
      "body": "Here is an idea:\r\nin case 2+ windows in column be able to switch mode to deck (dwm, qtile) aka stack (i3) where the top (or last focused window) are visible at full height. Its better to have separate color/border thicknes for such deck/stack. Keyboard shortcut with arrow up/down should  rise windows under top window. \r\nuseful for terminals, file managers, chat programs, ie arranged by type.  \r\n",
      "created_at": "2024-11-26T20:25:57Z",
      "updated_at": "2024-11-26T20:29:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ZabejAga",
        "avatar_url": "https://avatars.githubusercontent.com/u/81612608?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcXVU",
      "number": 784,
      "title": "Unable to screenshare in Niri",
      "body": "I wasn't aware that niri did not have screensharing built in and just installed xdg-desktop-portal-gnome and rebooted my system but the service fails with \r\n` Dependency failed for Portal service (GNOME implementation).`\r\nAlso I was running the cmd niri when entering through greetd-tuigreet but have changed it to `niri --session`.\r\nAre there any troubleshooting steps that I should go through?",
      "created_at": "2024-11-06T16:16:15Z",
      "updated_at": "2025-06-27T17:08:57Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "ConsularParadi",
        "avatar_url": "https://avatars.githubusercontent.com/u/79075392?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcxGH",
      "number": 827,
      "title": "question about the behaviour of DebugConfig::render_drm_device",
      "body": "hi, i'm new to rust. please forgive my ignorance. I was reading the code, trying to figure out how niri chooses the primary GPU by default unless explicitly specified. then I stumbled across this line: https://github.com/YaLTeR/niri/blob/9c7e8d04d27d2f914ad3e9a54c64b64c34aea4d4/niri-config/src/lib.rs#L3544\r\n\r\nThis suggests it may default to /dev/dri/renderD129 (maybe to prioritize using dgpu on laptops??) and then... perhaps fallback to another device, since not every machines has dual gpu. Is my assumption correct? I want to do the opposite: default to `/dev/dri/renderD128` (amd dgpu), then fall back to nvidia dgpu if it's not available (due to being allocated to a VM guest). I just didn't want to write 700 lines of Nix code to set up automated macOS vm installation, only to later find out this approach isn't possible😸 hopefully explicitly setting `render-drm-device` also let fallback",
      "created_at": "2024-11-24T06:29:08Z",
      "updated_at": "2024-11-24T18:09:16Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4ArV0h",
        "body": "Hey, that line is from a test. You can see above in a big string where I set that option to that value for the test: https://github.com/YaLTeR/niri/blob/9c7e8d04d27d2f914ad3e9a54c64b64c34aea4d4/niri-config/src/lib.rs#L3152\r\n\r\nThe setting defaults to `None` (unset), which causes niri to try to get the primary (boot) GPU from udev: https://github.com/YaLTeR/niri/blob/9c7e8d04d27d2f914ad3e9a54c64b64c34aea4d4/src/backend/tty.rs#L253-L272\r\n\r\nOn Asahi (and KMSRO in general) this logic doesn't always work (which could be improved but I don't have any such devices), so you can override it manually in the config if you need."
      },
      "user": {
        "login": "nyawox",
        "avatar_url": "https://avatars.githubusercontent.com/u/93813719?u=1f03718f8c2a86c5c8bb5ec82d8c4905d2b8f6f7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcrVh",
      "number": 819,
      "title": "Easy way to add niri to GDM on NixOS",
      "body": "Hey all ! First of all - niri is awesome! I've installed NixOS 24.05 stable from minimal ISO, then install GNOME by adding it in configuration.nix, then install 0.1.10-1 niri by root by `nix-env --install niri` from unstable nixpkgs. I'm new in nix, how to force niri to be shown in GDM menu ? (flakes enabled, without GUI nix build (by flake from master) and run ./result/.. has no effect - Permission denied ). I think some nix configuration. On debian 12  \"niri --session\" was be enough to start niri from pure terminal after boot in multi-user.target non graphical mode (systemctl set-default multi-user.target)",
      "created_at": "2024-11-20T04:36:42Z",
      "updated_at": "2024-11-20T16:59:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "technologicalsingularity",
        "avatar_url": "https://avatars.githubusercontent.com/u/186817624?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcpEY",
      "number": 814,
      "title": "Sroll even when the cursor is hidden",
      "body": "Since https://github.com/YaLTeR/niri/pull/797 the cursor is unhidden on the first scroll wheel input and the window is only scrolled when another scroll wheel input with the unhidden cursor is given.\r\n\r\nI would like the window to be scrolled immediately, also when the cursor is currently hidden. This is how `hyprland` behaves if i remember correctly (i'm not sure if it even unhides the cursor if you don't move it) and i find this to be more convenient. If this is a contentious viewpoint, then it could be made an option in the configuration.",
      "created_at": "2024-11-18T20:56:14Z",
      "updated_at": "2024-11-19T16:54:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Schweber",
        "avatar_url": "https://avatars.githubusercontent.com/u/64630479?u=d3a79244cac2fc22782dfe29dde79e9637b61ee7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aclv8",
      "number": 809,
      "title": "Per-window struts",
      "body": "I keep thinking it would be nice to be able to have different struts for my two monitors.\r\n\r\nUse case: I have a vertical status bar on one of my windows, but not both (just the secondary window, so I can use the full space of the primary window). Niri handles the status bar fine, and reduces the available screen width. My status bar design mimics that of a regular window, so it is floating with a margin around it, so I can see windows that scroll behind it.\r\n\r\nHowever, I also use left/right struts, in order to peek at neighboring windows. This works great everywhere _except_ next to the vertical bar. The gap that was a nice width for the edge of the screen looks much too wide between the current window and the status bar. It would be nice to adjust the left strut to be smaller, just for that monitor, to fit in better.\r\n",
      "created_at": "2024-11-16T19:42:18Z",
      "updated_at": "2024-11-19T15:21:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Nairou",
        "avatar_url": "https://avatars.githubusercontent.com/u/942190?u=fce8347b1eb6c8a9d1dee0459164949d026bf5dd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aclwd",
      "number": 810,
      "title": "Poor man's \"combined row\" across multiple monitors",
      "body": "I have been using two small Full HD monitors for some time side to side. The current workflow I understand / usage is more optimized for bigger / wider displays.\r\n\r\nKinda like  (image from internet search)\r\n![image](https://github.com/user-attachments/assets/46e228c1-4c50-44b5-9c49-5c2d7d79a33f)\r\n\r\n\r\n**Is there a way to make these outputs \"virtual\" and combine them as one \"row / swimlane\"?**\r\n\r\nThis probably requires some change in the behaviour of where \"columns edges\" are placed.\r\n\r\nI will try to explain \"intuitive behaviour according to me\":\r\n\r\n- Notation:\r\n  - Monitor boundary - `|`\r\n  - \"Combined monitor edges\" i.e. outside visible space '<|, |>`\r\n  - Column: `_/aaaa/b/c`, current column is in capital letters\r\n- Examples:\r\n  -  Simple example:\r\n     - `<|aaB|c__|>` : Three columns: `66%, 33%, 33%` fitting in the two monitors, B active\r\n     - Shift Window Right\r\n     - `<|aab|C__|>` C gets highlighted columns dont move\r\n  - \"Monitor edge\" example:\r\n    - `<|aab|bCC|>d`\r\n    - Shift window left\r\n    - `a<|aBB|ccd|>`\r\n      - Left selects the left window and if the wiindow is spread across two monitors tries to fit it in the left of the two monitors\r\n      - The current column is fully on one monitor\r\n      - The column that we moved is also fully on one monitor and visible\r\n      \r\nSimilar behaviour can maybe be implemented for scrollable workspaces across vertical stacks of monitors?",
      "created_at": "2024-11-16T19:58:41Z",
      "updated_at": "2024-11-19T05:24:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "meghprkh",
        "avatar_url": "https://avatars.githubusercontent.com/u/5979605?u=bc038884b0df0c9d68c0ae19a5e2e2c7c07ad8f9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcoD1",
      "number": 813,
      "title": "Enhance touchpad button remapping to support custom combinations",
      "body": "I would like to request an enhancement to the touchpad button remapping feature.\r\n\r\n**Current Situation:**\r\nCurrently, the `tap-button-map` setting allows for configuring individual buttons, but it does not support remapping to custom combinations like `left-left-left`. Currently it only support `left-middle-right` and `right-middle-left` \r\n\r\n**Requested Feature:**\r\nExtend the `tap-button-map` configuration to support custom button combinations. This would allow users to define mappings as their preferences.\r\n\r\n**Use Case:**\r\nThis feature would be useful for users who want to use all of the touchpad as a left button click.\r\n\r\n\r\nThank you for considering this feature request. Your work on Niri is highly appreciated!",
      "created_at": "2024-11-18T06:50:07Z",
      "updated_at": "2024-11-18T19:07:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Paul-Eau",
        "avatar_url": "https://avatars.githubusercontent.com/u/52856465?u=72317359a3acdf6d87179a24574debff8aabbea9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcnMw",
      "number": 812,
      "title": "Actions to take one or multiple windows and move them",
      "body": "Hello, this is a feature that I quite like in paperwm. It allows you to take one or multiple windows and either move all of them at once, or you can dispose them how you like.\r\n\r\nHere is a demo: https://private-user-images.githubusercontent.com/30424662/318035381-f736adea-d5ba-4c9d-aca0-2f63322c08cb.mp4?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE4ODE3NzYsIm5iZiI6MTczMTg4MTQ3NiwicGF0aCI6Ii8zMDQyNDY2Mi8zMTgwMzUzODEtZjczNmFkZWEtZDViYS00YzlkLWFjYTAtMmY2MzMyMmMwOGNiLm1wND9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDExMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQxMTE3VDIyMTExNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY4YTQ4NjQ3NjQ2ZmRlMzllN2MwNGFmYzQ4OGZhZTIwYTVhNTM1MmE1ZDIwMmVkZGNhZjY3NjM1MTVjOTZjNDcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.-bHpTn56oN9qMkq1nFeR9tnA0d048ghngQYNXwtSbFQ\r\n\r\nIs there something like this in niri?",
      "created_at": "2024-11-17T22:13:55Z",
      "updated_at": "2024-11-18T15:15:19Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4ArEdX",
        "body": "No particular plan. I haven't used it much myself. There are also multiple designs possible: like in paper, or maybe with some window selection."
      },
      "user": {
        "login": "babariviere",
        "avatar_url": "https://avatars.githubusercontent.com/u/12128029?u=6b118d9335fee602a39079b049a5183f121ed11f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbpSH",
      "number": 691,
      "title": "When named workspaces are defined, don't dynamically create an un-named workspace automatically after the named workspaces",
      "body": "When named workspaces are defined, it would be nice to not have a un-named workspace automatically/dynamically created after the named workspaces.\r\n\r\nHowever, if I move past the last named workspace (e.g. `focus-workspace-down` or `focus window <index>`) it would be nice for an un-named workspace to be created at the end.\r\n\r\nThe context is that when I'm using named workspaces, I usually don't need additional un-named workspaces.\r\n",
      "created_at": "2024-09-28T03:13:05Z",
      "updated_at": "2024-11-14T13:11:22Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "mexisme",
        "avatar_url": "https://avatars.githubusercontent.com/u/329349?u=4d103465628e172296eacbfe457d696325f828a8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZMG4",
      "number": 327,
      "title": "Dynamic display output configuration",
      "body": "I use a portable computer with a built in screen and when I plug in my dock or external monitor I'd like to have the built in monitor go off.\r\n\r\nSome stuff I'm unsure of:\r\n\r\nWhen the dock gets disconnected the windows on it seem to be \"lost\" but still in memory and show back up only when I re-dock. Feels like it'd be good to have orphaned windows moved to the active workspace on the first remaining monitor.\r\n\r\nIt feels like there could be an opportunity for setting conditional output configs like \"if both these displays exist, here's the per output rules\".\r\n\r\nIn the meantime I'll see if I can set up script to modify the config dynamically when detecting a new monitor.",
      "created_at": "2024-05-03T23:16:06Z",
      "updated_at": "2024-11-14T11:28:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "RangerMauve",
        "avatar_url": "https://avatars.githubusercontent.com/u/911495?u=c805f6453c9706f0768ee182ecaf78743bcf26a6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Acidx",
      "number": 803,
      "title": "Spanning of one `desktop instance` across multiple screens.",
      "body": "first off, sorry if this is a duplicate or this is possible already - but i didn't find anything regarding this.\r\n\r\nI've been wanting to run niri as a daily driver, but I'm missing a way to Span the view across multiple screens to have\r\n my 2 monitors to act as one big monitor, this way i could fully utilize the \"scrolling\" part of niri without having to deal with multiple screens and independent Work spaces for each monitor. This would allow for an easier way to create a multi desktop workspace for my tasks which i could switch to and from more easily.\r\n\r\nEspecially with horizontal Work spaces, I could have Firefox and discord on one, and vs code + terminals on the other for example.\r\n\r\nSimply shifting your views to the sides but still having them in view would work well with multiple monitors.\r\n",
      "created_at": "2024-11-14T08:09:20Z",
      "updated_at": "2024-11-14T10:12:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "BlaiZephyr",
        "avatar_url": "https://avatars.githubusercontent.com/u/101197249?u=1f2e1bd4cf0277ace4bdcb9ca532ceee40274de0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AciF2",
      "number": 802,
      "title": "Round corner borders without anti-aliasing",
      "body": "It will help bitmap-font centric rices go well with niri.",
      "created_at": "2024-11-14T01:30:51Z",
      "updated_at": "2024-11-14T06:03:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "asdfer-1234",
        "avatar_url": "https://avatars.githubusercontent.com/u/58357836?u=e3a568fbb355d538e1687d010f2391282171d73a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcbNR",
      "number": 793,
      "title": "v0.1.10",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nHere are the improvements from the last release.\r\n\r\n## Interactive window moving\r\n\r\nWhile not full-blown floating window support quite yet, this is an important step towards that. You can now move windows by dragging them by title bars, or anywhere while holding <kbd>Mod</kbd>.\r\n\r\nhttps://github.com/user-attachments/assets/b0c36fc3-d4ca-459b-819b-fc7ee223a3d7\r\n\r\nTo prevent accidental layout changes, the windows rubber-band a little before you drag them out.\r\n\r\nhttps://github.com/user-attachments/assets/7c50c95b-56fe-4d21-b659-ad8cd7f4fad7\r\n\r\nFurthermore, I made both interactive moving and resizing work on a touchscreen.\r\n\r\nhttps://github.com/user-attachments/assets/275f27fd-8c26-40a9-82c9-0cd975a96688\r\n\r\nThanks to @Pajn for implementing a fairly complete proof-of-concept of this feature!\r\n\r\n## Locked pointer location hint\r\n\r\n@sodiboo implemented the pointer location hint request. Apps like Blender use it to tell the compositor the final location after a locked pointer movement so that the compositor can update its own pointer location to match it.\r\n\r\nhttps://github.com/user-attachments/assets/76e92efb-7c93-4b1f-876e-fbc61912f7ea\r\n\r\n## Laptop lid and tablet mode switch bindings\r\n\r\nThanks to @cmeissl, you can now bind commands to laptop lid opening/closing and tablet mode switching. You can use this to automatically enable an on-screen keyboard when a convertible laptop enters tablet mode. See the [switch events wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Switch-Events) for more information and examples.\r\n\r\nAdditionally, I implemented disabling of the internal laptop monitor when closing the lid. So your workspaces will automatically move to the external screen. If for some reason this breaks for you, set the new `keep-laptop-panel-on-when-lid-is-closed` [debug config](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options) flag.\r\n\r\n## Pointer hiding\r\n\r\n@yzy-1 implemented new cursor hiding options: hide when typing (on any key press), and hide after a set inactivity period. See [the wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#hide-when-typing) for more details.\r\n\r\n```kdl\r\ncursor {\r\n    hide-when-typing\r\n\r\n    // Or, after a timeout:\r\n    // hide-after-inactive-ms 1000\r\n}\r\n```\r\n\r\nTo complement this, there are a few improvements to the hidden pointer behavior. The pointer will now show up on mouse button press, and on the contrary, it will stay hidden on programmatic and keyboard-triggered movement, like focusing a different monitor, or when using `warp-mouse-to-focus`.\r\n\r\n## Input configuration improvements\r\n\r\nThanks to @tazjin, @chillinbythetree and @elipp for:\r\n\r\n- Adding a `trackball` input config section.\r\n- Adding a `scroll-button` setting to mice, touchpads, trackpoints, and trackballs.\r\n- Adding a `scroll-factor` setting to mice and touchpads that you can use to speed up or slow down scrolling.\r\n\r\nSee the [input config wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#pointing-devices) for more information.\r\n\r\n## Other improvements in this release\r\n\r\n- Tablet input no longer follows the monitor rotation: you need to rotate your graphics tablet together with your monitor. This makes convertible laptops work properly; this is also how input works on other desktop environments. Thanks @cmeissl.\r\n- The GTK Access portal is now explicitly set in `niri-portals.conf`, which makes it work. It is required for applications requesting PipeWire webcam and microphone access, such as the Firefox package on Fedora 41. Thanks @cmeissl.\r\n- The `niri-ipc` crate is now [published to crates.io](https://crates.io/crates/niri-ipc).\r\n- Active workspace is now preserved across monitor disconnects and reconnects.\r\n- Added a window `--id` argument to `niri msg action consume-or-expel-window-left/right` and to the IPC.\r\n- Added an explicit `power-on-monitors` action that can be useful with certain hardware. Niri still automatically powers on monitors on any input event.\r\n- Added support for running niri as a dinit service: files in `resources/dinit/` and corresponding code in `niri-session` (thanks @markK24).\r\n- Added a `disable-monitor-names` [debug config](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options) flag as a workaround for niri crashing when plugging in two monitors reporting the exact same make/model/serial. This issue is tracked in #734.\r\n- The focused window will now become visually inactive when a layer-shell app in front has keyboard focus.\r\n- Fixed `focus-window-up-or-column-right` focusing left instead of right.\r\n- Fixed an animation jump when expelling a narrower window from a column with uneven window widths.\r\n- Fixed the logind power key inhibit file descriptor leaking into processes spawned by niri.\r\n- Fixed window close view position restoration triggering for windows that didn't get focused upon opening.\r\n- Fixed a crash when an output disappears immediately after connecting.\r\n- Fixed used xdg-activation token memory leak.\r\n- Fixed lock screen clients hanging until a monitor is enabled when no monitors are enabled.\r\n- Updated Smithay:\r\n    - Fixed memory leak when locking the screen.\r\n    - Fixed occasional visual freezing of GTK and other apps.\r\n    - Fixed a regression that made it so increasing the output scale in niri v0.1.9 didn't propagate to some clients, keeping them blurry.\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.10'>v0.1.10</a>.</em>",
      "created_at": "2024-11-09T16:06:10Z",
      "updated_at": "2024-11-13T20:26:16Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbVj3",
      "number": 662,
      "title": "Expel from bottom of column",
      "body": "I like the consume/expel functionality. I can, for example, have a large height editor above a small height shell where I run commands related to what I edit.\r\n\r\nHowever, I find the two commands a bit asymmetric. To me, consume feels like a column operation, and expel feels like a window operation. I will try to explain what I mean. When I consume a window, it is the selected column that consumes an extra window. It is not the selected window that is consumed into a column. It feels like a operation on the column. When I expel a window, it is the selected window that is expelled from the column. It is not the selected column that gets a window expelled. It feels like an operation on the window.\r\n\r\nI would like expel to expel the bottom window from the column. The main benefit would be that consume always reverts an expel and expel (almost) always reverts a consume. Almost any consume or expel by mistake is easily reverted by the other command. (The exception is if there is more than one window in the column to the right, where consume will take the top window, but expel will expel to a new column.)\r\n\r\nThe alternative consume/expel commands (consume-or-expel-window-{left,right}) are more symmetrical in their behavior in that the subject is always selected window.",
      "created_at": "2024-09-10T20:25:22Z",
      "updated_at": "2024-11-11T15:13:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "gustavcedersjo",
        "avatar_url": "https://avatars.githubusercontent.com/u/1759215?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcZCD",
      "number": 788,
      "title": "mouse wheel not working after update",
      "body": "hello guys, i need help after update to niri 0.1.9 (v0.1-9-95-g8867a4f) my mouse wheel didn't work, before update it was working just fine, any help will be appreciated, thank you",
      "created_at": "2024-11-08T01:08:43Z",
      "updated_at": "2024-11-10T06:19:23Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Aqtmw",
        "body": "That looks normal. Which niri version did it work on? Can you post your niri config?"
      },
      "user": {
        "login": "tomysurya",
        "avatar_url": "https://avatars.githubusercontent.com/u/152084609?u=b0064234995357f7fced4a8e3f5be98d80e1b436&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aca8J",
      "number": 791,
      "title": "Allow transient inputs configuration",
      "body": "Related to: https://github.com/YaLTeR/niri/discussions/773\r\n\r\nI would like to add a keybinding which I could use to toggle my touchpad on and off. Currently it is only possible (AFAIK) with configuration hot-reloading, which isn't really an option for me (I'm using [the Nix flake](https://github.com/sodiboo/niri-flake) to manage my configuration).\r\n\r\nI'm also capable of contributing code if this is something you'd find useful to have.",
      "created_at": "2024-11-09T11:58:59Z",
      "updated_at": "2024-11-09T12:44:33Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "lajp",
        "avatar_url": "https://avatars.githubusercontent.com/u/31856315?u=b9f4680aabd72b711d156410021ae30ec411fd08&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AV2o0",
      "number": 49,
      "title": "`set-column-width` could grow beyond the monitor sizes",
      "body": "I don't think there's a value in such a thing given that the window can't be seen naturally anymore after that. Clamping to (combined)output resolution should desirable.",
      "created_at": "2023-10-09T16:59:06Z",
      "updated_at": "2024-11-09T12:04:49Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "kchibisov",
        "avatar_url": "https://avatars.githubusercontent.com/u/27620401?u=e171ccf7497d1f3d23451abe7eb2a8463effb6b6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZyjo",
      "number": 416,
      "title": "Key combination / Key chords",
      "body": "Many WM (I know about Sway/i3 and Qtile, but I'm pretty sure there are others) offers the possibility to create \"key chord\", i.e. there is a first combination of keys that, when pressed, triggers a sub-set of key that can be pressed in order to then do something.\r\nIn Sway, for example, I have a main shortcut wich is Mod+d that I call to my self the \"launch programs\" combination, and then I can press one of different keys to launch a specific application (like \"b\" for a browser). This helps me organizing my keybindings and has helped me having a huge amount of very specific keybindings for many different common operations without the risk of having conflicts.\r\nHow hard would it be to implement something like this in Niri? And could it be interesting for the project or is it just a spoil of mine?",
      "created_at": "2024-06-01T14:47:18Z",
      "updated_at": "2024-11-08T04:56:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "egolep",
        "avatar_url": "https://avatars.githubusercontent.com/u/71430597?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcYlt",
      "number": 787,
      "title": "Option to cover full space when just a single window in workspace",
      "body": "Somewhat like `always-center-single-column`, when we just have a single window in a workspace, I would like to have it maximized like `maximize-column`, and its `gaps` are set to `0`.\r\n\r\nAlso the window should have `geometry-corner-radius` set to `0` so we don't have portion of the focus-ring with an empty space in every corner.\r\n\r\nJust like the `no_gaps_when_only` option in Hyprland.",
      "created_at": "2024-11-07T15:06:08Z",
      "updated_at": "2024-11-07T21:20:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "zefr0x",
        "avatar_url": "https://avatars.githubusercontent.com/u/65136727?u=71c5b40c424cb03b590923998cebe644fb9d0433&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcRbJ",
      "number": 776,
      "title": "Support for multiple system configurations?",
      "body": "Hi!\r\n\r\nI'm sharing my dot files between multiple machines and now I'm trying to figure out if it is possible to have configurations based on the machine Niri is running on.\r\n\r\n1. I have one machine with an ultra wide monitor and a huion monitor with tablet capabilities.\r\n2. Then I have one with a 4k monitor only.\r\n3. And one with a 2k monitor with touch input.\r\n\r\nI'm wondering what the best way to have a shared config for all machines at once. If it's at all possible.\r\n\r\nThanks!",
      "created_at": "2024-11-02T16:53:16Z",
      "updated_at": "2024-11-07T19:16:19Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Aqgv6",
        "body": "I think `chezmoi` could help you with this. Here's the relevant doc: https://www.chezmoi.io/user-guide/manage-machine-to-machine-differences/"
      },
      "user": {
        "login": "sommerper",
        "avatar_url": "https://avatars.githubusercontent.com/u/1512048?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbtxR",
      "number": 708,
      "title": "Change the workspace layout via the niri ipc api",
      "body": "Hi everybody. \r\n\r\nHave you ever considered to set the layout of a workspace via the ipc api? \r\n\r\nI think about something like getting the layout tree via the niri msg with the window ids, titles, app_ids... in the structure of columns with the containing Windows and there height/preset, with preserved ordering the way it is currently on the workspace.\r\n\r\nSome external application could use this feature to perform a reordering/resizing of the windows and calls niri msg with the reordered/resized layout representation.\r\nNiri then would try to change the window locations and sizes if possible(returns error if values out of bounds, or windows missing/duplicated).\r\n\r\nI would use it to automate workspace layouts I frequently use. e.g. work-spaces with only the messaging stuff, or work-spaces for multimedia, frequently used projects etc...\r\n\r\nI am not sure if this could be emulated using the current niri ipc api.",
      "created_at": "2024-10-01T20:59:09Z",
      "updated_at": "2024-11-06T12:22:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "TheAngusMcFire",
        "avatar_url": "https://avatars.githubusercontent.com/u/43189215?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcQ5n",
      "number": 773,
      "title": "How to programmatically change configuration parameters?",
      "body": "Is there a way to programmatically change any configurable parameter of niri, such as with swaymsg? I tried looking through `niri msg`'s help messages, but I didn't find a way to change, for example, gaps' size or the pointer acceleration. \r\n\r\nPlease correct me if I'm wrong, but it seems as though there's only a limited set of \"actions\" that can be performed with `niri msg`, as opposed to `swaymsg` which allows you to change on the go anything that can be set through the config file.",
      "created_at": "2024-11-02T07:53:19Z",
      "updated_at": "2024-11-04T10:41:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Aqcye",
        "body": "You can apply transient output config changes with `niri msg output`, for other things you can just edit the config file on disk (for example, with `sed`). The changes will be picked up since it's live-reloaded."
      },
      "user": {
        "login": "Yaroslav-95",
        "avatar_url": "https://avatars.githubusercontent.com/u/30291149?u=68d2808cd6e0ceb182de133f93c5eff5cb9b2609&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcR4v",
      "number": 778,
      "title": "Move Cursor to Specified Position for Keyboard-Controlled Mouse",
      "body": "Does Niri have a built-in function to move the cursor to a specified position, like Hyprland's `hyprctl dispatch movecursor x y`? I'm looking for a solution to control the mouse via keyboard with a custom script. I've tried xdotool, xautomation, ydotool, and warpd, but they either don't work or aren't intuitive.",
      "created_at": "2024-11-03T09:56:12Z",
      "updated_at": "2024-11-03T09:59:39Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "WantenMN",
        "avatar_url": "https://avatars.githubusercontent.com/u/41904684?u=d68ffe937841388140b496c2354d7a171b4ddec2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcRMu",
      "number": 775,
      "title": "Niri Session Startup Script Issue",
      "body": "(niri unstable 2024-10-30 (commit d3e72245b003cbeed0810bf00c4a445b7c8a652a))\r\n\r\nI wrote a script in `~/.config/niri/test.sh` with the following content:\r\n\r\n```bash\r\n#!/usr/bin/env bash\r\necho $(date +\"%H:%M:%S\") > ~/Downloads/time.txt\r\n```\r\n\r\nI added this line at the end of the Niri `config.kdl` file:\r\n\r\n```kdl\r\nspawn-at-startup \"bash ~/.config/niri/test.sh\"\r\n```\r\nexited Niri, and logged back into my TTY session. However, when I launch Niri using `niri-session`, the `spawn-at-startup` setting has no effect, and no `time.txt` file is created.",
      "created_at": "2024-11-02T13:26:53Z",
      "updated_at": "2024-11-02T19:07:54Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AqdQy",
        "body": "niri does not split arguments and does not expand ~ in arguments, you need to pass them separately: `spawn-at-startup \"bash\" \"/home/USERNAME/.config/niri/test.sh\"`"
      },
      "user": {
        "login": "WantenMN",
        "avatar_url": "https://avatars.githubusercontent.com/u/41904684?u=d68ffe937841388140b496c2354d7a171b4ddec2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcPQd",
      "number": 768,
      "title": "insert hint rounded corners",
      "body": "It'd be nice to have the option to enable rounded corners on insert hints to match window rounded corners\r\n\r\n![image](https://github.com/user-attachments/assets/60afc072-2b5f-4ccc-972c-2b8b5bdf87ff)\r\n\r\n![image](https://github.com/user-attachments/assets/b6f767cc-58b4-4391-b703-cc59473c8824)\r\n ",
      "created_at": "2024-10-31T18:04:56Z",
      "updated_at": "2024-11-02T07:56:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ThatOneCalculator",
        "avatar_url": "https://avatars.githubusercontent.com/u/44733677?u=a15c7592804dbcdf5f7690b8e95fcfde3ce3f5a3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcMF4",
      "number": 764,
      "title": "Ability to zoom out and see all windows, similar to how hot corner works in gnome, but maybe include all workspaces",
      "body": "thank you for niri !\r\nI searched for similar feature requests, but keywords like \"see all\" \"zoom out\" didn't produce duplicates",
      "created_at": "2024-10-29T09:18:14Z",
      "updated_at": "2024-10-29T09:29:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kirillrdy",
        "avatar_url": "https://avatars.githubusercontent.com/u/12160?u=fb8d7e1e43ff0ad5d6c1a93f95f9508039a46e08&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AY88y",
      "number": 304,
      "title": "Add more libinput options, especially \"scroll_button\" and \"scroll_factor\"",
      "body": "I'd like to have more options to change the behaviour of `libinput`, as this is a huge QoL improvement for me. For me, this is way more important than animations, looks etc. (i'm not using them anyway).",
      "created_at": "2024-04-22T05:33:01Z",
      "updated_at": "2024-10-26T20:20:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Schweber",
        "avatar_url": "https://avatars.githubusercontent.com/u/64630479?u=d3a79244cac2fc22782dfe29dde79e9637b61ee7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcHt0",
      "number": 760,
      "title": "Share a same workspace between monitors",
      "body": "> Every monitor has an independent set of workspaces, and there's always one empty workspace present all the way down.\r\n\r\nBut is it possible to share a workspace? ",
      "created_at": "2024-10-26T10:32:07Z",
      "updated_at": "2024-10-26T11:20:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ZreXoc",
        "avatar_url": "https://avatars.githubusercontent.com/u/61901461?u=fab86a972b7a91ca0330a43f3f57c573a2fcac1a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcHKL",
      "number": 759,
      "title": "Workspace overview/map",
      "body": "Hi all,\r\n\r\nThanks for making niri! It's a joy to use. But I keep getting \"lost\" when I have lots of horizontally and vertically stacked windows. It would be cool to have a utility that shows an overview \"map\" of the workspaces, for example when you press Mod+Tab.\r\n\r\nMaybe something like this already exists and I don't know about it?",
      "created_at": "2024-10-25T18:43:36Z",
      "updated_at": "2024-10-25T19:07:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jdiez17",
        "avatar_url": "https://avatars.githubusercontent.com/u/251900?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcGGS",
      "number": 758,
      "title": "Dynamically resize input buffer",
      "body": "By default, Wayland has a fixed input buffer size, meaning that if a client freezes for too long, it will get disconnected. This happens on all Wayland compositors and is particularly frustrating when debugging, and players of [the game I work on](https://forums.factorio.com/105527) have also ran into the issue due to the game's single-threaded nature.\r\n\r\nFortunately, the Wayland library now supports resizing this input buffer: https://gitlab.freedesktop.org/wayland/wayland/-/merge_requests/188.\r\n\r\nCould niri please implement this so that I can keep my sanity when debugging under Wayland?\r\n\r\nVideo demonstration of how easy it is to encounter this while debugging:\r\n\r\nhttps://github.com/user-attachments/assets/9124cb80-1b3d-43c7-a98c-d7af40f736ce",
      "created_at": "2024-10-24T23:27:39Z",
      "updated_at": "2024-10-25T04:42:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "raiguard",
        "avatar_url": "https://avatars.githubusercontent.com/u/3515394?u=f07fcd15fe695282f8527bf3822e584975fffad7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AcBG7",
      "number": 752,
      "title": "(joke) bug report: my brain is cooked",
      "body": "I used to be satisfied with karousel and paperwm. Okay with just using a desktop environment with a scrolling plugin tacked on. Things were simpler then. I had all my settings, and apps all driven by a gui. Updating settings and config was a short and painless process, all my apps worked well, regardless of wayland or xorg.\r\n\r\nBut then I tried niri. And I learned what scrolling can look like. Now I can't go back. Despite all the software I'm using being in such early stages of development that some really weird shit happens regularly.\r\n\r\nI suffer through the terminal more than any linux user should. Fuck with config files to no end, never satisfied with how things are working.\r\n\r\nAll because niri is worth it. Worth the added challenge and the pain\r\n\r\nMy brain is cooked. Pls fix.",
      "created_at": "2024-10-21T00:40:41Z",
      "updated_at": "2024-10-21T08:54:14Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "alicealysia",
        "avatar_url": "https://avatars.githubusercontent.com/u/35021050?u=ded3a507afc26687bb40b8db245903fae47fc2cc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab_TQ",
      "number": 750,
      "title": "Cursed Binds",
      "body": ":smiley: \r\n\r\n   Mod+Alt+1 { set-column-width \"25%\"; }\r\n    Mod+Alt+2 { set-column-width \"33.33333%\"; }\r\n    Mod+Alt+3 { set-column-width \"50%\"; }\r\n    Mod+Alt+4 { set-column-width \"66.66666%\"; }\r\n    Mod+Alt+5 { set-column-width \"75%\"; }\r\n    Mod+KP_End { set-column-width \"25%\"; }\r\n    Mod+KP_Down { set-column-width \"33.33333%\"; }\r\n    Mod+KP_Next { set-column-width \"50%\"; }\r\n    Mod+KP_Left { set-column-width \"66.66666%\"; }\r\n    Mod+KP_Begin { set-column-width \"75%\"; }\r\n\r\n    Mod+Alt+Alt+KP_Home { spawn \"bash\" \"-c\" \"niri msg action set-column-width '33.33333%' && niri msg action move-column-to-first && niri msg action consume-window-into-column\";}\r\n    Mod+Alt+KP_Left { spawn \"bash\" \"-c\" \"niri msg action expel-window-from-column && niri msg action set-column-width '33.33333%' && niri msg action move-column-to-first\";}\r\n    Mod+Alt+KP_End { spawn \"bash\" \"-c\" \"niri msg action move-column-to-first && niri msg action consume-or-expel-window-right && niri msg action set-column-width '33.33333%'\";}\r\n    Mod+Alt+KP_UP { spawn \"bash\" \"-c\" \"niri msg action consume-window-into-column && niri msg action set-column-width '33.33333%'\";}\r\n    Mod+Alt+KP_Begin { spawn \"bash\" \"-c\" \"niri msg action expel-window-from-column && niri msg action set-column-width '33.33333%' && niri msg action center-column\";}\r\n    Mod+Alt+KP_DOWN { spawn \"bash\" \"-c\" \"niri msg action consume-or-expel-window-left && niri msg action set-column-width '33.33333%'\";}   \r\n    Mod+Alt+KP_Prior { spawn \"bash\" \"-c\" \"niri msg action move-column-to-last && niri msg action consume-or-expel-window-left && niri msg action move-window-up && niri msg action set-column-width '33.33333%'\";}\r\n    Mod+Alt+KP_RIGHT { spawn \"bash\" \"-c\" \"niri msg action expel-window-from-column && niri msg action set-column-width '33.33333%' && niri msg action move-column-to-last\";}\r\n    Mod+Alt+KP_Next { spawn \"bash\" \"-c\" \"niri msg action move-column-to-last && niri msg action consume-or-expel-window-left && niri msg action set-column-width '33.33333%'\";}\r\n\r\n    Mod+ctrl+KP_Home { spawn \"bash\" \"-c\" \"niri msg action set-column-width '25%' && niri msg action move-column-to-first && niri msg action consume-window-into-column\";}\r\n    Mod+ctrl+KP_Left { spawn \"bash\" \"-c\" \"niri msg action expel-window-from-column && niri msg action set-column-width '25%' && niri msg action move-column-to-first\";}\r\n    Mod+ctrl+KP_End { spawn \"bash\" \"-c\" \"niri msg action move-column-to-first && niri msg action consume-or-expel-window-right && niri msg action set-column-width '25%'\";}\r\n    Mod+ctrl+KP_UP { spawn \"bash\" \"-c\" \"niric msg action consume-window-into-column && niri msg action set-column-width '50%'\";}\r\n    Mod+ctrl+KP_Begin { spawn \"bash\" \"-c\" \"niri msg action expel-window-from-column && niri msg action set-column-width '50%' && niri msg action center-column\";}\r\n    Mod+ctrl+KP_DOWN { spawn \"bash\" \"-c\" \"niri msg action consume-or-expel-window-left && niri msg action set-column-width '50%'\";}   \r\n    Mod+ctrl+KP_Prior { spawn \"bash\" \"-c\" \"niri msg action move-column-to-last && niri msg action consume-or-expel-window-left && niri msg action move-window-up && niri msg action set-column-width '25%'\";}\r\n    Mod+ctrl+KP_RIGHT { spawn \"bash\" \"-c\" \"niri msg action expel-window-from-column && niri msg action set-column-width '25%' && niri msg action move-column-to-last\";}\r\n    Mod+ctrl+KP_Next { spawn \"bash\" \"-c\" \"niri msg action move-column-to-last && niri msg action consume-or-expel-window-left && niri msg action set-column-width '25%'\";}\r\n`",
      "created_at": "2024-10-18T13:22:33Z",
      "updated_at": "2024-10-18T14:07:07Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "alicealysia",
        "avatar_url": "https://avatars.githubusercontent.com/u/35021050?u=ded3a507afc26687bb40b8db245903fae47fc2cc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab_VS",
      "number": 751,
      "title": "Drag and Drop windows",
      "body": "So we already have the ability to \"scroll\" through the workspace by using Mod+Middle Click, but I was wondering if we could have another bind that lets you \"pluck\" a window out of its column, and reposition it, like you can in Paper WM.\r\nSomething I really like about paper is that it lets me have a very mouse driven workflow, while still being mostly automatic.",
      "created_at": "2024-10-18T13:46:30Z",
      "updated_at": "2024-10-18T13:54:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alicealysia",
        "avatar_url": "https://avatars.githubusercontent.com/u/35021050?u=ded3a507afc26687bb40b8db245903fae47fc2cc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab7uA",
      "number": 740,
      "title": "Add support for export_dmabuf_manager",
      "body": "After configuring wluma, i get an error saying that it is unable to init export_dmabuf_manager. It seems that Niri does not support this protocol and i think it will be nice if it does.",
      "created_at": "2024-10-15T16:12:25Z",
      "updated_at": "2024-10-17T16:09:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Babilinx",
        "avatar_url": "https://avatars.githubusercontent.com/u/77548264?u=d04177e222a57119494d258217dc532431932c9b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AafDp",
      "number": 549,
      "title": "wlr/taskbar: List windows in correct order?",
      "body": "Hello,\r\n\r\nfirst of all, I _think_ this is the proper repo to raise this issue in, but please let me know in case I'm wrong and these changes would need to be addressed in waybar or wlr/taskbar.\r\n\r\nSo, I configured my waybar with the wlr/taskbar module to display a list of icons of my open windows. It works, but there are two changes I would wish for, that would make it way more useful for me to actually navigate windows.\r\n\r\n1. I wish the order of applications in the taskbar would reflect the actual order of windows in the current workspace. Right now, I think they are ordered by when they were started. So, if I reorder the windows in my workspace, the taskbar does not reflect that change. It can be configured to always show the active window first, but that doesn't change the rest of the order.\r\nI think this change would make it easier to know at a glance how to navigate to a window/application I'm looking for.\r\n2. I wish the taskbar would only show application windows of the current workspace, for the same reason. Also, I guess this change would be necessary to implement 1., since otherwise it would be unclear how to sort applications on different workspaces, relative to each other.\r\n\r\nMy understanding is that this behavior is controlled by niri's implementation of the wlr-foreign-toplevel-management API, but I don't know enough about this API yet. So first, would it be possible to make these changes in niri? Second, do y'all think this would be good changes to make? I realize that this might not be the behavior that every user expects.\r\nIf so, I might attempt a PR, but I wanted to make sure that it'd be possible, first :D ",
      "created_at": "2024-07-16T19:18:09Z",
      "updated_at": "2024-10-16T04:41:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "peret",
        "avatar_url": "https://avatars.githubusercontent.com/u/617977?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab6YX",
      "number": 733,
      "title": "Aseprite and Krita causing coredumps",
      "body": "Running on Fedora 40 / niri 0.1.9 (v0.1.9-1-g6ee5b5a)\r\n\r\nWhen I try to start Aseprite or Krita nothing happens. Looking at the journalctl log I see this for Aseprite\r\n\r\n```\r\nOct 14 16:18:41 fedora systemd-coredump[601460]: [🡕] Process 601453 (main) of user 1000 dumped core.\r\n\r\n                                                 Module libpcre2-8.so.0 from rpm pcre2-10.44-1.fc40.x86_64\r\n                                                 Module libbrotlicommon.so.1 from rpm brotli-1.1.0-3.fc40.x86_64\r\n                                                 Module libgraphite2.so.3 from rpm graphite2-1.3.14-15.fc40.x86_64\r\n                                                 Module libglib-2.0.so.0 from rpm glib2-2.80.3-1.fc40.x86_64\r\n                                                 Module liblzma.so.5 from rpm xz-5.4.6-3.fc40.x86_64\r\n                                                 Module libbrotlidec.so.1 from rpm brotli-1.1.0-3.fc40.x86_64\r\n                                                 Module libharfbuzz.so.0 from rpm harfbuzz-8.5.0-1.fc40.x86_64\r\n                                                 Module libpng16.so.16 from rpm libpng-1.6.40-3.fc40.x86_64\r\n                                                 Module libbz2.so.1 from rpm bzip2-1.0.8-18.fc40.x86_64\r\n                                                 Module libz.so.1 from rpm zlib-ng-2.1.7-2.fc40.x86_64\r\n                                                 Module libXrender.so.1 from rpm libXrender-0.9.11-6.fc40.x86_64\r\n                                                 Module libXfixes.so.3 from rpm libXfixes-6.0.1-3.fc40.x86_64\r\n                                                 Module libxml2.so.2 from rpm libxml2-2.12.8-1.fc40.x86_64\r\n                                                 Module libfreetype.so.6 from rpm freetype-2.13.2-5.fc40.x86_64\r\n                                                 Module libGLdispatch.so.0 from rpm libglvnd-1.7.0-4.fc40.x86_64\r\n                                                 Module libGLX.so.0 from rpm libglvnd-1.7.0-4.fc40.x86_64\r\n                                                 Module libXau.so.6 from rpm libXau-1.0.11-6.fc40.x86_64\r\n                                                 Module libXcursor.so.1 from rpm libXcursor-1.2.1-7.fc40.x86_64\r\n                                                 Module libXext.so.6 from rpm libXext-1.3.6-1.fc40.x86_64\r\n                                                 Module libX11.so.6 from rpm libX11-1.8.10-2.fc40.x86_64\r\n                                                 Module libfontconfig.so.1 from rpm fontconfig-2.15.0-6.fc40.x86_64\r\n                                                 Module libGL.so.1 from rpm libglvnd-1.7.0-4.fc40.x86_64\r\n                                                 Module libxcb.so.1 from rpm libxcb-1.17.0-2.fc40.x86_64\r\n                                                 Stack trace of thread 601453:\r\n                                                 #0  0x00007f5b10a00884 XDefaultScreen (libX11.so.6 + 0x2c884)\r\n                                                 #1  0x000000000087b1c4 n/a (/home/x/apps/Aseprite/aseprite + 0x47b1c4)\r\n                                                 ELF object binary architecture: AMD x86-64\r\nOct 14 16:18:41 fedora systemd[1]: systemd-coredump@9-601459-0.service: Deactivated successfully.\r\nOct 14 16:18:41 fedora audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=systemd-coredump@9-601459-0 comm=\"systemd\" exe=\"/usr/lib/systemd/systemd\" hostname=? addr=? terminal=? res=success'\r\nOct 14 16:18:41 fedora audit: BPF prog-id=196 op=UNLOAD\r\nOct 14 16:18:41 fedora audit: BPF prog-id=195 op=UNLOAD\r\nOct 14 16:18:41 fedora audit: BPF prog-id=194 op=UNLOAD\r\nOct 14 16:18:41 fedora abrt-server[601483]: Executable '/home/x/apps/Aseprite/aseprite' doesn't belong to any package and ProcessUnpackaged is set to 'no'\r\nOct 14 16:18:41 fedora abrt-server[601483]: 'post-create' on '/var/spool/abrt/ccpp-2024-10-14-16:18:41.402325-601453' exited with 1\r\nOct 14 16:18:41 fedora abrt-server[601483]: Deleting problem directory '/var/spool/abrt/ccpp-2024-10-14-16:18:41.402325-601453'\r\n```\r\n\r\nAnd for Krita\r\n```\r\nOct 14 16:19:38 fedora systemd[519195]: Starting flatpak-session-helper.service - flatpak session helper...\r\nOct 14 16:19:38 fedora systemd[519195]: Started flatpak-session-helper.service - flatpak session helper.\r\nOct 14 16:19:38 fedora systemd[519195]: Started app-flatpak-org.kde.krita-602818.scope.\r\nOct 14 16:19:39 fedora krita[602842]: qt.qpa.xcb: could not connect to display\r\nOct 14 16:19:39 fedora audit[602842]: ANOM_ABEND auid=1000 uid=1000 gid=1000 ses=12 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 pid=602842 comm=\"krita\" exe=\"/app/bin/krita\" sig=6 res=1\r\nOct 14 16:19:39 fedora krita[602842]: qt.qpa.plugin: Could not load the Qt platform plugin \"xcb\" in \"\" even though it was found.\r\nOct 14 16:19:39 fedora krita[602842]: This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.\r\n\r\n                                      Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, xcb.\r\nOct 14 16:19:39 fedora audit: BPF prog-id=197 op=LOAD\r\nOct 14 16:19:39 fedora audit: BPF prog-id=198 op=LOAD\r\nOct 14 16:19:39 fedora audit: BPF prog-id=199 op=LOAD\r\nOct 14 16:19:39 fedora systemd[1]: Started systemd-coredump@10-602843-0.service - Process Core Dump (PID 602843/UID 0).\r\nOct 14 16:19:39 fedora audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=systemd-coredump@10-602843-0 comm=\"systemd\" exe=\"/usr/lib/systemd/systemd\" hostname=? addr=? terminal=? res=success'\r\nOct 14 16:19:39 fedora systemd-coredump[602846]: [🡕] Process 602842 (krita) of user 1000 dumped core.\r\n\r\n                                                 Module /app/bin/krita from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /usr/lib64/libuuid.so.1.3.0 from rpm util-linux-2.40.1-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libxcb-xinput.so.0.1.0 from rpm libxcb-1.17.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libxcb-xkb.so.1.0.0 from rpm libxcb-1.17.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libxcb-xinerama.so.0.0.0 from rpm libxcb-1.17.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libxcb-xfixes.so.0.0.0 from rpm libxcb-1.17.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libxcb-sync.so.1.0.0 from rpm libxcb-1.17.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libxcb-shape.so.0.0.0 from rpm libxcb-1.17.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libxcb-render.so.0.0.0 from rpm libxcb-1.17.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libxcb-randr.so.0.1.0 from rpm libxcb-1.17.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libxcb-shm.so.0.0.0 from rpm libxcb-1.17.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libblkid.so.1.1.0 from rpm util-linux-2.40.1-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libmount.so.1.1.0 from rpm util-linux-2.40.1-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libcurl.so.4.8.0 from rpm curl-8.6.0-10.fc40.x86_64\r\n                                                 Module /usr/lib64/libselinux.so.1 from rpm libselinux-3.6-4.fc40.x86_64\r\n                                                 Module /usr/lib64/libKF5WindowSystem.so.5.116.0 from rpm kf5-kwindowsystem-5.116.0-1.fc40.x86_64\r\n                                                 Module /app/lib64/libunibreak.so.6.0.1 from rpm libunibreak-6.1-1.fc40app1.x86_64\r\n                                                 Module /usr/lib64/libxcb.so.1.1.0 from rpm libxcb-1.17.0-1.fc40.x86_64\r\n                                                 Module /app/lib64/libmlt-7.so.7.24.0 from rpm mlt-7.24.0-1.fc40app2.x86_64\r\n                                                 Module /app/lib64/libkritacolord.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libquazip1-qt5.so.1.4 from rpm quazip-1.4-7.fc40app1.x86_64\r\n                                                 Module /usr/lib64/libKF5ConfigCore.so.5.116.0 from rpm kf5-kconfig-5.116.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libKF5CoreAddons.so.5.116.0 from rpm kf5-kcoreaddons-5.116.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libKF5WidgetsAddons.so.5.116.0 from rpm kf5-kwidgetsaddons-5.116.0-1.fc40.x86_64\r\n                                                 Module /app/lib64/libkritawidgetutils.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritapigment.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritaplugin.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /usr/lib64/libKF5GuiAddons.so.5.116.0 from rpm kf5-kguiaddons-5.116.0-1.fc40.x86_64\r\n                                                 Module /usr/lib64/libKF5ConfigGui.so.5.116.0 from rpm kf5-kconfig-5.116.0-1.fc40.x86_64\r\n                                                 Module /app/lib64/libkritastore.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /usr/lib64/libKF5ItemViews.so.5.116.0 from rpm kf5-kitemviews-5.116.0-1.fc40.x86_64\r\n                                                 Module /app/lib64/libkritapsdutils.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritaflake.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritametadata.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritawidgets.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritaresourcewidgets.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /usr/lib64/libKF5Completion.so.5.116.0 from rpm kf5-kcompletion-5.116.0-1.fc40.x86_64\r\n                                                 Module /app/lib64/libkritacommand.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libmlt++-7.so.7.24.0 from rpm mlt-7.24.0-1.fc40app2.x86_64\r\n                                                 Module /app/lib64/libkritalibbrush.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritaimpex.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritaimage.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritaversion.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /usr/lib64/libKF5I18n.so.5.116.0 from rpm kf5-ki18n-5.116.0-1.fc40.x86_64\r\n                                                 Module /app/lib64/libkritaui.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritacolor.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritaglobal.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritaresources.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /app/lib64/libkritamultiarch.so.19.0.0 from rpm krita-5.2.2-7.fc40app1.x86_64\r\n                                                 Module /usr/lib64/libKF5Crash.so.5.116.0 from rpm kf5-kcrash-5.116.0-1.fc40.x86_64\r\n                                                 Module libxcb-util.so.1 from rpm xcb-util-0.4.1-5.fc40.x86_64\r\n                                                 Module libxkbcommon-x11.so.0 from rpm libxkbcommon-1.6.0-2.fc40.x86_64\r\n                                                 Module libICE.so.6 from rpm libICE-1.1.1-3.fc40.x86_64\r\n                                                 Module libSM.so.6 from rpm libSM-1.2.4-3.fc40.x86_64\r\n                                                 Module libxcb-render-util.so.0 from rpm xcb-util-renderutil-0.3.10-5.fc40.x86_64\r\n                                                 Module libxcb-image.so.0 from rpm xcb-util-image-0.4.1-5.fc40.x86_64\r\n                                                 Module libxcb-icccm.so.4 from rpm xcb-util-wm-0.4.2-5.fc40.x86_64\r\n                                                 Module libX11-xcb.so.1 from rpm libX11-1.8.10-2.fc40.x86_64\r\n                                                 Module libQt5XcbQpa.so.5 from rpm qt5-qtbase-5.15.15-1.fc40.x86_64\r\n                                                 Module libqxcb.so from rpm qt5-qtbase-5.15.15-1.fc40.x86_64\r\n                                                 Module libcrypt.so.2 from rpm libxcrypt-4.4.36-5.fc40.x86_64\r\n                                                 Module libsasl2.so.3 from rpm cyrus-sasl-2.1.28-19.fc40.x86_64\r\n                                                 Module libevent-2.1.so.7 from rpm libevent-2.1.12-12.fc40.x86_64\r\n                                                 Module libunistring.so.5 from rpm libunistring-1.1-7.fc40.x86_64\r\n                                                 Module libgmodule-2.0.so.0 from rpm glib2-2.80.3-1.fc40.x86_64\r\n                                                 Module libpsl.so.5 from rpm libpsl-0.21.5-3.fc40.x86_64\r\n                                                 Module libssh.so.4 from rpm libssh-0.10.6-5.fc40.x86_64\r\n                                                 Module libidn2.so.0 from rpm libidn2-2.3.7-1.fc40.x86_64\r\n                                                 Module libnghttp2.so.14 from rpm nghttp2-1.59.0-3.fc40.x86_64\r\n                                                 Module libbrotlicommon.so.1 from rpm brotli-1.1.0-3.fc40.x86_64\r\n                                                 Module libduktape.so.207 from rpm duktape-2.7.0-7.fc40.x86_64\r\n                                                 Module libgio-2.0.so.0 from rpm glib2-2.80.3-1.fc40.x86_64\r\n                                                 Module libffi.so.8 from rpm libffi-3.4.4-7.fc40.x86_64\r\n                                                 Module libxkbcommon.so.0 from rpm libxkbcommon-1.6.0-2.fc40.x86_64\r\n                                                 Module libwayland-cursor.so.0 from rpm wayland-1.23.0-2.fc40.x86_64\r\n                                                 Module libdbus-1.so.3 from rpm dbus-1.14.10-3.fc40.x86_64\r\n                                                 Module libxcb-keysyms.so.1 from rpm xcb-util-keysyms-0.4.1-5.fc40.x86_64\r\n                                                 Module libxml2.so.2 from rpm libxml2-2.12.8-1.fc40.x86_64\r\n                                                 Module libbrotlidec.so.1 from rpm brotli-1.1.0-3.fc40.x86_64\r\n                                                 Module libXau.so.6 from rpm libXau-1.0.11-6.fc40.x86_64\r\n                                                 Module libgobject-2.0.so.0 from rpm glib2-2.80.3-1.fc40.x86_64\r\n                                                 Module libpxbackend-1.0.so from rpm libproxy-0.5.5-1.fc40.x86_64\r\n                                                 Module libkeyutils.so.1 from rpm keyutils-1.6.3-3.fc40.x86_64\r\n                                                 Module libkrb5support.so.0 from rpm krb5-1.21.3-1.fc40.x86_64\r\n                                                 Module libcom_err.so.2 from rpm e2fsprogs-1.47.0-5.fc40.x86_64\r\n                                                 Module libk5crypto.so.3 from rpm krb5-1.21.3-1.fc40.x86_64\r\n                                                 Module libkrb5.so.3 from rpm krb5-1.21.3-1.fc40.x86_64\r\n                                                 Module libpcre2-8.so.0 from rpm pcre2-10.44-1.fc40.x86_64\r\n                                                 Module libicudata.so.74 from rpm icu-74.2-1.fc40.x86_64\r\n                                                 Module liblzma.so.5 from rpm xz-5.4.6-3.fc40.x86_64\r\n                                                 Module liblz4.so.1 from rpm lz4-1.9.4-6.fc40.x86_64\r\n                                                 Module libcap.so.2 from rpm libcap-2.69-8.fc40.x86_64\r\n                                                 Module libgraphite2.so.3 from rpm graphite2-1.3.14-15.fc40.x86_64\r\n                                                 Module libGLdispatch.so.0 from rpm libglvnd-1.7.0-4.fc40.x86_64\r\n                                                 Module libXext.so.6 from rpm libXext-1.3.6-1.fc40.x86_64\r\n                                                 Module libGLX.so.0 from rpm libglvnd-1.7.0-4.fc40.x86_64\r\n                                                 Module libbz2.so.1 from rpm bzip2-1.0.8-18.fc40.x86_64\r\n                                                 Module libudev.so.1 from rpm systemd-255.12-1.fc40.x86_64\r\n                                                 Module libwayland-client.so.0 from rpm wayland-1.23.0-2.fc40.x86_64\r\n                                                 Module libQt5WaylandClient.so.5 from rpm qt5-qtwayland-5.15.15-1.fc40.x86_64\r\n                                                 Module libQt5DBus.so.5 from rpm qt5-qtbase-5.15.15-1.fc40.x86_64\r\n                                                 Module libQt5PrintSupport.so.5 from rpm qt5-qtbase-5.15.15-1.fc40.x86_64\r\n                                                 Module libfribidi.so.0 from rpm fribidi-1.0.14-2.fc40.x86_64\r\n                                                 Module libfontconfig.so.1 from rpm fontconfig-2.15.0-6.fc40.x86_64\r\n                                                 Module libfreetype.so.6 from rpm freetype-2.13.2-5.fc40.x86_64\r\n                                                 Module libcrypto.so.3 from rpm openssl-3.2.2-3.fc40.x86_64\r\n                                                 Module libssl.so.3 from rpm openssl-3.2.2-3.fc40.x86_64\r\n                                                 Module libproxy.so.1 from rpm libproxy-0.5.5-1.fc40.x86_64\r\n                                                 Module libgssapi_krb5.so.2 from rpm krb5-1.21.3-1.fc40.x86_64\r\n                                                 Module libglib-2.0.so.0 from rpm glib2-2.80.3-1.fc40.x86_64\r\n                                                 Module libzstd.so.1 from rpm zstd-1.5.6-1.fc40.x86_64\r\n                                                 Module libpcre2-16.so.0 from rpm pcre2-10.44-1.fc40.x86_64\r\n                                                 Module libicuuc.so.74 from rpm icu-74.2-1.fc40.x86_64\r\n                                                 Module libicui18n.so.74 from rpm icu-74.2-1.fc40.x86_64\r\n                                                 Module libdouble-conversion.so.3 from rpm double-conversion-3.3.0-3.fc40.x86_64\r\n                                                 Module libsystemd.so.0 from rpm systemd-255.12-1.fc40.x86_64\r\n                                                 Module libharfbuzz.so.0 from rpm harfbuzz-8.5.0-1.fc40.x86_64\r\n                                                 Module libz.so.1 from rpm zlib-ng-2.1.7-2.fc40.x86_64\r\n                                                 Module libGL.so.1 from rpm libglvnd-1.7.0-4.fc40.x86_64\r\n                                                 Module libQt5Sql.so.5 from rpm qt5-qtbase-5.15.15-1.fc40.x86_64\r\n                                                 Module libfftw3.so.3 from rpm fftw-3.3.10-12.fc40.x86_64\r\n                                                 Module libQt5Svg.so.5 from rpm qt5-qtsvg-5.15.15-1.fc40.x86_64\r\n                                                 Module libQt5Xml.so.5 from rpm qt5-qtbase-5.15.15-1.fc40.x86_64\r\n                                                 Module libQt5X11Extras.so.5 from rpm qt5-qtx11extras-5.15.15-1.fc40.x86_64\r\n                                                 Module libImath-3_1.so.29 from rpm imath-3.1.12-1.fc40.x86_64\r\n                                                 Module libX11.so.6 from rpm libX11-1.8.10-2.fc40.x86_64\r\n                                                 Module libpng16.so.16 from rpm libpng-1.6.40-3.fc40.x86_64\r\n                                                 Module libQt5Network.so.5 from rpm qt5-qtbase-5.15.15-1.fc40.x86_64\r\n                                                 Module libQt5Core.so.5 from rpm qt5-qtbase-5.15.15-1.fc40.x86_64\r\n                                                 Module libQt5Gui.so.5 from rpm qt5-qtbase-5.15.15-1.fc40.x86_64\r\n                                                 Module libQt5Widgets.so.5 from rpm qt5-qtbase-5.15.15-1.fc40.x86_64\r\n                                                 Stack trace of thread 2:\r\n                                                 #0  0x00007f61f4ca8664 __pthread_kill_implementation (libc.so.6 + 0x99664)\r\n                                                 #1  0x00007f61f4c4fc4e raise (libc.so.6 + 0x40c4e)\r\n                                                 #2  0x00007f61f4c37902 abort (libc.so.6 + 0x28902)\r\n                                                 #3  0x00007f61f52a884c _ZNK14QMessageLogger5fatalEPKcz (libQt5Core.so.5 + 0xa884c)\r\n                                                 #4  0x00007f61f595433d _ZN22QGuiApplicationPrivate25createPlatformIntegrationEv (libQt5Gui.so.5 + 0x15433d)\r\n                                                 #5  0x00007f61f59548a0 _ZN22QGuiApplicationPrivate21createEventDispatcherEv (libQt5Gui.so.5 + 0x1548a0)\r\n                                                 #6  0x00007f61f54bb936 _ZN23QCoreApplicationPrivate4initEv (libQt5Core.so.5 + 0x2bb936)\r\n                                                 #7  0x00007f61f595799d _ZN22QGuiApplicationPrivate4initEv (libQt5Gui.so.5 + 0x15799d)\r\n                                                 #8  0x00007f61f5958a81 _ZN15QGuiApplicationC1ERiPPci (libQt5Gui.so.5 + 0x158a81)\r\n                                                 #9  0x00007f61f734b392 n/a (/app/lib64/libkritaui.so.19.0.0 + 0x54b392)\r\n                                                 #10 0x00007f61f7335118 n/a (/app/lib64/libkritaui.so.19.0.0 + 0x535118)\r\n                                                 #11 0x0000561f8e3aca7b n/a (/app/bin/krita + 0x7a7b)\r\n                                                 #12 0x00007f61f4c39088 __libc_start_call_main (libc.so.6 + 0x2a088)\r\n                                                 #13 0x00007f61f4c3914b __libc_start_main@@GLIBC_2.34 (libc.so.6 + 0x2a14b)\r\n                                                 #14 0x0000561f8e3b0425 n/a (/app/bin/krita + 0xb425)\r\n                                                 ELF object binary architecture: AMD x86-64\r\nOct 14 16:19:39 fedora audit[1]: SERVICE_STOP pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=systemd-coredump@10-602843-0 comm=\"systemd\" exe=\"/usr/lib/systemd/systemd\" hostname=? addr=? terminal=? res=success'\r\nOct 14 16:19:39 fedora systemd[1]: systemd-coredump@10-602843-0.service: Deactivated successfully.\r\nOct 14 16:19:39 fedora audit: BPF prog-id=199 op=UNLOAD\r\nOct 14 16:19:39 fedora audit: BPF prog-id=198 op=UNLOAD\r\nOct 14 16:19:39 fedora audit: BPF prog-id=197 op=UNLOAD\r\nOct 14 16:19:39 fedora abrt-server[602874]: Unsupported container technology\r\nOct 14 16:19:39 fedora abrt-server[602874]: Lock file '.lock' was locked by process 602877, but it crashed?\r\nOct 14 16:19:39 fedora audit[602890]: AVC avc:  denied  { execute } for  pid=602890 comm=\"rustdesk\" name=\"sudo\" dev=\"dm-0\" ino=540192 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:sudo_exec_t:s0 tclass=file permissive=0\r\nOct 14 16:19:39 fedora abrt-server[602874]: Deleting problem directory ccpp-2024-10-14-16:19:39.403040-602842 (dup of ccpp-2024-10-10-23:38:44.371101-17568)\r\nOct 14 16:19:39 fedora abrt-applet[574732]: g_app_info_should_show: assertion 'G_IS_APP_INFO (appinfo)' failed\r\nOct 14 16:19:40 fedora abrt-notification[602920]: [🡕] Process 17568 (krita) crashed in qt_message_output(QtMsgType, QMessageLogContext const&, QString const&) [clone .cold]()\r\nOct 14 16:19:40 fedora audit[602944]: AVC avc:  denied  { execute } for  pid=602944 comm=\"rustdesk\" name=\"sudo\" dev=\"dm-0\" ino=540192 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:sudo_exec_t:s0 tclass=file permissive=0\r\nOct 14 16:19:41 fedora audit[602965]: AVC avc:  denied  { execute } for  pid=602965 comm=\"rustdesk\" name=\"sudo\" dev=\"dm-0\" ino=540192 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:sudo_exec_t:s0 tclass=file permissive=0\r\nOct 14 16:19:42 fedora audit[602986]: AVC avc:  denied  { execute } for  pid=602986 comm=\"rustdesk\" name=\"sudo\" dev=\"dm-0\" ino=540192 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:sudo_exec_t:s0 tclass=file permissive=0\r\nOct 14 16:19:43 fedora audit[603007]: AVC avc:  denied  { execute } for  pid=603007 comm=\"rustdesk\" name=\"sudo\" dev=\"dm-0\" ino=540192 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:sudo_exec_t:s0 tclass=file permissive=0\r\nOct 14 16:19:44 fedora xdg-desktop-por[574791]: Failed to get application states: GDBus.Error:org.freedesktop.portal.Error.Failed: Could not get window list\r\n```\r\n\r\nThey do work under Gnome and hyprland so I'm thinking it relates to Niri - but I'm not sure.\r\n\r\nIs it maybe related to Xwayland?",
      "created_at": "2024-10-14T14:22:47Z",
      "updated_at": "2024-10-15T04:33:54Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "sommerper",
        "avatar_url": "https://avatars.githubusercontent.com/u/1512048?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYs8x",
      "number": 284,
      "title": "Cursor Timeout",
      "body": "It would be cool if there was an add to make the cursor hide after a certain time period when not moving. I remember Hyprland has something like it. ",
      "created_at": "2024-04-08T02:02:25Z",
      "updated_at": "2024-10-14T23:44:29Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "thairanaru",
        "avatar_url": "https://avatars.githubusercontent.com/u/106037630?u=24331be0e8c9230197196db990021178a5a92a2c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abugq",
      "number": 710,
      "title": "add command to power on monitors",
      "body": "My monitors become black after unlocking my session with `swaylock`. I would like to have a command like `niri msg action power-on-monitors` to add this as an after-resume command.\r\n\r\n`hyprland` has got both `hyprctl dispatch dpms off` and `on` which was needed in my setup to activate my monitors after unlocking them.",
      "created_at": "2024-10-02T15:45:26Z",
      "updated_at": "2024-10-14T23:43:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Schweber",
        "avatar_url": "https://avatars.githubusercontent.com/u/64630479?u=d3a79244cac2fc22782dfe29dde79e9637b61ee7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab5wH",
      "number": 732,
      "title": "re-process all window-rules",
      "body": "Would be nice to be able to re-process all window rules.\r\nI keep wrecking my mapping of windows to workspaces (eventually I will learn not to I suppose) but it would be nice to just have all the window-rules \"open-on-workspace\" be re-applied, say by writing the config file.\r\nI would be happy with a \"on-reconfig\" match, and put what I needed to be done in there.",
      "created_at": "2024-10-14T01:46:37Z",
      "updated_at": "2024-10-14T10:34:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "permezel",
        "avatar_url": "https://avatars.githubusercontent.com/u/2313876?u=d5938a424fec7720e8d0bc12249f71f4531dc95c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab5v-",
      "number": 731,
      "title": "focus-window capability in window-rule",
      "body": "I would like to be able to focus the newly created window.\r\nThis would require support for:\r\n   focus-workspace \"desired-workspace\"\r\nor\r\n  open-on-workspace --focus \"desired-workspace\"\r\n\r\nwithin a window-rule.\r\n\r\nIt would also be nice to be able to control where in the workspace one ends up with the new window: left-most, right-most, or default.\r\n\r\nMy rational for this is that currently I have \"terminal\", \"browse\" and \"emacs\" named workspaces. Mod+Return spawns a terminal, but I then have to go looking for it, if I am currently in some other workspace.\r\n\r\nI also sometimes want to override the workspace rule, and have the terminal be created in the current workspace.\r\nIf something like the floating window from `sway` were available, I would not want the override, as I would just push a terminal into the floating state, and use that.",
      "created_at": "2024-10-14T01:38:39Z",
      "updated_at": "2024-10-14T10:30:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "permezel",
        "avatar_url": "https://avatars.githubusercontent.com/u/2313876?u=d5938a424fec7720e8d0bc12249f71f4531dc95c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab5Rs",
      "number": 729,
      "title": "Support for Macbook trackpad \"Force Touch\"",
      "body": "On MacOS I use BetterTouchTool to bind unused trackpad inputs to many different actions, including a three finger \"Force Touch\" to close a window and four fingers to quit an application. Being able to utilize the pressure sensitivity on my trackpad for alternate actions on niri would be really nice, especially once gesture binding is implemented as it would help me exclusively manage my windows with my hands off the keyboard. \r\n\r\nAs far as I can tell using `libinput measure touchpad-pressure` on Asahi Fedora Remix the drivers do support pressure sensitivity and send a different input labelled \"down\" when applying pressure that is well above the regular clicking threshold, but there isn't any haptic feedback once you reach the threshold for the \"down\" input.",
      "created_at": "2024-10-13T09:00:50Z",
      "updated_at": "2024-10-14T04:48:57Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SproedKartoffelChip",
        "avatar_url": "https://avatars.githubusercontent.com/u/59844107?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Ab1tT",
      "number": 725,
      "title": "Border gradient animation",
      "body": "In hyprland you can configure:\r\n\r\n```\r\n  animation = borderangle, 1, 15, linear, loop\r\n```\r\n\r\nDescription from their README\r\nborderangle - for animating the border's gradient angle - styles: once (default), loop\r\n\r\nBasically it spins around and you can configure the speed.",
      "created_at": "2024-10-10T00:31:12Z",
      "updated_at": "2024-10-10T04:51:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "beckend",
        "avatar_url": "https://avatars.githubusercontent.com/u/6056334?u=cbabf3b42e05fdbaedc5b0afe4efd29f6fe476ff&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa1l_",
      "number": 587,
      "title": "Showcase OS setup",
      "body": "Currently, to set up Niri, you need to do quite a bit of configuration to get to the usable state, and that's under the condition that you set up things properly and not encounter any issues.\r\nI think it'd be quite valuable to have some form of a showcase setup that'd be easy to spin up, e.g. in a VM. I'm thinking something like a [Blue Build](https://blue-build.org/) setup maybe, where it'd be a declarative set of configs easy to get an ISO of and install. The method doesn't really matter that much, but the general ideal would be to allow people to easily check out Niri in some \"ideal\" setup, without the risk of bricking their systems, or giving them chance to misconfigure something and getting away with false bad impression.\r\n\r\nThe idea is inspired by me wanting to try Niri out, since the premise sounds awesome. Going through Getting Started is pretty discouraging, with all the things that need to be set up to get to some working environment. At the point where I'm reading Getting Started I'm not even sure if I'll like the end result, so it's a tough sell to convince me to go through the learning and setup process and spend time doing that.",
      "created_at": "2024-08-11T09:44:37Z",
      "updated_at": "2024-10-08T22:06:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "marcinjahn",
        "avatar_url": "https://avatars.githubusercontent.com/u/10273406?u=cad0088e5ab76c60481e0f811d91446b29ddeb16&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbzEw",
      "number": 719,
      "title": "temporarily override the screenshot file path",
      "body": "something like `niri msg action screenshot -p <path>`",
      "created_at": "2024-10-07T16:51:38Z",
      "updated_at": "2024-10-07T16:52:42Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "hollymlem",
        "avatar_url": "https://avatars.githubusercontent.com/u/35699052?u=3f0286f934e0fef5a79789cbaac71541e1f57ca5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbwYY",
      "number": 712,
      "title": "moving named workspaces to another monitor",
      "body": "currently  if monitor is unplugged, all named workspaces are moved to the one still present, but upon connecting of another monitor, there is no way to move some of the named workspaces to that new monitor.\r\n\r\nin general, for multimonitor setup it would be awesome to implement named workspaces affinity, where they can jump to any of the indicated monitors in config.\r\n\r\nright now i have in config \r\n```\r\nworkspace \"w4\" { open-on-output \"HDMI-A-1\"; } \r\n```\r\nbut despite second monitor being connected is also shown as HDMI-A-1 (despite being physically different), no workspaces flow onto it, leaving it with single unnamed workspace.",
      "created_at": "2024-10-04T10:52:20Z",
      "updated_at": "2024-10-05T16:29:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "d3m1gd",
        "avatar_url": "https://avatars.githubusercontent.com/u/3992031?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZGNJ",
      "number": 318,
      "title": "xwayland-satellite - rootless xwayland for niri",
      "body": "Here's something I've been working on for the last few months: https://github.com/Supreeeme/xwayland-satellite\r\n\r\nxwayland-satellite is rootless xwayland that lives outside of the compositor. I made it for niri, but it should work with any compositor implementing `xdg_wm_base`. I primarily made it for Steam, so it's likely missing a lot of features and might even crash from time to time, so feel free to open some bugs and I'll work on fixing them!",
      "created_at": "2024-04-29T04:35:20Z",
      "updated_at": "2024-10-03T15:22:29Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "Supreeeme",
        "avatar_url": "https://avatars.githubusercontent.com/u/7882157?u=00b9be59810b4811d4378441aef703e35eb970ec&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbszL",
      "number": 705,
      "title": "Way to swap Ctrl and Caps Lock key on niri?",
      "body": "Someone could find a cute and tidy way to swap the ctrl and caps lock keys on niri?\r\nOn GNOME I achieve that using this `gsettings` command:\r\n`gsettings set org.gnome.desktop.input-sources xkb-options \"['caps:ctrl_modifier', 'ctrl:swapcaps']\"`\r\nAnd it just works as one [chess nerd](https://www.youtube.com/watch?v=z0v8DBQB3uQ) wisely said.\r\n\r\nCould it be achieved with just a couple of config.kdl lines?\r\n\r\nPwease hewp daddy yalter",
      "created_at": "2024-10-01T00:27:43Z",
      "updated_at": "2024-10-01T12:45:50Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4ApN0z",
        "body": "Yes, put it into niri xkb options: https://github.com/YaLTeR/niri/wiki/Configuration:-Input#layout\r\n\r\n`options \"caps:ctrl_modifier,ctrl:swapcaps\"`"
      },
      "user": {
        "login": "thepragandsensdiary",
        "avatar_url": "https://avatars.githubusercontent.com/u/182240812?u=a93d9c21c0e0c1ce194c2613e992593cb4cd9355&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbsAa",
      "number": 704,
      "title": "some questions :",
      "body": "Hello, for the waybar tooltips that remain in the background, is there a way to move them to the front.\r\nI tried to put waybar in “overlay” mode but I don't have the tooltips at all.\r\nhttps://github.com/YaLTeR/niri/wiki/Layer%E2%80%90Shell-Components\r\n\r\nfor discord i have the same problem as here https://github.com/YaLTeR/niri/issues/405 is there a way to launch it without changing packages?\r\n",
      "created_at": "2024-09-30T08:40:50Z",
      "updated_at": "2024-09-30T09:31:14Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Manix80",
        "avatar_url": "https://avatars.githubusercontent.com/u/78910839?u=84d6d56cb0d6f84238c306255b6386b80b08394b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abq0l",
      "number": 700,
      "title": "GPU Reset Recovery",
      "body": "On KDE and wlroots compositors, the compositor will try to recover the session if the GPU driver crashes.\r\n\r\nCan niri do the same with smithay?",
      "created_at": "2024-09-29T20:13:34Z",
      "updated_at": "2024-09-29T22:41:35Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "travankor",
        "avatar_url": "https://avatars.githubusercontent.com/u/38744110?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbrBM",
      "number": 701,
      "title": "SDDM do not start a dbus-session on niri.",
      "body": "SDDM display manager do not start a dbus-session on niri, but it does on hyprland. Filepicker for example won't work on niri unless the application is started with dbus-launch.\r\n\r\nFor having a dbus-sessoin on niri I must first login on hyprland, logout, then login on niri.\r\n\r\nniri-session also won't start a dbus-session (I'm using systemd).\r\n\r\nAny help to debug this would be appreciated.",
      "created_at": "2024-09-29T22:30:23Z",
      "updated_at": "2024-09-29T22:31:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "abdeoliveira",
        "avatar_url": "https://avatars.githubusercontent.com/u/80419593?u=fb051faff81ef51ad2d084f57f250defa7e51186&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbpgT",
      "number": 694,
      "title": "`left-focused-column`, keep any focused window to the left",
      "body": "I wish to have the focused window to shift left to the screen always, whilemoving left/right.\r\n\r\nCurrently when I do mod+left, focus is behaving like I want to, stays on left, and mod+right has the same behavior (window stays to the right edge), I want the moving windows to stick to the left edge.\r\n\r\nI've tried as per the suggestion in [matrix](https://matrix.to/#/!KIjqiaZyJFkPXxMmGQ:gnome.org/$QwYyXZ13SK-syJqW5dFZ3Zk2HOCq_rmWYnHVom3CBmY?via=gnome.org&via=matrix.org&via=matrix.opulus.space)\r\n\r\nbinding to Mod+Left with `spawn bash focus-left.sh`\r\n```bash\r\nniri msg action focus-column-left # -right for Mod+Right\r\nniri msg action maximize-column\r\nniri msg action maximize-column\r\n```\r\n\r\nBut it is pretty jarring and bouncy.",
      "created_at": "2024-09-28T15:23:04Z",
      "updated_at": "2024-09-29T06:02:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "phanirithvij",
        "avatar_url": "https://avatars.githubusercontent.com/u/29627898?u=e4759afd392b12a607ac5a9d6b1bbf66194d470f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abpl-",
      "number": 695,
      "title": "Add `workspace_idx` to `niri msg -j windows` output",
      "body": "I'm trying to script a window switcher for Niri with a dmenu-like program, and I'd like to display the workspace index (the one shown by waybar, which appears as `idx` in the output of `niri msg -j workspaces`) next to the window title. I get the needed information by parsing the output of `niri msg -j windows`, but the `idx` is missing: I know that I can use another command, like `niri msg -j workspaces | jq '.[] | select(.id == $my_id) | .idx'`, but I'm wondering why it wasn't included in the first place.",
      "created_at": "2024-09-28T17:42:49Z",
      "updated_at": "2024-09-28T20:23:03Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "itshog",
        "avatar_url": "https://avatars.githubusercontent.com/u/130040841?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abaxq",
      "number": 672,
      "title": "scroll_factor support?",
      "body": "Currently, it doesn't seem possible to specify a `scroll_factor` in the input section (like sway, for example). Is that possible to add?",
      "created_at": "2024-09-15T17:31:52Z",
      "updated_at": "2024-09-28T16:00:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "elipp",
        "avatar_url": "https://avatars.githubusercontent.com/u/1861512?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abo42",
      "number": 688,
      "title": "Scratchpads?",
      "body": "Hi, i just found this project and it looks really interesting. I read somewhere that there is a plan to add support for floating windows. So im wondering if scratchpads is also a feature that you are planning to add?",
      "created_at": "2024-09-27T20:32:00Z",
      "updated_at": "2024-09-28T12:02:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ecribia",
        "avatar_url": "https://avatars.githubusercontent.com/u/112915552?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbBHa",
      "number": 618,
      "title": "0.1.8 on NixOS crashing the system",
      "body": "Running NixOS 24.05, I was using niri 0.1.6 from NixOS stable before. Today I tried running 0.1.8 from NixOS unstable – from the tty using `exec niri --session`, as I was doing before. niri outputs some logs and then there is just a black screen and the system seems to have been totally halted (not even able to switch to a different tty via keyboard). I need to turn the laptop off. The first time after turning it on again, the screen stays black. I need to turn it off a second time until it gets back to life. So it seems something really severe stuff happening there.\r\n\r\nI experienced a few kernel panics before with niri, while something like this never happened with Hyprland.\r\n\r\nThis is on a Thinkpad X1 Yoga 2nd Gen. I did not yet have time to dig deeper yet – that's why I did not open an issue yet. But is anyone else seeing these kinds of crashes?",
      "created_at": "2024-08-22T10:23:31Z",
      "updated_at": "2024-09-26T10:28:00Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "djmaze",
        "avatar_url": "https://avatars.githubusercontent.com/u/7229?u=ea656771eff62cd154b4dc5fc17b969f177909d5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AY0jy",
      "number": 290,
      "title": "Add a config to enable the NumLock key on login",
      "body": "Hi, I wasn't able to find a simple way to enable the NumLock key on login to Niri session, so I don't have to press NumLock to be able to type on numerical keyboard. In fact, I wasn't able to find any way to do that. Running the `numlockl on` command using [Numlockl](https://gitlab.com/phoepsilonix/numlockl) turns the NumLock on, but running it with spawn-at-startup or as a user systemd service doesn't. Both Hyprland and Sway have a config to enable it, so I think it would be awesome if Niri had it too.",
      "created_at": "2024-04-14T21:51:44Z",
      "updated_at": "2024-09-25T10:27:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "stepanzak",
        "avatar_url": "https://avatars.githubusercontent.com/u/99094176?u=c9ea00404bfaceff78e7a2246db193b6c06f3300&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abk2J",
      "number": 682,
      "title": "Configurable interactive resize modifier",
      "body": "Would it be possible to make the mouse resize modifier configurable?\r\nI have my caps lock mapped to Mod5 via my xkb config, and I use mod5 for all my shortcuts. It would feel more natural if I could also bind the mouse resize modifier to Mod5.",
      "created_at": "2024-09-24T06:42:29Z",
      "updated_at": "2024-09-24T10:55:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "notpeelz",
        "avatar_url": "https://avatars.githubusercontent.com/u/920910?u=570f5b4dcd99060b7748874a7b4f48e9c6882c51&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Abkdk",
      "number": 681,
      "title": "LXQt with Niri",
      "body": "Finished my setup including dimming inactive windows. Quite satisfied :)\r\n\r\n![immagine](https://github.com/user-attachments/assets/ac1b3810-73c3-42d5-a321-64fe43b55ee6)\r\n\r\nDetails here https://github.com/stefonarch/LXQt-Wayland-files#niri\r\nStarting niri is included also in https://github.com/lxqt/lxqt-wayland-session/ now.\r\n\r\nUnfortunately favorites configuration in the panel's menu is broken on smithay and has to be done atm in other sessions.\r\n",
      "created_at": "2024-09-23T19:17:56Z",
      "updated_at": "2024-09-23T19:17:56Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "stefonarch",
        "avatar_url": "https://avatars.githubusercontent.com/u/10681413?u=a2928499988ebbb05ef99547bd768ab7bbcf2fd2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbVXE",
      "number": 661,
      "title": "Animation when focus workspace by index",
      "body": "Is there any way to enable the animaton when focusing the workspace using index e.g. `focus-workspace 1` , `focus-workspace 3` etc like vertical scroll animation for workspace focus with `focus-workspace-up` / `focus-workspace-down`?",
      "created_at": "2024-09-10T15:56:34Z",
      "updated_at": "2024-09-23T12:58:26Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AodDh",
        "body": "It's already enabled on the latest git."
      },
      "user": {
        "login": "dikesh",
        "avatar_url": "https://avatars.githubusercontent.com/u/1618526?u=d0648b36282ff8e0832c5c83cedabfcf0755a5ca&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbgMM",
      "number": 679,
      "title": "wlr-layer-shell-unstable support?",
      "body": "i'd like to use [wlgreet](https://git.sr.ht/~kennylevinsen/wlgreet) as my greeter but i have no clue if niri supports this protocol. i know sway does, but i dont really wanna risk bricking greetd",
      "created_at": "2024-09-20T03:31:56Z",
      "updated_at": "2024-09-20T04:53:29Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "trolljoe",
        "avatar_url": "https://avatars.githubusercontent.com/u/161910543?u=0cc2f2ef684259b0997a180da03f43c139500704&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbcDw",
      "number": 675,
      "title": "screensharing is very resource intensive",
      "body": "I was wondering how niri is involved with screensharing and what could be the bottle necks there ~ for some reason screen sharing for me is really resource intensive to the point where every task feels really slow ~ the screen I'm usually sharing *is* a 4k screen and the machine is *just* a laptop (but a rather recent one) so it's possible that the laptop is just underspecced for this kinda task ~ but I really don't even know how to e.g. trouble shoot what *could* be slow / if I use graphics acceleration for screen sharing etc. \r\n\r\nthanks in advance <3  ",
      "created_at": "2024-09-16T07:50:03Z",
      "updated_at": "2024-09-16T09:34:35Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "MangoIV",
        "avatar_url": "https://avatars.githubusercontent.com/u/40720523?u=4fb5aed7ec9d8a8d4f82bdb0330ad91934409d7a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aba9g",
      "number": 673,
      "title": "Which program is shown near the end of the demo?",
      "body": "The README demo has an image editor at around 1:50:\r\n\r\n![image](https://github.com/user-attachments/assets/96f71d61-864e-4a29-acfc-5198a475ee0b)\r\n\r\nWhich program is this?",
      "created_at": "2024-09-15T19:36:23Z",
      "updated_at": "2024-09-15T19:56:35Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "road2react",
        "avatar_url": "https://avatars.githubusercontent.com/u/93143714?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbZhr",
      "number": 667,
      "title": "v0.1.9",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nHere are the improvements from the last release.\r\n\r\n> [!NOTE]\r\n> Packagers: niri now requires libdisplay-info.\r\n\r\n## New IPC functionality\r\n\r\nIn this release, I designed and implemented an [event stream](https://github.com/YaLTeR/niri/wiki/IPC#event-stream) in niri's IPC which lets you continuously listen to compositor events like workspace or window changes. The event stream enables taskbar applications to make correct and efficient widgets for niri.\r\n\r\nI implemented the [niri modules](https://github.com/Alexays/Waybar/wiki/Module:-Niri) for workspaces, focused window, and keyboard layout in Waybar, available in its fresh [0.11.0 release](https://github.com/Alexays/Waybar/releases/tag/0.11.0). Pull requests are open for [yambar](https://codeberg.org/dnkl/yambar/pulls/405) and [ironbar](https://github.com/JakeStanger/ironbar/pull/726) thanks to their contributors.\r\n\r\nhttps://github.com/user-attachments/assets/6fe9fc99-9246-45e3-a3b2-48ec79282cdd\r\n\r\nIPC windows and workspaces now have unique IDs, and all individual window and workspace actions can address a specific window or workspace by its ID. On the command line, a new `niri msg windows` command lists all windows with their IDs, and window commands accept an `--id <ID>` argument to target a specific window, for example:\r\n```\r\n$ niri msg action fullscreen-window --id 2\r\n```\r\nAlso, there's a new `niri msg action focus-window --id <ID>` action and a new `niri msg keyboard-layouts` command.\r\n\r\nI wrote some documentation on the [programmatic access](https://github.com/YaLTeR/niri/wiki/IPC#programmatic-access) to the niri IPC socket. I also set up an [online rustdoc](https://yalter.github.io/niri/niri_ipc/) for the niri-ipc crate where I documented every IPC type and request. Please refer there when working with the niri IPC.\r\n\r\nUnfortunately, while adding ID arguments to IPC actions, I discovered a backward incompatibility trap in serde-json. The default enum representation—externally tagged—prevents you from changing a unit variant to a struct variant, because the representation gains an extra dictionary. `\"FullscreenWindow\"` becomes `{\"FullscreenWindow\":{}}`, and the former does not parse with the new definition.\r\n\r\nI decided to make a JSON breaking change, converting all unit `Action` enum variants to struct variants (with or without fields). I doubt anyone used them directly through JSON since these actions could only address the focused window or column. All enum variants that already had fields are unchanged, and the `niri msg` CLI is also unaffected.\r\n\r\nWith this breaking change out of the way, any further JSON additions should remain backward compatible, so that existing scripts and programs communicating with niri will keep working with new niri versions.\r\n\r\n## Height distribution changes\r\n\r\nOne common complaint about niri's layout was the ability to make a multi-window column not \"add up\" to the total height of the monitor. The behavior was also fairly unobvious: with two windows in a column, you resize one, and the other resizes along as expected. Then, you resize the other, but the first window doesn't react. It felt like a bug.\r\n\r\nLast time there was a design problem (unwanted scrolling with focus-follows-mouse), we quickly found a solution by brainstorming in a Discussion. So, I made a big write-up about window heights in https://github.com/YaLTeR/niri/discussions/593. While there hasn't been much *discussion*, the act of laying out in writing all considerations and constraints had spawned a potential solution in my mind, which turned out to work quite well.\r\n\r\nIn this release, I reworked the window height distribution to do the *expected thing* in more cases. A column of two or more windows will always try to match the monitor height, as long as the minimum window sizes allow that. Resizing one window will resize all other windows in a column proportionally. The window that you resized last retains its height just like before, which lets you size one window in a column exactly to fit something, unaffected by adding more windows into the column, or moving it across monitors.\r\n\r\nKeep in mind that a single-window column can still be resized arbitrarily, including shorter or taller than the monitor. Until floating windows are implemented, this is necessary for some uses that require exact-sized windows.\r\n\r\nhttps://github.com/user-attachments/assets/d4f35887-a275-4531-a223-d518b6ebee8b\r\n\r\nAdditionally, I found and fixed a small issue where windows in a column would occasionally \"snap\" to a smaller size when resizing.\r\n\r\n### Preset window heights\r\n\r\n@TheAngusMcFire implemented a `preset-window-heights` layout option and a corresponding `switch-preset-window-height` bind, which work like the existing column width presets.\r\n\r\nBy default, it's bound to <kbd>Mod</kbd><kbd>Shift</kbd><kbd>R</kbd>, which is consistent with <kbd>Shift</kbd> making resize binds affect the height rather than the width. The default bind to resetting the window height therefore moved to <kbd>Mod</kbd><kbd>Ctrl</kbd><kbd>R</kbd>. (None of this affects you if you already have a niri config; you'll need to add any new binds manually.)\r\n\r\n## Output names\r\n\r\nYou might be familiar with this sight:\r\n```\r\n$ niri msg focused-output\r\nOutput \"Unknown Unknown Unknown\" (DP-1)\r\n  ...\r\n```\r\n\r\nThanks to @cmeissl finishing the [libdisplay-info bindings](https://crates.io/crates/libdisplay-info), this sight is no more.\r\n```\r\n$ niri msg focused-output\r\nOutput \"Acer Technologies XV320QU LV 420615FCD4200\" (DP-1)\r\n  ...\r\n```\r\n\r\nFollowing this, all throughout niri I implemented the ability to address outputs by name. This includes config `output`, `map-to-output`, `open-on-output`; `niri msg output`; wlr-output-management tools (wdisplays, kanshi); and xdg-desktop-portal-gnome screencasting where the screen selector will now show the monitor model and screencast session restore will remember the output name rather than the connector.\r\n\r\n![xdg-desktop-portal-gnome monitor selector showing monitor models](https://github.com/user-attachments/assets/800b4800-aeed-4847-a918-a5e32cc6c2b1)\r\n\r\nThe recommended way to configure everything output-related is now by name (as shown in `niri msg outputs`). This way, configuration does not depend on the connector name that can be non-deterministic with multiple GPUs or when using thunderbolt docks.\r\n```\r\n// Previously: output \"DP-1\" {\r\noutput \"Dell Inc. Dell S2716DG #ASOwvAqQj0Dd\" {\r\n    mode \"2560x1440@143.998\"\r\n    // ...\r\n}\r\n```\r\n\r\nI was also finally able to change the monitor sorting order to use the output name rather than the connector name, once again making it more deterministic. Note that this may swap your monitor positions if you were using multiple monitors and haven't manually configured them.\r\n\r\n## Transactional updates\r\n\r\nOne of Wayland's premises is that \"every frame is perfect\" ~~except the first one~~. The compositor is in full control of the display, and window state changes are atomic and correlate to specific compositor requests.\r\n\r\nThis allows the compositor to synchronize updates for multiple windows: render the old state until all windows update, then switch to the new state all at once, with no broken frame in between.\r\n\r\nHowever, possible doesn't mean easy, and different kinds of transactional updates need different approaches in the code. For this release, I implemented two relatively common cases.\r\n\r\n### Resizing\r\n\r\nThanks to the scrollable tiling nature, niri doesn't need to synchronize resizes among all windows on a workspace. However, windows in one column must still resize in unison: they must have the same width, and their heights must add up exactly to the monitor height.\r\n\r\nhttps://github.com/user-attachments/assets/8e1be961-5b72-4fb6-a769-a36cdc830313\r\n\r\n### Closing\r\n\r\nClosing a window resizes all other windows in the column to take up the freed space. Normally, resize and close animations hide this, but if you disable animations, the flicker becomes very noticeable. The closing transaction fixes this: niri waits until other windows have resized before hiding the closed window.\r\n\r\nhttps://github.com/user-attachments/assets/97c87ce9-3cc8-415d-92c1-4cfeb2260173\r\n\r\n## On-demand VRR\r\n\r\nThanks to @my4ng, we now have *on-demand* variable refresh rate as a window rule.\r\n\r\nSome monitors flicker at the lowest VRR refresh rate, some drivers have VRR bugs, and some clients don't handle VRR too well. Now, niri can enable VRR only when a specific window is on screen (for example, a video player, or a game), thereby avoiding most of those issues.\r\n\r\nConfigure your output with `on-demand=true`:\r\n```kdl\r\noutput \"Acer Technologies XV320QU LV 420615FCD4200\" {\r\n    // ...\r\n    // This will keep VRR off unless enabled by a window rule.\r\n    variable-refresh-rate on-demand=true\r\n}\r\n```\r\n\r\nThen, add `variable-refresh-rate true` window rules as necessary:\r\n```kdl\r\n// Enable VRR when mpv is on screen.\r\nwindow-rule {\r\n    match app-id=\"^mpv$\"\r\n    variable-refresh-rate true\r\n}\r\n```\r\n\r\n## NVIDIA flickering fix\r\n\r\nThere was a problem with NVIDIA flickering on niri, which the user could fix by enabling the `wait-for-frame-completion-before-queueing` debug flag. Turns out, this was only necessary because ages ago I forgot to add a check in the code. 🤦\r\n\r\nStarting from this release, you should no longer need to set that debug flag, and NVIDIA GPUs should no longer flicker on niri out of the box (fingers crossed).\r\n\r\n## Small UX improvements\r\n\r\nThe horizontal touchpad swipe gesture will no longer go past the first or last column on the workspace.\r\n\r\nhttps://github.com/user-attachments/assets/a92349e6-bc45-40b1-89d6-57f2e7fd068c\r\n\r\nAnd focus-follows-mouse will no longer \"catch\" windows on workspaces as you're switching away from them, which is especially important when using the new workspaces bar modules.\r\n\r\nhttps://github.com/user-attachments/assets/ca6e4b17-13aa-476d-ada8-313c4a5f5c7c\r\n\r\n## Other improvements in this release\r\n\r\n- Niri will now attempt to read the config file from `/etc/niri/config.kdl` when `~/.config/niri/config.kdl` is missing.\r\n- Added an `always-center-single-column` layout option that makes a single column on a workspace always centered (thanks @elkowar).\r\n- Switching a workspace by index and back-and-forth is now animated the same way as switching a workspace up or down.\r\n- On-demand layer-shell surfaces will now automatically get focus when they appear, which works better with some application launchers like `lxqt-runner`.\r\n- Added a `NIRI_DISABLE_SYSTEM_MANAGER_NOTIFY` environment variable; when set to `1` it will suppress niri's own notification to systemd or `NOTIFY_FD`. This is useful for some custom systemd setups like uwsm.\r\n- Niri will try harder to light up monitors, which may help it get a better resolution on some multi-monitor setups on some hardware.\r\n- Fixed xdg-desktop-portal-gnome unable to open a file chooser from Xwayland windows.\r\n- Fixed crashes when a resume from suspend or a monitor power-on sends bogus vblank events on some hardware.\r\n- Fixed `niri msg action do-screen-transition` rendering wrong across monitor scale and transform changes.\r\n- Fixed `move-column-to-workspace` to a different output only moving one window and not the whole column.\r\n- Fixed `set-window-height N%` actually trying to use 100×N% height.\r\n- Fixed niri not informing layer-shell surfaces of changes to preferred scale and transform.\r\n- Portal screencasts now use damage to reduce unnecessary rendering.\r\n- Improved portal screencast frame timing to fix an occasional stuck wrong frame and niri sometimes sending frames too often.\r\n- Fixed unsync subsurfaces of layer-shell, cursors, and DnD icons not causing output redraws when they should. (Does anything even use those currently?)\r\n- Exclusive layer-shell surfaces are now preferred for keyboard focus to on-demand layer-shell surfaces on the same layer.\r\n- Updated Smithay:\r\n    - Fixed layer-shell pop-up menu cursor input being slightly offset.\r\n    - Fixed inverted scroll direction when running the compositor as a nested window.\n\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.9'>v0.1.9</a>.</em>",
      "created_at": "2024-09-14T11:44:07Z",
      "updated_at": "2024-09-15T19:54:01Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbZ5u",
      "number": 669,
      "title": "Window Rule: Set Window Height",
      "body": "It would be nice to be able to set the proportional height of a window via a window rule. Similar to default-column-width, have something like default-window-height. This would be useful for apps that look out of place at full height of the monitor. For example a calculator app, setting terminal to half height on a 4k monitor, etc.",
      "created_at": "2024-09-14T21:11:30Z",
      "updated_at": "2024-09-14T21:12:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "garrettwp",
        "avatar_url": "https://avatars.githubusercontent.com/u/9434840?u=bf70647916946232c6debc735d0d0688a65cfa0e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbZk6",
      "number": 668,
      "title": "Popup window",
      "body": "Please add windows in popup format. It is not convenient when copyq pops up on the right side of the screen instead of in the center.",
      "created_at": "2024-09-14T13:19:51Z",
      "updated_at": "2024-09-14T13:26:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "IVKLD",
        "avatar_url": "https://avatars.githubusercontent.com/u/54883747?u=560384f91b0537e0bf425ccf21e9f051019c4fc9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbLlg",
      "number": 645,
      "title": "Disabling workspaces",
      "body": "Hey!\r\n\r\nI'm curious if there is a way to completely disable user-facing interactions with workspaces (i.e. rely *only* on the scrolling on one workspace per output).\r\n\r\nI got pretty far by simply removing all the workspace related stuff from my configuration, but the one thing that remains is that when disconnecting an output its \"workspace\" gets moved to another output and (if you've removed all workspace keybindings) becomes inaccessible.\r\n\r\nIf this can be toggled somehow (e.g. merging workspaces into the workspace of the primary screen), that'd be great.\r\n\r\nWhy do this: I like simple things, and Niri's model is pretty excellent for that. Workspaces are an abstraction I don't need that takes up valuable \"keyboard real estate\".\r\n\r\nIf this isn't in Niri itself, I guess it might be doable through RPC interactions with Niri without changing the code?",
      "created_at": "2024-09-02T08:01:49Z",
      "updated_at": "2024-09-07T15:58:05Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "tazjin",
        "avatar_url": "https://avatars.githubusercontent.com/u/1552853?u=f08981a116a19ad520316b71e37e38017300d5c7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbDC5",
      "number": 626,
      "title": "[Feature Request] Scratchpads",
      "body": "Definition: For the uninitiated, scratchpads are essentially programs you can define in config as special windows, which lets you summon them once then freely dismiss and summon them with same keybinding. \r\n\r\nUsecase: Scratchpads are useful if you have a couple of things you need in more than one workspace and don't want to scroll or change workspaces to find them. For example, a calculator which you can start/summon/dismiss with meta-f7 lets you use it without hassle in either budgeting for month or doing accounting/math/homework/gaming. Notepad-like editors and things like obsidian and floating terminals are also convenient when they are one keychord away from summoning/dismissing. \r\n\r\nWms that implement them: Then ones I know are xmonad, i3, hyprland. There are probably more.",
      "created_at": "2024-08-24T20:17:03Z",
      "updated_at": "2024-09-07T10:44:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KoshulaDora",
        "avatar_url": "https://avatars.githubusercontent.com/u/97489280?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbQ5-",
      "number": 656,
      "title": "open on workspace by id",
      "body": "allow the `open-on-workspace` rule to specify workspace by id",
      "created_at": "2024-09-06T17:16:05Z",
      "updated_at": "2024-09-07T06:28:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "hollymlem",
        "avatar_url": "https://avatars.githubusercontent.com/u/35699052?u=3f0286f934e0fef5a79789cbaac71541e1f57ca5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaJ8P",
      "number": 466,
      "title": "The last column in a workspace which is non-full-width can have empty space on the right",
      "body": "...when using the touchpad gestures. Keyboard shorcuts work \"correctly\" (correct being what I want :), hehe).\r\n\r\nI guess this was done to indicate that new windows spawn on the empty space at right, similar to the empty workspace at bottom.\r\n\r\nBut:\r\n1. Having consistency between keyboard and touchpad behaviours might be nicer.\r\n2. In the bottom/empty workspace case, we kinda need it with the current UX. In this case we don't necessarily need it per se.\r\n3. You need to be careful and precise with sideways touchpad gestures if you are working with a non-full-width column at the extreme start or end of a workspace, otherwise it throws the neighboring column out of the view hindering multitasking.\r\n\r\nI don't have an ultra-wide but I guess this might annoy those users too as they would have non-full-width-columns more often.\r\n\r\nA solution:\r\nOnly switch one (or N) column/s at most no matter the \"strength\" of the touchpad gesture, or expose some granular gesture config parameters to the same effect. I don't know which I would prefer.",
      "created_at": "2024-06-24T03:38:00Z",
      "updated_at": "2024-09-06T22:27:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "salman-farooq-sh",
        "avatar_url": "https://avatars.githubusercontent.com/u/46742354?u=62db47ed81fdd320147a6e2a8c3bc595d5e8cda5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbRD0",
      "number": 657,
      "title": "Feature Request: Animation/Visual indication when moving workspaces",
      "body": "I'd really appreciate an animation when moving workspaces (e.g. Super + Shift + PgUp/PgDown). \r\nCurrently it doesn't indicate that you moved a workspace at all, and I find myself accidentaly moving workspaces without even realizing and then being confused where my windows disappeared.\r\n\r\nAlternatively there should at least be some indication that something happened.\r\n\r\nBy the way, thanks for your work on Niri! It's pretty amazing so far, and can't wait to see where this will be in the future.",
      "created_at": "2024-09-06T20:39:35Z",
      "updated_at": "2024-09-06T20:52:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "GallowsDove",
        "avatar_url": "https://avatars.githubusercontent.com/u/71831019?u=a433b21d885c536f9cbd03bb6a13ce29caf587fe&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbP7i",
      "number": 653,
      "title": "SwitchPresetWindowHight, Command to cycle proportional hight similar to SwitchPresetColumnWidth but for the window hight.",
      "body": "I find myself reaching to the mouse every time I want to resize a window within a column which contains multiple windows. \r\nI usually have 2 windows per column and the upper one is about 3 quarters the high of the monitor. \r\nI would like to implement a command similar to SwitchPresetColumnWidth but for quickly changing the height. \r\nI would like to add another config section which would contain the height proportions which the windows can have, and the command.\r\nIs this something you might be interested in, or have some other ideas regarding a solution?",
      "created_at": "2024-09-05T18:35:02Z",
      "updated_at": "2024-09-05T18:49:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "TheAngusMcFire",
        "avatar_url": "https://avatars.githubusercontent.com/u/43189215?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbPq1",
      "number": 652,
      "title": "Wrapping Monitor Index",
      "body": "It would be nice to have a single hotkey for moving windows across monitors that will wrap back to the initial screen when done with the (likely small) list.\r\n\r\nThis can likely be achieved very simply, as it simply goes to monitor index 0 when at the last index.\r\n\r\nFurthermore, this can be made as default behavior for windows within a workspace and so on.\r\n\r\nFor example, in awesomewm, Ctrl+O can be used to cycle through monitors for which a window will be sent, so you do not need to waste another key binding on doing the cycle \"right-to-left\", since a person likely has ~ <=4 monitors anyway.\r\nSimilarly, awesomewm uses cycling with Ctrl+J or Ctrl+K binds for focusing or moving windows.\r\n\r\nEven selecting modes for layout uses cycling there as well.\r\n\r\nI have seen that there is an 'alternative' way to focus windows that moves to the next workspace if at the last window, but this bit less natural IMO.  It is great to keep this and all alternatives possible, but cycling seems to be a key missing feature.\r\n\r\nCycling through each window, workspace, monitor, and so on is a concept that I think would greatly benefit niri.",
      "created_at": "2024-09-05T14:20:50Z",
      "updated_at": "2024-09-05T14:42:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "chaxor",
        "avatar_url": "https://avatars.githubusercontent.com/u/1639151?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbDCm",
      "number": 625,
      "title": "Change default config?",
      "body": "Hi there! I'm currently building my own personal universal-blue image, with the Niri repos added, and I wanted to add my configuration directly as the default configuration into the system image.\r\n\r\nThe documentation suggests that Niri never reads a default configuration from a place such as i.e `/etc/xdg/niri`, and will instead dump the default configuration into `$XDG_USER_HOME/niri` / `$HOME/.config/niri`.\r\n\r\nOn top of that I've found no place I could override the resources (e.g change [this](https://github.com/YaLTeR/niri/blob/main/resources/default-config.kdl))\r\n\r\nCan anyone give me a pointer?",
      "created_at": "2024-08-24T19:56:20Z",
      "updated_at": "2024-09-05T13:46:56Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4An0wd",
        "body": "So:\r\n1. If `~/.config/niri/config.kdl` exists, load that.\r\n2. If `/etc/niri/config.kdl` exists, load that.\r\n3. If neither of these exist, write the built-in default config into `~/.config/niri/config.kdl`.\r\n\r\nSomething like this?"
      },
      "user": {
        "login": "cyrneko",
        "avatar_url": "https://avatars.githubusercontent.com/u/58338843?u=9ba7494e43d409a979a54c43ef0d0c1bf4a18beb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbN4U",
      "number": 648,
      "title": "Ability to match windows based on output",
      "body": "\r\nI am using a laptop but sometimes I plug a cable to my vertical monitor (well, it's just a regular horizontal monitor which I rotated). However, because the width in the vertical monitor is so small, it feels pointless to have two columns showing in that monitor, and it would be nice to have columns opened maximized by default instead. \r\nSo that's why I am asking window rules to be able to match windows based on what output it is opened. ",
      "created_at": "2024-09-03T23:37:41Z",
      "updated_at": "2024-09-04T05:15:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "thairanaru",
        "avatar_url": "https://avatars.githubusercontent.com/u/106037630?u=24331be0e8c9230197196db990021178a5a92a2c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa_C_",
      "number": 612,
      "title": "what is the best way to get workspaces to work",
      "body": "Hi! I'm using waybar and I would love to have workspaces displayed in the bottom left. From the documentation in waybar, this should work with the use of the `wlr/workspaces` module. \r\n\r\nIs there anything special I have to do wrt `niri` to get this to work? \r\n\r\nThanks in advance!",
      "created_at": "2024-08-20T08:22:10Z",
      "updated_at": "2024-09-03T15:41:15Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AnqMt",
        "body": "Hi, the wlr workspaces protocol was in stasis in wayland-protocols merge requests last time I checked, and niri itself currently lacks a good IPC to implement a niri-specific module properly. That said, there's been some workarounds: https://github.com/YaLTeR/niri/discussions/356"
      },
      "user": {
        "login": "MangoIV",
        "avatar_url": "https://avatars.githubusercontent.com/u/40720523?u=4fb5aed7ec9d8a8d4f82bdb0330ad91934409d7a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbHlG",
      "number": 635,
      "title": "Implement dimming of inactive windows",
      "body": "For inactive windows, it would be great to be able to adjust the color saturation and brightness. The dimming should be smooth. In my opinion, it's nice and useful for those who don't like the focus-ring and border.",
      "created_at": "2024-08-29T13:26:08Z",
      "updated_at": "2024-09-03T04:41:02Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alexdev16",
        "avatar_url": "https://avatars.githubusercontent.com/u/3262292?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZ_fX",
      "number": 435,
      "title": "`niri/workspaces` module for waybar",
      "body": "I don't know if this is actually a feature request or if this already exists and I'm not finding it.\r\nIt would be useful to have something to show Niri's workspaces in Waybar like Sway and other WMs are doing.",
      "created_at": "2024-06-12T19:41:01Z",
      "updated_at": "2024-09-02T12:13:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "egolep",
        "avatar_url": "https://avatars.githubusercontent.com/u/71430597?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbJeo",
      "number": 644,
      "title": "Help setting up login through GDM without systemd",
      "body": "Hey, I'm running Niri on Void Linux (so runit instead of systemd is the main concern). I had everything working, and then I decided to mess with the config without backing it up so now... it doesn't work. I can still launch niri from a TTY and have everything running as expected, but I can't seem to get GDM to launch niri.\r\n\r\nHere's my current setup:\r\n\r\n I've been building directly from the repo with cargo with a script to auto copy the built files over, the script is\r\n\r\n```shell\r\ncargo build --release --no-default-features --features dbus,xdp-gnome-screencast\r\nsudo cp --verbose target/release/niri /usr/bin/\r\nsudo cp --verbose resources/niri-session /usr/bin/\r\n# sudo cp --verbose resources/niri.desktop /usr/share/wayland-sessions/\r\nsudo cp --verbose resources/niri-portals.conf /usr/share/xdg-desktop-portal/\r\n```\r\n\r\nThe relevant services I have starting with the system are\r\n- alsa\r\n- avahi-daemon\r\n- chronyd\r\n- crond\r\n- dbus\r\n- gdm\r\n\r\n\r\nMy `/usr/share/wayland-sessions/niri.desktop` file, which gdm uses is\r\n\r\n```desktop\r\n[Desktop Entry]\r\nName=Niri\r\nComment=A scrollable-tiling Wayland compositor\r\nExec=dbus-run-session niri --session\r\nType=Application\r\nDesktopNames=niri\r\n```\r\n\r\nAgain, running `dbus-run-session niri --session` from a TTY works perfectly, so I think the problem here is more related to GDM (so advice on debugging gdm launches might also be helpful!)\r\n\r\nThanks!",
      "created_at": "2024-09-01T01:34:25Z",
      "updated_at": "2024-09-01T15:24:33Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "ChrisW-B",
        "avatar_url": "https://avatars.githubusercontent.com/u/2490974?u=4d74d51e38e649c6275f744c931e098eee4e26b6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbHle",
      "number": 636,
      "title": "Implement something like tab mode",
      "body": "when several windows are combined into one window. This will improve the work with the alacritty terminal",
      "created_at": "2024-08-29T13:31:59Z",
      "updated_at": "2024-08-29T14:24:02Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alexdev16",
        "avatar_url": "https://avatars.githubusercontent.com/u/3262292?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbDOt",
      "number": 629,
      "title": "how to get rid of keybinds message window on startup",
      "body": "hello i know i might sound dumb but how to get rid of keybinds message window on startup. In the config file its not in spawn at startup section and i cant seem to find it anywhere",
      "created_at": "2024-08-25T07:46:29Z",
      "updated_at": "2024-08-26T07:35:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Asteroth2018",
        "avatar_url": "https://avatars.githubusercontent.com/u/99032904?u=0239fc7761dc3f25d5f18569dc2342fe4a0ed3d6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZURF",
      "number": 335,
      "title": "expose active keyboard layout",
      "body": "hey,\r\nit would be nice if we can expose the active keyboard layout, such as to e.g. visualize this like with waybar for sway / hyprland.\r\ni don't know if there is a standard way to do this.\r\n",
      "created_at": "2024-05-09T17:37:45Z",
      "updated_at": "2024-08-25T09:04:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbCn8",
      "number": 623,
      "title": "Overview that shows the monitor and the workspace I'm on and the window I'm on!",
      "body": "![Frame 1 (2)](https://github.com/user-attachments/assets/c3ac573c-16b9-40f5-b158-54bff5b7eb68)\r\n",
      "created_at": "2024-08-24T00:00:17Z",
      "updated_at": "2024-08-24T04:19:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "r4hulrosh4n",
        "avatar_url": "https://avatars.githubusercontent.com/u/51088594?u=7cb1bd4fc824b473d0d42269221aa864b79c54f8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbCHd",
      "number": 622,
      "title": "New Message - Active Window for Output",
      "body": "I'm writing a Waybar module to display the window title. I would like each output to display the active window for that output.\r\n\r\nI don't believe this is possible with the current messages available.\r\n\r\nI know we have `focused-window`, but that doesn't allow for filtering by output and technically there can only be one focused window across all outputs.\r\n\r\nIs there any way to get the information I rrequire?",
      "created_at": "2024-08-23T12:24:20Z",
      "updated_at": "2024-08-23T12:42:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rawkode",
        "avatar_url": "https://avatars.githubusercontent.com/u/145816?u=f080bb722a4d659609e29c098269f2eae314c62c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbBoK",
      "number": 621,
      "title": "What is this applications module(?) in the bar shown in the wiki?",
      "body": "Saw this with the 5 alactritty icons on top, what bar/module/etc is that? :eyes: \r\n\r\n![image](https://github.com/user-attachments/assets/5d578e0f-e0b4-4fd4-9b52-af3d235b9fed)\r\n",
      "created_at": "2024-08-22T22:10:11Z",
      "updated_at": "2024-08-24T15:58:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "ThatOneCalculator",
        "avatar_url": "https://avatars.githubusercontent.com/u/44733677?u=a15c7592804dbcdf5f7690b8e95fcfde3ce3f5a3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa_kl",
      "number": 613,
      "title": "Config to freeze mouse while scrolling windows",
      "body": "As an alternative to the scroll amount percentage config, I think it might be cool to have the mouse freeze in place while a window is in the process of moving/scrolling over. This would largely be useful for focus-follows-mouse, and would prevent issues of the wrong window getting focused while the correct one is moving into focus.",
      "created_at": "2024-08-20T18:24:14Z",
      "updated_at": "2024-08-22T18:19:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Supreeeme",
        "avatar_url": "https://avatars.githubusercontent.com/u/7882157?u=00b9be59810b4811d4378441aef703e35eb970ec&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbA17",
      "number": 617,
      "title": "Set background for all outputs",
      "body": "More generally, can we add output options independent of the particular output?\r\n```\r\noutput \"eDP-1\" {\r\n    // off\r\n    mode \"1920x1080@120.030\"\r\n    scale 2.0\r\n    transform \"90\"\r\n    position x=1280 y=0\r\n    variable-refresh-rate\r\n    background-color \"#003300\"\r\n}\r\n```\r\nAlthough some like `position` may not make sense to apply to multiple outputs.",
      "created_at": "2024-08-22T03:49:18Z",
      "updated_at": "2024-08-22T10:54:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "chriselrod",
        "avatar_url": "https://avatars.githubusercontent.com/u/8043603?u=fa92d18e0e9951bdf45c63b9464e83ff0235b1e3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AbA1v",
      "number": 616,
      "title": "Vertical tiling / Row mode",
      "body": "Just documenting a discussion on preferences for implemention:\r\n\r\n- ideally changes are constrained to src/layout/ with as little flow-on effect as possible\r\n- single flag per output should be adequate\r\n- no abstractions are necessary, columnar terminology and logic to be left intact with divergence in the code at a minimum (just for inputs, layout, etc)\r\n- in all other respects, vertical tiles are effectively to be treated as \"sideways columns\"\r\n",
      "created_at": "2024-08-22T03:46:44Z",
      "updated_at": "2024-08-22T03:51:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "atagen",
        "avatar_url": "https://avatars.githubusercontent.com/u/11548989?u=83f102bb361f757c9d560e7cd3752270e082725c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa1Gw",
      "number": 582,
      "title": "v0.1.8",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nToday is a special day. Niri is one year old! 🥳\r\n\r\n```\r\n┌ (main) ~/s/r/niri\r\n└─ git show --format='commit %H%nCommitDate: %cd%n%n    %s' --no-patch ad3c3f8\r\ncommit ad3c3f8cefd38d2bf26b466d8e34eccde3bca443\r\nCommitDate: Thu Aug 10 14:49:38 2023 +0400\r\n\r\n    Init from smallvil\r\n```\r\n\r\nWe've come a long way since then! I am very happy with how niri is shaping up. I am especially grateful to 45 (!) contributors who have volunteered their time to improve something in the compositor over the year.\r\n\r\nWe also managed to amass more than 3000 stars, and almost 400 people in our comfy [Matrix](https://matrix.to/#/#niri:matrix.org) room!\r\n\r\nNevertheless, there's plenty to be done. Without further ado, here are the improvements from the last release.\r\n\r\n> [!NOTE]\r\n> Packagers: niri now requires pango >= 1.44 and rust >= 1.77.\r\n\r\n## Gradient border color spaces\r\n\r\nA big thanks to @CaliOn2 for overhauling gradient rendering in niri, adding support for interpolation color spaces! You can now set gradient borders to draw not just in `srgb`, but also in `srgb-linear`, `oklab` and `oklch`, the latter with support for `{shorter,longer,increasing,decreasing} hue`.\r\n\r\nWhich means that you can now have beautiful rainbow gradient borders:\r\n\r\n![Alacritty with a rainbow border via an \"oklch longer hue\" gradient](https://github.com/user-attachments/assets/8da9187b-3e44-4073-9ab2-f9cc55625892)\r\n\r\n```\r\nlayout {\r\n    border {\r\n        active-gradient from=\"red\" to=\"orange\" angle=45 in=\"oklch longer hue\"\r\n    }\r\n}\r\n```\r\n\r\nAs usual, niri gradients are rendered the same way as CSS `linear-gradient()`, so you can use any browser tool to configure them.\r\n\r\nAdditionally, @my4ng debugged and fixed gradients rendering with a sharp edge on NVIDIA, and I fixed gradient rendering being reversed at `angle=90`.\r\n\r\n## Screenshot UI pointer toggle\r\n\r\nYou can now toggle mouse pointer visibility in the screenshot UI by pressing <kbd>P</kbd>. I added a new help panel to remind you of this, and to explain how to capture the screenshot.\r\n\r\nhttps://github.com/user-attachments/assets/3d406508-9782-4d55-8b6b-1da09e6f01a0\r\n\r\nAlso, the screenshot UI now fades in. (As usual, you can [disable this animation](https://github.com/YaLTeR/niri/wiki/Configuration:-Animations#screenshot-ui-open) if you don't like it.) Finally, I fixed some minor regressions with area selection that were introduced in the fractional scaling refactor.\r\n\r\n## Key repeat for binds\r\n\r\nThanks to @salman-farooq-sh, niri now has key repeat for all binds. This is especially useful for binds that control volume and brightness. Or for having some fun by spawning a ton of windows.\r\n\r\nhttps://github.com/user-attachments/assets/fff6118e-94ca-469e-8a5f-48689d7eb330\r\n\r\nYou can disable key repeat for specific binds using the new `repeat=false` property:\r\n\r\n```\r\nbinds {\r\n    // Disable key repeat for this bind.\r\n    Mod+T repeat=false { spawn \"alacritty\"; }\r\n}\r\n```\r\n\r\n## Focus-follows-mouse improvements\r\n\r\nBeing a scrollable-tiling compositor, niri faces some unique design challenges for otherwise commonplace functionality. One particularly annoying example was unwanted view movement caused by `focus-follows-mouse`.\r\n\r\nWhen using niri, you will frequently have windows partially off-screen. With `focus-follows-mouse`, moving the cursor over such a window would focus it and scroll it into view. This is especially problematic if you have two monitors side-by-side, and just want to move the mouse to the other monitor.\r\n\r\nTo figure out the solution, I outlined all problems and possible solutions in a GitHub [discussion](https://github.com/YaLTeR/niri/discussions/491). Some very productive brainstorming followed, and a solution emerged: a view scroll threshold for `focus-follows-mouse`.\r\n\r\nIn the config, you can now set a property on `focus-follows-mouse`:\r\n```\r\ninput {\r\n    focus-follows-mouse max-scroll-amount=\"0%\"\r\n}\r\n```\r\nThis number controls how much scrolling is allowed to happen for `focus-follows-mouse` to trigger. With 0% (the new suggested default), `focus-follows-mouse` will only focus a window if it does *not* cause any scrolling. You can also set this to bigger values, e.g. 10% will restrict it to when the view scrolls no more than 10% of the screen width.\r\n\r\nhttps://github.com/user-attachments/assets/da8e0c4a-80e3-438e-9e6a-99d586e8734d\r\n\r\nI've personally been avoiding `focus-follows-mouse` in niri in the past precisely because of the undesired scrolling, but `max-scroll-amount=\"0%\"` had pretty much solved that problem, so since then I've been using it just fine.\r\n\r\nThis release has another fix to `focus-follows-mouse`: when using the always-centered mode, it will no longer cause rapid window scrolling. The issue was the way the logic interacted with pointer focus update suppression during animations.\r\n\r\n## wlr-output-management\r\n\r\n@gmorer implemented the wlr-output-management protocol, which means that you can now use third-party tools like [kanshi](https://git.sr.ht/~emersion/kanshi) or [wdisplays](https://github.com/artizirk/wdisplays) to configure the outputs in niri.\r\n\r\n![Checking display settings in wdisplays](https://github.com/user-attachments/assets/d51c28be-165c-4c77-ae2d-da9739a0696f)\r\n\r\nKeep in mind that changes applied this way are *transient* and are not automatically saved into your niri configuration, just like the `niri msg output` command.\r\n\r\n## wlr-screencopy version 3\r\n\r\nNiri had supported wlr-screencopy version 1 since v0.1.3. This was enough for screenshot tools like [grim](https://git.sr.ht/~emersion/grim), but not for screen recording tools. This was an intentional choice, as the screen recording parts of this protocol are quite complex, and need a very different implementation from the existing PipeWire screencasting.\r\n\r\nFor this release, @my4ng dived in and implemented it! Now, niri supports wlr-screencopy version 3 and you can use tools like [wf-recorder](https://github.com/ammen99/wf-recorder) and [wl-mirror](https://github.com/Ferdi265/wl-mirror).\r\n\r\nhttps://github.com/user-attachments/assets/c6991bf6-cc00-4839-b372-86f0e96cc34b\r\n\r\nAs a bonus, I found and fixed a bug in region capture with a fractional scale.\r\n\r\n## Negative struts\r\n\r\n@salman-farooq-sh implemented a small change to allow `strut` config values to go negative. It's not obvious at first why this is needed (why would you want windows to peek outside the screen bounds?), but actually, this is an elegant solution for having smaller outer gaps than inner gaps.\r\n\r\nIn niri, one of the [design principles](https://github.com/YaLTeR/niri/wiki/Design-Principles) is that opening a new window never causes existing windows to resize. Turns out, this restriction prevents differentiating horizontal inner and outer gaps. Imagine inner gaps = 10 and outer gaps = 0. A single 50%-wide window should then take exactly 50% of the screen. But then, opening a second window introduces an inner gap, so now the first window must occupy (50% minus a half gap), requiring a resize!\r\n\r\nNegative struts work around this problem. All gap values remain equal, but you can use left and right strut values equal to negative gap size to \"push\" the \"outer\" gaps off-screen. Visually, this looks the same as having no outer gaps, while not causing any unintended window resizes.\r\n\r\n![Inner gaps without outer gaps in niri](https://github.com/user-attachments/assets/a5eae901-601e-4633-8ac9-cec8b35a7b93)\r\n\r\n```\r\nlayout {\r\n    gaps 16\r\n\r\n    struts {\r\n        left -16\r\n        right -16\r\n        top -16\r\n        bottom -16\r\n    }\r\n}\r\n```\r\n\r\n## PipeWire screencast fixes\r\n\r\nI implemented the full DMA-BUF modifier negotiation procedure for PipeWire screencasts (when using xdg-desktop-portal-gnome). As an immediate benefit, it makes screencasting work on NVIDIA. It should also fix GStreamer-based screen recording tools like [Kooha](https://github.com/SeaDve/Kooha), however, I have not been able to get this to work just yet. Perhaps it'll start working with the next PipeWire release? We'll see.\r\n\r\n## Wiki configuration snippet tests\r\n\r\nThis is not directly related to running niri, but is very cool nonetheless! @Suyashtnt implemented a test that verifies that every single config example [on the wiki](https://github.com/YaLTeR/niri/wiki/Configuration:-Overview) successfully parses. Combined with the fact that every single config option has an example code block, we should be very much set to catch any unintentional config parsing regressions.\r\n\r\n## Nightly COPR\r\n\r\nWith some help from @my4ng, I set up a COPR with automatic git niri builds: https://copr.fedorainfracloud.org/coprs/yalter/niri-git\r\n\r\nTurns out, this is quite easy, and involves adding a special template .spec file into the repository, and setting up a webhook so GitHub can tell COPR to trigger a build when the main branch is updated.\r\n\r\nIf you run Fedora, you can use this new COPR to stay more up-to-date with niri development.\r\n\r\n## Other improvements in this release\r\n\r\n- Implemented on-demand keyboard focus mode for layer-shell surfaces, which is used by some newer bar applications.\r\n- Added `focus-window-or-monitor-{up,down}` actions (thanks @TheAngusMcFire).\r\n- Added `move-column-left-or-to-monitor-left` and `move-column-right-or-to-monitor-right` actions (thanks @brainlessbitch).\r\n- Added a `middle-emulation` flag to touchpad, mouse, and trackpoint settings.\r\n- Added a `background-color` option to outputs that sets the color of the default niri solid background. You can use this if you don't want to run any third-party background tools. Thanks @anant-357!\r\n- Added `Mod3`/`ISO_Level5_Shift` modifier support to key bindings (thanks @jpeeler).\r\n- Enabled sub-pixel glyph positioning for better kerning in niri panels.\r\n- Added a `profile-with-tracy-ondemand` build feature that produces a build with on-demand Tracy profiler integration, which you can run as your main compositor and only attach the profiler when needed.\r\n- VRR state (whether VRR is on or off for an output) is now correctly restored upon TTY switch into niri.\r\n- Fixed view scroll animation sometimes restarting on switching focus when the target view position does not change.\r\n- Fixed a rare crash that could happen when reconnecting monitors with a KVM switch.\r\n- Removed the `enable-color-transformations-capability` debug config flag. Keep in mind that changes to debug options are not considered breaking changes.\r\n- Powered-off monitors no longer turn on upon connecting a new monitor. This is a workaround for some monitors that reconnect themselves upon powering off, which made it impossible to power them off. Thanks @it-a-me!\r\n- @olistrik added optional JSON schema generation to the niri-ipc crate using schemars.\r\n- Updated Smithay:\r\n  - Fixed Chromium getting stuck after attempting to drag-and-drop text in a tab.\r\n  - Fixed fullscreen Xwayland windows freezing the screen on some NVIDIA setups.\r\n  - Fixed lock screen surface viewporter support (used for fractional scaling).\r\n  - Fixed primary plane selection on some devices where the same primary plane can be used on different CRTCs.\r\n  - Fixed cursor plane selection on some drivers that have multiple cursor planes per CRTC.\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.8'>v0.1.8</a>.</em>",
      "created_at": "2024-08-10T12:40:27Z",
      "updated_at": "2024-08-21T10:29:43Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa96-",
      "number": 610,
      "title": "configure the direction in which new displays are positioned",
      "body": "Hi ~ first of all, many thanks for this great compositor, it is really nice to use. \r\n\r\nSo the situation is as follows: I often dock my laptop on my monitor and I use the same niri config across multiple laptops. I would like the monitor to always be on top of the laptop. This is not trivial because absolute sizes differ wildly between the laptop monitors. So it would be really nice to be able to configure something like `output.positioning` with the options:\r\n- `{bottom,top}-{left,right,center}\r\n- `{left, right}-{bottom,top,centre}`\r\n\r\nThis way one wouldn't have to think of output specific logic and could just let niri set it automatically. ",
      "created_at": "2024-08-19T06:08:05Z",
      "updated_at": "2024-08-20T14:35:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "MangoIV",
        "avatar_url": "https://avatars.githubusercontent.com/u/40720523?u=4fb5aed7ec9d8a8d4f82bdb0330ad91934409d7a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa8bu",
      "number": 607,
      "title": "Make \"niri msg action spawn\" support quoted substrings",
      "body": "This would make niri msg behave more simliarly to i3msg or swaymsg and make it compatible with i3-dmenu-desktop, a wrapper script for dmenu (or wmenu) that uses .desktop files instead of just using the system PATH.",
      "created_at": "2024-08-17T18:48:58Z",
      "updated_at": "2024-08-20T10:49:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "efeme4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34747538?u=574e40e1209308b139562f9bc8e347073cfd78ec&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaSUr",
      "number": 507,
      "title": "Perform actions by client app-id/title with `niri msg`",
      "body": "This would allow me to focus my browser after running a search in my web menu script using fuzzel.",
      "created_at": "2024-07-02T18:28:54Z",
      "updated_at": "2024-08-19T16:39:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "e-tho",
        "avatar_url": "https://avatars.githubusercontent.com/u/128100160?u=a236fae00d4b8912c2b0ca3c35078e5e5dab79e5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa3pP",
      "number": 593,
      "title": "Window height design (not adding up to full screen height)",
      "body": "Currently, it's quite easy to end up with columns shorter or taller than the screen height. This can be confusing and annoying. Let's figure out a solution.\r\n\r\n### How it currently works\r\n\r\nWindow height can be in two states:\r\n1. Automatic: the window fills all available screen height.\r\n2. Fixed: fixed height in logical pixels.\r\n\r\nWhen you vertically resize a window, it becomes fixed-height. To go back to automatic, you can use a double-vertical-resize click, the `reset-window-height` action, or expel the window into a new column.\r\n\r\nFor comparison, column *width* also has a third state: proportion of a screen width as a percentage. I intentionally designed heights to *not* have a proportion state. My reasoning was that if you vertically resize a window, you probably want some particular thing to fit in it (i.e. exactly 20 lines in a terminal), and therefore the height should become fixed and not change as you move the window across monitors (which can have different height, therefore resulting in a different window height after the proportion calculation).\r\n\r\n### Constraints\r\n\r\nWayland windows have a final say in their size. They can decide to be smaller than the screen (i.e. fixed-size dialogs) or bigger than the screen. This is not really a problem as it is generally clear how to deal with this, whatever the height distribution algorithm.\r\n\r\nWindows bigger than the screen could use some way to scroll them up and down, but that is out of scope for this discussion.\r\n\r\nWindows generally tell the compositor their minimum and maximum size, so the height distribution algorithm can take this into account. The occasional client doesn't (used to be a problem with Qt), which can result in column height not matching screen height even with an automatically-sized window. That is also out of scope for this discussion.\r\n\r\nCurrently, the height distribution algorithm does not take maximum window height into account if it is different from the minimum window height (i.e., fixed size dialogs work, but windows with max height and no min height do not work). This is due to how the algorithm needs to iterate to find a fixed point solution for automatic window heights. You can either take all minimum sizes into account (what it currently does), or all maximum heights into account, but taking both into account is much more complicated (?) and I don't think it is guaranteed to find a fixed point solution (?). This is not really a problem because windows don't generally have max height that is not equal to min height.\r\n\r\n### Problems\r\n\r\n1. The main problem is that generally people expect a tiling layout to always pad the column height to the screen height. Currently, it seems to work this way right until it doesn't.\r\n\r\n    For a single-window column this is at least obvious (you resized the window => it is no longer full height). For a multi-window column it appears to work at first, because as you resize one window, the second window remains automatically-sized, and expands to fill the space. However, as soon as you also resize the second window, both windows are now fixed-height, so they no longer add up to the screen height.\r\n2. There's currently another minor problem. If you have three automatic windows in a column and resize the middle one, it will resize \"in the center\" rather than only on the edge that you are resizing. It works this way because the middle window gets a fixed height, whereas automatic top and bottom windows distribute the remaining height equally among themselves. This makes sense for a `set-window-height` key binding as it doesn't specify the edge, but it doesn't really make sense for mouse resizing. It would be nice if the new sizing algorithm would solve this.\r\n3. A related problem is that with two windows in a column, you can resize the top window by its top edge, which is weird (since it is the other edge that is resizing). I thought about this quite a bit when implementing interactive resizing, but I realized that there are way too many edge cases to handle this correctly with the current system (one example: a column with two windows, top has a min size; you resize the bottom window up by its top edge; at some point you hit the min size for the top window which would need to block you from resizing any further; this gets arbitrarily complicated with more windows with different min sizes in the column).\r\n4. There are situations where you might want window heights to work as proportions. Someone was trying to use niri for presenting (not exactly a supported case but nevertheless). They arranged windows in columns on their monitor, then moved the workspace to the projector output, which had a different resolution. The expectation was that window heights will be moved as proportions, just like column widths.\r\n\r\n    I think this problem is not particularly pressing, as this only kinda works for the specific case when your windows upscale their contents to fit the size (image/video viewers). If they don't, your layout will likely break anyway.\r\n\r\n### Things that should work\r\n\r\nHere are some important use cases that should ideally still work with whatever system we decide on:\r\n1. Resizing a single window to smaller or bigger than the screen. Useful for taking exact resolution screenshots, or for viewing videos in native resolution.\r\n2. Resizing a window in a column with many windows should not cause other windows to spontaneously change their sizes.\r\n\r\n    What I mean by this is, imagine we have a column with two small fixed-size windows, one big fixed-size window and one automatic window. When I start to resize the automatic window, if the algorithm were to change all other windows to automatic at that instant, the other windows would all spontaneously snap to exactly 1/3 of the remaining height each. This is something I'd like to avoid.\r\n3. Resizing one (or more?) window in a column to a fixed size which is then preserved when moving across monitors or when adding more windows into that column.\r\n\r\n    This is the case I mentioned above, when you have for example two terminals in a column, and you resize one of them to fit exactly 20 lines. Then you move the entire column to a second, smaller monitor. The window that you resized should remain exactly 20 lines in size, and not become smaller.\r\n6. Resizing a window should not unnecessarily fix heights of other windows in the column. I.e., moving the column to a different monitor should let things resize to that monitor's height.\r\n\r\n### Potential solutions\r\n\r\nWhile writing all of this down, I've got this rough idea in my mind. Add a \"weight\" to the automatic height state. When distributing height among automatic windows, instead of distributing it equally, distribute it according to the weights. This is similar to how [`flex-grow`](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-grow) works in CSS, or how the [fraction](https://typst.app/docs/reference/layout/fraction/) unit works in Typst.\r\n\r\nWhen resizing a window, all other windows in a column instantly change to Automatic with weights computed in such a way as to preserve their apparent visual heights. This means that as you resize a window, other windows will resize proportionally to their initial sizes, while the entire column will maintain its full height equal to the monitor height.\r\n\r\nI haven't thought too hard about this yet, let alone tried implementing it, so I'm not sure if this will work, or if it will hit some edge cases. It doesn't solve problems 2–4 but that's fine, we can do one thing at a time.",
      "created_at": "2024-08-12T08:25:26Z",
      "updated_at": "2024-08-15T08:00:22Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa4gH",
      "number": 595,
      "title": "Add an option to automatically create keybindings for numpad keys",
      "body": "On laptop I have convenient numpad  and inconvenient pageup/pagedown so I want to use numpad as well. However numpad keys and non numpad keys are not the same.\r\n\r\nAs the result right now for each numpad key I need to use three entries: the main key, numpad key(num lock off), numpad key(numlock on)\r\n\r\n```\r\n    Mod+KP_Prior       { focus-workspace-up; }\r\n    Mod+KP_Next        { focus-workspace-down; }\r\n    Mod+KP_9           { focus-workspace-up; }\r\n    Mod+KP_3           { focus-workspace-down; }\r\n    Mod+Page_Down      { focus-workspace-down; }\r\n    Mod+Page_Up        { focus-workspace-up; }\r\n````\r\n\r\nIt would be cool to have an option to generate them automatically so I don't have to bloat the config. Ideally make it so numlock can be ignored, ie have an option something like `auto-numpad-keybinding`  with  options lke\r\n\r\n* none: current behavior \r\n* numlock\r\nfor every binding that uses 9, create a keybinding(if it doesn't exist) with KP_9 instead\r\nfor every binding that uses PageUp, create a keybinding(if it doesn't exist) with KP_Prior instead, \r\n*  digits\r\nfor every binding that uses 9, create two  keybindings(if they don't exist): one  with KP_9 instead of 9 and another with KP_Prior instead of 9.\r\n\r\n*  navigation\r\nfor every binding that uses PageUp, create two  keybindings(if they don't exist): one  with KP_9 instead of 9 and another with KP_Prior instead of 9.\r\n\r\n\r\nand either have it as a separate option to apply to all bindings, or make it as a property:\r\n\r\n```\r\nMod+Page_Up clone-for-numpad=\"navigation\"       { focus-workspace-up; }\r\nMod+Page_Down clone-for-numpad=\"navigation\"     { focus-workspace-down; }\r\n```",
      "created_at": "2024-08-13T03:55:03Z",
      "updated_at": "2024-08-14T17:50:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Maykeye",
        "avatar_url": "https://avatars.githubusercontent.com/u/13607441?u=ee818d192472a91a570ad8d6baf33a83d2a1b899&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaMzj",
      "number": 474,
      "title": "changing window height",
      "body": "mouse window resize and keybind window resize allow resizing window down beyond the bottoms edge of the screen. maybe the feature is intended, but it breaks the apparent rigidity of the window stripe, with overall experience it is being strictly bounded.\r\n\r\ni propose a toggle to restrict resizing beyond bottom and top when resizing a window.\r\n\r\ngoing further, it would be awesome to have a toggle to prevent vertical resize if there is a single window in a column, so that outer column edges are fixed, and only the split can be moved up and down.",
      "created_at": "2024-06-27T05:58:19Z",
      "updated_at": "2024-08-12T08:26:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "d3m1gd",
        "avatar_url": "https://avatars.githubusercontent.com/u/3992031?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AavhX",
      "number": 573,
      "title": "Enforce fixed column height",
      "body": "In a tiler like niri, it seems counter-intuitive for windows to overflow the screen or for a single window to occupy less than 100% of the screen height. Currently, there is no support for vertical scrolling, and windows are not in float mode, making overflow constraining. It makes more sense for the columns to be fully occupied, with other windows adjusting their size when one is increased in height.",
      "created_at": "2024-08-02T20:49:13Z",
      "updated_at": "2024-08-12T08:25:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "e-tho",
        "avatar_url": "https://avatars.githubusercontent.com/u/128100160?u=a236fae00d4b8912c2b0ca3c35078e5e5dab79e5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aa3fl",
      "number": 590,
      "title": "Window rule output for niri msg focused-window",
      "body": "This also applies to pick-window: https://github.com/YaLTeR/niri/issues/589\r\n\r\nI was thinking that it could be useful to change the default/add a new output format to print window rules syntax? Something like:\r\n\r\n```\r\n$ niri msg focused-window --rule\r\nwindow-rule {\r\n    match title=\"New Issue · YaLTeR/niri — Mozilla Firefox\"\r\n    match app-id=\"org.mozilla.firefox\"\r\n\r\n    default-column-width { proportion 1.0; }\r\n    open-on-output \"DP-1\"\r\n}\r\n```\r\n\r\nTitle and app ID are printed as matchers (though, they need to be regex-escaped. How hard would that be to do?), then some properties are pre-filled with current values for copy-paste convenience.\r\n\r\nHowever, this could also be confusing, i.e. if the user copy-pastes the entire thing without thinking about it, they will have a bunch of rules set that they may not necessarily want.\r\n\r\nIf it's a new output format under a flag `--rule`, then the default output format should get the same fields, e.g.:\r\n```\r\n$ niri msg focused-window --rule\r\nFocused window:\r\n  Title: \"New Issue · YaLTeR/niri — Mozilla Firefox\"\r\n  App ID: \"org.mozilla.firefox\"\r\n  Width: proportion 1.0\r\n  Output: \"DP-1\"\r\n```\r\n\r\n---\r\n\r\nI got the idea looking at KDE where the window rule settings have a window picker where you can then click any window property to add a matcher or a rule. In niri there's no GUI settings, so I want something similar as a CLI (and of course with JSON output it's possible to make a GUI that uses this under the hood).",
      "created_at": "2024-08-12T07:02:41Z",
      "updated_at": "2024-08-12T07:04:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aazt2",
      "number": 580,
      "title": "Ambient light sensor support",
      "body": "Being able to change the screen brightness with an ambient light sensor would be great. GNOME has something like this built-in, and it works flawlessly out of the box. There are third party solutions, but they all try to do too much (i.e. turning the webcam into a faux sensor, trying to adjust gamma, time of day and geolocation, etc) and all end up failing in one way or another. If there's something in the compositor that could just watch `/sys/bus/iio/devices/iio:device0/in_illuminance_raw` (between 0 and 255) or even have a dbus listener for [`clightd`](https://github.com/FedeDP/Clightd) `busctl call org.clightd.clightd /org/clightd/clightd/Sensor/Als org.clightd.clightd.Sensor Caputure \"sis\" \"\" 5 \"\"`, that would be incredibly useful.",
      "created_at": "2024-08-08T23:26:24Z",
      "updated_at": "2024-08-09T05:31:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ThatOneCalculator",
        "avatar_url": "https://avatars.githubusercontent.com/u/44733677?u=a15c7592804dbcdf5f7690b8e95fcfde3ce3f5a3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aazfn",
      "number": 577,
      "title": "Allow for opt-in key repeat on keybind",
      "body": "While it wouldn't be ideal for most keybinds, having the option to turn key-repeat on when holding down a keybind would be great for volume and brightness control keys :)",
      "created_at": "2024-08-08T16:45:40Z",
      "updated_at": "2024-08-08T17:00:37Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ThatOneCalculator",
        "avatar_url": "https://avatars.githubusercontent.com/u/44733677?u=a15c7592804dbcdf5f7690b8e95fcfde3ce3f5a3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aauvc",
      "number": 569,
      "title": "Binds : on release",
      "body": "Trying to use `SwayOSD` for `Caps_Lock` with `binds` like so:\r\n```\r\nspawn-at-startup \"swayosd-server\"\r\n\r\nbinds {\r\n    Caps_Lock { spawn \"swayosd-client\" \"--caps-lock\"; }\r\n}\r\n```\r\nI noticed that `Niri` is grabbing the event and so the uppercase is not applied.\r\n\r\nI checked for `Sway` and apparently they use a `--release` flag to handle that case.",
      "created_at": "2024-08-02T16:47:22Z",
      "updated_at": "2024-08-02T16:48:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "RichardFevrier",
        "avatar_url": "https://avatars.githubusercontent.com/u/5154754?u=bbdab8baaf74d968b121e297c436292dc4840748&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AauU5",
      "number": 568,
      "title": "[Feature] Store app-id + title and automatically set default-column-width to last used column width",
      "body": "Similar to how  MS Windows works (if I remember correctly).\r\n\r\n- When resizing a window, niri would memorize this and, next time that I open said window, set the window to last used width (within bounds, if I accidentally resized to 0, I would not want the new window to be 0 px wide again)\r\n  - i.e. automatic default-column-width definition upon resizing a window\r\n- Open Question: How to identify windows?\r\n  - By title? By app-id? By combo? Anything else?\r\n  - I don't want Firefox to be resized based on the Firefox file picker width, etc. -> not only app-id\r\n\r\nBenefits of this approach:\r\n- No need to manually code window-rules for this\r\n- \"Automagically\" supports a change in my workflow. When I decide one day, I want window X to be of size Y, niri will understand and give me window X in size Y automatically, next time",
      "created_at": "2024-08-02T08:09:42Z",
      "updated_at": "2024-08-02T09:10:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "phuhl",
        "avatar_url": "https://avatars.githubusercontent.com/u/16835755?u=23415f912acbb882df4121b035a2b6de4faed2b8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYlvN",
      "number": 275,
      "title": "is there anyway to split config file into different parts",
      "body": "it would be much more easy to read if the config file is too long",
      "created_at": "2024-04-01T10:25:20Z",
      "updated_at": "2025-01-28T22:17:42Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AiOWP",
        "body": "big brain\nhaven't thought of this🤯"
      },
      "user": {
        "login": "ogios",
        "avatar_url": "https://avatars.githubusercontent.com/u/96933655?u=09108f0f354534e0706b13ad19f105cf8adc7d44&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYlzY",
      "number": 276,
      "title": "Scaling as a window rule",
      "body": "It would be nice to set scaling, similar to output scaling, on a per-window basis using window rules.\r\n\r\nFor example, normally I like the scaling of 1, but some applications use tiny icons and I would like to scale them specifically to 2.\r\n\r\nIs this allowed in the Wayland spec?",
      "created_at": "2024-04-01T12:02:51Z",
      "updated_at": "2024-07-24T04:35:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tversteeg",
        "avatar_url": "https://avatars.githubusercontent.com/u/2574730?u=5b2f0b48b1ad196a74a797f58f38d2efdffa81b0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4Aalfl",
      "number": 555,
      "title": "Hide cursor during screenshot",
      "body": "The ability to hide your cursor while taking a screenshot would be great :)",
      "created_at": "2024-07-23T17:07:15Z",
      "updated_at": "2024-07-23T23:35:04Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ThatOneCalculator",
        "avatar_url": "https://avatars.githubusercontent.com/u/44733677?u=a15c7592804dbcdf5f7690b8e95fcfde3ce3f5a3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaWTr",
      "number": 527,
      "title": "use NIRI_SOCKET variable in systemd user services",
      "body": "Hi everybody, \r\n\r\nI try to start 2 services which need to communicate with niri as systemd user services.\r\nOne is the xwayland-satellite and one is a rust service which uses the niri-ipc crate to communicate with niri.\r\n\r\nBoth systemd files look like that.\r\n```\r\n[Unit]\r\nDescription=Script Daemon for xwayland-satellite \r\nAfter=graphical-session.target\r\nRequisite=graphical-session.target\r\nPartOf=graphical-session.target\r\n\r\n[Service]\r\nType=simple\r\nExecStart=/usr/bin/xwayland-satellite :1000\r\nRestart=on-failure\r\n```\r\n\r\nThe problem I am having is that the services start to fast, so that the NIRI_SOCKET variable is not yet set.\r\nniri-ipc reports the missing env var.\r\nIf I restart the 2 services everything is working fine, so I think systemd is not waiting long enough  before it starts those 2 services.\r\n\r\nHas anybody done something similar or does know how I can configure the systemd service to wait for the env var to be present?\r\n\r\nSystem: Arch Linux\r\nDisplayManager: GDM\r\n",
      "created_at": "2024-07-07T16:53:31Z",
      "updated_at": "2024-07-18T18:59:18Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "TheAngusMcFire",
        "avatar_url": "https://avatars.githubusercontent.com/u/43189215?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWFeb",
      "number": 60,
      "title": "Xwayland support?",
      "body": "Is there any xwayland support?",
      "created_at": "2023-10-29T14:04:55Z",
      "updated_at": "2024-07-16T09:45:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AcSos",
        "body": "There isn't, and unfortunately due to X11 being completely cursed, built-in Xwayland support is not planned at the moment.\r\n\r\nYou can, however, use X11 apps on niri using Valve's gamescope (game-oriented), or by running Xwayland in rootful mode:\r\n\r\n1. Run `Xwayland` (just the binary on its own without flags). This will spawn a large black monitor-sized window, you can fullscreen it for convenience. In the next Xwayland version, it will be properly resizable, too.\r\n2. Run some X11 window manager in there, e.g. `env DISPLAY=:0 i3`. This way you can manage X11 windows inside the Xwayland instance.\r\n3. Run an X11 application there, e.g. `env DISPLAY=:0 flatpak run com.valvesoftware.Steam`."
      },
      "user": {
        "login": "wesbluemarine",
        "avatar_url": "https://avatars.githubusercontent.com/u/14043560?u=64d0fed553e233986596dcf1219889f91c89e636&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AabSO",
      "number": 543,
      "title": "a way to make a layer-shell component not have reserved space",
      "body": "(or at least that's how i'm wording it)\r\n\r\ncurrently, when doing maximize-column with e.g. a waybar on the right, it reserves space that takes away from the column width: ![](https://img.ayaya.dev/B1mPUpUcDOSy)\r\n\r\nusually this is fine (and of course perfectly intended given that you'd normally have a full bar there), but in my case since i have what amounts to the world's smallest widget that i don't care about overlapping the column/window contents itself, is there a way to maximize-column to the entire screen and not have any space reserved for waybar?\r\n\r\ni had a look through the config but didn't find a way to override anything related to reserved space for layer-shell (and e.g. struts right 0 doesn't do anything because it's additive)",
      "created_at": "2024-07-12T15:17:50Z",
      "updated_at": "2024-07-12T15:22:47Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "nekopsykose",
        "avatar_url": "https://avatars.githubusercontent.com/u/102837530?u=25322cc299c9bdb24a9d1cb5cf68dcf3d4abe6bd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaYkU",
      "number": 537,
      "title": "Main display",
      "body": "How to autofocus on a specific monitor?\r\n\r\nCase: connected external monitor and laptop monitor, focus is stolen by the laptop monitor.",
      "created_at": "2024-07-09T17:40:27Z",
      "updated_at": "2024-07-09T18:00:24Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "vanarok",
        "avatar_url": "https://avatars.githubusercontent.com/u/6105977?u=c7cb355e946f3c9eda84d0ebfa59715b4891b458&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaXti",
      "number": 535,
      "title": "Focus Window and Center-Column on Mod+R/L-Mouse Click",
      "body": "Hi,\r\n\r\nFirst of all, thank you for this great wm. I came from Sway with many problems, and here everything runs smoothly, even with proprietary Nvidia drivers.\r\n\r\nI work with a 34\" monitor, and `center-column` is definitely something I have always missed. However, I think it would be cool if there was a way, for example, to click on a window while holding the mod key, and have it immediately centered. Currently, it's a bit cumbersome to first focus on the window or column and then call `center-column`. Would this be possible, or is it perhaps already possible and I just overlooked it?\r\n\r\nThank you very much for the great work.",
      "created_at": "2024-07-08T19:38:23Z",
      "updated_at": "2024-07-09T07:09:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "456634",
        "avatar_url": "https://avatars.githubusercontent.com/u/78704733?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaWHe",
      "number": 526,
      "title": "Add text-input-v1 support",
      "body": "support text-input-v1 can help to make fcitx5 work in electron apps on native wayland.\r\nsupport in kde is here: [link](https://invent.kde.org/plasma/kwin/-/merge_requests/3403)\r\nsupport in Hyprland is here: [link](https://github.com/hyprwm/Hyprland/pull/1778)\r\n",
      "created_at": "2024-07-07T14:27:24Z",
      "updated_at": "2024-07-07T14:32:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ZenQy",
        "avatar_url": "https://avatars.githubusercontent.com/u/8230646?u=3503c768b30e72cd221d0166bad23ba5f9520447&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaLiQ",
      "number": 471,
      "title": "Add a `--wait` option to some `niri msg` actions.",
      "body": "I've been using `niri msg --json focused-window` to get the title of the active window, to display in a bar. This works just fine, but there is no way to know when it has changed, so I am currently running it every second.\r\n\r\nThis feels rather wasteful, and it means that there is a short delay before the title actually updates.\r\n\r\nI'd love to see a new option added to `niri msg` that allows waiting for a change before it returns. That would work perfectly with `ags` since it can run async commands and wait for the result.",
      "created_at": "2024-06-25T18:14:52Z",
      "updated_at": "2024-07-06T13:03:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "minego",
        "avatar_url": "https://avatars.githubusercontent.com/u/469128?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaURz",
      "number": 518,
      "title": "realtime render thread",
      "body": "e.g. like sway https://github.com/swaywm/sway/blob/5be5a5005164d3ccff844f4c72836cb49cbf784a/sway/realtime.c#L19 and kwin https://invent.kde.org/plasma/kwin/-/blob/b0970bd6c7c481f210c9bfcd205292cfcbbcba34/src/utils/realtime.cpp#L22 and mutter https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2060 and pipewire module-rt https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/589a06e105838c482dd25518766d8b96a79710c4/src/modules/module-rt.c#L567\r\n\r\nthe three ways are using RTKit via dbus, or using pthread_setschedparam/syscall via libc::, or using RealtimeThreadSchedulePolicy in https://docs.rs/thread-priority/latest/thread_priority (but i have no idea how to integrate that to the render thread only)\r\n\r\nit (hopefully) would lead to slightly improved presentation under load",
      "created_at": "2024-07-04T21:11:13Z",
      "updated_at": "2024-07-05T15:57:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nekopsykose",
        "avatar_url": "https://avatars.githubusercontent.com/u/102837530?u=25322cc299c9bdb24a9d1cb5cf68dcf3d4abe6bd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXiWF",
      "number": 156,
      "title": "Question: Behaviour when closing \"column-last\"",
      "body": "Hey there,\r\n\r\nassumption: 4 columns. 3 and 4 are visible, 50% split. When I close the only window in the 4th column, only column 3 is visible on the left of the screen.\r\n\r\nI'd think it would make sense that an implicit scroll to the left happens, so that 2 and 3 are visible.\r\n\r\nOpinions?",
      "created_at": "2024-02-02T09:33:54Z",
      "updated_at": "2024-07-05T12:11:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "muchgitsuchwow",
        "avatar_url": "https://avatars.githubusercontent.com/u/97453054?u=c7c1da4841c7a7d46575ea7985cbf9a67abd3b6a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaLC8",
      "number": 468,
      "title": "waypaper systemd service",
      "body": "I was using the swaybg systemd service recommended on [the wiki](https://github.com/YaLTeR/niri/wiki/Example-systemd-Setup). I decided I wanted to be able to set my wallpaper graphically, so I installed waypaper (basically nitrogen for wayland). `waypaper --restore` from the cli works great.\r\n\r\n```\r\n▷ waypaper --restore\r\nswaybg: no process found\r\nSent command to set wallpaper was set with swaybg\r\n2024-06-25 18:12:09 - [main.c:282] Found config * for output HDMI-A-1 ((null))\r\n```\r\n\r\nHowever, I'm running into issues trying to turn it into a systemd service. I created `waypaper-restore.service` in `~/.config/systemd/user`, and linked it into `niri.service.wants`\r\n\r\n```systemd\r\n[Unit]\r\nPartOf=graphical-session.target\r\nAfter=graphical-session.target\r\nRequisite=graphical-session.target\r\n\r\n[Service]\r\nType=oneshot\r\nExecStart=/usr/bin/env waypaper --restore\r\n```\r\n\r\nIt seems like it's maybe running too early or something?\r\n```\r\n▷ journalctl --user -u waypaper-restore.service|tail -5\r\nJun 25 17:41:14 phrygian systemd[1557]: Starting waypaper-restore.service...\r\nJun 25 17:41:14 phrygian env[3203]: swaybg: no process found\r\nJun 25 17:41:14 phrygian env[3207]: 2024-06-25 17:41:14 - [main.c:562] Unable to connect to the compositor. If your compositor is running, check or set the WAYLAND_DISPLAY environment variable.\r\nJun 25 17:41:14 phrygian env[3156]: Sent command to set wallpaper was set with swaybg\r\nJun 25 17:41:14 phrygian systemd[1557]: Finished waypaper-restore.service.\r\n```\r\n\r\nAs a long shot I tried setting `Environment=WAYLAND_DISPLAY=wayland-1` (the output of `$echo WAYLAND_DISPLAY`) under `[Service]`, but it didn't work. That makes sense, niri is setting it anyway, so it should be available when the service runs. \r\n\r\nAny ideas how to get this working?",
      "created_at": "2024-06-25T08:10:52Z",
      "updated_at": "2024-07-05T03:24:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "sullyj3",
        "avatar_url": "https://avatars.githubusercontent.com/u/3953669?u=37c35c963451f6ceea0ef91af23b8a8340fac39d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaSPQ",
      "number": 505,
      "title": "Color Averaging",
      "body": "the way colors are averaged when borders have 2 bright different colors\r\n(for example 0xff0000 (red) and 0x00ff00 (green)) the gradient colors in the middle are very inaccurately dark and ruin some color combinations.",
      "created_at": "2024-07-02T16:04:52Z",
      "updated_at": "2024-07-04T19:52:34Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "CaliOn2",
        "avatar_url": "https://avatars.githubusercontent.com/u/170101967?u=c4764ac92a2cdf9c9a5283df7201cd3b9aff6ada&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaRPa",
      "number": 492,
      "title": "Things look pretty similar when compared with hyprland so cant there be just plugin which can enable this type of scrolling ?",
      "body": "Just saw sample video and nothing much special i saw so rather than installing and using this i think if possible if plugin could be created for hyprland to have this scrolling kind of feature then it would be much better as Hyprland already is well established project which has grown alot.Just my thoughts so sharing it here ",
      "created_at": "2024-07-01T16:17:24Z",
      "updated_at": "2024-07-04T10:27:19Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Greatz08",
        "avatar_url": "https://avatars.githubusercontent.com/u/55040435?u=1d3751acf272cf5597b70db85c4d0d4422740dfd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaTl0",
      "number": 516,
      "title": "Focus behavior for windows with 100%+ width or height.",
      "body": "If a window is 100%+ in width or height, you can't put the right or bottom side that sticks out into the viewport.\r\n\r\nI think we need a way to {top-bottom-left-right}-edge-snap the 100%+ width/height windows to the corresponding monitor edge, possibly with the same Mod+HJKL, or maybe even scroll freely in both dimensions.\r\n\r\nEdge-snapping will omit the center area of windows that are more than 200% width/height.\r\n\r\nMaybe snap in intelligent stages for ~150%+?",
      "created_at": "2024-07-04T00:29:02Z",
      "updated_at": "2024-07-04T10:22:34Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "salman-farooq-sh",
        "avatar_url": "https://avatars.githubusercontent.com/u/46742354?u=62db47ed81fdd320147a6e2a8c3bc595d5e8cda5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AY6vt",
      "number": 296,
      "title": "Add focus-window-or-monitor actions",
      "body": "The following options would help me with keyboard navigation on my multi monitor setup:\r\n\r\nfocus-window-or-monitor-left\r\nfocus-window-or-monitor-right\r\nfocus-column-or-monitor-up\r\nfocus-column-or-monitor-down\r\n\r\nfunctionality: When reaching the end of column/row of a workspace, move focus to the workspace that is active on the monitor in that direction",
      "created_at": "2024-04-20T09:27:07Z",
      "updated_at": "2024-07-04T00:55:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Damnjelly",
        "avatar_url": "https://avatars.githubusercontent.com/u/13944407?u=bc3f08221365091bd307bfdcaa8f033551940183&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaJ5E",
      "number": 465,
      "title": "feat: `focus-workspace-or-monitor-up` and `focus-workspace-or-monitor-down`",
      "body": "@lpnh Thanks for the new feature in https://github.com/YaLTeR/niri/pull/456!\r\n\r\nI was wondering if the same thing can be done for upper and lower monitors too i.e. `focus-workspace-or-monitor-up` and `focus-workspace-or-monitor-down`. It would work the same but instead on workspaces, though it needs to be discussed how the last/bottom-most workspace which is dynamic should be handled.\r\n\r\nPossible options:\r\n1. A flag or variation of the up and down binding that skips the last and empty workspace before moving the monitor up or below.\r\n2. Fixed number of workspaces? I think 1 will still be helpful.\r\n\r\nMy particular use-case is 2 external monitors plus the laptop's built-in screen. But I know many people who use a single small 24\" external one raised by some books on top of their 15\" macbooks (sorry no niri for them :)).\r\n\r\n\r\nMy logical layout:\r\n```\r\n.-----------. .------.\r\n| 32\"       | | 24\"  |\r\n|           | |      |\r\n*-----------* |      |\r\n     .------. |      |\r\n     | 16\"  | *------*\r\n     *------*\r\n```\r\n\r\nAnother one:\r\n```\r\n.------------.\r\n| 24\"        |\r\n|            |\r\n*------------*\r\n   .------.\r\n   | 15\"  |\r\n   *------*\r\n```\r\n\r\nEdit: Sorry, I missed the existing discussion\r\nDuplicate of: https://github.com/YaLTeR/niri/discussions/296",
      "created_at": "2024-06-24T02:03:54Z",
      "updated_at": "2024-07-03T05:08:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "salman-farooq-sh",
        "avatar_url": "https://avatars.githubusercontent.com/u/46742354?u=62db47ed81fdd320147a6e2a8c3bc595d5e8cda5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZ3Uk",
      "number": 423,
      "title": "Help Building niri on void linux",
      "body": "hello guys, i try to build niri on void linux, at the final step of building niri i get this error:\r\nnote: /usr/bin/ld: cannot find -linput: nosuch file or directory\r\n         collect2: error: ld returned 1 exit status\r\nwhat package did i missed?\r\nappreciate any help thank you!",
      "created_at": "2024-06-05T06:56:29Z",
      "updated_at": "2024-07-02T19:02:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "tomysurya",
        "avatar_url": "https://avatars.githubusercontent.com/u/152084609?u=b0064234995357f7fced4a8e3f5be98d80e1b436&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaO-o",
      "number": 483,
      "title": "Open new window in remaining space on screen",
      "body": "Sometimes I'll shrink a window with Alt-, leaving a certain amount of space left on the current view of the screen (without scrolling left or right), and it'd be useful to have a keybind that I could toggle to open the next window in that remaining space.\r\n\r\n![2024-06-29_06-42-46_PM](https://github.com/YaLTeR/niri/assets/31457698/67510013-ccd7-4af8-97b0-baf0e5dcc591)\r\ne.g. on the far right in this screenshot\r\n\r\nWould it be possible to implement this?",
      "created_at": "2024-06-29T22:43:52Z",
      "updated_at": "2024-07-02T17:11:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "robbins",
        "avatar_url": "https://avatars.githubusercontent.com/u/31457698?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaPDL",
      "number": 484,
      "title": "Follow mouse, but do not move the focus to a neighboring application outside the visible screen boundary",
      "body": "Add an option whereby using \"mouse tracking\" the focus of a window would switch when hovering over it, BUT if the application is expanded to the full width of the screen, it would not switch to another window when hovering over the border of the application. \r\n\r\nI like the option where I can switch focus on mouseover, but it annoys me when that focus causes me to fly to the neighboring window that is to the right. \r\n\r\nIf it's not clear to me, I can attach a video. ",
      "created_at": "2024-06-30T04:08:56Z",
      "updated_at": "2024-07-01T07:59:38Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "IVKLD",
        "avatar_url": "https://avatars.githubusercontent.com/u/54883747?u=560384f91b0537e0bf425ccf21e9f051019c4fc9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZuo-",
      "number": 408,
      "title": "Focus follows the mouse but ONLY in the visible windows (ones in current column)!",
      "body": "The current focus behavior when following the mouse is, to be able to change to non-visible windows by moving the mouse to the top left or top right corners of the screen.\r\n\r\nThis can mess some windows and make them more hard to use when you want to have a maximized column. One example been the current one that made my post this issue, LMMS.",
      "created_at": "2024-05-28T23:29:02Z",
      "updated_at": "2024-07-01T07:59:33Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "rempas",
        "avatar_url": "https://avatars.githubusercontent.com/u/60424977?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZmoM",
      "number": 378,
      "title": "Add \"focus-follows-mouse\"-like option but for outputs only",
      "body": "I like how \"focus follows mouse\" works in general but it's not something I could normally use here with two monitors placed side-by-side since moving mouse to the other screen can move the windows view frame. Therefore I have disabled it, but it's somewhat annoying that I need to click to focus even when going with mouse to the other monitor. I wish there was an option like \"focus-follows-mouse\" but exclusively for outputs.\r\n\r\nSince focused window on each monitor is already stored separately (I assume so since there exists \"focus-ring\") it shouldn't require a lot of changes in existing code I guess. A general algorithm is the following:\r\n\r\n1. For each mouse movement event\r\n2. Check whether the pointer has moved off screen\r\n3. Set the screen under cursor as focused\r\n4. Set last focused window on it as currently focused\r\n\r\nDidn't look into the code yet, maybe the 4th step isn't needed at all. I'd try to implement it myself but I don't have enough time for it as of now, and at least not until exams are over.",
      "created_at": "2024-05-22T14:02:29Z",
      "updated_at": "2024-07-01T07:59:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "xezo360hye",
        "avatar_url": "https://avatars.githubusercontent.com/u/79970533?u=8af1633c912ee91dc21379e114a234d31597aead&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaQjJ",
      "number": 490,
      "title": "Disable column movement on focus",
      "body": "So, I have multiple monitors, and sometimes I want to do things like leaving a terminal and a YouTube video on one monitor, and moving to another.\r\n\r\nThe problem is, sometimes when I do that, I have a window partially on (or just off) the screen, and this causes niri to focus that window and shift everything around... because of this, I'd like to stop niri from moving my columns, even if I focus one that's not on the screen.\r\n\r\nI found the [`center-focused-column`](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#center-focused-column) option, and thought it was what I needed, but unfortunately setting `\"never\"` for that still scrolls to the edge of the screen rather than preventing movement altogether. I couldn't find a config setting that did exactly what I wanted.\r\n\r\nOne mitigation could be disabling [`focus-follows-mouse`](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#focus-follows-mouse), but I like `focus-follows-mouse` and don't really want to disable it for this.",
      "created_at": "2024-07-01T00:04:04Z",
      "updated_at": "2024-07-01T07:58:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Minion3665",
        "avatar_url": "https://avatars.githubusercontent.com/u/34243578?u=2a733a89f320f15fda9f825a9e5783ee45191ae4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaPJ2",
      "number": 485,
      "title": "Question for niri users: scale below 1 with chromium-based apps/ japanese input on xwayland electron programs",
      "body": "This isn't a niri-specific issue but rather a question for users.\r\n\r\nIn the latest release, niri added support for scaling below 1, which is essential for me because I feel like the default behavior for 1080p makes the application UI too large, wastes screen space, and hurts my eyes. I really want to daily-drive niri again. However, chromium/electron on wayland doesn't render correctly with scaling below 1. (Again, this isn't a niri-specific issue. I've confirmed the same behavior on almost every wayland compositor.)\r\n\r\nThis means I have to run electron on xwayland in the meantime, and I have been doing so on Cosmic. This becomes a problem for me with niri because it doesn't support native xwayland, and I couldn't get fcitx5, which is necessary for Japanese input, working on cage.\r\n\r\nAlso, iirc, even if I managed to fix the scaling issue, electron on native wayland required text-input-v1 support for Japanese IME, so I don't think I have any other choice.\r\nI looked through issue #445, does running i3wm under xwayland fix the issue?\r\n\r\nI want to hear about the workarounds people uses.",
      "created_at": "2024-06-30T09:14:20Z",
      "updated_at": "2024-06-30T10:02:16Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nyawox",
        "avatar_url": "https://avatars.githubusercontent.com/u/93813719?u=1f03718f8c2a86c5c8bb5ec82d8c4905d2b8f6f7&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaOYj",
      "number": 476,
      "title": "How do you manage your system settings?",
      "body": "What's holding me back on paperwm, is gnome's nice settings app and the gnome bar's quick settings. I have no interest at all in any *ricing* or mucking around in settings, I would want a productive system without much ado.\r\nHow do you guys go about this? ",
      "created_at": "2024-06-28T19:33:24Z",
      "updated_at": "2024-06-29T17:07:19Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "janlimpens",
        "avatar_url": "https://avatars.githubusercontent.com/u/370261?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaOmQ",
      "number": 480,
      "title": "v0.1.7",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nHere are the improvements from the last release.\r\n\r\n## Fractional Scaling\r\n\r\nThe big update this time is fractional scale support. You can set output scale to fractional values like 1.5 and automatic scale factor guessing will now return fractional scale factors.\r\n\r\nOn the surface this sounds simple, but under the hood, doing it properly required a complete refactor of the layout system to use fractional coordinates and sizes (and then chasing down all of the bugs caused by this).\r\n\r\nThe result is well worth it though. Borders, gaps and windows are always physical-pixel aligned, and not restricted to integer logical pixel positions. There's no blur or position-dependent +-1 px jank. Fractional-scale-aware clients remain crisp at any scale.\r\n\r\nHere's a demo of going through every single currently representable fractional scale factor between 100% and 200% where everything remains crisp, including a 1 px checkerboard in mpv. Watch it in the native 1920×1080 resolution if you want to see the checkerboard correctly.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/458b3021-b1f0-4c30-8f22-6db63af79a41\r\n\r\nAs a bonus, you can set the scale to a value below 1, which will make things smaller and give you more space. This could be useful in specific cases like monitors with very big pixel size, but it will lose you some image crispness.\r\n\r\n## Fractional Layout\r\n\r\nAs previously mentioned, niri layout now completely operates in floating-point. While fractional scaling benefits the most from this, fractional layout is also useful for integer scales.\r\n\r\nConcretely, you can now set border and focus ring width, gaps, struts to fractional values, which will round to physical pixels according to the monitor's scale factor. Which means you can have 1 px wide borders on a 200% monitor for example by setting the border width to 0.5.\r\n\r\nThe view position is also no longer restricted to integer logical pixels, so when you do a touchpad swipe gesture on a 200% monitor, windows will move in single physical pixel increments.\r\n\r\nIf you're interested in the technical details of how this works, check [this wiki page](https://github.com/YaLTeR/niri/wiki/Fractional-Layout).\r\n\r\n## Window Screencasts\r\n\r\nYou can now select an individual window to screencast through xdg-desktop-portal-gnome. You can resize windows, open pop-ups, use [block-out rules](https://github.com/YaLTeR/niri/blob/main/wiki/Configuration:-Window-Rules.md#block-out-from), and it will all work correctly.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/c792b448-5b16-4f2d-825f-eebabdad519b\r\n\r\nThis involved some refactoring of the PipeWire screencasting code in niri, most notably adding support for changing the video stream size on the fly. As a bonus, monitor screencasts will now also keep running through monitor resolution changes.\r\n\r\nI still need to work out some details like frame callback delivery to obscured windows, but the current implementation should already work for a lot of use cases.\r\n\r\n## xdg-activation\r\n\r\n@pcc implemented the xdg-activation-v1 protocol which allows apps to pass focus to other apps. For example, clicking on a link in a GTK 4 app will now automatically focus your browser, switching the workspace if necessary.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/fd444abc-77cd-4089-b43d-97846deb4931\r\n\r\nThis protocol is also used by clients to indicate urgency; this part is not implemented yet (but planned).\r\n\r\n## Workspace Switch Mouse Gesture\r\n\r\nLast release I added the horizontal <kbd>Mod</kbd> + middle mouse drag gesture to scroll the view. This release I also added the vertical drag gesture to switch workspaces, just like on a touchpad you can swipe both horizontally and vertically.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/3c9485be-189c-4c7c-9094-a3346cf3e36f\r\n\r\n## Other improvements in this release\r\n\r\n- Added four actions `focus-window-{up,down}-or-column-{left,right}` which allow traversing all windows on a workspace in order (thanks @minego).\r\n- Added actions `focus-column-right-or-first`, `focus-column-left-or-last` which allow the focus to loop around (thanks @sullyj3).\r\n- Added actions `focus-column-or-monitor-left` and `focus-column-or-monitor-right` that switch the monitor upon reaching the end of the workspace.\r\n- Added `niri msg focused-output` which returns information about the currently focused output (thanks @rustysec).\r\n- Added `off` flag to disable input devices (thanks @yuja).\r\n- Added `left-handed` flag to touchpad, mouse, tablet input config.\r\n- Added `scroll-method` property to touchpad, mouse, trackpoint input config (thanks @yuja).\r\n- Added `disabled-on-external-mouse` flag to touchpad input config (thanks @yuja).\r\n- Niri now additionally reads the config file path from `$NIRI_CONFIG`, to help with nix wrappers. The `--config` flag still takes precedence (thanks @sodiboo).\r\n- Changed absolute pointer input to work over a union rectangle across all outputs, rather than picking a single output (thanks @galister).\r\n- Changed tablet input without a specific `map-to-output` to map to a union rectangle across all outputs. This makes Open Tablet Driver work.\r\n- Changed foreign-toplevel (i.e. Waybar) window activation to animate the workspace switch.\r\n- Changed output scale setting to no longer require the fractional part, i.e. `scale 2` will work.\r\n- Fixed `focus-window-or-workspace-{up,down}` missing the workspace switch animation.\r\n- Fixed empty named workspaces disappearing upon output removal.\r\n- Fixed a crash when an (already unfullscreened) window that in a column with other windows requests to be unfullscreened.\r\n- Fixed key repeat not working when the `keyboard` config section is missing.\r\n- Fixed some crashes when no outputs are connected. On some devices outputs reconnect themselves upon resuming from sleep, which was triggering these issues.\r\n- Fixed rounded corners rendering blurry on very high scale factors.\r\n- Fixed the automatic draw border with background check to also include the KDE decoration protocol value. This makes it work for some older clients like GTK 3 (thanks @kchibisov).\r\n- Fixed ISO_Level3_Shift modifier not showing up in the Important Hotkeys list.\r\n- Niri now increases the fd limit to the maximum, fixing some fd-heavy clients (e.g. running RustRover in Xwayland).\r\n- Updated Smithay, which fixes running on the NVIDIA 555 driver (explicit sync is still not implemented for now).\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.7'>v0.1.7</a>.</em>",
      "created_at": "2024-06-29T07:10:33Z",
      "updated_at": "2024-06-29T15:35:56Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaOg_",
      "number": 478,
      "title": "Add window resizing like hyprland has.",
      "body": "On 4k monitors, there is severe lag when resizing a window, whether it's firefox or a text editor. I would like to see an implementation of window resizing like in hyprland. In norms, when resizing a window, it changes the size of the frame, which is not bound to the application window.",
      "created_at": "2024-06-29T02:31:06Z",
      "updated_at": "2024-06-29T15:29:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "IVKLD",
        "avatar_url": "https://avatars.githubusercontent.com/u/54883747?u=560384f91b0537e0bf425ccf21e9f051019c4fc9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaOr8",
      "number": 481,
      "title": "threading rendering",
      "body": "Is there any plan for Niri to use dedicated thread for rendering? I noticed cosmic-comp has implemented this. It should be good for users with multiple high refresh rate monitors 🤔.",
      "created_at": "2024-06-29T10:54:34Z",
      "updated_at": "2024-06-29T11:45:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Paraworker",
        "avatar_url": "https://avatars.githubusercontent.com/u/46927151?u=ad81f453105c41f93da8ffb89868cd98cc807567&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWQ3x",
      "number": 81,
      "title": "Add option for inner gaps only",
      "body": "I would like to have gaps only between windows.",
      "created_at": "2023-11-10T13:33:14Z",
      "updated_at": "2024-06-29T01:35:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "wesbluemarine",
        "avatar_url": "https://avatars.githubusercontent.com/u/14043560?u=64d0fed553e233986596dcf1219889f91c89e636&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaMs-",
      "number": 473,
      "title": "wldash lighweight launcher + dashboard /status bar / panel combo written in Rust 🦀",
      "body": "Hello,\r\nI found out about wldash.\r\nhttps://git.sr.ht/~kennylevinsen/wldash\r\n\r\n![screenshot](https://github.com/YaLTeR/niri/assets/89577795/c79769ee-51cb-4bdf-a4ef-9b217a9cb57d)\r\n\r\nIt's a launcher plus dashboard combined and it's written in Rust 🦀\r\n\r\nUnfortunately it hasn't been maintained for over a year but still works quite well. It's in archlinux repos so you can try it out without compiling.\r\n\r\nI noticed waybar widgets usually poll in certain time intervals. I'm not sure if every DE panel does this but it seems very CPU inefficient to poll system volume every 100 miliseconds and display it correctly. Or system temperature, clock and so on. If you have a lot of widgets then the status bar becomes bloated and goes against the whole purpose of bloatfree stand-alone Window Manager setup. I don't know, maybe I'm just crazy. \r\n\r\nEither way once you close wldash like a typical launcher, the process gets terminated and no CPU cycles wasted when it's not open. It's  a little limited, but it does show pulse volume, time, calendar and laptop battery status.\r\n\r\nI figured since there's no clean, non hacky way to show workspace indicators in niri, wldash serves me quite well and I got rid of waybar.\r\n\r\nI hope it's useful to someone else",
      "created_at": "2024-06-27T02:43:32Z",
      "updated_at": "2024-06-29T03:03:21Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "HEX0101",
        "avatar_url": "https://avatars.githubusercontent.com/u/89577795?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaLMl",
      "number": 470,
      "title": "Can we make switch-preset-column-width an action?",
      "body": "I found my self only use a few window widths: 1/3, 1/2, 2/3, 5/6, and fullscreen.\r\n\r\nSo in theory I can only use two shortcuts to ajust width efficiently(three if Mod+F counted)\r\n\r\nI consider something like this\r\n\r\n```kdl\r\nbinds {\r\n    // switch between [S]mall widths\r\n    Mod+S { switch-column-width \"33.3333%\" \"50%\"; }\r\n\r\n    // switch between [G]iant widths\r\n    Mod+G { switch-column-width \"66.6667%\" \"83.3333%\"; }\r\n}\r\n```\r\n\r\nI'm so proud of this idea: Say I want a window to be big or small, but not sure how big/small it should be exactly. Just hit the shortcuts one or two times, it will be ok.\r\n\r\n------------------------------\r\n### Added\r\nIgnore me please. I did some testing it doesn't feel natrue as I thought this way.\r\nAnd I realized a window's width will not change from very small to very big often.\r\nI'm going to try make Mod+Minus/Equal step by 1/6 for some days.",
      "created_at": "2024-06-25T11:20:40Z",
      "updated_at": "2024-06-26T13:39:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kls1991",
        "avatar_url": "https://avatars.githubusercontent.com/u/32974383?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZdJd",
      "number": 344,
      "title": "Being able to hold a keymap to repeatedly call it's action",
      "body": "I am sorry as I am not sure how to phrase this. I have a keymap like this:\r\n```\r\nXF86AudioRaiseVolume allow-when-locked=true { spawn \"zsh\" \"-c\" \"~/.config/waybar/scripts/volume --inc\"; }\r\nXF86AudioLowerVolume allow-when-locked=true { spawn \"zsh\" \"-c\" \"~/.config/waybar/scripts/volume --dec\"; }\r\nXF86AudioMute        allow-when-locked=true { spawn \"zsh\" \"-c\" \"~/.config/waybar/scripts/volume --toggle\"; }\r\nXF86AudioMicMute     allow-when-locked=true { spawn \"zsh\" \"-c\" \"~/.config/waybar/scripts/volume --toggle-mic\"; }\r\nXF86MonBrightnessUp  allow-when-locked=true { spawn \"zsh\" \"-c\" \"~/.config/waybar/scripts/brightness --inc\";\r\nXF86MonBrightnessDown  allow-when-locked=true { spawn \"zsh\" \"-c\" \"~/.config/waybar/scripts/brightness --dec\"; }\r\n```\r\n\r\nIt works fine but I want to hold a keymap to repeatedly call the action that is given there. Like, if I am holding a volume key then it should go on increasing the volume until I stop holding the volume key. Right now, if I am holding a keymap then it is fired once, I want to be able to repeatedly call it with specific interval while holding.",
      "created_at": "2024-05-15T15:35:16Z",
      "updated_at": "2024-06-26T00:16:32Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "binamralamsal",
        "avatar_url": "https://avatars.githubusercontent.com/u/61900781?u=5d422cd0ee7e4f0b8b980119c8fceb9454a96592&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaH7O",
      "number": 458,
      "title": "Multiple scroll strips",
      "body": "I wonder what would be the complexity required for having multiple scroll strips. For example, one on top of the other, having the ability to be sized independently as a whole.\r\n\r\nDo you imagine this being easy or difficult to implement and maintain ?\r\n\r\nThanks!",
      "created_at": "2024-06-21T20:28:40Z",
      "updated_at": "2024-06-25T00:52:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Aqa-Ib",
        "avatar_url": "https://avatars.githubusercontent.com/u/16420574?u=1e4a099aabb4a329141679f746ea2ba2393866fd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXjYg",
      "number": 164,
      "title": "rounded corners without CSD",
      "body": "the [code now notes](https://github.com/YaLTeR/niri/blob/fbe902091533c211a8e61905951fdd113fbca11e/src/handlers/xdg_shell.rs#L43C35-L44):\r\n\r\n> If the user prefers no CSD, it's a reasonable assumption that they would prefer to get rid of the various client-side rounded corners also by using the tiled state.\r\n\r\ni have been interested in using rounded corners without using top bars, see e.g. [here](https://imgur.com/LPC6uBf).\r\nit would be nice if rounding were available as a setting independent of other such options.\r\n",
      "created_at": "2024-02-03T16:22:02Z",
      "updated_at": "2024-06-24T06:47:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZ5GY",
      "number": 427,
      "title": "Forward chosen global shortcuts to chosen windows",
      "body": "[As in Hyprland](https://wiki.hyprland.org/Configuring/Binds/#global-keybinds).",
      "created_at": "2024-06-06T21:56:52Z",
      "updated_at": "2024-06-24T05:23:47Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "salman-farooq-sh",
        "avatar_url": "https://avatars.githubusercontent.com/u/46742354?u=62db47ed81fdd320147a6e2a8c3bc595d5e8cda5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaIbJ",
      "number": 464,
      "title": "Implement the unstable version of zwlr-screencopy-manager",
      "body": "Niri has been great so far, but my biggest pain point is that I can't use https://github.com/russelltg/wl-screenrec -- it spits out `your compositor does not support zwlr-screencopy-manager and therefore is not support by wl-screenrec. See the README for supported compositors`\r\n\r\nI saw that running the command in [this comment](https://github.com/YaLTeR/niri/discussions/232#discussioncomment-8610182) produces:\r\n\r\n```\r\next_idle_notifier_v1@v1\r\next_session_lock_manager_v1@v1\r\norg_kde_kwin_server_decoration_manager@v1\r\nwl_compositor@v6\r\nwl_data_device_manager@v3\r\nwl_drm@v2\r\nwl_output@v4\r\nwl_seat@v9\r\nwl_shm@v1\r\nwl_subcompositor@v1\r\nwp_cursor_shape_manager_v1@v1\r\nwp_drm_lease_device_v1@v1\r\nwp_fractional_scale_manager_v1@v1\r\nwp_presentation@v1\r\nwp_security_context_manager_v1@v1\r\nwp_viewporter@v1\r\nxdg_activation_v1@v1\r\nxdg_wm_base@v6\r\nzwlr_data_control_manager_v1@v2\r\nzwlr_foreign_toplevel_manager_v1@v3\r\nzwlr_gamma_control_manager_v1@v1\r\nzwlr_layer_shell_v1@v4\r\nzwlr_screencopy_manager_v1@v1\r\nzwp_idle_inhibit_manager_v1@v1\r\nzwp_input_method_manager_v2@v1\r\nzwp_linux_dmabuf_v1@v5\r\nzwp_pointer_constraints_v1@v1\r\nzwp_pointer_gestures_v1@v3\r\nzwp_primary_selection_device_manager_v1@v1\r\nzwp_relative_pointer_manager_v1@v1\r\nzwp_tablet_manager_v2@v1\r\nzwp_text_input_manager_v3@v1\r\nzwp_virtual_keyboard_manager_v1@v1\r\nzxdg_decoration_manager_v1@v1\r\nzxdg_exporter_v2@v1\r\nzxdg_importer_v2@v1\r\nzxdg_output_manager_v1@v3\r\n```\r\n\r\nin which I see both `zxdg_output_manager_v1` and `zwlr_screencopy_manager_v1@v1`, but it seems that wl-screenrec requires the *unstable* versions of those protocols.",
      "created_at": "2024-06-22T22:42:56Z",
      "updated_at": "2024-06-23T13:05:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "ThatOneCalculator",
        "avatar_url": "https://avatars.githubusercontent.com/u/44733677?u=a15c7592804dbcdf5f7690b8e95fcfde3ce3f5a3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaEkL",
      "number": 447,
      "title": "Breaking Change Ideas",
      "body": "Eventually we'll do a 0.2 or a 1.0, so let's collect ideas for what breaking changes we want to consider.\r\n\r\n1. Remove deprecated four-number color format, i.e. `active-color 255 0 0 0`\r\n    * These are all representable in the new CSS-like syntax.\r\n1. Change linear animation settings to be set as properties similarly to spring animation settings, i.e. `linear duration-ms=200 curve=\"ease-out-quad\"`\r\n1. Change `toggle-debug-tint` to `debug-toggle-tint`\r\n    * I've been intentionally prefixing new actions (i.e. `debug-toggle-damage`), this one should be prefixed too for consistency\r\n    * As per a note in the debug wiki we can breaking-change this without a release, but it's not a terribly big deal to wait\r\n1. KDL 2 (if a reasonable parsing crate exists by then)\r\n    * This may enable more config improvements/breaking changes, haven't looked too deep into this",
      "created_at": "2024-06-18T09:59:43Z",
      "updated_at": "2024-06-20T19:46:37Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaFKX",
      "number": 448,
      "title": "Embellish selected column",
      "body": "I'm a big fan of the \"floating master\" type layout that can be achieved in qtile - something like this.\r\n![image](https://github.com/YaLTeR/niri/assets/11548989/7819268d-0206-479a-b4ee-3c2e0a5636fe)\r\nIt effectively scrolls like a carousel.\r\n\r\nWould it be possible to emulate this kind of thing in Niri by \"popping out\" the selected column, increasing its height beyond the other columns, and widening it to overlap them on the sides?\r\n\r\nThis would be very visually impressive, and quite useful as a gross visual indicator of selection.  \r\n",
      "created_at": "2024-06-19T00:10:47Z",
      "updated_at": "2024-06-20T12:29:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "atagen",
        "avatar_url": "https://avatars.githubusercontent.com/u/11548989?u=83f102bb361f757c9d560e7cd3752270e082725c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaDmw",
      "number": 444,
      "title": "Is there any way to use swayosd or something similar in niri?",
      "body": "I tried replacing  ` XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; } ` with `  XF86AudioRaiseVolume allow-when-locked=true { \"bash\" \"-c\" \"swayosd-client --output-volume raise\" } ` . It didn't work.\r\n\r\nEdit: Created a bash script  and used XF86AudioRaiseVolume { spawn \"bash\" \"-c\" \"exec ~/.scripts/swayosd.sh raise\"",
      "created_at": "2024-06-17T10:09:08Z",
      "updated_at": "2024-06-22T13:31:21Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Ald5r",
        "body": "swayosd works fine for me with:\r\n\r\n```\r\n    XF86AudioLowerVolume { spawn \"swayosd-client\" \"--output-volume\" \"lower\"; }\r\n    XF86AudioMute { spawn \"swayosd-client\" \"--output-volume\" \"mute-toggle\"; }\r\n    XF86AudioRaiseVolume { spawn \"swayosd-client\" \"--output-volume\" \"raise\"; }\r\n    XF86MonBrightnessDown { spawn \"swayosd-client\" \"--brightness\" \"lower\"; }\r\n    XF86MonBrightnessUp { spawn \"swayosd-client\" \"--brightness\" \"raise\"; }\r\n```"
      },
      "user": {
        "login": "NotMugil",
        "avatar_url": "https://avatars.githubusercontent.com/u/86902446?u=6b909d2f7e535e543852708c1def775357cc0c7a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZpmU",
      "number": 387,
      "title": "Workspace switch gesture with Mod+MMB",
      "body": "Hi!\r\nThe very same way you can already move across a strip with horizontal movement with Mod+MMB, I'd like to be able to switch workspaces with vertical movement.\r\n\r\nFor good UX, I think there should be a threshold (possibly configurable?) so that you'd need to move a certain amount vertically before it happens. That way you can keep moving horizontally without having the workspace switch come into effect.\r\n\r\n**AND/OR**, probably a good thing would be to have only vertical movement or horizontal movement happen at once, never at the same time. I'm not exactly sure which solution is better or what the actual feel should be.",
      "created_at": "2024-05-24T14:59:58Z",
      "updated_at": "2024-06-19T19:01:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Vermoot",
        "avatar_url": "https://avatars.githubusercontent.com/u/23317434?u=9565440a39c76a58e4fd5f642ec3434114a9985f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaFKt",
      "number": 449,
      "title": "Workspace Tags",
      "body": "This isn't really a hard request or even firm idea, more of just a light probing to see how people feel about an option to use Tags.\r\n\r\nEffectively what I envision is the standard-ish tag setup, a single workspace where windows are assigned to a tag, then tags are de/activated to make all windows within that tag visible or not.\r\n\r\nI believe tagging columns to re/disappear them would be particularly smooth in Niri, taking the vertical constraint as its advantage to make this feel much more intuitive than an autotiler.\r\n\r\nI think this would contribute to keeping users in flowstate much easier; I personally find full workspace transitions quite disruptive, and I tend to subconciously use whatever means a compositor has - stacking, scratchpads, etc - to avoid them.",
      "created_at": "2024-06-19T00:21:32Z",
      "updated_at": "2024-06-20T12:28:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "atagen",
        "avatar_url": "https://avatars.githubusercontent.com/u/11548989?u=83f102bb361f757c9d560e7cd3752270e082725c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaC8S",
      "number": 443,
      "title": "xdg-activation that guides user to window",
      "body": "So, https://github.com/YaLTeR/niri/issues/30 added support for xdg-activation-v1 (https://wayland.app/protocols/xdg-activation-v1), but the functionality seems to be \"applications that prepare for the action while they have keyboard focus can then within 10 seconds make themselves visible\", or something like that? https://github.com/YaLTeR/niri/commit/bc3d6cac805bde6a26232dfa75c37b18ca9ec743\r\n\r\nThat's pretty far from what us old school neckbeards expect. The historical behavior has been \"guide user to window\", with the guidance being persistent until the user reacts to it. See e.g. https://docs.rs/winit/latest/winit/window/enum.UserAttentionType.html discussion on how Windows flashes the taskbar entry for the application until the user reacts to it; similarly X11 environments generally highlighted the window in some way until it gained focus.\r\n\r\nCould we pretty please have an activation that's a persistent guide until the user chooses to react?\r\n\r\nI think the usual rendering is changing border color (like focus-ring inactive-color) and setting a flag on the any workspace that contains any windows with this active. I believe Sway highlights all windows -- and the workspaces that contain them -- that are requesting attention.\r\n\r\nHere's my use case:\r\n\r\n```console\r\n$ thing_that_takes_a_long_time; printf '\\a'\r\n```\r\n\r\nOn some days, I have dozens of those running concurrently. I don't want them to force focus on themselves; I want them to sit patiently until I have time to deal with them. Consider 10 such notifications happening while I'm on a break.\r\n\r\nThe bell will make the terminal mark itself as \"worthy of attention\". Back in the day that was X11 \"urgent\" flag, these days e.g. alacritty uses xdg-activation-v1\r\nhttps://github.com/alacritty/alacritty/blob/0d4ab7bca43213d96ddfe40048fc0f922543c6f8/alacritty/src/display/window.rs#L336-L340 via https://docs.rs/winit/latest/winit/window/struct.Window.html#method.request_user_attention -- see also https://github.com/alacritty/alacritty/issues/181\r\n",
      "created_at": "2024-06-16T20:05:02Z",
      "updated_at": "2024-06-17T10:19:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tv42",
        "avatar_url": "https://avatars.githubusercontent.com/u/419909?u=731cd7ab19c143556b4206a4d8473ee5999d4656&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AaCIj",
      "number": 442,
      "title": "Disabling Welcome shorcuts screen",
      "body": "Hello. \r\n\r\nI don't find how to disable the shortcuts window launched at the start of Niri. \r\n\r\nI think it is in the config file but. . . ? \r\n\r\nThx. ",
      "created_at": "2024-06-16T08:29:58Z",
      "updated_at": "2024-06-16T08:47:55Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AlVCD",
        "body": "Here's the flag: https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#hotkey-overlay"
      },
      "user": {
        "login": "Okanda",
        "avatar_url": "https://avatars.githubusercontent.com/u/12570903?u=21fc37c16905fa5bf5b41dfb04c2e83a54be07df&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZ_hP",
      "number": 436,
      "title": "theming the hotkey and quit dialogs",
      "body": "is it possible to customise the colours",
      "created_at": "2024-06-12T20:24:29Z",
      "updated_at": "2024-06-12T20:28:59Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "hollymlem",
        "avatar_url": "https://avatars.githubusercontent.com/u/35699052?u=3f0286f934e0fef5a79789cbaac71541e1f57ca5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZ2Lo",
      "number": 421,
      "title": "Using a coding language for configs",
      "body": "Hi there!\r\nLooking at #391 I found myself dearly wishing niri (and more compositors/WMs generally) used actual code and an API for configs, something like AwesomeWM.\r\nThe `focus-next-or-first` feature is something I actually did in my AWM config even though it wasn't implemented in the WM itself, because the API and code config allowed me to do so.\r\n\r\nIn pretend lua, it could look like this:\r\n```lua\r\nrequire(\"niri\")\r\nw = niri.ws\r\n\r\nfunction ws_next_cycling()\r\n  ws_list = w.workspaces()\r\n  if w.active().index == #ws_list then -- Currently active WS is the last one\r\n    w.focus(1)\r\n  else\r\n    w.focus(w.active().index + 1)\r\n  end\r\nend\r\n```\r\n\r\nOf course I understand doing this rather than parsing a config like niri does now is a huge amount of work and a very different paradigm altogether, but I'm curious to read your thoughts about it?",
      "created_at": "2024-06-04T08:25:26Z",
      "updated_at": "2024-06-10T18:07:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Vermoot",
        "avatar_url": "https://avatars.githubusercontent.com/u/23317434?u=9565440a39c76a58e4fd5f642ec3434114a9985f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZ31d",
      "number": 425,
      "title": "Chrome notification popups",
      "body": "Niri 0.1.6 behavior of Chrome browser notifications from e.g. Slack notifications is very disruptive and hard to work with. Right now, every notification creates a new column to the right, with a new window showing the message there. That window steals the focus (interrupting my typing), and needs to be closed with the tiny [x] in the corner (no ESC etc).\r\n\r\nYou can test this at https://www.bennish.net/web-notifications.html\r\n\r\nAnyone have a good idea of how to improve on this?\r\n\r\nIt seems Chrome developers have completely abandoned using native desktop notifications. (https://issues.chromium.org/issues/41496153 and https://www.reddit.com/r/chrome/comments/t551ib/comment/hz84t81/?utm_source=reddit&utm_medium=web2x&context=3 and https://www.reddit.com/r/chrome/comments/t5o39l/how_to_turn_chrome_native_notifications_back_on/ and https://issues.chromium.org/issues/41292312)\r\n\r\nWindow rules, maybe? `niri msg -j focused-window` tells me the popup doesn't really identify itself well: `{\"title\":\"\",\"app_id\":\"\"}`, so this seems impossible.\r\n\r\nFirefox uses desktop notifications for popups, and is much more pleasant with niri.\r\n\r\nSee also:\r\n\r\n- Floating windows: https://github.com/YaLTeR/niri/issues/122\r\n",
      "created_at": "2024-06-05T16:15:07Z",
      "updated_at": "2024-06-05T17:04:17Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "tv42",
        "avatar_url": "https://avatars.githubusercontent.com/u/419909?u=731cd7ab19c143556b4206a4d8473ee5999d4656&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZ2Tz",
      "number": 422,
      "title": "new column spawning position",
      "body": "Currently, it seems like new columns are always created to the right of the current column.\r\n\r\nWhat if instead, it was decided as follows:\r\n\r\n- If the center of the focused column is the left of the center of the screen, spawn on the right\r\n- Else if the center of the focused column is to the right of the center of the screen, spawn on the left\r\n```\r\n┌───────────────────────────┬──────────────────────────┐\r\n│                           │                          │\r\n│              ┌────────────┼─┐ ┌────────────────────┐ │\r\n│              │            │ │ │                    │ │\r\n│              │            │ │ │ Focused column     │ │\r\n│              │            │ │ │                    │ │\r\n│              │            │ │ │ It's on the right  │ │\r\n│              │            │ │ │ of the screen, so  │ │\r\n│              │            │ │ │ spawn new column   │ │\r\n│              │            │ │ │ to its left        │ │\r\n│              │            │ │ │                    │ │\r\n│              │            │ │ │                    │ │\r\n│              │            │ │ │                    │ │\r\n│              │            │ │ │                    │ │\r\n│              │            │ │ │                    │ │\r\n│              └────────────┼─┘ └────────────────────┘ │\r\n│                           │                          │\r\n└───────────────────────────┴──────────────────────────┘\r\n```\r\n\r\nI think this would feel pretty natural, cause less scrolling, and therefore be less jarring. Thoughts?",
      "created_at": "2024-06-04T09:49:48Z",
      "updated_at": "2024-06-04T11:36:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sullyj3",
        "avatar_url": "https://avatars.githubusercontent.com/u/3953669?u=37c35c963451f6ceea0ef91af23b8a8340fac39d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZ1gM",
      "number": 420,
      "title": "how to set output bit depth eg 10 bit",
      "body": "any way to set this?",
      "created_at": "2024-06-03T18:05:42Z",
      "updated_at": "2024-06-03T18:08:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "24fpsDaVinci",
        "avatar_url": "https://avatars.githubusercontent.com/u/3499141?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZnO7",
      "number": 380,
      "title": "Theme switcher (Light/Dark Mode)",
      "body": "At last release, [0.1.6](https://github.com/YaLTeR/niri/releases/tag/v0.1.6) - there was a video with new implemented function `do-screen-transition` with simple principle switching themes between dark and light that interest me. \r\n\r\nI spent some time and here is my implementation of the theme switch! Just like in Mac OSX (or Gnome or KDE, I guess), it automatically switches when the sun rises/sets. \r\n\r\nIt uses [darkman](https://gitlab.com/WhyNotHugo/darkman) and some hacks (all instructions also written in script):\r\n\r\n1. Darkman uses folders `$XDG_DATA_DIRS/{dark,light}-mode.d/` and execute scripts in it. So, you need to duplicate scripts in both folders with some edits (on|off commands). I tested another configuration of it with symlinks and it works! You need just one script with `case` options that execute commands in depends what mode you are using:\r\n```console\r\nmkdir -p $HOME/.config/darkman\r\nchmod +x $HOME/.config/darkman/mode_switcher.sh\r\nsudo ln -s $HOME/.config/darkman /usr/share/dark-mode.d\r\nsudo ln -s $HOME/.config/darkman /usr/share/light-mode.d\r\n```\r\n\r\n2. `.service` file that provides in package not work with `Niri` - got error `NIRI_SOCKET is not set`, so it need another service file that describe at [wiki](https://github.com/YaLTeR/niri/wiki/Example-systemd-Setup):\r\n```console\r\n~/.config/systemd/user/darkman.service:\r\n\r\n[Unit]\r\nPartOf=graphical-session.target\r\nAfter=graphical-session.target\r\nRequisite=graphical-session.target\r\n\r\n[Service]\r\nExecStart=/usr/bin/darkman run\r\nRestart=on-failure\r\n```\r\n\r\nAnd finally `~/.config/darkman/`[mode_swither.sh](https://github.com/nebulosa2007/archinstallbtfrs/blob/master/Archive/Niri%20config/darkman/mode_switcher.sh) that can switch:\r\n* Themes for GTK3 and GTK4 apps\r\n* Wallpaper (some kind of dynamic wallpapers)\r\n* Brightness of a screen\r\n* [Mako](https://github.com/nebulosa2007/archinstallbtfrs/blob/master/Archive/Niri%20config/mako/config) and [fuzzel](https://github.com/nebulosa2007/archinstallbtfrs/tree/master/Archive/Niri%20config/fuzzel) theme\r\nand send notification after. \r\n\r\nNot all will work for you but it's an worked example. List of commands can be extended (for inspiration you could use [Dracula project](https://draculatheme.com/))\r\n\r\nI also use it together with [wlsunset](https://github.com/kennylevinsen/wlsunset).\r\n\r\nP.S. If anyone knows how to switch modes for Qt5/6 apps (especially Telegram) via shell commands - please let me know.",
      "created_at": "2024-05-22T20:29:26Z",
      "updated_at": "2024-06-03T17:49:29Z",
      "category": {
        "name": "Show and tell",
        "emoji": ":raised_hands:"
      },
      "answer": null,
      "user": {
        "login": "nebulosa2007",
        "avatar_url": "https://avatars.githubusercontent.com/u/85841412?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZy5M",
      "number": 418,
      "title": "Variables Node",
      "body": "Allowing a node for custom variables would be really nice, something like\r\n\r\n```kdl\r\nvariables {\r\n  terminal \"alacritty\"\r\n}\r\n\r\nbinds {\r\n  Mod+T { spawn variables.terminal; }\r\n}\r\n```\r\nnot sure if this is possible, I know very little about kdl",
      "created_at": "2024-06-01T22:20:47Z",
      "updated_at": "2024-06-02T03:53:24Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "brainlessbitch",
        "avatar_url": "https://avatars.githubusercontent.com/u/102400503?u=7dc1ec43eb484635ac215550db11c3f27f09a57b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZyMk",
      "number": 415,
      "title": "It would be great to set the gaps for each side of a window individually!",
      "body": "For example, I use a rather chunky ags bar at the top of my workspace.\r\nI would love to have some large gaps for my windows except for the top, to save a bit of space.\r\nThanks!",
      "created_at": "2024-06-01T05:06:01Z",
      "updated_at": "2024-06-01T05:10:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "jonseppanen",
        "avatar_url": "https://avatars.githubusercontent.com/u/10136068?u=a3c842b23127d74253dd83017cdef342359040bc&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZyAi",
      "number": 414,
      "title": "is possible to use the xdg-desktop-portal-kde instead of the gnome?",
      "body": "Because it's already installed in my distro, thanks!",
      "created_at": "2024-05-31T21:37:25Z",
      "updated_at": "2024-06-01T11:46:45Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AkuHs",
        "body": "Screencasting requires the GNOME portal since niri implements the GNOME-specific interface. Otherwise you can install the KDE portal fine."
      },
      "user": {}
    },
    {
      "id": "D_kwDOKFkxdc4AZwlq",
      "number": 412,
      "title": "Sticky columns",
      "body": "I'm not sure that name makes sense... But, I'd like an option to make a column visible in all workspaces.\r\n\r\nAn example use case is a column with chat or email, etc that I'd like to keep visible as I switch between projects on different workspaces. I want the chat and email to always be visible.\r\n\r\n(Really I'd love to see dwm style tags as an option, which would provide this, but that seems like a much bigger request)",
      "created_at": "2024-05-30T17:08:20Z",
      "updated_at": "2024-05-30T17:08:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "minego",
        "avatar_url": "https://avatars.githubusercontent.com/u/469128?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZtc-",
      "number": 404,
      "title": "Remove title bars from all windows",
      "body": "Hello,\r\n\r\nVery long-time i3 user here. In i3/X, I am able to effectively disable window titles in i3 with `default_border pixel 1` in my config. I'd love to somehow reproduce this behavior of globally turning off all title bars for every window, even if it is an ugly hack.\r\n\r\nFrom some googling, it seems like in Wayland title bars for windows are controlled by each individual application and not Wayland itself. Sway seems to get around this by setting the font of the title to zero or near-zero ([ref](https://github.com/swaywm/sway/issues/7350)), but that feature doesn't seem to be stable.\r\n\r\nI've looked at all the issues, discussions, and read the config file for Niri, but I haven't really seen any information about a way to achieve this. Can anybody advise? Thanks in advance for your time and thoughts and apologies if I have missed any earlier discussions about this. ",
      "created_at": "2024-05-27T19:07:31Z",
      "updated_at": "2024-05-28T02:12:49Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AkhVS",
        "body": "Hi! Try to uncomment the `prefer-no-csd` line and see if it works.\r\n\r\nhttps://github.com/YaLTeR/niri/blob/ae7fb4c4f405aa0ff49930040d414581a812d938/resources/default-config.kdl#L198"
      },
      "user": {
        "login": "cgeoga",
        "avatar_url": "https://avatars.githubusercontent.com/u/22404639?u=c49a56ae4b8f089290657307a2630abd34d2f5a1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZtC9",
      "number": 402,
      "title": "Separate `natural-scroll` settings for workspace scroll and view scroll",
      "body": "Touchpad input could support having separate values for workspace and view scroll directions or more values for such cases, i.e. `natural-scroll vertical-only`. A different solution could be adding a `gestures` configuration field that allows overriding the scroll direction for gestures (along with potential new configuration later on)\r\n\r\nEdit: Just saw #372 that kind of supports the latter way of implementing this\r\n\r\nNote: This is absurdly minor and I might actually be the only person who wants this, but that's why I am making the discussion :^)",
      "created_at": "2024-05-27T12:19:57Z",
      "updated_at": "2024-05-27T16:11:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Chiffario",
        "avatar_url": "https://avatars.githubusercontent.com/u/49232762?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZnTF",
      "number": 381,
      "title": "keep columns centered",
      "body": "If I center a column with `center-column`, then it might be nice to keep it in the center if the width is changed with `set-column-width`.\r\n\r\n",
      "created_at": "2024-05-22T21:42:37Z",
      "updated_at": "2024-05-27T04:20:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "gregzuro",
        "avatar_url": "https://avatars.githubusercontent.com/u/235511?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZry8",
      "number": 399,
      "title": "multi-button keybinds",
      "body": "i'm using a microsoft keyboard which has a few keys sending multiple key signals, among which an emoji key sending `Mod+Shift+Ctrl+Alt+Space`.\r\ni was wondering if i could use that key as a modifier to bind specific emoji to different letters, so as a test tried a bind:\r\n\r\n```\r\nMod+Shift+Ctrl+Alt+Space+F9 { spawn \"sh\" \"-c\" \"notify-send foo baz'\"; }\r\n```\r\n\r\nhowever, this got me:\r\n\r\n```\r\n       > Error: error loading config\r\n       >     Diagnostic severity: error\r\n       >     Caused by: error parsing\r\n       >     Caused by: error parsing KDL\r\n       >\r\n       > Error: invalid keybind\r\n       >     Diagnostic severity: error\r\n       >\r\n       >     Caused by: invalid keybind\r\n       >     Caused by: invalid modifier: Space\r\n       > Begin snippet for .attr-041r6j70w6v6dakqkzmwb899h71g2hibch7d14bbv9gy7bxhd5mp starting at line 144, column 1\r\n```\r\n\r\nso i get that so far binds use mods + one non-mod key. i guess i'm curious if it might be possible to have binds with multiple non-mod keys this way as well.\r\n",
      "created_at": "2024-05-26T17:05:16Z",
      "updated_at": "2024-05-26T17:29:50Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZrHI",
      "number": 398,
      "title": "Monocle layout",
      "body": "Hello. \r\n\r\nIn BSPWM there is a layout called monocle. Windows are maximized but without any gaps. \r\nThis is pretty cool when we work for a long time on a single window (web, Writer, photo treatment,. . . ). \r\n\r\nIs this can be difficult to implement? \r\n\r\nI absolutely don't have any skills in programmation. I just ask. .. in case ;)\r\n\r\nThank you. ",
      "created_at": "2024-05-26T09:06:00Z",
      "updated_at": "2024-05-26T16:04:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Okanda",
        "avatar_url": "https://avatars.githubusercontent.com/u/12570903?u=21fc37c16905fa5bf5b41dfb04c2e83a54be07df&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZq-K",
      "number": 396,
      "title": "Option or window rule to focus workspace",
      "body": "I'd like the option, either global setting or per-window-rule, to force a `focus-workspace` when opening a new window on a workspace that isn't visible.\r\n\r\nI have multiple rules to open certain programs on different workspaces, but there is no visual indication that they were opened. After launching the program, I have to manually switch workspaces. I can see this being useful for some, but I'd like the option of it being automatic.",
      "created_at": "2024-05-26T03:25:51Z",
      "updated_at": "2024-05-26T14:08:43Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Nairou",
        "avatar_url": "https://avatars.githubusercontent.com/u/942190?u=fce8347b1eb6c8a9d1dee0459164949d026bf5dd&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZq1a",
      "number": 392,
      "title": "Install Niri for MOST DISTROS (script)",
      "body": "Hey, I like this project so far, I've seen that at least for now it's available Gentoo, NixOS, Arch and its variants but it rather skips those more casual friendly distros like Debian, Ubuntu, Mint or base Fedora. I would like to address this - what do you think about maybe releasing an \"official\" installation (bash) script that would just download latest release binary files and neatly organize them on user computer or make it download latest version of rust (stable), then compile own latest stable release of Niri and copy files to correct places. It would be then something very similar to what Deno or Rust install scripts does and should realistically work for all distros except those extreme ones like Gentoo, Linux from Scratch or NixOs but dozens of other would be covered.\r\n\r\nI'm also down for creating such installation script & maintaining it if you like the idea. Users could just paste:\r\n```sh\r\ncurl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/YaLTeR/niri/main/install.sh | sh\r\n```\r\n*(example command, but it would be something very similar)*\r\n*(\"special\" distros like NixOS or Gentoo would still need its own dedicated package, about updating, how about having command like `niri update` that would just check if there's new release and if it is - rerun install script)*",
      "created_at": "2024-05-25T20:02:58Z",
      "updated_at": "2024-05-26T11:22:28Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "amatsagu",
        "avatar_url": "https://avatars.githubusercontent.com/u/81469656?u=fdba01365280b04db2b709b2419f16f51b4bf582&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZq2w",
      "number": 393,
      "title": "Feature request: Ability to swap column sizes...",
      "body": "I've used things like DWM, awesomewm, DWL, etc for years, and one thing I miss from those is that I can select a window and hit mod+enter and that swaps with the \"master\"...\r\n\r\nI think I'd be able to replicate that use case really nicely in niri if there was a way to quickly swap the width of the current column with the column to the left or right of it.\r\n\r\nSo, if I have two columns, one that is 2/3 the screen width and the other 1/3, then swap focus but swap the widths as well.\r\n\r\nOne approach that I think would work well would be a modified version of `move-column-left` and `move-column-right` that swaps the widths as well when moving. Then I can setup a \"wide\" column and a skinny column and move windows in and out of that as needed.\r\n\r\nThoughts? I'll probably start working on a pull request for this...",
      "created_at": "2024-05-25T21:08:04Z",
      "updated_at": "2024-05-26T10:44:23Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "minego",
        "avatar_url": "https://avatars.githubusercontent.com/u/469128?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZoUi",
      "number": 385,
      "title": "[Feature] Option to automatically resize windows to preset-column-widths",
      "body": "I think it would be useful to have an option to force preset-column-widths for all windows, or certain window-rules. By \"force\" I mean, when a window is created, it will be resized to the closest `preset-column-widths` value. This option should have possible values: \"never\" (default), \"on-creation\", and \"always\". The only issue with \"always\" would be that it would conflict with `set-column-width` bindings. Specific `window-rules` should override this behavior, if `default-column-width` is set for that rule.\r\n\r\nThe issue with the current behavior, is that I want to leave `default-column-width {}` because I want some windows big and some windows small, and default sizing generally works for that. But the sizing is sometimes slightly uneven. For example: firefox opens at 60% width, and alacritty opens at 43% width by default. With this option I wouldn't have to make window-rules for every offending application that has uneven default sizing.",
      "created_at": "2024-05-23T16:25:07Z",
      "updated_at": "2024-05-23T21:52:46Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "FlyingWombat",
        "avatar_url": "https://avatars.githubusercontent.com/u/25214020?u=bb68823e5b979f3c022106f21101546df1343b72&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXltl",
      "number": 172,
      "title": "support wlr-output-management-unstable-v1?",
      "body": "the [`wlr-output-management-unstable-v1` protocol](https://github.com/swaywm/wlr-protocols/blob/master/unstable/wlr-output-management-unstable-v1.xml) \"exposes interfaces to obtain and modify output device configuration\".\r\nthis is used by tools such as [`kanshi`](https://wayland.emersion.fr/kanshi/).\r\n",
      "created_at": "2024-02-05T20:01:23Z",
      "updated_at": "2024-05-23T04:53:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZnjm",
      "number": 383,
      "title": "How to open a window inside a defined workspace?",
      "body": "Something like\r\n`niri msg action open-window-on-workspace workspace-1 \"flatpak run org.mozilla.firefox\"`\r\nIs that a feature that could be easily implemented?, it could improve productivity on lower-end devices and could spawn a complete workspace while booting up.\r\n\r\nIs it on your scope for the project (being a minimalist compositor)?",
      "created_at": "2024-05-22T00:36:39Z",
      "updated_at": "2024-05-23T05:25:39Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "thepragmaticmero",
        "avatar_url": "https://avatars.githubusercontent.com/u/169491353?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZlJx",
      "number": 368,
      "title": "dimming window_rule",
      "body": "Are there any plans to add this?",
      "created_at": "2024-05-21T16:19:01Z",
      "updated_at": "2024-05-21T19:39:27Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "name-snrl",
        "avatar_url": "https://avatars.githubusercontent.com/u/72071763?u=7aacf4e6dbdd14b85459db56da0f18254fb23081&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYrUL",
      "number": 282,
      "title": "support wlr-output-management-unstable-v1",
      "body": "To make programs like [kanshi](https://git.sr.ht/~emersion/kanshi) works.\r\n\r\n```\r\n$kanshi\r\ncompositor doesn't support wlr-output-management-unstable-v1\r\n```\r\n\r\nDoes it breaks the output configuration `position` option?",
      "created_at": "2024-04-06T23:30:31Z",
      "updated_at": "2024-05-21T18:04:30Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "megatux",
        "avatar_url": "https://avatars.githubusercontent.com/u/850020?u=0973020b5f49284386d63c2529405cb565bb5a69&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZkfU",
      "number": 365,
      "title": "Add support for left-handed pointer devices",
      "body": "I use trackballs and mice with my left hand, and I'm used to swap the buttons. Many wayland compositors have a \"left-hand\" option that can be set on pointer/trackpad devices. The libinput function is [libinput_device_config_left_handed_set](https://smithay.github.io/input.rs/input_sys/fn.libinput_device_config_left_handed_set.html)\r\n\r\nIn Sway, the option is `input <id> left_handed enable|disable`.\r\n\r\nIn River, it's `riverctl input <id> left-handed enabled|disabled`.",
      "created_at": "2024-05-21T05:50:38Z",
      "updated_at": "2024-05-21T06:16:13Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "dnkl",
        "avatar_url": "https://avatars.githubusercontent.com/u/14031526?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZjyV",
      "number": 361,
      "title": "expose active display in `niri msg outputs`",
      "body": "i would like to make a keybind for scaling displays. to this end, i would like to be able to check which display is in focus, such as to be able to use that info to pass to `niri msg output $OUTPUT scale 2`.\r\nto facilitate this use-case, it would be nice if `niri msg outputs` exposed this info.",
      "created_at": "2024-05-20T15:39:55Z",
      "updated_at": "2024-05-20T15:44:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZgiv",
      "number": 350,
      "title": "v0.1.6",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nWe've now got a small [setup showcase thread](https://github.com/YaLTeR/niri/discussions/325), be sure to check it out!\r\n\r\nAnd here are the improvements from the last release.\r\n\r\n## Gestures\r\n\r\nIn this release, I added mouse gestures for resizing and scrolling the view. I also made a [wiki page](https://github.com/YaLTeR/niri/wiki/Gestures) listing all existing gestures.\r\n\r\n### Interactive Window Resizing\r\n\r\nYou can now resize windows interactively with a mouse (yes, finally). Both by edge-dragging windows with client-side decorations, and anywhere on a window by holding <kbd>Mod</kbd> together with the right mouse button.\r\n\r\nTo complement this, there are two new double-click gestures: double-clicking a resize will expand the window to the full monitor width, or reset the window height to take up all available space, depending on the edge that you double-click. Thanks @FreeFull for suggesting these gestures!\r\n\r\nResetting the window height is also available as the new `reset-window-height` key binding.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/2598afdc-4520-4f85-8e95-ddd62aa37000\r\n\r\nDespite the ubiquity, interactive resizing proved quite tricky to implement with plenty of edge cases (tiling makes it harder since multiple things need to coordinate together). The main challenge stems from the fact that when resizing a window by the left edge, its right edge *should stay in place*, which means that the *window itself* must move to the left, strictly in sync with changing size. Throw into the mix *slow* windows (the red rectangle on the video), windows not strictly obeying the given size (e.g. terminals snapping to the cell grid), and multiple windows in a column (which must all resize together), and you've got a wild asynchronous cocktail.\r\n\r\nThere was even a [Chromium bug](https://issues.chromium.org/issues/340500574) involved in this one, and a similar Firefox issue is waiting on [a recent GTK 3 update](https://gitlab.gnome.org/GNOME/gtk/-/blob/3.24.42/NEWS?ref_type=tags#L22).\r\n\r\n### Mouse View Scrolling\r\n\r\nHolding <kbd>Mod</kbd> and the middle mouse button (scroll wheel) will now let you scroll the view. This uses the touchpad swipe gesture code with all its decelerated spring animation goodness, but makes sure that the spot that you \"grabbed\" stays locked to the mouse cursor.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/8464e65d-4bf2-44fa-8c8e-5883355bd000\r\n\r\n<div align=\"center\"><i>Quite embarrassing how long it took me to come up with this one, considering I am primarily a mouse user.</i></div>\r\n\r\n## Functionality\r\n\r\nThis release also adds some nice new functionality.\r\n\r\n### Named Workspaces\r\n\r\nYou can now declare *named* workspaces in the config.\r\n\r\n```\r\nworkspace \"browser\"\r\n\r\nworkspace \"chat\" {\r\n    open-on-output \"DP-2\"\r\n}\r\n```\r\n\r\nUnlike normal (dynamic) workspaces, named workspaces are persistent (they are not deleted when they have no windows), but otherwise they behave just like normal workspaces: you can reposition them and move to different monitors.\r\n\r\nActions like `focus-workspace` or `move-column-to-workspace` can refer to workspaces by name in addition to by index. Also, you can use the new `open-on-workspace` window rule to make a window open on a specific named workspace:\r\n\r\n```\r\n// Declare a workspace named \"chat\" that opens on the \"DP-2\" output.\r\nworkspace \"chat\" {\r\n    open-on-output \"DP-2\"\r\n}\r\n\r\n// Open Fractal on the \"chat\" workspace.\r\nwindow-rule {\r\n    match app-id=r#\"^org\\.gnome\\.Fractal$\"#\r\n    open-on-workspace \"chat\"\r\n}\r\n```\r\n\r\nYou can find a few more details [on the wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Named-Workspaces).\r\n\r\nNamed workspaces should mostly solve the \"shove a bunch of windows on correct monitors at startup\" problem while working seamlessly with the dynamic workspace system. Thanks to @algernon for implementing this!\r\n\r\n### IPC Improvements\r\n\r\nThe new `niri msg output` command lets you apply *transient* output configuration changes. It uses the same syntax as the config file, e.g. `niri msg output eDP-1 scale 2`. These changes will persist until you edit the output settings in the config file (or restart niri).\r\n\r\nWhile adding this, I also made output names case-insensitive, both for `niri msg output` and for the config file, which should make things less annoying.\r\n\r\nAdditionally, @rustysec added a `niri msg workspaces` command which will be extra useful now with the introduction of named workspaces:\r\n\r\n```\r\n┌ ~\r\n└─ niri msg workspaces\r\nOutput \"DP-2\":\r\n   1 \"chat\"\r\n   2 \"browser\"\r\n * 3\r\n   4\r\n\r\nOutput \"eDP-1\":\r\n   1 \"notes\"\r\n * 2\r\n   3\r\n```\r\n\r\nLike with other IPC commands, you can use the `--json` flag to get the same data in a machine-readable form.\r\n\r\n### New Window Rules\r\n\r\nYou can now [set](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#focus-ring-and-border) `focus-ring` and `border` properties in window rules to override them for specific windows.\r\n\r\nThe new `is_active_in_column` matcher, added by @TheZoq2, can be used to make a magnifier-like window layout:\r\n\r\n```\r\nwindow-rule {\r\n    match is-active-in-column=false\r\n\r\n    min-height 100\r\n    max-height 100\r\n}\r\n```\r\n\r\nFinally, the new `at-startup` matcher will match during the first 60 seconds after niri startup. You can combine it with `open-on-output` or `open-on-workspace` properties to put windows where they belong when starting the session, but not afterward. I found it quite useful for e.g. browsers where I want new windows to open normally as I go on with my day, rather than keep spawning on the same monitor and workspace.\r\n\r\n```\r\n// Open Firefox maximized on the \"browser\" workspace, but only at niri startup.\r\nwindow-rule {\r\n    match at-startup=true app-id=r#\"^org\\.mozilla\\.firefox$\"#\r\n\r\n    open-on-workspace \"browser\"\r\n    open-maximized true\r\n}\r\n```\r\n\r\n### Debugging Features\r\n\r\nThere are a few new debugging features:\r\n- The `debug-toggle-opaque-regions` bind will draw regions marked as opaque in blue and others in red.\r\n\r\n    ![](https://github.com/YaLTeR/niri/assets/1794388/c3505b52-b4d8-4d5a-851b-691d4c5cb82b)\r\n- The `debug-toggle-damage` bind will draw the damage computed for the screen. Kind of, mostly. Good enough to tell when something wrong is going on.\r\n- The `disable-direct-scanout` flag disables direct scanout to the primary and the overlay planes.\r\n\r\n## Eye candy\r\n\r\nOf course, there are also new eye candy features!\r\n\r\n### Rounded Window Corners\r\n\r\nNiri can now do corner rounding, a clear *must-have* feature for any self-respecting Wayland compositor. I've got quite an extensive implementation here, actually. Let's take a look.\r\n\r\nYou set the radius with the new `geometry-corner-radius` window rule.\r\n\r\nBy itself, it doesn't *clip* the window but merely informs elements like the border and the focus ring which window radius *they* should assume. This means that you can keep using client-side-decorated windows with *their own* rounded corners and shadows, and have the borders drawn with the right radius.\r\n\r\n```\r\nwindow-rule {\r\n    geometry-corner-radius 12\r\n}\r\n```\r\n\r\n<div align=\"center\">\r\n\r\n![](https://github.com/YaLTeR/niri/assets/1794388/7e328867-8ecd-4764-928d-f76701cfdf92)\r\n\r\n<i>This sets the radius of the window geometry—the inner radius of the border. The outer border radius is computed automatically taking the border width into account.</i></div>\r\n\r\nYou can even set a separate radius for every corner, for example, to match GTK 3 applications:\r\n\r\n```\r\nwindow-rule {\r\n    match app-id=\"^gnome-terminal-server$\"\r\n    geometry-corner-radius 8 8 0 0\r\n}\r\n```\r\n\r\n<div align=\"center\">\r\n\r\n![](https://github.com/YaLTeR/niri/assets/1794388/08f37389-4927-4a28-9aa1-b240f22700be)\r\n\r\n<i>No, I don't particularly see anyone going out of their way to set this up for every window.</i></div>\r\n\r\nNext, the new `clip-to-geometry` window rule will make niri actually clip windows to their geometry, including the `geometry-corner-radius` that you have set.\r\n\r\n```\r\nwindow-rule {\r\n    geometry-corner-radius 12\r\n    clip-to-geometry true\r\n}\r\n```\r\n\r\n<div align=\"center\">\r\n\r\n![](https://github.com/YaLTeR/niri/assets/1794388/52a620d7-720d-4d49-93ca-686e26bb9e4f)\r\n\r\n</div>\r\n\r\nCombine this with `prefer-no-csd` to get the classic rounded corner setup that works on all windows:\r\n\r\n```\r\nprefer-no-csd\r\n\r\nlayout {\r\n    focus-ring {\r\n        off\r\n    }\r\n\r\n    border {\r\n        width 2\r\n    }\r\n}\r\n\r\nwindow-rule {\r\n    geometry-corner-radius 12\r\n    clip-to-geometry true\r\n}\r\n```\r\n\r\n![](https://github.com/YaLTeR/niri/assets/1794388/c4355513-a8e6-4946-9e01-3e1d493bedfe)\r\n\r\nAll of this works correctly with subsurfaces, windows [blocked out from screencasts](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#block-out-from), transparency, resize and other animations. And whenever possible, there's no overhead: opaque regions are preserved (except for the corners themselves), and even overlay plane unredirection still works for subsurfaces completely inside the clipped geometry!\r\n\r\n| Tricky Cases | Opaque Regions | Unredirection |\r\n| --- | --- | --- |\r\n| ![](https://github.com/YaLTeR/niri/assets/1794388/623a6900-3a7d-438a-9895-9fcd38dad69d) | ![](https://github.com/YaLTeR/niri/assets/1794388/427f5b65-f9a9-4227-8367-cfc8795c6d14) | ![](https://github.com/YaLTeR/niri/assets/1794388/fc807999-2e4c-4231-b5e6-c5c16f92b174)|\r\n\r\n### Screen Transition\r\n\r\nI added a `do-screen-transition` action which lets you switch between light and dark, or between different themes, smoothly like in GNOME Shell.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/aa779179-2ad0-4e17-82af-a802b8d32094\r\n\r\nThe key is to make sure the applications themselves switch their theme *without animation* and as fast as possible, then niri's own screen transition will make it look nice and synchronized.\r\n\r\nIf your apps take just a bit too long to switch, you can increase the delay during which the screen is frozen (defaults to 250 ms):\r\n\r\n```\r\nniri msg action do-screen-transition --delay-ms 500\r\n```\r\n\r\n### Animation Custom Shaders\r\n\r\nFinally, for something more advanced. I'm experimenting with the ability to set [custom shaders](https://github.com/YaLTeR/niri/wiki/Configuration:-Animations#custom-shader) for animations. Currently, I added support to all three base window animations (open, close, resize).\r\n\r\n<div align=\"center\">\r\n\r\n![](https://github.com/YaLTeR/niri/assets/1794388/b16b4703-f427-47b0-83b6-132601c0c5ae)\r\n\r\n<i>No, not those shaders.</i></div>\r\n\r\nFor example, you can use a custom shader to change the default crossfade resize to an animation that *crops* the window when it is growing, and crossfades only when it is shrinking. This looks nicer for the text-heavy terminals since it avoids visually stretching the text.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/438f51c1-4ad7-4b86-963e-6842a732c060\r\n\r\nFor the closing animation, I made a shader that makes the windows fall down and rotate, inspired by [the S rank animation](https://github.com/ppy/osu/pull/26630) from osu!lazer:\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/9adf2919-7994-454d-a4be-08b701b40d0b\r\n\r\nAnd for the opening, I made a simple expanding circle example:\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/27a238d6-0a22-4692-b794-30dc7a626fad\r\n\r\nThe way you make these shaders is by writing a GLSL function:\r\n\r\n```\r\nanimations {\r\n    window-resize {\r\n        custom-shader r\"\r\n            vec4 resize_color(vec3 coords_curr_geo, vec3 size_curr_geo) {\r\n                vec3 coords_tex_next = niri_geo_to_tex_next * coords_curr_geo;\r\n                vec4 color = texture2D(niri_tex_next, coords_tex_next.st);\r\n                return color;\r\n            }\r\n        \"\r\n    }\r\n}\r\n```\r\n\r\nLike all other settings, custom shaders are live-reloaded as you edit the config. I've got detailed documentation with many examples, including all shaders above, [in this folder](https://github.com/YaLTeR/niri/tree/v0.1.6/wiki/examples).\r\n\r\n## Other improvements in this release\r\n\r\n- Niri will now guess the default scale factor for monitors, which should make HiDPI laptops get 200% scaling by default.\r\n- Some Intel multi-monitor setups that didn't work before will now work (niri now filters out CCS modifiers that increase required bandwidth).\r\n- Asahi and other ARM and kmsro devices will now work in more cases.\r\n- Made screencasting on Asahi work, at least in some cases.\r\n- On-demand layer-shell surfaces no longer receive exclusive keyboard focus. This fixes panels like xfce4-panel. On-demand focus will be properly implemented later.\r\n- Fixed IME popup positioning to be within the parent window and not obscure the input region (thanks @kchibisov).\r\n- Fixed screenshots not always pasting from the clipboard correctly.\r\n- Added `Abgr8888` and `Xbgr8888` formats to wl_shm which fixes some clients that assume they are always present.\r\n- Added a `linear` easing animation curve.\r\n- Fixed focus ring rendering above the fullscreen window backdrop.\r\n- Fixed border and focus ring config changes not applying until the next screen redraw.\r\n- Corrected the draw order for windows in the closing animation.\r\n- Updated Smithay, which:\r\n    - Fixed drag-and-drop cursor sometimes getting stuck in Firefox.\r\n    - Fixed a crash with clients using the virtual keyboard protocol.\r\n    - Fixed some screen lockers like gtklock not working.\r\n    - Fixed some wl_subsurface issues.\r\n    - Fixed running on a TTY not working on some setups, like QEMU + virgl.\r\n    - Slightly improved performance.\n\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.6'>v0.1.6</a>.</em>",
      "created_at": "2024-05-18T11:35:33Z",
      "updated_at": "2024-05-19T04:05:53Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZg-B",
      "number": 355,
      "title": "Per-Keyboard XKB Configs",
      "body": "Would it be possible to make per-keyboard xkb configs? I have a standard 65% QWERTY keyboard that I mapped to Dvorak using xkb and a custom 8-key macropad with my own layout flashed to it. Would it be possible to apply the xkb layer to only certain keyboards (my 65%) and not to others (my macropad), similar to \"Per-device input configs\" in Hyprland? Thanks!",
      "created_at": "2024-05-18T18:19:55Z",
      "updated_at": "2024-05-18T18:24:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "arutonee1",
        "avatar_url": "https://avatars.githubusercontent.com/u/137639243?u=db5487868d1e8e42ced3935a5a6100e3c348b2a1&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZg2L",
      "number": 354,
      "title": "Layout section should be applicable per-monitor",
      "body": "For multi-screen setups it would be desirable to have the ability to use the functions of the layout section on each screen if desired.\r\n\r\nFor example, I have a 1080p display to my left rotated 90 degrees. I use this for documentation, messaging, etc, but the problem is the initial window setup. This screen will never want a 50/50 split which is my preferred setup on the main screen which is 1440p and not rotated.\r\n\r\nThank you for a wonderful project! (yes, I'm still trying to learn rust; just busy) ",
      "created_at": "2024-05-18T16:57:22Z",
      "updated_at": "2024-05-18T17:09:33Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "morenathan",
        "avatar_url": "https://avatars.githubusercontent.com/u/98691858?u=303cae5d64147a6376a3ebc2f37f5269a7e0ee8d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZgJu",
      "number": 348,
      "title": "Support for smoother gradients",
      "body": "Hello all!\r\n\r\nToday I was trying out using different border gradients and a thing I noticed was that the gradients seem to skip some colors. This makes sense (seeing the comment in the default config supplied) since the gradients are based off CSS's `linear-gradient`. This means that the gradient smoothly interpolate colors that go from the `from` color to the `to` color. This makes it so that if you make a gradient between red and blue, the colors go from red, to grayish purple, to blue. The hues in between blue and red get skipped.\r\n\r\nThe way CSS gets around this is by letting you give `linear-gradient` more arguments. Those arguments being the extra colors that you want the gradient to pass through. As a consequence you can make it go through the missing hues you needed.\r\n\r\nMy question now is:\r\n- Could there be support for something like what CSS does with the extra arguments to `linear-gradient`?\r\n- Could there be support for a version of `active`/`inactive-gradient` that interpolates the hue of the color instead of the RGB values?\r\n\r\nThank you for your time reading this.\r\n\r\nHere are some examples of what I mean:\r\n`linear-gradient(red, blue)`\r\n![image](https://github.com/YaLTeR/niri/assets/65361987/018ec49a-5802-49cf-88ce-862312562672)\r\n\r\n`linear-gradient(red, orange, yellow, green, blue)`\r\n![image](https://github.com/YaLTeR/niri/assets/65361987/44683b5d-edee-46a8-99d8-9f0727969b5d)\r\n\r\n",
      "created_at": "2024-05-17T22:55:31Z",
      "updated_at": "2024-05-18T12:07:45Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sona-tau",
        "avatar_url": "https://avatars.githubusercontent.com/u/65361987?u=fcc87142d4a15c740fc3e48a51fce2d2a0333ed8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZgTp",
      "number": 349,
      "title": "Please correct a word in wiki/Configuration/animations",
      "body": "https://github.com/YaLTeR/niri/wiki/Configuration:-Animations#window-close\r\nIn this section\r\n`animations {\r\n    window-open {\r\n        duration-ms 150\r\n        curve \"ease-out-quad\"\r\n    }\r\n}`\r\nIt should be `animations{\r\n                          window-close{`",
      "created_at": "2024-05-18T04:48:48Z",
      "updated_at": "2024-05-18T04:50:50Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "moilong",
        "avatar_url": "https://avatars.githubusercontent.com/u/112737385?u=03d76819fb88573ed4b69e83787faca7e940a39c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZdvA",
      "number": 346,
      "title": "screen capture using pipewire",
      "body": "wf-recorder gives this error:\r\n`wl_registry@2: error 0: invalid version for global zwlr_screencopy_manager_v1 (25): have 1, wanted 3`\r\nNo pipewire source in obs.\r\nxdg-dessktop-portal-gnome, xdg-desktop-portal-gtk are running.\r\nOther compositors like labwc,swayfx and hyprland uses xdg-desktop-portal-wlr so wf-recorder and obs works.\r\nCan't figure out the missing component for niri.\r\nniri 0.1.5 (v0.1.5-106-g229ca90) on voidlinux.",
      "created_at": "2024-05-16T06:12:29Z",
      "updated_at": "2024-05-20T08:30:19Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AkECZ",
        "body": "Yes, it must be running before niri is started."
      },
      "user": {
        "login": "moilong",
        "avatar_url": "https://avatars.githubusercontent.com/u/112737385?u=03d76819fb88573ed4b69e83787faca7e940a39c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZctd",
      "number": 343,
      "title": "Vscode Crashes on Niri, works fine on Gnome",
      "body": "I am using `niri 0.1.5 (6a80078)`. And I tried installing Vscode using DNF, Flatpak, Snaps, and tried bunch of solutions that I found online but no help. Vscode doesn't open or crashes. It works fine when I open on Gnome.\r\n\r\nSpecifications:\r\nOS: Fedora Linux 40 (Workstation Edition) x86_64\r\nHost: Aspire A515-51G V1.19\r\nKernel: 6.8.5-301.fc40.x86_64\r\nCPU: Intel i5-7200U (4) @ 3.100GHz\r\nGPU: NVIDIA GeForce 940MX\r\nGPU: Intel HD Graphics 620\r\nMemory: 8gb\r\nWhen I open Vscode using \"code\" command then nothing happens if installed using DNF.\r\nbut when using `flatpak run com.visualstudio.code`, I get a warning:\r\n```\r\n[2 zypak-helper] Wait found events, but sd-event found none\r\nWarning: 'ms-enable-electron-run-as-node' is not in the list of known options, but still passed to Electron/Chromium.\r\n```\r\n\r\nI am not sure if this issue is because of Niri or something else, that's why I am creating a discussion.",
      "created_at": "2024-05-15T09:18:38Z",
      "updated_at": "2024-05-15T10:02:51Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "binamralamsal",
        "avatar_url": "https://avatars.githubusercontent.com/u/61900781?u=5d422cd0ee7e4f0b8b980119c8fceb9454a96592&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZaNb",
      "number": 339,
      "title": "Like to spawn a command at start.",
      "body": "I like to start swww to set wallpaper in niri. My config looks like this:\r\nspawn-at-startup \"swww\" \"init\"\r\nspawn-at-startup \"swww\" \"img\" \"$(< \"${HOME}/.cache/wal/wal\")\"\r\nFirst one to start swww-daemon. Works ok.\r\nSecond one to set wallpaper not executed. I tried running as bash script. \r\nspawn-at-startup \"swww.sh\". \r\nAgain no worky. As a workaround I put that second command in .bash_profile. Help appreciated. Thankyou.",
      "created_at": "2024-05-13T13:23:36Z",
      "updated_at": "2024-05-14T02:56:07Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Aj74g",
        "body": "They are started in parallel, so likely swww img starts before the daemon has a chance to start up. I suggest putting these two in a single shell script or command so that they run sequentially."
      },
      "user": {
        "login": "moilong",
        "avatar_url": "https://avatars.githubusercontent.com/u/112737385?u=03d76819fb88573ed4b69e83787faca7e940a39c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZa73",
      "number": 342,
      "title": "Fullscreen (Mod + Shift + F) still includes a thin border around the window.",
      "body": "Is there a way to make only this Fullscreen not include the border?",
      "created_at": "2024-05-14T02:25:12Z",
      "updated_at": "2024-05-14T02:26:06Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "LollipopFt",
        "avatar_url": "https://avatars.githubusercontent.com/u/62802897?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZTZU",
      "number": 334,
      "title": "Drag and drop windows with mouse?",
      "body": "Hello. \r\n\r\nI'm trying Niri and it's really cool. \r\nI know it is done to be used with keyboard but I wonder if it's possible to drag en drop windows to arrange them with Meta+mouse (or other key)? \r\nIf not will it be implemented in the futur? \r\n\r\nThank you. \r\n\r\nLCG\r\n\r\nedit : add \"to arrange them\"",
      "created_at": "2024-05-09T07:08:29Z",
      "updated_at": "2024-05-11T10:30:40Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Okanda",
        "avatar_url": "https://avatars.githubusercontent.com/u/12570903?u=21fc37c16905fa5bf5b41dfb04c2e83a54be07df&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZVGK",
      "number": 336,
      "title": "support screen-sharing a single window",
      "body": "I didn't see a tracking issue/discussion for this yet. This is especially helpful for widescreen users where sharing the full screen is bad for attendees with more traditional resolutions and usually requires adjusting the font size.",
      "created_at": "2024-05-10T10:13:41Z",
      "updated_at": "2024-05-10T10:30:14Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Kha",
        "avatar_url": "https://avatars.githubusercontent.com/u/109126?u=e4a79e137900a0cb86300e28cd4e0bc91fcc4989&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZQsh",
      "number": 331,
      "title": "Persistent keyboard layout per application",
      "body": "It will be usefull if we can set persistent keyboard layout per application. (by window class or smth)\r\n\r\nI tried to write script using `wlrctl` and `setxkbmap`, but  `setxkbmap` dont work on Wayland. Is there a way on Wayland to set keyboard layout from terminal?\r\n\r\nExample usecase:\r\n\r\n- Change layout to en_EN when switch to terminal\r\n- Change layout to <other_layout> when switch to messanger\r\n\r\n\r\n",
      "created_at": "2024-05-07T08:22:19Z",
      "updated_at": "2024-05-07T09:27:34Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "Vatson112",
        "avatar_url": "https://avatars.githubusercontent.com/u/55401893?u=a4f3ab5178a3438051ef66d37c1b121428b2b76d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXwPf",
      "number": 202,
      "title": "Add more animations",
      "body": "1. Switching between workspaces using `focus-window-or-workspace-[up,down]` is animated, but `focus-workspace` isn't\r\n2. Moving windows isn't animated, not necessary though\r\n\r\nHope to see animations here. Nice WM anyway :heart:\n\nEDIT: 1, 2 finished",
      "created_at": "2024-02-16T15:33:46Z",
      "updated_at": "2024-05-02T15:35:09Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "vollowx",
        "avatar_url": "https://avatars.githubusercontent.com/u/73375859?u=8ad681869121cb18d3486fa4f1294ea7f80ee30a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZJ7H",
      "number": 324,
      "title": "WIdgets in Niri",
      "body": "Just like AwesomeWM, I wanted to make basic widgets for stuff like volume, brightness etc, and I have noticed that niri has some widgets like this in the form of the hotkey menu and the quit confirmation box. I am not sure if that's niri or a different program.\r\nIf niri has support for basic widgets, can someone provide the code for how the exit confirmation dialogue works?\r\nThanks!",
      "created_at": "2024-05-02T03:21:05Z",
      "updated_at": "2024-05-02T05:34:46Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AjcQ4",
        "body": "Hey, these two are indeed in niri, but they are essentially 100% \"hardcoded\". In order to keep things simple, I didn't want to add a whole GUI toolkit to niri, so these dialogs are all manually laid out and drawn with Cairo, with quite a bit of boilerplate. You can find the code here: https://github.com/YaLTeR/niri/tree/main/src/ui"
      },
      "user": {
        "login": "aditya23043",
        "avatar_url": "https://avatars.githubusercontent.com/u/66688960?u=8a6b9d0fef3411612ae636d78bf87a116a95b07c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AZGMU",
      "number": 317,
      "title": "tiny scripts for rootful xwayland",
      "body": "hey, just here to share some tiny scripts for launching different applications in rootful xwayalnd mode. \r\n\r\nThe [wiki](https://github.com/YaLTeR/niri/wiki) explains already very well, so I hope these scripts can assist others who, like me, are not familiar with the Xwayland mechanism.\r\n\r\nlaunch.sh\r\n```bash\r\n#!/bin/sh\r\n\r\nif [ ! \"$#\" -gt 0 ]; then  \r\n    echo \"ERROR: needs at least one argument.\"  \r\n    exit 1  \r\nfi  \r\n\r\nDD=114\r\n\r\nwhile [ -e /tmp/.X11-unix/X$DD ]; do\r\n  DD=$((DD+1))\r\ndone\r\n\r\nXwayland :$DD &\r\nsleep 2\r\nenv DISPLAY=:$DD i3 &\r\n\r\narg=\"$1\"  \r\nargs=\"$@\"\r\nsleep 2\r\n  \r\nif [ \"$arg\" = \"foo\" ]; then  \r\n    env XDG_SESSION_TYPE=x11 QT_QPA_PLATFORM=xcb WAYLAND_DISPLAY= DISPLAY=:$DD foo &\r\nelse  \r\n    env DISPLAY=:$DD $args &\r\nfi\r\n```\r\n\r\ncopy.sh\r\n```bash\r\n#!/bin/bash\r\ninfo=$(niri msg focused-window)\r\necho $info | awk 1>/tmp/tar_stdout '/Title/ {\r\n    if ($0 ~ /Title: \"Xwayland on :[0-9]+\"/) {\r\n        port = gensub(/.*:([0-9]+).*/, \"\\\\1\", \"g\", $0)\r\n        if (port ~ /^[0-9]+$/) {\r\n            print port\r\n        } else {\r\n            print \"NAN\"\r\n        }\r\n    } else {\r\n        print \"NAN\"\r\n    }\r\n}'\r\n\r\nresult=$(</tmp/tar_stdout)\r\nif [ \"$result\" != \"NAN\" ]; then\r\n    env DISPLAY=:$result xsel -ob | wl-copy\r\nfi\r\n```\r\n\r\npaste.sh\r\n```bash\r\n#!/bin/bash\r\ninfo=$(niri msg focused-window)\r\necho $info | awk 1>/tmp/tar_stdout '/Title/ {\r\n    if ($0 ~ /Title: \"Xwayland on :[0-9]+\"/) {\r\n        port = gensub(/.*:([0-9]+).*/, \"\\\\1\", \"g\", $0)\r\n        if (port ~ /^[0-9]+$/) {\r\n            print port\r\n        } else {\r\n            print \"NAN\"\r\n        }\r\n    } else {\r\n        print \"NAN\"\r\n    }\r\n}'\r\n\r\nresult=$(</tmp/tar_stdout)\r\nif [ \"$result\" != \"NAN\" ]; then\r\n    wl-paste -n | env DISPLAY=:$result xsel -ib\r\nfi\r\n```",
      "created_at": "2024-04-29T03:56:39Z",
      "updated_at": "2024-04-29T03:56:40Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Fuann-Kinoko",
        "avatar_url": "https://avatars.githubusercontent.com/u/56078314?u=fd71ed0568c9322d9dd71d367dc3e6d8d1ce35f3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYgvw",
      "number": 267,
      "title": "Start app if it doesn't have a window or activate window if it exists",
      "body": "Hi!\r\n\r\nOn my Pop_os installation I have a script that I bind to shortcuts for manipulating my most used apps like browser, terminal, and code editor.\r\n\r\nFor the terminal it would look like this:\r\n```\r\nmod+ctrl+shift+n      open or go to terminal\r\nmod+ctrl+shift+alt+n  open or move terminal to current workspace\r\n```\r\n\r\nLet's say I have no apps open:\r\n\r\n- If I press `mod+ctrl+shift+n` the terminal will be loaded and activated on the current workspace.\r\n- If I'm using the browser on another workspace and press `mod+ctrl+shift+n` I will be taken to the workspace of the terminal and the terminal window will be activated.\r\n- If I'm on another workspace than the terminal and press `mod+ctrl+shift+alt+n` the terminal window will be brought to the current workspace and activated. If it does not exist it will be loaded instead.\r\n\r\nIs there a way to check for open apps and their windows and is it possible to manipulate the windows position and workspace location by script?\r\n\r\nI hope I made myself clear! It's not that easy to explain.\r\n\r\nThanks!\r\n\r\n",
      "created_at": "2024-03-27T01:57:14Z",
      "updated_at": "2024-04-25T15:42:51Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AiCYP",
        "body": "Unfortunately, it's not currently possible. The IPC system needs to be extended with workspace and window information, and some way to manipulate windows different from the currently focused one."
      },
      "user": {
        "login": "sommerper",
        "avatar_url": "https://avatars.githubusercontent.com/u/1512048?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AV2ot",
      "number": 46,
      "title": "Implement Run or Raise",
      "body": "It could be functional to \"teleport\" to an already running app.\r\n[Here](https://github.com/labwc/labwc/issues/673) an example.",
      "created_at": "2023-10-11T11:46:03Z",
      "updated_at": "2024-04-22T05:44:26Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "wesbluemarine",
        "avatar_url": "https://avatars.githubusercontent.com/u/14043560?u=64d0fed553e233986596dcf1219889f91c89e636&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AY8U8",
      "number": 301,
      "title": "Swipe motion config?",
      "body": "Is there a way to configure the swipe motions? I'd like to have non-natural scrolling with the touchpad but natural for swipes. I thought I'd just put a minus sign in the swipe gestures but can't find a way to do that.",
      "created_at": "2024-04-21T19:01:42Z",
      "updated_at": "2024-04-21T20:07:57Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AjBbR",
        "body": "There's no configuration for swipes at the moment"
      },
      "user": {
        "login": "knuesel",
        "avatar_url": "https://avatars.githubusercontent.com/u/2412819?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AY65G",
      "number": 297,
      "title": "v0.1.5",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nThis time I decided to update the demo video in the README. Here's the new video if you're curious:\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/bce834b0-f205-434e-a027-b373495f9729\r\n\r\nNow let's go over the improvements from the last release.\r\n\r\n## More animations\r\n\r\nA big focus in this release was on animations. I've animated many more actions: window movement, resizing, and closing. Each of these was challenging to implement in its own way, but I'm quite happy with the end result.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/ce178da2-af9e-4c51-876f-8709c241d95e\r\n\r\nNaturally, all animations work well with [windows blocked out from screencasts](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#block-out-from).\r\n\r\nAs usual, you can disable or configure individual animations if you prefer. Find instructions on [the wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Animations).\r\n\r\nWhile working on these animations, I fixed a few minor issues with view positioning. So niri now works better even with animations disabled.\r\n\r\n## Spring animation improvements\r\n\r\nSpring animations are now more robust: values and durations are clamped more aggressively where it makes sense. For example, a bouncy window opening animation will become fully opaque upon reaching the full window size, and won't become transparent again during the following bounces.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/182a2ae3-7f25-497f-a4cc-554a7be49f82\r\n\r\nAlso, when using `slowdown`, the touchpad gesture velocity is now scaled by the slowdown factor, making the animation smoother.\r\n\r\n## Variable refresh rate\r\n\r\nNiri now has basic variable refresh rate (VRR) support. You can enable it by setting a `variable-refresh-rate` flag in the output config. Check [the wiki](https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs#variable-refresh-rate) for an example and caveats.\r\n\r\nAdditionally, `niri msg outputs` now shows whether VRR is supported and enabled.\r\n\r\n## IPC improvements\r\n\r\n`niri msg` received a few quality-of-life improvements thanks to @sodiboo:\r\n\r\n- Added `niri msg version` that shows the running niri compositor version and the niri CLI version. They are the same binary, so their versions should match, but they can briefly go out of sync after a niri update.\r\n- When `niri msg` receives an error from the compositor, it will now check if the compositor and the CLI versions match, and if not, print a message reminding you that you may need to restart niri.\r\n- Added `niri msg request-error` that will always result in an error from the compositor. This can aid in script development to check that your error handling works right.\r\n\r\n## Other improvements in this release\r\n\r\n- Added an `allow-when-locked=true` flag for spawn key bindings that makes them work when the session is locked. Check [the wiki](https://github.com/YaLTeR/niri/wiki/Configuration:-Key-Bindings#spawn) for an example.\r\n- Previous view position is now restored upon unfullscreening a window.\r\n- The `SIGPIPE` handler is now set to default in `niri msg` to prevent panic backtraces from showing up when stdout is closed.\r\n- The mouse cursor is now hidden upon touchscreen interaction.\r\n- Corrected some DRM leasing behavior to fix crashes when DRM leasing is unavailable and better handle hotplugging.\r\n- Added an `ease-out-quad` easing curve.\r\n- Fixed `warp-mouse-to-focus` not triggering when a window is closed by unmapping its buffer.\r\n- Fixed the horizontal touchpad gesture redrawing continuously rather than only on touchpad events.\r\n- Fixed overdamped spring instability being able to crash the compositor.\r\n- Added a microphone mute example bind to the default config.\n\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.5'>v0.1.5</a>.</em>",
      "created_at": "2024-04-20T13:55:09Z",
      "updated_at": "2024-04-20T13:55:10Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYymA",
      "number": 288,
      "title": "Fuzzel 1.10.* run window size",
      "body": "I don't know if this is a Niri issue or not. \r\n\r\nAfter updating fuzzel to 1.10.1 from 1.9.2, the launch window opens in full screen mode:\r\n\r\n![Screenshot from 2024-04-13 13-54-24](https://github.com/YaLTeR/niri/assets/85841412/23ab3f2e-53ce-4488-bd39-92d34ba0e41b)\r\n1.9.2\r\n\r\n![Screenshot from 2024-04-13 14-02-45](https://github.com/YaLTeR/niri/assets/85841412/e7639700-59ad-40b3-8c55-bec3f35ab628)\r\n1.10.1\r\n\r\nAny thoughts?\r\n```console\r\n$ niri -V\r\nniri 0.1.4 (7ff2de1)\r\n```\r\n\r\nTried to delete the fuzzel config file - didn't help.",
      "created_at": "2024-04-13T11:05:24Z",
      "updated_at": "2024-04-16T07:40:57Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "nebulosa2007",
        "avatar_url": "https://avatars.githubusercontent.com/u/85841412?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AY1m6",
      "number": 292,
      "title": "Question or feat. request.  Switch to previous used window/column. / Alt+Tab window switcher addon?",
      "body": "I'm too used to Alt+Tab to switch to my recents windows/apps.\r\nIs there something like a queue of the recently used windows or at least the previous one, so I can bind a key to quickly switch to it?\r\n\r\nAlso, I remember using something like that with i3...maybe from this [Redit post](https://www.reddit.com/r/i3wm/comments/95b2hx/alttab_like_behavior/) to get a better idea of what I mean.",
      "created_at": "2024-04-15T17:59:38Z",
      "updated_at": "2024-04-15T18:12:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "megatux",
        "avatar_url": "https://avatars.githubusercontent.com/u/850020?u=0973020b5f49284386d63c2529405cb565bb5a69&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXxAh",
      "number": 209,
      "title": "IPC for getting information about niri",
      "body": "It would be nice if we can have something like `niri msg activeworkspace`, making it convenient to write iteractive scripts and modules for waybar etc.",
      "created_at": "2024-02-17T15:41:52Z",
      "updated_at": "2024-04-15T04:14:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "EdenQwQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/62473844?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYxNU",
      "number": 286,
      "title": "Allow \"pinning\" apps so that they appear on every workspace",
      "body": "My workflow includes having qmmp on the far left of my workspace so that i can always slide it in and control the music, on desktop environments like gnome i would make the window visible on all desktops, so that i can always have quick access to the window no matter what workspace i am on.\r\n\r\nThis could be done either through a keybinding to toggle it or a window rule to activate it for specific windows (or both)\r\n\r\nThis may be similiar (or the same) as #149, but I dont really understand what the sticky columns exactly mean in that case.",
      "created_at": "2024-04-11T20:38:11Z",
      "updated_at": "2024-04-14T19:07:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "axtloss",
        "avatar_url": "https://avatars.githubusercontent.com/u/60044824?u=0054a394d319a914a05231d5a769456adc9e2e98&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYgvN",
      "number": 266,
      "title": "Is there a way to execute a script at startup?",
      "body": "Hi!\r\n\r\nI recently discovered this wonderful compositor and I'm trying to figure out if it is at a usable state for me. So I'll likely ask a bunch of questions over the next days if you don't mind.\r\n\r\nComparing to hyprland where it is possible to run a script from the config file at start-up like so:\r\n```\r\nexec-once=bash ~/.config/hypr/start.sh\r\n```\r\nIs there an equivalent method in Niri?\r\nI know it possible to set up services as you describe here https://github.com/YaLTeR/niri/wiki/Example-systemd-Setup but I think it's a little more convenient if I could just execute a script :-)\r\n\r\nAnd thank you for this project!",
      "created_at": "2024-03-27T01:41:22Z",
      "updated_at": "2024-04-14T12:39:59Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AiCXu",
        "body": "Hello, yeah, it's possible:\n\n```\nspawn-at-startup \"bash\" \"myscript.sh\"\n```\n\nat the top level. Note that the ~ in the second argument will not be expanded currently, you need to write out the home dir."
      },
      "user": {
        "login": "sommerper",
        "avatar_url": "https://avatars.githubusercontent.com/u/1512048?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYzKk",
      "number": 289,
      "title": "VRR Support",
      "body": "I might just not have looked hard enough (in which case please correct me), but couldn't find a way to enable VRR/adaptive sync. It's an essential feature for good framepacing (especially when playing 60hz content on a 144hz display, or 24hz on 60hz, etc.) and it would be very nice to have available.",
      "created_at": "2024-04-14T01:23:19Z",
      "updated_at": "2024-04-14T08:16:25Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "coatlessali",
        "avatar_url": "https://avatars.githubusercontent.com/u/61166135?u=df6c36ba859eb16651f56f20b8e57ef4e061081c&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYyP8",
      "number": 287,
      "title": "Center first couple windows in a workspace",
      "body": "I would be great to have the first couple windows in a workspace that don't yet take up more width than the display to be horizontally centered instead of tiling them from the left.\r\n\r\nBasically, `on-overflow` but before windows actually overflow.",
      "created_at": "2024-04-12T22:19:15Z",
      "updated_at": "2024-04-13T04:47:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "kra-mo",
        "avatar_url": "https://avatars.githubusercontent.com/u/93832451?u=61053c2c41c54f805d976e05eee8038e5d2931fe&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYvCj",
      "number": 285,
      "title": "Toggle floating window.",
      "body": "Hello, is toggle floating window available ? Is it planned as feature ? Thanks",
      "created_at": "2024-04-09T17:54:09Z",
      "updated_at": "2024-04-13T11:29:04Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Aiki2",
        "body": "Hi, not yet: https://github.com/YaLTeR/niri/issues/122"
      },
      "user": {
        "login": "lidgnulinux",
        "avatar_url": "https://avatars.githubusercontent.com/u/99301306?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AX4Qq",
      "number": 226,
      "title": "Can use `~` to replace home path",
      "body": "Use\r\n```\r\nSUPER+Alt+J { spawn \"~/.config/niri/scripts/control/volume\" \"--dec\"; }\r\n```\r\nto replace\r\n```\r\nSUPER+Alt+J { spawn \"/home/xxx/.config/niri/scripts/control/volume\" \"--dec\"; }\r\n```\r\nI know I can use it, but my volume script dosen't work if I use it:\r\n```\r\nSUPER+Alt+J { spawn \"sh\" \"-c\" \"~/.config/niri/scripts/control/volume\" \"--dec\"; }\r\n```",
      "created_at": "2024-02-23T16:53:35Z",
      "updated_at": "2024-04-07T12:38:10Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Buer-Nahida",
        "avatar_url": "https://avatars.githubusercontent.com/u/139795416?u=36a9ced9b40050f3049b1e9bf10d528771fcbd04&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYkok",
      "number": 273,
      "title": "Add a spawn-when-detected action to dynamic window rules",
      "body": "For some windows, I'd like to run some code when they appear. This could be done with a spawn-when-detected action.\r\n\r\nExample usecase:\r\n\r\nWhen using ediff in Emacs, a new window is spawned, that takes all the user input, but I still want to look at the main Emacs window. The ediff window is full screen sized by default. I can make it small, but I'd like to also shrink the main Emacs window, so both fit on the same screen.\r\n\r\nDesired config after ediff window spawned:\r\n![image](https://github.com/YaLTeR/niri/assets/16835755/9dc3bb2a-d4fc-4161-8a7d-1ef53e86b3d3)\r\n\r\nCurrently: Emacs main window is full screen size, focus is switched to ediff window, so Emacs is actually off screen, so I need to go back to Emacs main window and shrink it, manually.\r\n\r\nUsually, one would probably have the Ediff window be floating, but as we don't, yet, have a floating layer, this would be a pretty good solution.",
      "created_at": "2024-03-31T10:59:01Z",
      "updated_at": "2024-03-31T13:01:53Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "phuhl",
        "avatar_url": "https://avatars.githubusercontent.com/u/16835755?u=23415f912acbb882df4121b035a2b6de4faed2b8&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AV2ou",
      "number": 47,
      "title": "Focus Follows Mouse",
      "body": "Could it be possible to change to this behaviour?  It would become a mouse based only lateral scrolling.\r\nThanks for your work!",
      "created_at": "2023-10-11T20:46:37Z",
      "updated_at": "2024-03-31T12:11:07Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "wesbluemarine",
        "avatar_url": "https://avatars.githubusercontent.com/u/14043560?u=64d0fed553e233986596dcf1219889f91c89e636&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXsZk",
      "number": 188,
      "title": "Thank you for your hard work",
      "body": "I wanted to take this time to appreciate the effort @YaLTeR has invested in this project. I have admiration for you. For the way you have structured the organization of this project's code, for the great amount of reading you have done, for the time spent replying to us users, and for everything else. You appear as a very intelligent individual and a person that takes constructive feedback with a positive attitude. Thank you for everything!   ",
      "created_at": "2024-02-12T20:44:25Z",
      "updated_at": "2024-03-30T13:52:31Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "0xDEAD-C0DE",
        "avatar_url": "https://avatars.githubusercontent.com/u/155328330?u=0bd15016b82398c7f6721c768da657be36352a5b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYjIA",
      "number": 270,
      "title": "special workspace and window rules",
      "body": "Hello,\r\n\r\nI come from hyprland and what I notice most or what is missing:\r\n- Will there still be a special workspace?\r\n- More rules to be able to automatically arrange in the correct order at startup, even with windows above/below each other",
      "created_at": "2024-03-29T10:17:09Z",
      "updated_at": "2024-03-29T10:27:54Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "bobblkabb",
        "avatar_url": "https://avatars.githubusercontent.com/u/7815101?u=30f6d40c7d0361f14b6b239e13a9a72a18d59972&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYeYY",
      "number": 263,
      "title": "trigger 'center column' by three-finger swipe",
      "body": "currently three-finger horizontal swipe seems able to trigger:\r\n\r\n- horizontally slide to window to the left/right\r\n- pan current window to the left/right side of the display (if this is the right wording)\r\n\r\nwhile by keyboard we only have access to the first out of those two, by keyboard we can currently also center a column to the center of the screen.\r\nit might be cool to allow centering like that using a three-finger swipe as well.\r\n",
      "created_at": "2024-03-24T17:59:50Z",
      "updated_at": "2024-03-25T08:44:19Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AX7W8",
      "number": 231,
      "title": "support transparency",
      "body": "now that we can make rules applying to center windows, it would be nice if we were to have transparency support.\r\none might use this to e.g. set some transparency to terminal windows, as these tend to not need the full opacity as much as graphical applications.\r\n\r\nrelated: #75\r\n",
      "created_at": "2024-02-25T22:52:28Z",
      "updated_at": "2024-03-24T06:54:22Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWyRD",
      "number": 92,
      "title": "Various problems/questions/suggestions as I try to start using niri",
      "body": "This is not really a single issue, but moreso multiple, and not necessarily well-defined. I apologize in advance for the lack of structure.\n\nI'll start this by saying that I'm on NixOS with an nvidia GPU. This is not a particularly *easy* combo, especially with Wayland, and given that this is a project in alpha, I by no means expect everything to work out of the box. I've created my own NixOS module to install niri, which I will publish once it's a bit more polished and I can be satisfied with a working setup.\n\nOne thing I would like to know is whether anyone else is using nvidia with niri? If so, did you run into any issues, and how have you resolved them, if at all?\n\nTwo major pain points I have before even getting to use niri properly, which basically prevent me from using it at all:\n\n## Exhibit A: I'm getting extremely low refresh rates. (NVIDIA)\n\nI can open a terminal, and the prompt does not appear. Typing works just fine, I can even launch e.g. Firefox, and *that* causes the screen to refresh. Clicking can somewhat reliably force a refresh.\n\nNotably, this is only for window buffers. The screen itself is responsive, the mouse is smooth, the windows can be moved freely and the borders update in real-time. But type in the terminal? it doesn't show up. scroll on a website? it might update, if you're lucky.\n\nThis is caused by proprietary NVIDIA drivers, and it works just fine on nouveau.\n\n## Exhibit B: The config is, in a UX-sense, quite fragile.\n\nWhen it is malformed, niri does print an error.\n\nIt also launches a graphical session, which does not contain the error. This is fixable, and I suggest that if the default config is loaded, a banner or message of some kind should show on startup informing the user of this, and why it happened.\n\n\"The provided config file (does not exist /  is malformed [error details]), and therefore the default config has been loaded\" would be better. Best would be if at all possible to load the last-known-good config, and as such prevent everything from resetting.\n\nIt's problematic for me, because my monitors are \"strange\" and the default layout is completely wrong, with bad scaling. I also have a non-US keyboard layout, and as such typing becomes hard with the default config, and I also don't use alacritty so I have to resort to another tty to even fix the config.\n\nI also don't get to see the config error if I launch it from a login manager. I have to figure out that the config didn't load, then go to a new tty, launch niri manually, close immediately, read the error, and there I can finally fix it.\n\n\nFor that matter of my monitors, there are two more pain points:\n\n### I can't seem to find a way to disable a monitor.\n\nI have two monitors connected, but I only use one. I would ideally like to hotswap whether the second one is enabled or not at any time, but that's not what I'm even trying to do. Before even prioritizing getting that working, I'd like to make it work with one monitor disabled. I may be mistaken, but there does not seem to be a way to disable a monitor.\n\n### I can't figure out the correct mode for my monitor\n\nAdmittedly, I \"should\" know this already, and I do for one of my monitors, but not the other. The default config tells me that the debug output shows supported modes, but it is not obvious where to find this. It also hints at using wayland-info utility, which can show me my available displays but not their supported modes.\n\nSomehow, this seems to also be NVIDIA related, because, while testing on nouveau when writing this, I found that my desired mode just works on nouveau? no changes needed? Needs more investigation.\n\nIn essence, what I want from this is an easier way to list out the supported display modes, rather than \"guessing\".\n\n---\n\nI don't expect fixes to all of these, especially the NVIDIA-related issues, but I do at least want to gather these thoughts and share them rather than keep them to myself. I would, however, like a way to disable an output in the config.\n\nAdditionally, on top of the config improvements, something that would be useful to me is some flag or separate binary to validate the config (not just syntax but the niri-specific structure). If this was provided, then I could probably hack away at getting nix to validate the config and rollback to the last valid config for me, before niri ever sees an invalid config, which would be quite useful. I am willing to implement this myself, if the desire for this is agreed upon.",
      "created_at": "2023-12-18T02:13:07Z",
      "updated_at": "2024-03-19T14:41:35Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "sodiboo",
        "avatar_url": "https://avatars.githubusercontent.com/u/37938646?u=3f07dacab24bcf207e269dc2be8fccaf7b9a1b94&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXdqe",
      "number": 144,
      "title": "Implement \"focus follows mouse\"",
      "body": "Or maybe I miss something from documentation?",
      "created_at": "2024-01-29T21:21:45Z",
      "updated_at": "2024-03-19T14:40:05Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "pg83",
        "avatar_url": "https://avatars.githubusercontent.com/u/1481268?u=1a6195217f665d028396922d51812cac9247e58e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYTb9",
      "number": 257,
      "title": "File picker on chromium won't work on niri.",
      "body": "Hello, I just need a confirmation. Is it just me or the file picker on chromium browser doesn't work when we use niri ? Other apps's file picker seems work fine. Strangely enough, when I run chromium from command line (with exact same command from desktop file), the file picker works. \r\n\r\nNiri : 0.1.3 (acd3365)\r\nChromium : 122.0.6261.57",
      "created_at": "2024-03-14T06:57:30Z",
      "updated_at": "2024-03-17T09:17:53Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AhokV",
        "body": "I end up make a shortcut / keybind rather than using launcher. Closing it now. Thanks."
      },
      "user": {
        "login": "lidgnulinux",
        "avatar_url": "https://avatars.githubusercontent.com/u/99301306?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AYNFE",
      "number": 251,
      "title": "v0.1.3",
      "body": "Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nHere are the improvements from the last release.\r\n\r\n> [!NOTE]\r\n> Packagers: if you're not using systemd and the `niri-session` script, you may need to change your niri startup command to `niri --session`. Please read below on the changes for environments without systemd.\r\n>\r\n> Also, please consider including the wp-viewporter revert: 40cec34aa4a7f99ab12b30cba1a0ee83a706a413 to fix a mouse input bug with Chromium and Electron apps.\r\n\r\n## Touchpad gestures\r\n\r\nI grew annoyed enough with the lack of a horizontal touchpad gesture in niri, so I spent several days working on the gestures. I tried three different horizontal gesture behaviors, and the one I landed on does a fairly good job of moving the windows where you intended.\r\n\r\nI also made many overall improvements to both the vertical and the horizontal gestures to make them *feel* very good. They are now inertial, meaning that a short flick is enough to take you to the next workspace, as the gesture will account for the speed of your fingers. Vertical gesture has rubberbanding at the edges, indicating that you can't go any further. Finally, both gestures use spring animations when releasing fingers, which feel natural as they also take the finger speed into account. If you swipe with enough force, you'll even get a small bounce at the edge!\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/946a910e-9bec-4cd1-a923-4a9421707515\r\n\r\nThanks goes to the maintainers of [libadwaita](https://gitlab.gnome.org/GNOME/libadwaita) since that's where I copied lots of the code and numeric values from.\r\n\r\n## Spring animations\r\n\r\nAs part of the gesture work, niri now supports spring animations. These are physics-based animations that are especially well suited for gestures, but feel good on their own too. Based on the spring configuration, they can optionally give small bounces and oscillations.\r\n\r\nI made three of the four default animations to use springs. If you had custom animation settings in your config, comment them out to give springs a try! Also, check the default config for a [more detailed explanation](https://github.com/YaLTeR/niri/blob/v0.1.3/resources/default-config.kdl#L268-L293) and examples on how to set up spring animations.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/29c70f51-1c5e-4367-83c4-92707692a33e\r\n\r\n## Touch support\r\n\r\n@cmeissl added basic touchscreen support to niri. Thanks!\r\n\r\n<figure>\r\n<img src=\"https://github.com/YaLTeR/niri/assets/1794388/8236205f-d296-40e9-8291-b991104e6279\">\r\n<caption><div align=\"center\"><i>Dramatic reenactment (this laptop doesn't have a touchscreen).</i></div></caption>\r\n</figure>\r\n\r\n## Gradient borders\r\n\r\nFocus ring and borders can now use a linear gradient instead of a solid color!\r\n\r\n![image](https://github.com/YaLTeR/niri/assets/1794388/c19018c9-6424-4bea-9ea8-5ad82cb5be9d)\r\n\r\nThis is how you can set it up:\r\n\r\n```\r\nlayout {\r\n    border {\r\n        active-gradient from=\"#f38ba8\" to=\"#f9e2af\" angle=45 relative-to=\"workspace-view\"\r\n        inactive-gradient from=\"#585b70\" to=\"#7f849c\" angle=45 relative-to=\"workspace-view\"\r\n    }\r\n}\r\n```\r\n\r\nColors can use several CSS-like notations, and the gradient itself is rendered like CSS `linear-gradient(angle, from, to)`. You can use some CSS gradient generator, like [this one](https://www.css-gradient.com/), to get a gradient you like, then copy the values into the niri config.\r\n\r\nAlso, gradients can be relative to windows individually (the default), or to the whole view of the workspace. It's easier to explain visually:\r\n\r\n| Default  | `relative-to=\"workspace-view\"` |\r\n| --- | --- |\r\n| ![image](https://github.com/YaLTeR/niri/assets/1794388/1bec9a69-06e6-411a-b64c-1c693adace37) | ![image](https://github.com/YaLTeR/niri/assets/1794388/c3557d79-0c55-454e-aeb4-3255ce371009) |\r\n\r\nBy the way, regular colors can also now be written with CSS-like notations. The old four-number way is now deprecated.\r\n\r\n```\r\n// catppuccin-mocha Sapphire\r\nactive-color \"#74c7ec\"\r\n// catppuccin-mocha Surface2\r\ninactive-color \"#585b70\"\r\n```\r\n\r\n## wlr-screencopy\r\n\r\nWhile niri supports xdg-desktop-portal screencasting and has a built-in screenshot UI, these are not very well suited for taking programmatic screenshots (and the current screenshot portal API isn't very good either). So, in this release, niri implements wlr-screencopy *version 1* (not 3). Now you can take screenshots with [grim](https://git.sr.ht/~emersion/grim).\r\n\r\nScreen *recording* tools based on wlr-screencopy will need version 3, so they won't work for now. (The screencast portal is better for this anyway; for example, it leaves frame pacing entirely to the compositor, where it belongs.) Version 1 should be sufficient for any screenshot tool; if a screenshot tool complains that it needs version 3 then it likely needs a simple patch to avoid requesting version 3 if unavailable.\r\n\r\nLike other security-sensitive protocols, wlr-screencopy is not available to sandboxed clients with a security context (such as Flatpaks).\r\n\r\n<table><tr><td>\r\n<img src=\"https://github.com/YaLTeR/niri/assets/1794388/124b6643-97f0-4adb-83bb-f42ec8ac5057\">\r\n<br>\r\n<div align=\"center\"><i>Finally, all three of my outputs on a single screenshot.</i></div>\r\n</td></tr></table>\r\n\r\nThanks to @sodiboo for implementing wlr-screencopy support!\r\n\r\n## Frame timing fixes\r\n\r\nI fixed several issues in the presentation time handling and frame callback tracking logic.\r\n\r\n- Frame callbacks were sometimes sent ~1 frame later than they should've been, meaning that clients had much less time to render.\r\n- With specific timing it was possible for frame callbacks to stop getting sent to certain surfaces, causing a window to stop redrawing until something else updates the screen.\r\n- Zero presentation time from DRM (which can happen on some drivers) sometimes resulted in a panic.\r\n\r\n## Stricter config validation\r\n\r\nDue to the ease of use in [knuffel](http://lib.rs/knuffel), the KDL parsing library we use in niri, some nodes technically accepted multiple children, despite only expecting one. Specifically, `default-column-width {}` and binds. Also, you could write multiple binds to the same key combination, which is similarly not supported.\r\n\r\nThis has been fixed to cause a config validation error. While technically a config-breaking change, it's more of a bug fix, since before all these extra nodes that you could write were ignored. Therefore I considered it fine to include in a minor niri version bump.\r\n\r\nThanks @sodiboo for implementing this validation!\r\n\r\n## Refactored window creation flow\r\n\r\nI reworked the window creation flow and tracking of unmapped windows in niri to make it more robust and less \"all over the place\". As part of this:\r\n\r\n- With borders enabled, `default-column-width {}` (unset, the app picks its own) caused the app to shrink a bit right after it appeared. This wasn't really noticeable, but it resulted in a smaller window size than what the app wanted. It is now fixed.\r\n- Corrected `default-column-width { fixed N; }` similarly not taking borders into account, resulting in a smaller window than the specified N.\r\n- Added support for apps requesting a specific fullscreen monitor before they first appear (`mpv --fs-screen=N` will now work).\r\n- Added `open-maximized true` window rule.\r\n- Added `open-fullscreen true/false` window rule. Setting it to `true` will fullscreen the window upon opening, and setting it to `false` will deny the window from fullscreening upon opening.\r\n  - Some windows can request fullscreen *after* they are initially configured, but *before* they are first shown on screen. In this case `open-fullscreen false` will not work, because these window rules apply at the initial configure. So far I only saw `mpv --fs` do this, so it's not a big problem (you can just remove the mpv flag).\r\n\r\n## Systemd scopes\r\n\r\nWhen niri runs applications it will now put them into transient systemd scopes. One concrete benefit is that when an application uses too much RAM and systemd-oomd kills it, niri won't go down alongside the app, so the rest of your session will stay intact.\r\n\r\nMany other tools (like Flatpak, tmux, or systemd itself) already do this for the commands they spawn, so niri joins this established practice.\r\n\r\n```\r\n┌ ~\r\n└─ systemctl --user status\r\n● sparklingbrook\r\n    State: running\r\n    Units: 444 loaded (incl. loaded aliases)\r\n     Jobs: 0 queued\r\n   Failed: 0 units\r\n    Since: Mon 2024-03-04 10:25:20 +04; 4 days ago\r\n  systemd: 254.9-1.fc39\r\n   CGroup: /user.slice/user-1000.slice/user@1000.service\r\n           ├─app.slice\r\n           │ ├─app-niri-alacritty-1672431.scope\r\n           │ │ ├─1672431 alacritty\r\n           │ │ ├─1672446 /usr/bin/fish\r\n           │ │ └─1672578 systemctl --user status --no-pager\r\n           │ ├─app-niri-fuzzel-1672466.scope\r\n           │ │ └─1672468 /var/home/yalter/stuff/blender-4.0.2-linux-x64/blender\r\n<...>\r\n           ├─session.slice\r\n           │ ├─niri.service\r\n           │ │ └─1663138 /usr/bin/niri --session\r\n<...>\r\n```\r\n\r\nAlso, since the `niri.service` scope now only contains niri itself, I have moved it into `session.slice`, a slice for important services such as the compositor.\r\n\r\n## Running without systemd\r\n\r\nI've made it easier to run niri in environments without systemd.\r\n\r\n- Added a new, enabled by default, feature `systemd` which gates calls to the systemd D-Bus API. Currently, this includes starting transient scopes and `systemctl import-environment`.\r\n- Niri now sets `XDG_CURRENT_DESKTOP` and `XDG_SESSION_TYPE` in the main binary, rather than in the `niri-session` script.\r\n- Added a `niri --session` flag for running niri as the main session instance, which means that it will import environment variables globally into systemd and D-Bus, and start D-Bus services. This flag replaces auto-detection based on the presence of the `NOTIFY_SOCKET` variable.\r\n- Added a `dinit` feature that runs `dinitctl setenv` to import environment, and added ready notifications through `NOTIFY_FD` environment variable (thanks @metent).\r\n\r\nSo, if you package niri:\r\n\r\n- Check if you need to call `niri --session` instead of `niri`.\r\n- Make sure you compile with the `systemd` feature if needed.\r\n- Compile with the `dinit` feature if your distribution uses [dinit](https://davmac.org/projects/dinit/).\r\n\r\n## Other improvements in this release\r\n\r\n- Fixed a Smithay crash when a client sets a buffer scale of 0. The client is now correctly terminated with a protocol error.\r\n- Fixed a crash when parsing the EDID of certain monitors.\r\n- Fixed screen locking when monitors are powered off.\r\n- Fixed windows disappearing when requesting to be fullscreen on a different output than they were displayed on.\r\n- Fixed empty workspaces sometimes not getting cleaned up during the workspace switch gesture.\r\n- Fixed screen resolution changes not always triggering output repositioning, which could result in overlapping outputs (which manifested as mouse clicks seemingly not always working).\r\n- Fixed `toggle-debug-tint` desynchronizing for newly connected outputs.\r\n- Commented out the default bind for `toggle-debug-tint`.\r\n- `spawn` and `spawn-at-startup` will now expand `~` to the home directory in the command name, similarly to how `screenshot-path` does it. In the command arguments `~` will not be expanded.\r\n- Added the [`environment {}`](https://github.com/YaLTeR/niri/blob/v0.1.3/resources/default-config.kdl#L213-L220) config section where you can control the environment variables that niri sets for the commands it spawns.\r\n- Implemented the wp-viewporter protocol. This makes `Xwayland -fullscreen` work (that flag makes it emulate a specific screen resolution for the clients inside).\r\n- Implemented the xdg-foreign protocol, which allows tracking dialog parent relationships in more cases, which will be more useful in the future.\r\n- Overlays like the exit confirmation dialog are no longer dismissed by a mouse button release, which means that a Waybar module that calls `niri msg action quit` on click will now work as expected.\r\n- Clarified in the default config how workspace indices work.\r\n- Changed several `error!` log messages to `warn!` for consistency. In niri, `error!` always indicates a bug in our code. If something can happen without a bug in niri, then it should be a `warn!`.\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.3'>v0.1.3</a>.</em>",
      "created_at": "2024-03-09T11:12:32Z",
      "updated_at": "2024-03-10T17:06:12Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AX8BN",
      "number": 232,
      "title": "document what wayland protocols have been implemented",
      "body": "e.g. doing checkboxes to track progress, say going by https://wayland.app/protocols/\r\n\r\n### stable\r\n- Presentation time\r\n- Viewporter\r\n- XDG shell\r\n- Linux DMA-BUF\r\n### staging\r\n- XDG activation\r\n- DRM lease\r\n- Session lock\r\n- Single-pixel buffer\r\n- Content type hint\r\n- Idle notify\r\n- Tearing control\r\n- Xwayland shell\r\n- Fractional scale\r\n- Cursor shape\r\n- Foreign toplevel list\r\n- Security context\r\n- Transient seat\r\n- XDG toplevel drag\r\n### unstable\r\n- Fullscreen shell\r\n- Idle inhibit\r\n- Input method v1\r\n- Input timestamps\r\n- Keyboard shortcuts inhibit\r\n- Linux explicit synchronization (dma-fence)\r\n- Pointer constraints\r\n- Pointer gestures\r\n- Primary selection\r\n- Relative pointer\r\n- Tablet\r\n- Text input\r\n- XDG decoration\r\n- XDG foreign\r\n- XDG output\r\n- XWayland keyboard grabbing\r\n### wlr\r\n- wlr data control\r\n- wlr export DMA-BUF\r\n- wlr foreign toplevel management\r\n- wlr gamma control\r\n- wlr input inhibitor\r\n- wlr layer shell\r\n- wlr output management\r\n- wlr output power management\r\n- wlr screencopy\r\n- wlr virtual pointer\r\n",
      "created_at": "2024-02-26T12:55:42Z",
      "updated_at": "2024-03-03T03:55:27Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXa9k",
      "number": 134,
      "title": "Cache derivations results",
      "body": "As the project is using nix it would be cool if it also provided a cache to avoid building it locally.\r\nThis could be done using something like [cachix](https://www.cachix.org/) since they do have a free plan.\r\n\r\nThanks for your time and the project. ",
      "created_at": "2024-01-27T23:29:59Z",
      "updated_at": "2024-02-25T22:47:20Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SrEstegosaurio",
        "avatar_url": "https://avatars.githubusercontent.com/u/49443421?u=c51e24fdb78fd277a6a1bb6333037eb4447ed2b5&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXwqz",
      "number": 206,
      "title": "v0.1.2",
      "body": "Thanks everyone for 1000 stars! 🥳\r\n\r\nNiri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.\r\n\r\nHere are the improvements from the last release.\r\n\r\n> [!NOTE]\r\n> Packagers: niri now requires libinput >= 1.21.\r\n>\r\n> The new niri-visual-tests subcrate is development-only and should not be packaged. If you do `cargo test --workspace`, make sure to exclude it: `cargo test --workspace --exclude niri-visual-tests`, as it brings extra native dependencies.\r\n\r\n### Window opening animations\r\n\r\nWindows now appear with an animation! Existing windows to the right move away, and the new window fades in, avoiding sudden visual jumps. All happening quickly enough to hopefully not be distracting.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/f1ebf2e5-0eb1-4b8f-9eba-6afe60604989\r\n\r\nMore animations are coming, but they need time and work to implement *right*.\r\n\r\n### Animation settings\r\n\r\nIf you prefer reduced motion, or on the contrary if you want *more* animation, you can now set this up in a [new `animations` config section](https://github.com/YaLTeR/niri/blob/v0.1.2/resources/default-config.kdl#L207). There's a flag to turn off, and a setting to adjust speed for all animations at once, as well as settings for every individual animation should you need it.\r\n\r\nThese settings replace the now-removed `animation-slowdown` debug flag.\r\n\r\n### Idle protocols\r\n\r\nNiri now implements the ext-idle-notify and idle-inhibit pair of Wayland protocols. This allows tools like [`swayidle`](https://github.com/swaywm/swayidle) to work, and clients like `mpv` to pause them from working while you're watching videos.\r\n\r\nAs a bonus, I also implemented the `org.freedesktop.ScreenSaver` D-Bus interface for idle inhibiting, used by xdg-desktop-portal-gtk. This was necessary to make Flatpak Firefox correctly inhibit the idle state, and in general covers more applications.\r\n\r\n### Invoke actions via IPC\r\n\r\nAs the first expansion to the `niri msg` command, you can now invoke *any bindable action* with `niri msg action do-something`. That is, if you can bind something like `Mod+F { maximize-column; }`, then you can also call it programmatically with `niri msg action maximize-column`.\r\n\r\nTurns out, one thing IPC actions are pretty convenient for is scripting video demos, like the one above!\r\n\r\nAlso, niri now has a way to report errors back to the IPC client, instead of leaving it in the dark for requests that don't otherwise need a response.\r\n\r\n### Window rules (the beginnings thereof)\r\n\r\nYou can now set some (at the moment, two) settings on a per-window basis. You can match or exclude windows from a rule with regular expressions on app-id and window title, similarly to other compositors. See the default config for a [detailed explanation](https://github.com/YaLTeR/niri/blob/v0.1.2/resources/default-config.kdl#L257).\r\n\r\nThe settings you can currently set are `default-column-width` and `open-on-output`. Most notably, this lets you work around WezTerm's initial configure bug:\r\n\r\n```\r\nwindow-rule {\r\n    // This regexp is intentionally made as specific as possible.\r\n    // You can get away with app-id=\"wezterm\" if you want.\r\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\r\n\r\n    default-column-width {}\r\n}\r\n```\r\n\r\nMore rules, including dynamically updating ones, are coming, after some refactors.\r\n\r\n### Better focus stealing prevention\r\n\r\nTo minimize your distraction, niri prevents new windows from taking focus while you're in a fullscreen application (I've had enough games ruined by a sudden Steam chat message). In this release, niri will additionally track when a newly opened window is a dialog from a particular existing window, and put that dialog to the immediate right from its parent window. The dialog will get focus only if the parent window was focused.\r\n\r\nThis change both prevents some random client from a different monitor/workspace from taking focus with a sudden dialog (looking at you, syncthing-gtk), and lets dialogs originating from fullscreen windows take focus as expected, bypassing the normal fullscreen focus stealing prevention.\r\n\r\n### Improved filtering in the hotkey overlay\r\n\r\nThe hotkey overlay shows a hardcoded set of binds that I deemed \"most important\". Included are the `spawn` actions, because binds like \"spawn terminal\" and \"spawn application launcher\" are definitely up there in the importance list.\r\n\r\nHowever, not all commands you might want to `spawn` are that important, and with a lot of binds, the list could get polluted with many entries like *XF86AudioRaiseVolume*. Filtering based on program name doesn't sound very robust, so, instead, now the hotkey overlay will only show `spawn` binds with `Mod` or `Super` in the hotkey.\r\n\r\nAdditionally, out of multiple `spawn` binds to the same command, only the first one will show up in the hotkey overlay, which is consistent with all other hotkeys.\r\n\r\n<table>\r\n<thead>\r\n<tr>\r\n<th>Before</th>\r\n<th>After</th>\r\n</tr>\r\n</thead>\r\n<tbody>\r\n<tr>\r\n<td valign=\"top\"><img alt=\"Hotkey overlay before the change.\" src=\"https://github.com/YaLTeR/niri/assets/1794388/549d257f-def8-45a7-967c-e63de7d9db98\"></td>\r\n<td valign=\"top\"><img alt=\"Hotkey overlay after the change.\" src=\"https://github.com/YaLTeR/niri/assets/1794388/dff82430-5440-4a20-8b5d-e8ec9dd96fa2\"></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n\r\n### Other improvements\r\n\r\n- Fixed a crash with some monitors with weird EDID data, and fixed inability to light up some monitors by filtering out interlaced modes.\r\n- Implemented DRM leasing. This lets you use VR applications and headsets with niri. Thanks @Supreeeme for working on this!\r\n- Added `consume-or-expel-window-{left,right}` actions that either expel the focused window into its own column, or consume a singular focused window into a column. These act as an alternative to the existing consume and expel commands, and are not bound to any keys by default. Thanks @exoticorn for implementing them!\r\n- Added a `dwtp` flag to touchpad settings for disable-when-trackpointing.\r\n- Added `trackpoint` input settings. Thanks @okvik for implementing them!\r\n- Added a way to bind / IPC-invoke `quit` while skipping the \"Are you sure you want to exit niri?\" dialog: `Mod+Shift+E { quit skip-confirmation=true; }`.\r\n- You can no longer spawn multiple lockscreen clients at once (more relevant now with swayidle).\r\n- Fixed binds like `Super+Q` not working (you had to spell it out as `Mod+Super+Q`).\r\n- Changed the default `swaylock` bind from `Mod+Alt+L` to `Super+Alt+L` to fix a collision with the `Mod+L` bind when running niri as a window (not sure how I missed this in testing). You don't usually want to \"lock the screen\" of a nested niri anyway.\r\n- Monitors powered off with DPMS will now light up upon switching the TTY back to niri.\r\n- The `NIRI_SOCKET` environment variable is now exported into the systemd and D-Bus session, which lets systemd units run `niri msg`. For example, this [allows](https://github.com/YaLTeR/niri/wiki/Example-systemd-Setup) you to run `swayidle` as a systemd service.\r\n- Fixed a Smithay bug which mistakenly sent primary-selection to wlr-data-control v1 clients, causing them to crash (thanks @kchibisov).\r\n- Fixed `border` using focus ring's default values instead of its own.\r\n- Fixed omitting the `layout` config section resulting in `gaps 0` instead of the default `gaps 16`.\r\n- Fixed target monitor not getting focus when pressing `move-column-to-monitor-*` on an empty source monitor.\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.2'>v0.1.2</a>.</em>",
      "created_at": "2024-02-17T05:33:34Z",
      "updated_at": "2024-02-24T11:59:45Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AX4On",
      "number": 225,
      "title": "`env` options (similar as hyprland)",
      "body": "I think `niri` needs a way to set environment variables in itself config file.\r\n\r\nIn hyprland, I'm using `env = QT_QPA_PLATFORMTHEME, qt5ct` to set environment variables for window manager.\r\nIn niri, I can write `QT_QPA_PLATFORMTHEME=qt5ct` in `/etc/environment`.\r\n\r\nBut if I do it, these environment variables are play a part in everywhere for my system.\r\nIt doesn't make a difference than I set environment variables in window manager config file if I only use wayland.\r\n\r\nbut I'm not only use niri and other wayland window manager, I also use `bspwm`(x11 window manager), because some x11 apps are doesn't work use xwayland, they are only work in raw x11 environment, If I write `QT_QPA_PLATFORM=wayland` in `/etc/environment`, in `bspwm`, qt apps are all doesn't work.\r\n\r\nSo `niri` needs a way to set environment variables only for itself. such as this\r\n```kdl\r\nenv {\r\n    QT_QPA_PLATFORMTHEME \"qt5ct\"\r\n}\r\n```",
      "created_at": "2024-02-23T16:30:36Z",
      "updated_at": "2024-02-24T11:00:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Buer-Nahida",
        "avatar_url": "https://avatars.githubusercontent.com/u/139795416?u=36a9ced9b40050f3049b1e9bf10d528771fcbd04&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AX32S",
      "number": 224,
      "title": "3-finger horizontal swipe to navigate columns",
      "body": "niri now allows using the touchpad with three fingers swiping vertically to switch between workspaces.\r\nif i recall correctly paperwm had a similar thing with horizontal swiping to navigate between window columns within a workspace.\r\nit would be cool if niri supported a similar operation (/ exposed gestures such as to support that).\r\ni do think paperwm had it scroll kind of more smoothly than a binary switch, which could be harder but seems maybe cool as well.\r\n",
      "created_at": "2024-02-23T10:33:41Z",
      "updated_at": "2024-02-23T11:35:56Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AX3db",
      "number": 223,
      "title": "Add an option for circular horizontal and circular vertical modes",
      "body": "Currently scrolling horizontally between tiled windows behaves linearly with a left most en and a right most end.\r\nSimilarly scrolling vertically between workspace behaves linearly with a top most and a bottom most workspace.\r\n\r\nThis request is for implementing 2 options for circular horizontal and circular vertical modes. \r\n\r\nThe analogy to use is a circular linked list compared to a linear linked list. After reaching one end, scrolling further would just continue show the elements from the other end. Note: this is not the same as jumping to the beginning of the list after reaching the end.\r\n\r\nThis would result in enabling infinite scrolling and therefore the ability to fully navigate using just half of the direction keys.\r\n\r\nThis is not an entirely new concept. The desktop cube as implemented by some desktops is in effect a circular list of virtual desktops.\r\n\r\nFor a physical analogy, when only horizontal circular mode is enabled, one can think of a stack of cylinders of different diameters (depending on the number of tiled windows) with the windows on the curved surfaces.\r\n\r\nThis is similar to #41 but applied to both directions.",
      "created_at": "2024-02-23T01:06:59Z",
      "updated_at": "2024-02-23T03:08:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "alexvoda",
        "avatar_url": "https://avatars.githubusercontent.com/u/790775?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AX3Z-",
      "number": 222,
      "title": "is there a way to search current opening window",
      "body": "just like fuzzel, is there a way to switch to some opening window?",
      "created_at": "2024-02-22T22:52:59Z",
      "updated_at": "2024-02-23T03:00:48Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "shenjiangqiu",
        "avatar_url": "https://avatars.githubusercontent.com/u/18464919?u=778d75399cbb4714f98737754cf5ab20ee9d95d4&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AX1tF",
      "number": 220,
      "title": "What's the default renderer of niri",
      "body": "Which rendering api is used in niri opengl or vulkan.\r\nI really hope it defaults to vulkan as it is more efficient fast and very good with all the 10-bit colors and HDR stuff.",
      "created_at": "2024-02-21T15:15:21Z",
      "updated_at": "2024-02-22T15:29:07Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "helixoid",
        "avatar_url": "https://avatars.githubusercontent.com/u/110732140?u=0bff8729b5fe13837f27da1dd02e55216ed14831&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXlsV",
      "number": 171,
      "title": "add color gradient support to border/focus ring",
      "body": "please add an option to allow for color gradients in the border and focus ring configuration, like hyprland does in the default config",
      "created_at": "2024-02-05T19:28:12Z",
      "updated_at": "2024-03-19T14:39:31Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "cptn-cosmo",
        "avatar_url": "https://avatars.githubusercontent.com/u/7382310?u=41a22cda0e1d6cbe8b7452974e2bfdb87473d7fb&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXz_D",
      "number": 214,
      "title": "Set env var at niri start",
      "body": "I want set some env var at niri start, such as `GDK_BACKEND=wayland` `QT_QPA_PLATFORM=wayland` `QT_QPA_PLATFORMTHEME=qt5ct` and more, I'm also read wiki and comments but I'm not found answers, How can I do it?",
      "created_at": "2024-02-20T02:40:49Z",
      "updated_at": "2024-02-20T05:00:26Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AghFp",
        "body": "Hey, so niri-session runs through your shell, so you can set them in `~/.bashrc` or a similar file for your shell."
      },
      "user": {
        "login": "Buer-Nahida",
        "avatar_url": "https://avatars.githubusercontent.com/u/139795416?u=36a9ced9b40050f3049b1e9bf10d528771fcbd04&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXnsb",
      "number": 174,
      "title": "Looping mode where windows can wrap off 1 side of the screen onto the other",
      "body": "i know it sounds stupid but imagine you had a 360deg monitor all around you (totally not making that or anything) and you wanted to rotate your panels and all (similar to #45 but it'd be seamless)",
      "created_at": "2024-02-07T16:05:40Z",
      "updated_at": "2024-02-20T03:37:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "technobaboo",
        "avatar_url": "https://avatars.githubusercontent.com/u/4541968?u=b3dd27a419729f771a2b968fd96a011b4a67378f&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXyxH",
      "number": 213,
      "title": "Intelligently switch between workspaces and windows",
      "body": "# Why I made this suggestion\r\n\r\nUhhh, Niri's windows and workspaces are arranged vertically, so I thought of this idea.\r\n\r\n# Interpretation\r\n\r\nIf there is a window above/below, focus on, otherwise switch to the workspace above/below.",
      "created_at": "2024-02-19T01:14:08Z",
      "updated_at": "2024-02-19T01:19:00Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Buer-Nahida",
        "avatar_url": "https://avatars.githubusercontent.com/u/139795416?u=36a9ced9b40050f3049b1e9bf10d528771fcbd04&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXxff",
      "number": 212,
      "title": "execute multiple actions in a single bind",
      "body": "usage: \r\nexecute multiple actions, just for convenience\r\n\r\nfor example\r\n```kdl\r\n Mod+Shift+Comma  { consume-window-into-column; consume-window-into-column; }\r\n Mod+Z {\r\n       focus-column-last\r\n       spawn \"pkill\" \"-SIGUSR1\" \"-o\" \"waybar\"\r\n }\r\n```\r\n\r\nRight now niri only takes the first action within bind, but it is easy to extend it to a Vec and do multiple actions sequentially.\r\n\r\nhttps://github.com/YaLTeR/niri/blob/2b5eeb61620363a325a5c76c4a5d25e45f2a6054/src/input.rs#L1488\r\n\r\nHowever I'm not sure what if multiple actions are trigger in screenshot mode, and some actions are valid like `quit`, while others are not. Should the valid actions be executed and others get ignored?  Or don't do anything if it contains non-screenshot actions?\r\n\r\nhttps://github.com/YaLTeR/niri/blob/2b5eeb61620363a325a5c76c4a5d25e45f2a6054/src/input.rs#L1393-L1405\r\n\r\nAdditionally, I'm not certain if it's necessary to include a \"safety check\" to prevent potentially conflicting actions.\r\n\r\nIf this feature is considered acceptable, I'm willing to submit a pull request.",
      "created_at": "2024-02-18T09:51:50Z",
      "updated_at": "2024-02-18T10:13:16Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Fuann-Kinoko",
        "avatar_url": "https://avatars.githubusercontent.com/u/56078314?u=fd71ed0568c9322d9dd71d367dc3e6d8d1ce35f3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXxC6",
      "number": 210,
      "title": "move column to workspace that doesn't exist",
      "body": "Hello, I am deeply impressed by niri! This can be said to be the most impressive tiling window manager I have ever tried.\r\n\r\nHowever, during the testing, I found some situations that did not quite align with my expectations.\r\n\r\nassume there are `n` workspaces currently:\r\n\r\nFor the command `focus-workspace` `x`, if `x` refers to a workspace that has not been created yet, it indeed switches to an empty workspace. But it seems that once a window is created in this workspace, regardless of the value of `x`, the actual index of the current workspace will always be `n+1`.\r\n\r\nSimilarly, for the command `move-column-to-workspace` `x`, after moving to a new workspace, the index of the current workspace will also bee `n+1` instead of the specified `x`.\r\n\r\nI understand that dynamic workspaces is a feature of niri, but there is still some inconsistency between the commands and their actual outcomes. \r\n\r\nPerhaps it would be worth considering renaming these commands, allowing workspace numbers to be discontinuous, or simply adding a comment in the configuration to clarify this behavior?",
      "created_at": "2024-02-17T16:47:44Z",
      "updated_at": "2024-02-18T09:29:55Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "Fuann-Kinoko",
        "avatar_url": "https://avatars.githubusercontent.com/u/56078314?u=fd71ed0568c9322d9dd71d367dc3e6d8d1ce35f3&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXxWg",
      "number": 211,
      "title": "XDP without systemd",
      "body": "The current implementation only sets up D-BUS interface required for XDP-gnome to work if the compositor is run as systemd service. systemd isn't a requirement of XDP-gnome, so maybe systemd checks can be dropped (or, check for D-BUS session instead)? This would allow XDP to function if the compositor is running as a D-BUS session.\r\nAnd, maybe the compositor can itself set `XDG_CURRENT_DESKTOP` and `XDG_SESSION_TYPE` environment vars, which would allow to simply use `dbus-run-session niri` to start the compositor instead of having to rely on wrapper script.\r\n\r\nI've tested this on system without systemd and it appears to work fine.",
      "created_at": "2024-02-18T03:01:59Z",
      "updated_at": "2024-02-21T08:36:44Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "QaidVoid",
        "avatar_url": "https://avatars.githubusercontent.com/u/12017109?u=387c025010df4f1e35e67f5b9ffa80145d0f5ce2&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXw4v",
      "number": 208,
      "title": "Negative strut?",
      "body": "In my config I have these huge gaps -- like 32px -- it's embarrassing to be honest. Waybar is narrow enough to fit inside that region at the top of the display. So at the top of the display I want a 32px gap from the edge of the display, not from waybar. From waybar the gap is like 6px or something.\r\n\r\nIt looks like the gap is just a single value, as opposed to reducing the top gap independently (like how struts can be set for left right top bottom).\r\n\r\nBut it appears that using a negative strut to remove the gap from the top also does what I want. Changing that type from `u16` to `i32` works and removes `into()` and `as i32` in `compute_working_area()`.\r\n\r\nAnyway, just some feedback about my use case and how I chose to support it.",
      "created_at": "2024-02-17T12:14:52Z",
      "updated_at": "2024-02-17T17:11:11Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sqwishy",
        "avatar_url": "https://avatars.githubusercontent.com/u/131432?u=bc8e7297480f1faa65174c287513ca74f549cb9e&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXwX5",
      "number": 204,
      "title": "Add support for `wlr-output-management-unstable-v1`",
      "body": "Hey, it would be great to have support for `wlr-output-management-unstable-v1` so `wdisplays` becomes usable.",
      "created_at": "2024-02-16T18:16:21Z",
      "updated_at": "2024-02-16T18:17:08Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "SobhanMP",
        "avatar_url": "https://avatars.githubusercontent.com/u/2301159?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXwQ8",
      "number": 203,
      "title": "Horizontal gesture for in-workspace scrolling",
      "body": "It's strange that a _scrollable_ workspaces is not as it feels, and sometimes I just want to view the windows with only one hand using the touchpad.\r\n\r\nWould be great if this'll implemented!\r\n\r\n_Though this looks like a hard-to-impl feature..._",
      "created_at": "2024-02-16T15:58:33Z",
      "updated_at": "2024-02-16T16:02:21Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "vollowx",
        "avatar_url": "https://avatars.githubusercontent.com/u/73375859?u=8ad681869121cb18d3486fa4f1294ea7f80ee30a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWJ4I",
      "number": 73,
      "title": "(Design suggestion) Replace KDL with TOML on the configuration file",
      "body": "The syntax is more easy.",
      "created_at": "2023-11-02T22:52:31Z",
      "updated_at": "2024-02-13T10:54:44Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "hardBSDk",
        "avatar_url": "https://avatars.githubusercontent.com/u/55782009?u=2065a0265a54d008776e177f8d4f727f8c66b7c9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXhZd",
      "number": 152,
      "title": "Updating config file with new features",
      "body": "There should also be an update mechanism for adding new lines and features to the user's configuration file. Otherwise, Niri use default config newer than the user has and user not warned about it.\r\n\r\nSince this [commit](https://github.com/YaLTeR/niri/commit/51243a0a505a533057e7326fbbae882420f0d363)",
      "created_at": "2024-02-01T10:14:20Z",
      "updated_at": "2024-02-13T07:15:39Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "nebulosa2007",
        "avatar_url": "https://avatars.githubusercontent.com/u/85841412?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXsp4",
      "number": 190,
      "title": "Default workspace for autolaunched windows?",
      "body": "Is there any way to configure what workspace a window will end up with when initially spawned? I'd like to be able to configure a bunch of tools at launch and want to auto-organize them into different workspaces instead of having to move stuff around by hand every time I start niri",
      "created_at": "2024-02-13T05:49:15Z",
      "updated_at": "2024-02-13T06:29:58Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AgO6u",
        "body": "I'm also not entirely sure yet how this should work. Since from the niri PoV, windows that run at startup are no different from windows that spawn later (I'm not sure it's possible to fully reliably differentiate these two cases).\r\n\r\nOnce we have window/client rules, we can have a rule for which monitor a window should appear, but that can get a bit weird since later you may want to launch a window on the current monitor and not on the preset monitor.\r\n\r\nIt might also be possible to have a setting for which monitor becomes focused at startup. I think udev gives us devices right away so we can differentiate the startup case from the later case there.\r\n\r\nWhat would work for you?"
      },
      "user": {
        "login": "zkat",
        "avatar_url": "https://avatars.githubusercontent.com/u/17535?u=99aea32aa6a8d9953a29c1b7bb9d34c38f864991&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXqRl",
      "number": 179,
      "title": "Build fails. Dependencies missing?",
      "body": "Recently I cannot build niri any longer (using a slightly modified version of the Arch AUR PKGBUILD):\r\n\r\n```\r\n   Compiling niri v0.1.1 (/home/user/.local/var/lib/makepkg/aur/niri-git/src/niri)\r\nerror: linking with `cc` failed: exit status: 1\r\n  |\r\n  = note: LC_ALL=\"C\" PATH=\"/usr/lib64/rustlib/x86_64-unknown-linux-gnu/bin:/home/user/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl\" VSLANG=\"1033\" \"cc\" \"-m64\" \"/tmp/rustcFzsUOh/symbols.o\" \"/home/user/.local/var/lib/makepkg/aur/niri-git/src/niri/target/x86_64-unknown-linux-gnu/aur/deps/niri-af62f87027fe0571.niri.1be11338d174d065-cgu.0.rcgu.o\" \"-Wl,--as-needed\" \"-L\" \"/home/user/.local/var/lib/makepkg/aur/niri-git/src/niri/target/x86_64-unknown-linux-gnu/aur/deps\" \"-L\" \"/home/user/.local/var/lib/makepkg/aur/niri-git/src/niri/target/aur/deps\" \"-L\" \"/usr/lib\" \"-L\" \"/usr/lib\" \"-L\" \"/usr/lib\" \"-L\" \"/usr/lib\" \"-L\" \"/home/user/.local/var/lib/makepkg/aur/niri-git/src/niri/target/x86_64-unknown-linux-gnu/aur/build/libspa-dcedcb7111ff4692/out\" \"-L\" \"/home/user/.local/var/lib/makepkg/aur/niri-git/src/niri/target/x86_64-unknown-linux-gnu/aur/build/libspa-sys-e6e2b4aafdbc1817/out\" \"-L\" \"/usr/lib64/rustlib/x86_64-unknown-linux-gnu/lib\" \"-Wl,-Bstatic\" \"/tmp/rustcFzsUOh/liblibspa-75b56344d3d3baef.rlib\" \"/tmp/rustcFzsUOh/liblibspa_sys-4b781d0f87d8f4ec.rlib\" \"/usr/lib64/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-8107a46244b29f2b.rlib\" \"-Wl,-Bdynamic\" \"-lpipewire-0.3\" \"-lpipewire-0.3\" \"-lpangocairo-1.0\" \"-lpango-1.0\" \"-lgobject-2.0\" \"-lglib-2.0\" \"-lharfbuzz\" \"-lcairo\" \"-lpango-1.0\" \"-lgobject-2.0\" \"-lglib-2.0\" \"-lharfbuzz\" \"-lgobject-2.0\" \"-lgio-2.0\" \"-lgobject-2.0\" \"-lglib-2.0\" \"-lgobject-2.0\" \"-lglib-2.0\" \"-lcairo-gobject\" \"-lcairo\" \"-lgobject-2.0\" \"-lglib-2.0\" \"-lgobject-2.0\" \"-lglib-2.0\" \"-lgbm\" \"-lxkbcommon\" \"-lseat\" \"-ludev\" \"-linput\" \"-ldl\" \"-lpixman-1\" \"-ldl\" \"-lgbm\" \"-lgcc_s\" \"-lutil\" \"-lrt\" \"-lpthread\" \"-lm\" \"-ldl\" \"-lc\" \"-Wl,--eh-frame-hdr\" \"-Wl,-z,noexecstack\" \"-L\" \"/usr/lib64/rustlib/x86_64-unknown-linux-gnu/lib\" \"-o\" \"/home/user/.local/var/lib/makepkg/aur/niri-git/src/niri/target/x86_64-unknown-linux-gnu/aur/deps/niri-af62f87027fe0571\" \"-Wl,--gc-sections\" \"-pie\" \"-Wl,-z,relro,-z,now\" \"-Wl,-O1\" \"-nodefaultlibs\"\r\n  = note: /usr/bin/ld: /home/user/.local/var/lib/makepkg/aur/niri-git/src/niri/target/x86_64-unknown-linux-gnu/aur/deps/niri-af62f87027fe0571.niri.1be11338d174d065-cgu.0.rcgu.o: in function `niri::pw_utils::PipeWire::start_cast::{{closure}}':\r\n          niri.1be11338d174d065-cgu.0:(.text._ZN4niri8pw_utils8PipeWire10start_cast28_$u7b$$u7b$closure$u7d$$u7d$17h14f14741253c792aE+0x3c): undefined reference to `libspa_rs_format_parse'\r\n          /usr/bin/ld: /home/user/.local/var/lib/makepkg/aur/niri-git/src/niri/target/x86_64-unknown-linux-gnu/aur/deps/niri-af62f87027fe0571.niri.1be11338d174d065-cgu.0.rcgu.o: in function `libspa::param::video::raw::VideoInfoRaw::parse':\r\n          /home/user/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libspa-0.7.2/src/param/video/raw.rs:375:(.text._ZN4niri8pw_utils8PipeWire10start_cast28_$u7b$$u7b$closure$u7d$$u7d$17h14f14741253c792aE+0xb3): undefined reference to `libspa_rs_format_video_raw_parse'\r\n          collect2: error: ld returned 1 exit status\r\n\r\n  = note: some `extern` functions couldn't be found; some native libraries may need to be installed or have their path specified\r\n  = note: use the `-l` flag to specify native libraries to link\r\n  = note: use the `cargo:rustc-link-lib` directive to specify the native libraries to link with Cargo (see https://doc.rust-lang.org/cargo/reference/build-scripts.html#cargorustc-link-libkindname)\r\n\r\nerror: could not compile `niri` (bin \"niri\") due to previous error\r\n==> ERROR: A failure occurred in build().\r\n    Aborting...\r\n```\r\n\r\nI have little to no idea what exactly is happening there. I'd guess some missing packages.",
      "created_at": "2024-02-10T07:00:26Z",
      "updated_at": "2024-02-10T16:27:58Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "muchgitsuchwow",
        "avatar_url": "https://avatars.githubusercontent.com/u/97453054?u=c7c1da4841c7a7d46575ea7985cbf9a67abd3b6a&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXjSA",
      "number": 162,
      "title": "expose actions over `niri msg`",
      "body": "hey there,\r\ni'm happy to see `niri msg` added as a way to communicate with niri.\r\ni was thinking, it would be nice to see actions exposed thru such a cli as well.\r\nthis would for example facilitate scripting niri actions thru the likes of `fuzzel`,\r\nto enable more mouse-based means of interacting with the system. :)\r\n",
      "created_at": "2024-02-03T12:42:35Z",
      "updated_at": "2024-02-10T05:51:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXoBA",
      "number": 177,
      "title": "Implement DRM leasing",
      "body": "https://wayland.app/protocols/drm-lease-v1\r\nWould be nice to be able to use my VR headset. If no one else gets around to it before me I'll give it a shot myself.",
      "created_at": "2024-02-07T22:36:44Z",
      "updated_at": "2024-02-14T20:59:36Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Supreeeme",
        "avatar_url": "https://avatars.githubusercontent.com/u/7882157?u=00b9be59810b4811d4378441aef703e35eb970ec&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXnuf",
      "number": 175,
      "title": "Option to auto-center fixed height windows",
      "body": "Sometimes windows will have a fixed height when they are created - I've seen this with cagebreak and mpv - and as such they are positioned at the top of the display. I think it would be useful, either as an option or by default, to allow automatically centering these windows vertically.",
      "created_at": "2024-02-07T16:36:47Z",
      "updated_at": "2024-02-07T16:38:17Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "Supreeeme",
        "avatar_url": "https://avatars.githubusercontent.com/u/7882157?u=00b9be59810b4811d4378441aef703e35eb970ec&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXjh7",
      "number": 168,
      "title": "keybinds not intercepting the keys",
      "body": "i just got the idea to make a keybind to dismiss notifications to `Escape`.\r\nwhile this worked, it seems to interfere with the key's regular function.\r\nit would be cool to have keybinds leaving keys' original function intact.\r\n",
      "created_at": "2024-02-03T22:58:09Z",
      "updated_at": "2024-02-04T16:01:01Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXja2",
      "number": 166,
      "title": "GTK apps slow to start",
      "body": "as mentioned [by someone else as well](https://github.com/YaLTeR/niri/discussions/61#discussioncomment-7417681), GTK apps seem somewhat slow to start on niri.\r\ni'm not sure if this is something about the way i set things up, but i wonder if this is a known issue?\r\nmight this pertain to e.g. `xdg-desktop-portal-gtk` / `xdg-desktop-portal-gnome`?\r\n",
      "created_at": "2024-02-03T17:54:14Z",
      "updated_at": "2024-02-05T00:23:19Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Af4KA",
        "body": "That sounds like an issue with the portal setup (it's probably the 10 s DBus timeout). Make sure you're running niri as a session and the portals start up successfully I guess. Make sure you *don't* have `GTK_USE_PORTAL=1` or `GDK_DEBUG=portals` set."
      },
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXjZ5",
      "number": 165,
      "title": "make it easier to navigate across columns by mouse",
      "body": "in paperwm, when focusing/moving a window it would tend to ensure not just that the window pans/stays into view, but that in fact one could see just beyond its gap, as might be seen in their [screenshot](https://github.com/paperwm/media/blob/master/tiling.png).\r\nthis is relevant when navigating by mouse, as having such a window edge in view would allow one to click it and focus that, in turn panning the camera to bring the next edge into view.\r\nit would be nice if niri would facilitate this as well, even if optional.\r\n",
      "created_at": "2024-02-03T17:15:54Z",
      "updated_at": "2024-02-03T17:23:15Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "KiaraGrouwstra",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059397?u=109f2a051801981b8f3b21cd8aa847f62c1cd41d&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWKxZ",
      "number": 75,
      "title": "Dim inactive windows",
      "body": "This could be an alternative to help focusing without ring but never seen any Wayland compositor with a dimming option.",
      "created_at": "2023-11-04T10:23:20Z",
      "updated_at": "2024-02-03T12:47:41Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "wesbluemarine",
        "avatar_url": "https://avatars.githubusercontent.com/u/14043560?u=64d0fed553e233986596dcf1219889f91c89e636&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXi3_",
      "number": 158,
      "title": "Code that controls power button action",
      "body": "Good afternoon. Since, I believe this is not an issue with Niri, I decided to post it here. \r\nThe config states that Niri handles the action of the power button when pressed. I do not start Niri from a niri.session ( Login Graphical Interface). I simply execute `niri` from TTY1` \r\nWhere is the Rust code that handles this action located? I want to inspect it for learning it purposes .\r\n\r\nWhen I press the power button, the computer powers off and when I power it back on it sends me to the Dell diagnostic test. \r\nI am Archlinux `kernel 6.7.2 x86_64` DELL XPS 15 9550` `systemd 255.3.1`",
      "created_at": "2024-02-02T20:44:13Z",
      "updated_at": "2024-02-05T19:01:55Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4Af3KF",
        "body": "Hey, so when you run niri directly, it does not do any power button handling. In this case it's controlled by logind or something like that. So in your case you need to look into logind.conf.\n\nWhen niri is a session however, it will:\n1. Inhibit the logind power key handling, so that niri can handle it by itself: https://github.com/YaLTeR/niri/blob/main/src/main.rs#L246, https://github.com/YaLTeR/niri/blob/main/src/niri.rs#L1042\n2. When it's pressed, ask logind to suspend: https://github.com/YaLTeR/niri/blob/main/src/backend/tty.rs#L1511"
      },
      "user": {
        "login": "0xDEAD-C0DE",
        "avatar_url": "https://avatars.githubusercontent.com/u/155328330?u=0bd15016b82398c7f6721c768da657be36352a5b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXipK",
      "number": 157,
      "title": "Adding a Makefile for Recommended Install",
      "body": "Having a Makefile for building and setup would be nice. However correct me if I'm mistaken but a bulid.rs/cargo can achieve the same thing?",
      "created_at": "2024-02-02T15:37:57Z",
      "updated_at": "2024-02-02T15:54:18Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "sfyatee",
        "avatar_url": "https://avatars.githubusercontent.com/u/63768478?u=8252e76874b7ac20aac1bb4d6128b67895d8b79b&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXiPG",
      "number": 155,
      "title": "add support for autorun",
      "body": "althrough niri already support xdg-autostart,\r\nbut i'm in void linux which doesn't have systemd.\r\n\r\nit's more flex to add a autostart script. just like dwl/sway/river do.\r\nthese script must be launch after wm, such as fcitx, waybar ..., so they can't be added to niri-session script.",
      "created_at": "2024-02-02T07:21:21Z",
      "updated_at": "2024-03-19T14:43:35Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "superiums",
        "avatar_url": "https://avatars.githubusercontent.com/u/16359582?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXan5",
      "number": 129,
      "title": "v0.1.0",
      "body": "Here it is. The first *real* release, after five months of work. Let's do a recap for the occasion.\r\n\r\nThis is niri, a scrollable-tiling Wayland compositor inspired by [PaperWM](https://github.com/paperwm/PaperWM). Windows are tiled on an infinite horizontal strip that scrolls left and right. They don't \"overflow\" onto adjacent monitors. Opening a new window never resizes existing ones.\r\n\r\n![Niri showing some windows.](https://github.com/YaLTeR/niri/assets/1794388/81174a43-da12-42f3-8d06-9166ca64a01f)\r\n\r\nDespite this being the first release with [plenty of things left to do](https://github.com/YaLTeR/niri/issues), niri already packs a good number of features.\r\n\r\n- All the basics. It's a Wayland compositor, it shows windows, runs on a TTY, works with multiple monitors and mixed-GPU systems, supports HiDPI.\r\n- Dynamic workspaces like in GNOME, but per-monitor. Workspaces also remember which monitor they were on across monitor disconnects and reconnects.\r\n- Some of the important desktop component protocols like wlr-layer-shell and ext-session-lock.\r\n- A built-in screenshot UI. Press <kbd>PrtSc</kbd>, select a rectangle on a frozen screen, and press <kbd>Space</kbd> to copy the image to the clipboard and save to a file. Or screenshot one window with <kbd>Alt</kbd><kbd>PrtSc</kbd>.\r\n\r\n    ![Niri with the screenshot UI open.](https://github.com/YaLTeR/niri/assets/1794388/cd533daf-99af-4bc2-9e43-b740c0ed00f6)\r\n\r\n- Screencasting support through xdg-desktop-portal-gnome. Works with OBS, browsers, and others.\r\n\r\n    ![Niri screencasting to OBS, Firefox, Chromium.](https://github.com/YaLTeR/niri/assets/1794388/d2ff0db2-6556-481a-80e5-df3f31379461)\r\n\r\n- Fully live-reloading config.\r\n- Configurable layout: things like gaps, borders, struts, window sizes.\r\n\r\n    ![Niri showing large struts and gaps.](https://github.com/YaLTeR/niri/assets/1794388/48b3a7d1-a3f1-4bf6-81f2-f89433ea57e0)\r\n\r\nIf you want to see niri in action, here's a video demo from the README.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/5d355694-7b06-4f00-8920-8dce54a8721c\r\n\r\nIt's also worth mentioning that:\r\n\r\n- NVIDIA GPU systems might have rendering issues.\r\n- Xwayland in rootless mode is not supported. However, [you can use](https://github.com/YaLTeR/niri/wiki/Xwayland) its excellent rootful mode with niri. Games and X11 apps work just fine for the most part.\r\n\r\nIf you'd like to give niri a try, check the README for [building and running instructions](https://github.com/YaLTeR/niri#building). There are also a few community-maintained packages:\r\n\r\n- [A COPR](https://copr.fedorainfracloud.org/coprs/yalter/niri) for Fedora users (ok, that one's made by myself).\r\n- [A Flake](https://github.com/sodiboo/niri-flake) for NixOS.\r\n- [An AUR package](https://aur.archlinux.org/packages/niri).\r\n- [A port for FreeBSD](https://www.freshports.org/x11-wm/niri) and a pack of other BSDs, if GitHub code search is to be believed.\r\n\r\nFinally, we have a [Matrix room](https://matrix.to/#/#niri:matrix.org). Feel free to drop by with a message.\r\n\r\n### Changes since v0.1.0-beta.1\r\n\r\n- Fixed config live-reload on NixOS configurations which change the config file symlink but leave the mtime constant (thanks @sodiboo).\r\n- Fixed most cases of niri failing to light up monitors after a TTY switch (thanks @cmeissl).\r\n- Fixed xdg-desktop-portal-gnome not updating the screencast monitor list upon monitor disconnection / reconnection (niri wasn't notifying it about changes).\r\n- Fixed large windows with large CSD shadows getting cut on screenshots and screencasts.\r\n- Fixed output config changes being ignored if done when on a different TTY.\r\n- Fixed popups not showing up when an IME is active (for now as a workaround by disabling popup grabs when an IME is active).\r\n- Slightly improved cursor rendering performance by avoiding CPU->GPU->CPU transfers (thanks @cmeissl).\r\n- Slightly increased the precision of the default column widths in the default config. This should get one pixel back for the ⅓ column width on most monitors.\r\n- xdg-desktop-portal screencasts will now receive the optional logical monitor size which some apps require.\r\n- xdg-desktop-portal screenshots will now get an error instead of a broken screenshot for multi-monitor configurations (it needs to be implemented, see #117). This does not affect the screenshot UI.\r\n- Fixed screenshot UI not showing up if the cursor ended up outside all monitors.\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.0'>v0.1.0</a>.</em>",
      "created_at": "2024-01-27T10:42:28Z",
      "updated_at": "2024-01-31T16:04:46Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXa7B",
      "number": 133,
      "title": "mixed-GPU? Wayland?",
      "body": "Can someone chime in on what \"mixed-GPU\" means? Years ago I spoke with a Wayland Dev about multi GPU and basically what I was told was Wayland will dump all the work on to one GPU while turning all the others into worthless output / fb splitters. I had heard Wayland might have been working on making Multi-Gpu work where in each can run their own workloads / screens correctly but news is scarce...\r\n\r\nSo does Wayland actually run multi/mixed GPU correctly now or is this a niri only thing or does niri do this the way xrandr does it (resulting in high idle loads and horrid performance)? ENLIGHTEN ME PLZ~! (playful yelling...not angry...OK maybe tad scared as Wayland/GTK has been tightening the noose on multi GPU workstations like mine...)",
      "created_at": "2024-01-27T21:27:52Z",
      "updated_at": "2024-01-28T05:43:20Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "nPHYN1T3",
        "avatar_url": "https://avatars.githubusercontent.com/u/38122105?v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXQtK",
      "number": 111,
      "title": "v0.1.0-beta.1",
      "body": "I've made a ton of improvements since the last alpha tag. I am now happy enough with the feature set to make the first proper release. So, this is a **beta** tag, and 0.1.0 should follow several days later.\r\n\r\n> [!NOTE]\r\n> Packagers: niri now depends on pangocairo.\r\n\r\n### IPC, output list\r\n\r\nI've implemented the beginnings of IPC, and a new `niri msg outputs` subcommand that will list all connected monitors and their available modes. Finally, you no longer need to dig in niri's debug output to find this information.\r\n\r\n```\r\n┌ ~\r\n└─ niri msg outputs\r\nOutput \"eDP-1\" (Unknown - Unknown - eDP-1)\r\n  Current mode: 2560x1600 @ 165.004 Hz\r\n  Physical size: 340x210 mm\r\n  Available modes:\r\n    2560x1600@165.004\r\n    2560x1600@60.002\r\n    2560x1600@120.028\r\n    2560x1600@96.030\r\n    2560x1600@72.005\r\n    2560x1600@60.001\r\n    1920x1200@165.004\r\n    1920x1080@165.004\r\n    1600x1200@165.004\r\n    1680x1050@165.004\r\n    1280x1024@165.004\r\n    1440x900@165.004\r\n    1280x800@165.004\r\n    1280x720@165.004\r\n    1024x768@165.004\r\n    800x600@165.004\r\n    640x480@165.004\r\n```\r\n\r\n### Output settings improvements\r\n\r\nAll output settings (scale, position, mode, on/off) are now live-reloaded without having to replug the monitors.\r\n\r\nAdditionally, monitors are now always repositioned from scratch on every change, with preference given to monitors with explicitly-configured positions. Practically this means that your monitor positions will be consistent regardless of the order they are connected in (especially relevant at startup where the order is random).\r\n\r\n### More libinput settings, live-reload\r\n\r\n* Added touchpad `accel-profile`, `dwt`, `tap-button-map` settings.\r\n* Added mouse `natural-scroll`, `accel-speed`, `accel-profile` settings.\r\n* Added live-reload for all libinput settings.\r\n\r\nThis should cover most of the important libinput settings. These are relatively straightforward to add, so feel free to open a PR if you need some libinput setting that is still missing.\r\n\r\n### Hotkey help overlay\r\n\r\nI've added Pango for text rendering, which unlocks a ton of useful features. One of them is the new Important Hotkeys list that shows up at startup and helps you learn your way around niri.\r\n\r\n![Important hotkeys overlay.](https://user-images.githubusercontent.com/1794388/298000923-78e2cf2c-39ff-4239-bb1e-76584c10b708.png)\r\n\r\nThe list of actions to show is hardcoded, but the actual hotkeys come from the current config, so you will see the keys that you had configured. The bind to display this overlay is `show-hotkey-overlay`.\r\n\r\n### More overlays\r\n\r\nI've added two more overlays using text rendering. One shows up when there's an error in your config:\r\n\r\n![Config error overlay.](https://user-images.githubusercontent.com/1794388/298002274-d9222bc7-f2c7-4c8a-b07b-2e3910761a1c.png)\r\n\r\nAnd the second one prompts for a confirmation when pressing the exit bind:\r\n\r\n![Exit confirmation dialog.](https://user-images.githubusercontent.com/1794388/298002226-0f238809-432d-4ca4-843d-8cee8ffd9697.png)\r\n\r\n### Wayland popup grabs\r\n\r\nNiri now correctly implements popup grabs. Practically, this means that:\r\n\r\n* You can now dismiss popups by clicking anywhere on screen, including layer-shell popups like the ones from sfwbar.\r\n* You can now navigate the layer-shell popups with the keyboard.\r\n* Popups with grabs will be dismissed when focusing a different window (or in the case of layer-shell, a different monitor), and unfocused windows will be denied popup grabs.\r\n\r\n### Client-side decoration fixes\r\n\r\nBy default (without the `prefer-no-csd` setting), niri wants clients to use client-side decorations. Turns out that SDL2 has a bug (already fixed but not released) in its xdg-decoration protocol implementation that prevents windows from showing up when the compositor insists on CSD.\r\n\r\nTo make all apps work properly, niri will now hide the xdg-decoration protocol from the clients when it wants client-side decorations, and only show it when `prefer-no-csd` is set.\r\n\r\n![DOSBox-X with CSD.](https://github.com/YaLTeR/niri/assets/1794388/b47a6bdf-2f23-404d-969e-a0cfb9eb9237)\r\n\r\n### Improved security\r\n\r\nNiri now implements the security-context Wayland protocol which lets it hide a number of sensitive protocols from sandboxed clients. This protocol is used by Flatpak, so now Flatpak apps can no longer steal your clipboard through wlr-data-control, as an example.\r\n\r\n```\r\n┌ ~\r\n└─ wl-copy 'My secret clipboard contents!'\r\n┌ ~\r\n└─ flatpak run --command=bash --filesystem=home org.gnome.Adwaita1.Demo\r\n[📦 org.gnome.Adwaita1.Demo ~]$ wl-paste\r\nError: A required Wayland protocol (zwlr_data_control_manager_v1 version 1) is not supported by the compositor\r\n[📦 org.gnome.Adwaita1.Demo ~]$\r\nexit\r\n┌ ~ 1\r\n└─ wl-paste\r\nMy secret clipboard contents!\r\n```\r\n\r\n### More improvements in this release\r\n\r\n* Added `move-column-to-workspace*` and `move-column-to-monitor*` binds that operate on columns, as opposed to the existing `move-window-to-*` binds. I believe this behavior makes more sense, so I changed the default binds to the new column ones.\r\n* Added a `center-focused-column` layout setting that can be set to `never` (the default), `always` (always center the focused column) and `on-overflow`, which will center the focused column when it doesn't fit together with the previously focused column. Thanks @tversteeg for working on this feature.\r\n* Layer-shell surfaces are now properly notified of output removal, which for example fixes mako breaking when disconnecting a monitor that it was displaying a notification on.\r\n* Fixed mouse clicks on layer-shell surfaces activating the windows below them.\r\n* Fixed screencast session restore picking the wrong monitor. This is especially relevant in Chromium where session restore is part of the normal screencast workflow.\r\n* Fixed screencast taking a while to startup if there are no new frames rendered by the compositor.\r\n* Laptop displays will now show up as \"Built-in display\" in the xdp-gnome monitor selection dialog.\r\n* Fixed niri not redrawing the screen upon changing focus. Usually this isn't a problem because windows redraw in response to changing focus, but it became more visible with popup grabs.\r\n* Niri will now watch the config file path even if the config did not exist, or failed to parse at startup. This is especially relevant for new niri users which don't have a config yet. You can create a config after running niri for the first time, and it will now live-load it without having to restart.\r\n* Added a `niri panic` subcommand that triggers a panic, which you can use to check that you have built / packaged niri with enough debuginfo to produce useful crash backtraces.\r\n* Documented the debug settings in the default config file.\r\n* Fixed windows receiving events that look like they left all outputs when consuming them into a column.\r\n* Fixed windows receiving events that look like they left all outputs when replugging monitors.\r\n* Fixed a crash that could happen when a window is closed during a workspace switch transition.\r\n* Fixed a crash that could happen if workspaces are transferred back to their original monitor that was connected during a workspace switch transition.\r\n* Updated Smithay, the Wayland compositor building library that underlies niri, which brought some fixes:\r\n  * The cursor plane will now work in more cases. If you needed the `disable-cursor-plane` setting, you might no longer need it.\r\n  * Fixes to graphical glitches on nouveau and possibly other configurations.\r\n  * Fixes to a deadlock when using an IME with certain clients.\r\n\r\n> [!CAUTION]\r\n> This is an beta tag. There may be breaking changes leading to the release.\r\n\r\nPlease check the [README](https://github.com/YaLTeR/niri/blob/main/README.md) for building and installation instructions. Also, if you're on Fedora, I've got a [COPR](https://copr.fedorainfracloud.org/coprs/yalter/niri/). NixOS users, check out https://github.com/sodiboo/niri-flake.\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.0-beta.1'>v0.1.0-beta.1</a>.</em>",
      "created_at": "2024-01-20T06:08:27Z",
      "updated_at": "2024-01-20T07:08:16Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXCIE",
      "number": 97,
      "title": "v0.1.0-alpha.3",
      "body": "### Config breaking change\r\n\r\nSettings for `focus-ring`, `preset-column-widths`, `default-column-width`, `gaps`, `struts` moved into a new `layout { }` node.\r\n\r\n```\r\nlayout {\r\n    focus-ring { /* ... */ }\r\n    preset-column-widths { /* ... */ }\r\n    default-column-width { /* ... */ }\r\n    gaps 8\r\n    struts { /* ... */ }\r\n}\r\n```\r\n\r\n### Multi-GPU support\r\n\r\nMonitors plugged into secondary GPUs will now light up and work. This is particularly important for hybrid laptops with an integrated and a discrete GPU, where for example a monitor may \"plug into\" the dGPU while the primary device is the iGPU.\r\n\r\nAdditionally, direct scan-out will now work in more cases across GPUs (i.e. a dGPU client on an iGPU monitor).\r\n\r\n![image](https://github.com/YaLTeR/niri/assets/1794388/70f6f8b2-ceeb-44ab-8b7b-6a9e5487ddfe)\r\n\r\nNiri uses the default GPU for rendering, the same as any other GL client. You can force niri to use a different GPU with a new debug setting which works similarly to the `WLR_RENDER_DRM_DEVICE` environment variable from wlroots:\r\n\r\n```\r\ndebug {\r\n    render-drm-device \"/dev/dri/renderD129\"\r\n}\r\n```\r\n\r\n### Borders\r\n\r\nYou can now add borders to windows with a new setting:\r\n\r\n```\r\nlayout {\r\n    border {\r\n        // The settings are the same as for the focus ring.\r\n        // If you enable the border, you probably want to disable the focus ring.\r\n        // off\r\n        width 4\r\n        active-color 255 200 127 255\r\n        inactive-color 80 80 80 255\r\n    }\r\n}\r\n```\r\n\r\nIn contrast to the focus ring, borders are always visible, even on unfocused windows.\r\n\r\n![image](https://github.com/YaLTeR/niri/assets/1794388/105665bc-57cf-4007-9ca6-ed031d12d217)\r\n\r\n### Fullscreen backdrop\r\n\r\nFullscreen windows smaller than the monitor now have a monitor-sized black backdrop, as expected by xdg-shell. This makes all fullscreen windows consistent in how they look, while keeping the PaperWM-like property that they mostly behave like a regular column that you can scroll out of view if you want.\r\n\r\n![image](https://github.com/YaLTeR/niri/assets/1794388/a7c334c3-79cc-4606-b9aa-4df721c478db)\r\n\r\n### More improvements in this release\r\n\r\n- Added a `focus-column-{first,last}` actions that focus the leftmost/rightmost column on the workspace, bound to <kbd>Mod</kbd><kbd>Home</kbd>/<kbd>End</kbd> by default.\r\n- Added a `move-column-to-{first,last}` actions that move the focused column to the leftmost/rightmost position on the workspace, bound to <kbd>Mod</kbd><kbd>Ctrl</kbd><kbd>Home</kbd>/<kbd>End</kbd> by default.\r\n- Added an `input { disable-power-key-handling }` config flag to prevent niri from taking over the power button handling (which makes it sleep instead of power off). You can use this flag if you configure the power button elsewhere, i.e. in `logind.conf`.\r\n- Windows on unfocused monitors now always display as unfocused.\r\n- When `prefer-no-csd` is unset (the default), niri is now more insistent on client-side decorations. This makes the alacritty 0.13 use CSD in this case for example.\r\n- Added a `debug { disable-cursor-plane }` config flag if you're having cursor rendering issues.\r\n- Enabled EGL support for clients in the winit backend (when running niri as a nested window). On Fedora with recent Mesa this makes it so you can run GL clients inside nested niri again.\r\n- The `toggle-debug-tint` action, bound to <kbd>Mod</kbd><kbd>Ctrl</kbd><kbd>Shift</kbd><kbd>T</kbd> by default, will now redraw the screen immediately.\r\n\r\n> [!CAUTION]\r\n> This is an alpha tag. There are known bugs and missing features. Don't be surprised if there's a breaking config change in the future.\r\n\r\nPlease check the [README](https://github.com/YaLTeR/niri/blob/main/README.md) for building and installation instructions. Also, if you're on Fedora, I've got a [COPR](https://copr.fedorainfracloud.org/coprs/yalter/niri/). NixOS users, check out https://github.com/sodiboo/niri-flake.\n\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.0-alpha.3'>v0.1.0-alpha.3</a>.</em>",
      "created_at": "2024-01-07T14:19:21Z",
      "updated_at": "2024-01-07T14:19:22Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AW_k3",
      "number": 95,
      "title": "Center windows when focusing windows that don't fit",
      "body": "I have an idea about an option that automatically centers the focused window when another window doesn't fit next to it.\r\n\r\nSo for example, I have the following three windows, where the percentages are the size of the window as a percentage of the screen size:\r\n\r\n<table>\r\n<tr>\r\n <td>A\r\n <td>B\r\n <td>C\r\n<tr>\r\n <td>80%\r\n <td>50%\r\n <td>50%\r\n</table>\r\n\r\nNow when I'm focused on *A*, and I call `focus-column-right`, I would like the *B* window to be focused and centered, because it doesn't fit together with *A* on a single screen anymore, 80% + 50% > 100%.\r\n\r\nWhen I'm focused on *B* and I call `focus-column-right` again, I would like the *B* window to be on the left side of the screen and the *C* window on the right, because they both fit, 50% + 50% <= 100%.",
      "created_at": "2024-01-04T08:47:13Z",
      "updated_at": "2024-01-09T07:10:52Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "tversteeg",
        "avatar_url": "https://avatars.githubusercontent.com/u/2574730?u=5b2f0b48b1ad196a74a797f58f38d2efdffa81b0&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AW2jP",
      "number": 94,
      "title": "v0.1.0-alpha.2",
      "body": "Several important additions have landed since alpha.1.\r\n\r\n### Implemented the relative-pointer and pointer-constraints protocols\r\n\r\nThese protocols allow apps to lock or confine the mouse pointer within their window. In particular, Xwayland makes use of these protocols to make 3D games with mouse look \"just work\"!\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/d1a1e0ec-a80c-44ac-b527-bfaf79a995fb\r\n\r\nOther examples include Blender and virtual machines.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/7212e1ae-a9f9-4e85-8d43-e703757fc18e\r\n\r\n### Implemented popup unconstraining\r\n\r\nPopups will no longer open partially off-screen. Niri will also try to position popups within the application's window horizontally so that if a window is fully on-screen, the popup will also be fully visible.\r\n\r\n![Fractal screenshot with open emoji popup](https://github.com/YaLTeR/niri/assets/1794388/6515f06b-7f4f-4f97-a5e4-cc50b638676c)\r\n\r\n### Added a `struts` option\r\n\r\nThis one allows you to add a kind of \"outer gaps\" if you like those layouts. Also, left and right struts will make windows to the sides always partially visible, which can help with mouse-only navigation.\r\n\r\n![Screenshot from 2023-12-23 10-21-20](https://github.com/YaLTeR/niri/assets/1794388/6e4a3071-e1da-49fd-8c96-996d9bb4d14f)\r\n\r\n### More improvements in this release\r\n\r\n- New windows can no longer steal focus from a fullscreen window. All it took was a Syncthing dialog interrupting my Hollow Knight boss battle.\r\n- Tablets will now match their target monitor's aspect ratio (works the same way as in GNOME Shell).\r\n- Tablets can no longer move the cursor outside of their target monitor's bounds.\r\n- Tablets will no longer send wl_pointer events (as they shouldn't), which makes them work correctly with GTK 4 apps.\r\n- Added a `niri validate` subcommand that will check if your config parses successfully.\r\n- Added a way to disable an output with an `off` config flag.\r\n- Added `focus-window-or-workspace-up`/`down` and `move-window-up-or-to-workspace-up`/`down` bind commands that do a workspace switch when the focus is at the end of a window column (not bound to anything by default). This way you can avoid an extra set of workspace switch binds. Thanks @rabidpug for adding this.\r\n- Keyboard config is now live-reloaded, including the XKB options.\r\n- Fixed screen not immediately redrawing in some cases, most notably when a layer-shell surface shows a popup.\r\n- Allegedly, high-resolution scroll wheel mice should now work after a Smithay update, but I don't have one so I don't know for sure.\r\n\r\nThis is an alpha tag. There are known bugs and missing features. Don't be surprised if there's a breaking config change in the future.\r\n\r\nPlease check the [README](https://github.com/YaLTeR/niri/blob/main/README.md) for building and installation instructions. Also, if you're on Fedora, I've got a [COPR](https://copr.fedorainfracloud.org/coprs/yalter/niri/).\n\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.0-alpha.2'>v0.1.0-alpha.2</a>.</em>",
      "created_at": "2023-12-23T07:10:36Z",
      "updated_at": "2023-12-24T15:43:19Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWwtm",
      "number": 91,
      "title": "Matrix room",
      "body": "I've made a Matrix room for niri: https://matrix.to/#/#niri:matrix.org",
      "created_at": "2023-12-16T14:45:06Z",
      "updated_at": "2023-12-16T14:45:08Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWerM",
      "number": 86,
      "title": "v0.1.0-alpha.1",
      "body": "A good chunk of functionality is implemented. I've been daily driving niri for at least two months now. I feel like it's a good point to make the first tag.\r\n\r\nMake no mistake, this is an alpha tag. There are known bugs and missing features. Don't be surprised if there's a breaking config change in the future. But, depending on your needs and preferences, it may already be good enough for daily use.\r\n\r\nPlease check the [README](https://github.com/YaLTeR/niri/blob/main/README.md) for building and installation instructions. Also, if you're on Fedora, I've got a [COPR](https://copr.fedorainfracloud.org/coprs/yalter/niri/).\r\n\r\nFor people following along, I recommend sticking to the main branch rather than freezing on this release.\r\n\r\nhttps://github.com/YaLTeR/niri/assets/1794388/5d355694-7b06-4f00-8920-8dce54a8721c\r\n\r\n<hr /><em>This discussion was created from the release <a href='https://github.com/YaLTeR/niri/releases/tag/v0.1.0-alpha.1'>v0.1.0-alpha.1</a>.</em>",
      "created_at": "2023-11-26T16:28:41Z",
      "updated_at": "2023-11-26T16:31:17Z",
      "category": {
        "name": "Announcements",
        "emoji": ":mega:"
      },
      "answer": null,
      "user": {
        "login": "YaLTeR",
        "avatar_url": "https://avatars.githubusercontent.com/u/1794388?u=5f734700ff3a1d475a8888a9d0a35b93fece7348&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWSfE",
      "number": 83,
      "title": "Un-fullscreening always starts the animation",
      "body": "Even when nothing changes as a result, just feels like it in place bounces a bit.",
      "created_at": "2023-10-29T13:54:11Z",
      "updated_at": "2023-11-12T16:27:50Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "kchibisov",
        "avatar_url": "https://avatars.githubusercontent.com/u/27620401?u=e171ccf7497d1f3d23451abe7eb2a8463effb6b6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AXM6N",
      "number": 102,
      "title": "Surfaces that draw too far out of the window geometry can look surprising",
      "body": "This approach to create wallpapers shouldn't work (apply to sctk)\r\n\r\n```diff\r\ndiff --git a/examples/themed_window.rs b/examples/themed_window.rs\r\nindex f26f7f8e5..9858dfdfc 100644\r\n--- a/examples/themed_window.rs\r\n+++ b/examples/themed_window.rs\r\n@@ -105,7 +105,7 @@ fn main() {\r\n     let window_surface = compositor_state.create_surface(&qh);\r\n \r\n     let window =\r\n-        xdg_shell_state.create_window(window_surface, WindowDecorations::ServerDefault, &qh);\r\n+        xdg_shell_state.create_window(window_surface, WindowDecorations::ClientOnly, &qh);\r\n     window.set_title(\"A wayland window\");\r\n     // GitHub does not let projects use the `org.github` domain but the `io.github` domain is fine.\r\n     window.set_app_id(\"io.github.smithay.client-toolkit.SimpleWindow\");\r\n@@ -287,8 +287,7 @@ impl WindowHandler for SimpleWindow {\r\n \r\n             let (width, height) = match configure.new_size {\r\n                 (Some(width), Some(height)) => {\r\n-                    // The size could be 0.\r\n-                    window_frame.subtract_borders(width, height)\r\n+                    (Some(width), Some(height))\r\n                 }\r\n                 _ => {\r\n                     // You might want to consider checking for configure bounds.\r\n@@ -306,10 +305,10 @@ impl WindowHandler for SimpleWindow {\r\n             let (x, y) = window_frame.location();\r\n             let outer_size = window_frame.add_borders(width.get(), height.get());\r\n             window.xdg_surface().set_window_geometry(\r\n-                x,\r\n-                y,\r\n-                outer_size.0 as i32,\r\n-                outer_size.1 as i32,\r\n+                0,\r\n+                0,\r\n+                width.get() as _,\r\n+                height.get() as _,\r\n             );\r\n \r\n             (width, height)\r\n@@ -624,9 +623,9 @@ impl SimpleWindow {\r\n \r\n         // Draw the decorations frame.\r\n         if let Some(frame) = self.window_frame.as_mut() {\r\n-            if frame.is_dirty() && !frame.is_hidden() {\r\n+            // if frame.is_dirty() && !frame.is_hidden() {\r\n                 frame.draw();\r\n-            }\r\n+            // }\r\n         }\r\n \r\n         // Damage the entire window\r\ndiff --git a/src/shell/xdg/fallback_frame.rs b/src/shell/xdg/fallback_frame.rs\r\nindex dcea2006b..212c55933 100644\r\n--- a/src/shell/xdg/fallback_frame.rs\r\n+++ b/src/shell/xdg/fallback_frame.rs\r\n@@ -27,7 +27,7 @@ use wayland_backend::client::ObjectId;\r\n const HEADER_SIZE: u32 = 24;\r\n \r\n /// The size of the border.\r\n-const BORDER_SIZE: u32 = 4;\r\n+const BORDER_SIZE: u32 = 4096;\r\n \r\n const HEADER: usize = 0;\r\n const TOP_BORDER: usize = 1;\r\n@@ -38,7 +38,7 @@ const LEFT_BORDER: usize = 4;\r\n const BTN_ICON_COLOR: u32 = 0xFFCCCCCC;\r\n const BTN_HOVER_BG: u32 = 0xFF808080;\r\n \r\n-const PRIMARY_COLOR_ACTIVE: u32 = 0xFF3A3A3A;\r\n+const PRIMARY_COLOR_ACTIVE: u32 = 0xA03A3A3A;\r\n const PRIMARY_COLOR_INACTIVE: u32 = 0xFF242424;\r\n \r\n /// The default ugly frame.\r\n```",
      "created_at": "2023-11-04T22:22:17Z",
      "updated_at": "2024-01-16T14:08:52Z",
      "category": {
        "name": "General",
        "emoji": ":speech_balloon:"
      },
      "answer": null,
      "user": {
        "login": "kchibisov",
        "avatar_url": "https://avatars.githubusercontent.com/u/27620401?u=e171ccf7497d1f3d23451abe7eb2a8463effb6b6&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWRG9",
      "number": 82,
      "title": "Change default color background",
      "body": "Could it be possible to change it without using another software like swaybg?",
      "created_at": "2023-11-10T18:51:38Z",
      "updated_at": "2023-11-11T03:41:17Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "wesbluemarine",
        "avatar_url": "https://avatars.githubusercontent.com/u/14043560?u=64d0fed553e233986596dcf1219889f91c89e636&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWJ4P",
      "number": 74,
      "title": "(Question) How to load the KDE Plasma launcher on the niri session?",
      "body": "",
      "created_at": "2023-11-02T19:07:33Z",
      "updated_at": "2023-11-03T05:15:16Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": null,
      "user": {
        "login": "hardBSDk",
        "avatar_url": "https://avatars.githubusercontent.com/u/55782009?u=2065a0265a54d008776e177f8d4f727f8c66b7c9&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AWF2w",
      "number": 61,
      "title": "Any working status bar?",
      "body": "I've tried waybar, hybrid-bar without success.",
      "created_at": "2023-10-29T18:04:39Z",
      "updated_at": "2023-11-02T12:26:31Z",
      "category": {
        "name": "Q&A",
        "emoji": ":pray:"
      },
      "answer": {
        "id": "DC_kwDOKFkxdc4AcSzJ",
        "body": "Waybar works fine for me. Any layer-shell bar should work."
      },
      "user": {
        "login": "wesbluemarine",
        "avatar_url": "https://avatars.githubusercontent.com/u/14043560?u=64d0fed553e233986596dcf1219889f91c89e636&v=4"
      }
    },
    {
      "id": "D_kwDOKFkxdc4AV2ow",
      "number": 48,
      "title": "Mouse wheel scrolling with focus on background",
      "body": "If it were possible to remove focus from windows by clicking on the desktop, it would be possible to use the mouse wheel to scroll.",
      "created_at": "2023-10-12T06:42:52Z",
      "updated_at": "2023-10-12T12:13:49Z",
      "category": {
        "name": "Ideas",
        "emoji": ":bulb:"
      },
      "answer": null,
      "user": {
        "login": "wesbluemarine",
        "avatar_url": "https://avatars.githubusercontent.com/u/14043560?u=64d0fed553e233986596dcf1219889f91c89e636&v=4"
      }
    }
  ],
  "details": {
    "id": 676934005,
    "node_id": "R_kgDOKFkxdQ",
    "name": "niri",
    "full_name": "niri-wm/niri",
    "private": false,
    "owner": {
      "login": "niri-wm",
      "id": 259576467,
      "node_id": "O_kgDOD3jSkw",
      "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/niri-wm",
      "type": "Organization",
      "user_view_type": "public",
      "site_admin": false
    },
    "description": "A scrollable-tiling Wayland compositor.",
    "fork": false,
    "url": "https://api.github.com/repos/niri-wm/niri",
    "created_at": "2023-08-10T10:53:14Z",
    "updated_at": "2026-03-02T01:24:14Z",
    "pushed_at": "2026-02-27T15:56:51Z",
    "homepage": "https://niri-wm.github.io/niri/",
    "size": 10931,
    "stargazers_count": 20571,
    "watchers_count": 20571,
    "language": "Rust",
    "has_issues": true,
    "has_projects": false,
    "has_downloads": true,
    "has_wiki": true,
    "has_pages": true,
    "has_discussions": true,
    "forks_count": 719,
    "archived": false,
    "disabled": false,
    "open_issues_count": 411,
    "license": {
      "key": "gpl-3.0",
      "name": "GNU General Public License v3.0",
      "spdx_id": "GPL-3.0",
      "url": "https://api.github.com/licenses/gpl-3.0",
      "node_id": "MDc6TGljZW5zZTk="
    },
    "allow_forking": true,
    "is_template": false,
    "web_commit_signoff_required": false,
    "has_pull_requests": true,
    "pull_request_creation_policy": "all",
    "topics": {
      "0": "rust",
      "1": "smithay",
      "2": "tiling-window-manager",
      "3": "wayland",
      "4": "wayland-compositor"
    },
    "visibility": "public",
    "forks": 719,
    "open_issues": 411,
    "watchers": 20571,
    "default_branch": "main",
    "permissions": {
      "admin": false,
      "maintain": false,
      "push": false,
      "triage": false,
      "pull": true
    },
    "temp_clone_token": "",
    "custom_properties": {},
    "organization": {
      "login": "niri-wm",
      "id": 259576467,
      "node_id": "O_kgDOD3jSkw",
      "avatar_url": "https://avatars.githubusercontent.com/u/259576467?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/niri-wm",
      "type": "Organization",
      "user_view_type": "public",
      "site_admin": false
    },
    "network_count": 719,
    "subscribers_count": 65
  },
  "lastFetched": 1772416757407
}