copilot-cli icon indicating copy to clipboard operation
copilot-cli copied to clipboard

Cannot use "Enter" in Ghostty [Fedora Linux]

Open kevinnkansah opened this issue 4 months ago • 9 comments

Describe the bug

I cannot use enter key when trying to trust a folder, in Ghostty. Is find for other terminals

Affected version

0.0.354 Commit: 076bd172b

Steps to reproduce the behavior

Pressing Enter Key

Expected behavior

Should work

Additional context

• SYSTEM INFORMATION HOST - Aspire A315-58 (Acer) COMPUTER TYPE - Notebook (V1.31) CPU - 11th Gen Intel(R) Core(TM) i5-1135G7 (8) @ 4.20 GHz GPU - Intel Iris Xe Graphics @ 1.30 GHz [Integrated] MEMORY USED - 6.23 GiB / 11.45 GiB (54%) SWAP USED - 2.33 GiB / 8.00 GiB (29%) DISK - 214.39 GiB / 475.35 GiB (45%) - btrfs • SOFTWARE INFORMATION DISTRO - Fedora Linux 43 (Workstation Edition) x86_64 INSTALLED DATE - 2025-07-19 05:37:24 KERNEL - Linux 6.17.7-300.fc43.x86_64 PACKAGES - 2484 (rpm), 38 (flatpak), 32 (brew) UPTIME - 2 hours, 2 mins • DISPLAY INFORMATION LOGIN MANAGER - Wayland WM - niri (Wayland) MONITOR (BOE07CB) - 1920x1080 @ 60 Hz - 340x190 mm (15 inches, 144 ppi) • DESIGN INFORMATION KDE THEME - ICON THEME - FONT - Unknown TERMINAL FONT - JetBrainsMono NFM Bold (16pt) CURSOR - default (24px) • VARIOUS INFORMATION WEATHER - +16°C - Clear (Cape Town, South Africa) INFO - fastfetch 2.48.1 (x86_64)

kevinnkansah avatar Nov 07 '25 00:11 kevinnkansah

FWIW, it works fine on EndeavourOS: Ghostty 1.2.3-arch2

alexaandru avatar Nov 07 '25 07:11 alexaandru

@alexaandru with all due respect , how does you tell me that resolve my issue. I tested on 5 TERMINALS. It works for all but not Ghostty (niri). i dont care about the distro you use.

kevinnkansah avatar Nov 07 '25 19:11 kevinnkansah

My intent was to provide additional information to developers to aid them with fixing this. The point was never to prove you wrong or anything like that.

alexaandru avatar Nov 08 '25 05:11 alexaandru

I'm experiencing the same issue. I'm using arch liux & Ghostty

peterbartels avatar Nov 09 '25 13:11 peterbartels

I experience same issue $ghostty --version

Ghostty 1.2.3-arch2

Version

  • version: 1.2.3-arch2
  • channel: tip Build Config
  • Zig version : 0.14.1
  • build mode : builtin.OptimizeMode.ReleaseFast
  • app runtime : apprt.Runtime.gtk
  • font engine : font.main.Backend.fontconfig_freetype
  • renderer : renderer.generic.Renderer(renderer.OpenGL)
  • libxev : io_uring
  • kernel version: 6.17.5-arch1-1
  • desktop env : other
  • GTK version : build : 4.20.2 runtime : 4.20.2
  • libadwaita : enabled build : 1.8.1 runtime : 1.8.1
  • libX11 : enabled
  • libwayland : enabled

$ copilot --version 0.0.354 Commit: 076bd172b

maorv avatar Nov 10 '25 15:11 maorv

A workaround to make it work is to set

keybind = enter=text:\r
in $HOME/.config/ghosttty/config 

maorv avatar Nov 12 '25 05:11 maorv

I started using niri with ghostty over the weekend and can reproduce this if the team needs an internal repro :)

RyanHecht avatar Nov 17 '25 15:11 RyanHecht

FYI @RyanHecht I was able to repro on MacOS 26.1. Issue appears larger than linux distros.

patniko avatar Nov 17 '25 19:11 patniko

I don't use Copilot CLI (and don't have time to mess with it either), but someone opened a post[^1] in Ghostty's Discord's #help channel about this, and it was discovered that Copilot uses the Kitty keyboard protocol; the issue might be there (they confirmed it doesn't reproduce on GNOME Terminal (VTE), which doesn't support KKP).

The workaround above,

keybind = enter=text:\r

Is also quite suspect, as that essentially forces Ghostty to encode enter with the legacy encoding.

tested on 5 TERMINALS

Checking if it works fine on another terminal emulator supporting KKP (e.g.: Kitty, Foot, WezTerm, Alacritty) would help disprove this theory of course (though it could be some combination of KKP and Ghostty, such as with special-casing terminal emulators).

FWIW, it works fine on EndeavourOS: Ghostty 1.2.3-arch2

And KKP support was only introduced in v0.0.337, so it would presumably work on older versions if this is the issue (though to be fair that version is a month and a half old).

[^1]: You need to be in the Ghostty Discord for this link to work; you can join with https://discord.gg/ghostty.

00-kat avatar Nov 26 '25 10:11 00-kat

FYI I checked with @patniko and he cannot reproduce it on Ghostty for macOS anymore. Right now it seems the issue has been reproduced only on:

  • Fedora (+ niri) + Ghostty
  • Arch Linux + Ghostty

sergiou87 avatar Dec 03 '25 13:12 sergiou87

I'll also mention that my ghostty config is the default DankMaterialShell config, but I can still reproduce it with a blank config too https://github.com/AvengeMedia/DankMaterialShell/blob/master/core/internal/config/embedded/ghostty.conf

The workaround above,

keybind = enter=text:\r

Is also quite suspect, as that essentially forces Ghostty to encode enter with the legacy encoding.

This workaround did not work for me.

Checking if it works fine on another terminal emulator supporting KKP (e.g.: Kitty, Foot, WezTerm, Alacritty) would help disprove this theory of course (though it could be some combination of KKP and Ghostty, such as with special-casing terminal emulators).

I can't reproduce the bug in Alacritty; it works fine there.

RyanHecht avatar Dec 03 '25 15:12 RyanHecht

I tried to reproduce this in KDE Plasma and could not -- I only experience this issue in niri with ghostty.

@kevinnkansah Can you share your niri config?

@peterbartels, do you happen to be using niri as well?

RyanHecht avatar Dec 03 '25 17:12 RyanHecht

I'm having this issue on hyprland

0.0.363
Commit: 66416ad
Ghostty 1.2.0-arch1

Version
  - version: 1.2.0-arch1
  - channel: tip
Build Config
  - Zig version   : 0.14.1
  - build mode    : builtin.OptimizeMode.ReleaseFast
  - app runtime   : apprt.Runtime.gtk
  - font engine   : font.main.Backend.fontconfig_freetype
  - renderer      : renderer.generic.Renderer(renderer.OpenGL)
  - libxev        : io_uring
  - kernel version: 6.16.8-1-MANJARO
  - desktop env   : other
  - GTK version   :
    build         : 4.18.6
    runtime       : 4.18.6
  - libadwaita    : enabled
    build         : 1.7.7
    runtime       : 1.7.7
  - libX11        : enabled
  - libwayland    : enabled
OS: Manjaro Linux x86_64
Host: Inspiron 5491 2n1
Kernel: 6.16.8-1-MANJARO
Uptime: 10 hours, 9 mins
Packages: 2199 (pacman), 98 (nix-user), 64 (nix-default), 91 (flatpak), 6 (snap)
Shell: zsh 5.9
Resolution: 1920x1080
DE: Hyprland
Theme: Adwaita [GTK2], adw-gtk3-dark [GTK3]
Icons: Adwaita [GTK2], Papirus-Dark-Maia [GTK3]
Terminal: ghostty
CPU: Intel i7-10510U (8) @ 4.900GHz
GPU: Intel CometLake-U GT2 [UHD Graphics]
Memory: 19984MiB / 31751MiB

kingwill101 avatar Dec 03 '25 17:12 kingwill101

I tried to reproduce this in KDE Plasma and could not -- I only experience this issue in niri with ghostty.

@kevinnkansah Can you share your niri config?

@peterbartels, do you happen to be using niri as well?

// This config is in the KDL format: https://kdl.dev
// "/-" comments out the following node.
// Check the wiki for a full description of the configuration:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction
config-notification {
    disable-failed
}
// Outputs from existing configuration
/-output "eDP-1" {
    // Uncomment this line to disable this output.
    // off

    // Resolution and, optionally, refresh rate of the output.
    // The format is "<width>x<height>" or "<width>x<height>@<refresh rate>".
    // If the refresh rate is omitted, niri will pick the highest refresh rate
    // for the resolution.
    // If the mode is omitted altogether or is invalid, niri will pick one automatically.
    // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.
    mode "[email protected]"

    // You can use integer or fractional scale, for example use 1.5 for 150% scale.
    scale 2

    // Transform allows to rotate the output counter-clockwise, valid values are:
    // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.
    transform "normal"

    // Position of the output in the global coordinate space.
    // This affects directional monitor actions like "focus-monitor-left", and cursor movement.
    // The cursor can only move between directly adjacent outputs.
    // Output 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.
    position x=1280 y=0
}


gestures {
    hot-corners {
        off
    }
}

// Input device configuration.
// Find the full list of options on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Input
input {
    keyboard {
        xkb {
        }
        numlock
    }
    touchpad {
        natural-scroll
        tap
    }
    mouse {
    }
    trackpoint {
    }
}
// You can configure outputs by their name, which you can find
// by running `niri msg outputs` while inside a niri instance.
// The built-in laptop monitor is usually called "eDP-1".
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs
// Remember to uncomment the node by removing "/-"!

// Settings that influence how windows are positioned and sized.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
layout {
    // Set gaps around windows in logical pixels.
    gaps 5
    background-color "transparent"
    // When to center a column when changing focus, options are:
    // - "never", default behavior, focusing an off-screen column will keep at the left
    //   or right edge of the screen.
    // - "always", the focused column will always be centered.
    // - "on-overflow", focusing a column will center it if it doesn't fit
    //   together with the previously focused column.
    center-focused-column "never"
    // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
    preset-column-widths {
        // Proportion sets the width as a fraction of the output width, taking gaps into account.
        // For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
        // The default preset widths are 1/3, 1/2 and 2/3 of the output.
        proportion 0.33333
        proportion 0.5
        proportion 0.66667
        // Fixed sets the width in logical pixels exactly.
        // fixed 1920
    }
    // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
    // preset-window-heights { }
    // You can change the default width of the new windows.
    default-column-width { proportion 0.5; }
    // If you leave the brackets empty, the windows themselves will decide their initial width.
    // default-column-width {}
    // By default focus ring and border are rendered as a solid background rectangle
    // behind windows. That is, they will show up through semitransparent windows.
    // This is because windows using client-side decorations can have an arbitrary shape.
    //
    // If you don't like that, you should uncomment `prefer-no-csd` below.
    // Niri will draw focus ring and border *around* windows that agree to omit their
    // client-side decorations.
    //
    // Alternatively, you can override it with a window rule called
    // `draw-border-with-background`.
    border {
        off
        width 4
        active-color   "#707070"      // Neutral gray
        inactive-color "#d0d0d0"      // Light gray
        urgent-color   "#cc4444"      // Softer red
    }
    focus-ring {
        width 2
        active-color   "#808080"      // Medium gray
        inactive-color "#505050"      // Dark gray
    }
    shadow {
        softness 30
        spread 5
        offset x=0 y=5
        color "#0007"
    }
    struts {
    }
}
layer-rule {
    match namespace="^quickshell$"
    place-within-backdrop true
}
overview {
    workspace-shadow {
        off
    }
}
// Add lines like this to spawn processes at startup.
// Note that running niri as a session supports xdg-desktop-autostart,
// which may be more convenient to use.
// See the binds section below for more spawn examples.
// This line starts waybar, a commonly used bar for Wayland compositors.
spawn-at-startup "bash" "-c" "wl-paste --watch cliphist store &"
spawn-at-startup "dms" "run"
spawn-at-startup "/usr/lib/mate-polkit/polkit-mate-authentication-agent-1"
environment {
  XDG_CURRENT_DESKTOP "niri"
  QT_QPA_PLATFORM "wayland"
  ELECTRON_OZONE_PLATFORM_HINT "auto"
  QT_QPA_PLATFORMTHEME "gtk3"
  QT_QPA_PLATFORMTHEME_QT6 "gtk3"
  TERMINAL "kitty"
}
hotkey-overlay {
    skip-at-startup
}
prefer-no-csd
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
animations {
    workspace-switch {
        spring damping-ratio=0.80 stiffness=523 epsilon=0.0001
    }
    window-open {
        duration-ms 500
        curve "cubic-bezier" 0.28 0 0.02 1.02
        
    }
    window-close {
        duration-ms 150
        curve "ease-out-quad"
    }
    horizontal-view-movement {
        spring damping-ratio=0.85 stiffness=423 epsilon=0.0001
    }
    window-movement {
        spring damping-ratio=0.75 stiffness=323 epsilon=0.0001
    }
    window-resize {
        spring damping-ratio=0.85 stiffness=423 epsilon=0.0001
    }
    config-notification-open-close {
        spring damping-ratio=0.65 stiffness=923 epsilon=0.001
    }
    screenshot-ui-open {
        duration-ms 200
        curve "ease-out-quad"
    }
    overview-open-close {
        spring damping-ratio=0.85 stiffness=800 epsilon=0.0001
    }
}
// Window rules let you adjust behavior for individual windows.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
// Work around WezTerm's initial configure bug
// by setting an empty default-column-width.
window-rule {
    // This regular expression is intentionally made as specific as possible,
    // since this is the default config, and we want no false positives.
    // You can get away with just app-id="wezterm" if you want.
    match app-id=r#"^org\.wezfurlong\.wezterm$"#
    default-column-width {}
}
window-rule {
    match app-id=r#"^org\.gnome\."#
    draw-border-with-background false
    geometry-corner-radius 12
    clip-to-geometry true
}
window-rule {
    match app-id=r#"^gnome-control-center$"#
    match app-id=r#"^pavucontrol$"#
    match app-id=r#"^nm-connection-editor$"#
    default-column-width { proportion 0.5; }
    open-floating false
}
window-rule {
    match app-id=r#"^gnome-calculator$"#
    match app-id=r#"^galculator$"#
    match app-id=r#"^blueman-manager$"#
    match app-id=r#"^org\.gnome\.Nautilus$"#
    match app-id=r#"^steam$"#
    match app-id=r#"^xdg-desktop-portal$"#
    match app-id=r#"^thunar$"#
    open-floating true
}
window-rule {
    match app-id=r#"^org\.wezfurlong\.wezterm$"#
    match app-id="Alacritty"
    match app-id="zen"
    match app-id="com.mitchellh.ghostty"
    match app-id="kitty"
    draw-border-with-background false
}
window-rule {
    match is-active=false
    opacity 0.9
}
window-rule {
    match app-id=r#"firefox$"# title="^Picture-in-Picture$"
    match app-id="zoom"
    open-floating true
}
window-rule {
    geometry-corner-radius 12
    clip-to-geometry true
}

window-rule {
    match app-id="(?i)zed"
    draw-border-with-background false
    open-maximized true
}

window-rule {
    match app-id="org.chromium.Chromium"
    match app-id="org.prismlauncher.PrismLauncher"
    open-maximized true
}

binds {
    // === System & Overview ===
    Mod+D { spawn "niri" "msg" "action" "toggle-overview"; }
    Mod+O repeat=false { toggle-overview; }
    Mod+Shift+Slash { show-hotkey-overlay; }

    // === Application Launchers ===
    Mod+Return hotkey-overlay-title="Open Terminal" { spawn "kitty"; }
    Mod+Z hotkey-overlay-title="Open Zed" { spawn "/home/kevin/.local/bin/zed"; }
    Mod+Space hotkey-overlay-title="Application Launcher" {
        spawn "dms" "ipc" "call" "spotlight" "toggle";
    }
    Mod+T hotkey-overlay-title="Open File Manager" { spawn "thunar"; }
    Mod+B hotkey-overlay-title="Open Browser" { spawn "xdg-open" "https://"; }
    Mod+V hotkey-overlay-title="Clipboard Manager" {
        spawn "dms" "ipc" "call" "clipboard" "toggle";
    }
    Mod+M hotkey-overlay-title="Task Manager" {
        spawn "dms" "ipc" "call" "processlist" "toggle";
    }
    Mod+Comma hotkey-overlay-title="Settings" {
        spawn "dms" "ipc" "call" "settings" "toggle";
    }
    Mod+N hotkey-overlay-title="Notification Center" { spawn "dms" "ipc" "call" "notifications" "toggle"; }
    Mod+Shift+N hotkey-overlay-title="Notepad" { spawn "dms" "ipc" "call" "notepad" "toggle"; }

    // === Security ===
    Mod+Alt+L hotkey-overlay-title="Lock Screen" {
        spawn "dms" "ipc" "call" "lock" "lock";
    }
    Mod+Shift+E { quit; }
    Ctrl+Alt+Delete hotkey-overlay-title="Task Manager" {
        spawn "dms" "ipc" "call" "processlist" "toggle";
    }

    // === Audio Controls ===
    XF86AudioRaiseVolume allow-when-locked=true {
        spawn "dms" "ipc" "call" "audio" "increment" "3";
    }
    XF86AudioLowerVolume allow-when-locked=true {
        spawn "dms" "ipc" "call" "audio" "decrement" "3";
    }
    XF86AudioMute allow-when-locked=true {
        spawn "dms" "ipc" "call" "audio" "mute";
    }
    XF86AudioMicMute allow-when-locked=true {
        spawn "dms" "ipc" "call" "audio" "micmute";
    }

    XF86KbdBrightnessUp allow-when-locked=true {
        spawn "kbdbrite.sh" "up";
    }
    XF86KbdBrightnessDown allow-when-locked=true {
        spawn "kbdbrite.sh" "down";
    }
    // === Brightness Controls ===
    XF86MonBrightnessUp allow-when-locked=true {
       spawn "dms" "ipc" "call" "brightness" "increment" "5" "";
    }
    XF86MonBrightnessDown allow-when-locked=true {
       spawn "dms" "ipc" "call" "brightness" "decrement" "5" "";
    }

    // === Window Management ===
    Mod+Q repeat=false { close-window; }
    Mod+F { maximize-column; }
    Mod+Shift+F { fullscreen-window; }
    Mod+Shift+T { toggle-window-floating; }
    Mod+Shift+V { switch-focus-between-floating-and-tiling; }
    Mod+W { toggle-column-tabbed-display; }

    // === Focus Navigation ===
    Mod+Left  { focus-column-left; }
    Mod+Down  { focus-window-down; }
    Mod+Up    { focus-window-up; }
    Mod+Right { focus-column-right; }
    Mod+H     { focus-column-left; }
    Mod+J     { focus-window-down; }
    Mod+K     { focus-window-up; }
    Mod+L     { focus-column-right; }

    // === Window Movement ===
    Mod+Shift+Left  { move-column-left; }
    Mod+Shift+Down  { move-window-down; }
    Mod+Shift+Up    { move-window-up; }
    Mod+Shift+Right { move-column-right; }
    Mod+Shift+H     { move-column-left; }
    Mod+Shift+J     { move-window-down; }
    Mod+Shift+K     { move-window-up; }
    Mod+Shift+L     { move-column-right; }

    // === Column Navigation ===
    Mod+Home { focus-column-first; }
    Mod+End  { focus-column-last; }
    Mod+Ctrl+Home { move-column-to-first; }
    Mod+Ctrl+End  { move-column-to-last; }

    // === Monitor Navigation ===
    Mod+Ctrl+Left  { focus-monitor-left; }
    //Mod+Ctrl+Down  { focus-monitor-down; }
    //Mod+Ctrl+Up    { focus-monitor-up; }
    Mod+Ctrl+Right { focus-monitor-right; }
    Mod+Ctrl+H     { focus-monitor-left; }
    Mod+Ctrl+J     { focus-monitor-down; }
    Mod+Ctrl+K     { focus-monitor-up; }
    Mod+Ctrl+L     { focus-monitor-right; }

    // === Move to Monitor ===
    Mod+Shift+Ctrl+Left  { move-column-to-monitor-left; }
    Mod+Shift+Ctrl+Down  { move-column-to-monitor-down; }
    Mod+Shift+Ctrl+Up    { move-column-to-monitor-up; }
    Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
    Mod+Shift+Ctrl+H     { move-column-to-monitor-left; }
    Mod+Shift+Ctrl+J     { move-column-to-monitor-down; }
    Mod+Shift+Ctrl+K     { move-column-to-monitor-up; }
    Mod+Shift+Ctrl+L     { move-column-to-monitor-right; }

    // === Workspace Navigation ===
    Mod+Page_Down      { focus-workspace-down; }
    Mod+Page_Up        { focus-workspace-up; }
    Mod+U              { focus-workspace-down; }
    Mod+I              { focus-workspace-up; }
    Mod+Ctrl+Down { move-column-to-workspace-down; }
    Mod+Ctrl+Up   { move-column-to-workspace-up; }
    Mod+Ctrl+U         { move-column-to-workspace-down; }
    Mod+Ctrl+I         { move-column-to-workspace-up; }

    // === Move Workspaces ===
    Mod+Shift+Page_Down { move-workspace-down; }
    Mod+Shift+Page_Up   { move-workspace-up; }
    Mod+Shift+U         { move-workspace-down; }
    Mod+Shift+I         { move-workspace-up; }

    // === Mouse Wheel Navigation ===
    Mod+WheelScrollDown      cooldown-ms=150 { focus-workspace-down; }
    Mod+WheelScrollUp        cooldown-ms=150 { focus-workspace-up; }
    Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
    Mod+Ctrl+WheelScrollUp   cooldown-ms=150 { move-column-to-workspace-up; }

    Mod+WheelScrollRight      { focus-column-right; }
    Mod+WheelScrollLeft       { focus-column-left; }
    Mod+Ctrl+WheelScrollRight { move-column-right; }
    Mod+Ctrl+WheelScrollLeft  { move-column-left; }

    Mod+Shift+WheelScrollDown      { focus-column-right; }
    Mod+Shift+WheelScrollUp        { focus-column-left; }
    Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
    Mod+Ctrl+Shift+WheelScrollUp   { move-column-left; }

    // === Numbered Workspaces ===
    Mod+1 { focus-workspace 1; }
    Mod+2 { focus-workspace 2; }
    Mod+3 { focus-workspace 3; }
    Mod+4 { focus-workspace 4; }
    Mod+5 { focus-workspace 5; }
    Mod+6 { focus-workspace 6; }
    Mod+7 { focus-workspace 7; }
    Mod+8 { focus-workspace 8; }
    Mod+9 { focus-workspace 9; }

    // === Move to Numbered Workspaces ===
    Mod+Shift+1 { move-column-to-workspace 1; }
    Mod+Shift+2 { move-column-to-workspace 2; }
    Mod+Shift+3 { move-column-to-workspace 3; }
    Mod+Shift+4 { move-column-to-workspace 4; }
    Mod+Shift+5 { move-column-to-workspace 5; }
    Mod+Shift+6 { move-column-to-workspace 6; }
    Mod+Shift+7 { move-column-to-workspace 7; }
    Mod+Shift+8 { move-column-to-workspace 8; }
    Mod+Shift+9 { move-column-to-workspace 9; }

    // === Column Management ===
    Mod+BracketLeft  { consume-or-expel-window-left; }
    Mod+BracketRight { consume-or-expel-window-right; }
    Mod+Period { expel-window-from-column; }

    // === Sizing & Layout ===
    Mod+R { switch-preset-column-width; }
    Mod+Shift+R { switch-preset-window-height; }
    Mod+Ctrl+R { reset-window-height; }
    Mod+Ctrl+F { expand-column-to-available-width; }
    Mod+C { center-column; }
    Mod+Ctrl+C { center-visible-columns; }

    // === Manual Sizing ===
    Mod+Minus { set-column-width "-10%"; }
    Mod+Equal { set-column-width "+10%"; }
    Mod+Shift+Minus { set-window-height "-10%"; }
    Mod+Shift+Equal { set-window-height "+10%"; }

    // === Screenshots ===
    XF86Launch1 { screenshot; }
    Ctrl+XF86Launch1 { screenshot-screen; }
    Alt+XF86Launch1 { screenshot-window; }
    Print { screenshot; }
    Ctrl+Print { screenshot-screen; }
    Alt+Print { screenshot-window; }
    // === System Controls ===
    Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
    Mod+Shift+P { power-off-monitors; }
}

kevinnkansah avatar Dec 03 '25 20:12 kevinnkansah