Describe the bug
When using the xkb caps:escape_shifted_capslock option (that turns capslock into escape but keep capslock's default behavior on shift-capslock), kitty will still output an escape when pressing shift-capslock (while kitty should have output capslock).
To Reproduce
Steps to reproduce the behavior:
setxkbmap us -option caps:escape_shifted_capslock (or whatever way to enable that option in your compositor)
- Open a program that listens to escape, for example vim in insert mode
- Types
shift-capslock, observe that capslock gets activated at the system level.
- Notice that your app received an escape (so with our vim example, we went back to normal mode)
Environment details
kitty 0.46.1 created by Kovid Goyal
Linux fuhen 6.18.20 #1-NixOS SMP PREEMPT_DYNAMIC Wed Mar 25 10:10:46 UTC 2026 x86_64
<<< Welcome to NixOS 26.05.20260328.8110df5 (x86_64) - /dev/tty >>>
Run 'nixos-help' for the NixOS manual.
DISTRIB_CODENAME=yarara
DISTRIB_DESCRIPTION="NixOS 26.05 (Yarara)"
DISTRIB_ID=nixos
DISTRIB_RELEASE="26.05"
LSB_VERSION="26.05 (Yarara)"
Running under: Wayland (niri 25.11 (Nixpkgs)) missing: blur single_pixel_buffer icon bell window-tag key-repeat top_level_drag
OpenGL: '4.6 (Core Profile) Mesa 26.0.3' Detected version: 4.6
Frozen: False
Fonts:
medium: JetBrainsMonoNLNF-Regular: /nix/store/h4dp26272i1qq3i059l7skirhp2v6dr6-nerd-fonts-jetbrains-mono-3.4.0+2.304/share/fonts/truetype/NerdFonts/JetBrainsMono/JetBrainsMonoNLNerdFont-Regular.ttf:0
Features: ()
bold: JetBrainsMonoNLNF-SemiBold: /nix/store/h4dp26272i1qq3i059l7skirhp2v6dr6-nerd-fonts-jetbrains-mono-3.4.0+2.304/share/fonts/truetype/NerdFonts/JetBrainsMono/JetBrainsMonoNLNerdFont-SemiBold.ttf:0
Features: ()
italic: JetBrainsMonoNLNF-Italic: /nix/store/h4dp26272i1qq3i059l7skirhp2v6dr6-nerd-fonts-jetbrains-mono-3.4.0+2.304/share/fonts/truetype/NerdFonts/JetBrainsMono/JetBrainsMonoNLNerdFont-Italic.ttf:0
Features: ()
bi: JetBrainsMonoNLNF-SemiBoldItalic: /nix/store/h4dp26272i1qq3i059l7skirhp2v6dr6-nerd-fonts-jetbrains-mono-3.4.0+2.304/share/fonts/truetype/NerdFonts/JetBrainsMono/JetBrainsMonoNLNerdFont-SemiBoldItalic.ttf:0
Features: ()
Paths:
kitty: /nix/store/a6l6x6jc899bv35cqyqnprk465n7i05j-kitty-0.46.1/bin/kitty
base dir: /nix/store/a6l6x6jc899bv35cqyqnprk465n7i05j-kitty-0.46.1/lib/kitty
extensions dir: /nix/store/a6l6x6jc899bv35cqyqnprk465n7i05j-kitty-0.46.1/lib/kitty/kitty
system shell: /run/current-system/sw/bin/zsh
System color scheme: dark. Applied color theme type: dark
Config options different from defaults:
Colors:
active_border_color #b4befe
active_tab_background #cba6f7
active_tab_foreground #11111b
background #1e1e2e
bell_border_color #f9e2af
color0 #45475a
color1 #f38ba8
color10 #a6e3a1
color11 #f9e2af
color12 #89b4fa
color13 #f5c2e7
color14 #94e2d5
color15 #a6adc8
color2 #a6e3a1
color3 #f9e2af
color4 #89b4fa
color5 #f5c2e7
color6 #94e2d5
color7 #bac2de
color8 #585b70
color9 #f38ba8
cursor #f5e0dc
cursor_text_color #1e1e2e
foreground #cdd6f4
inactive_border_color #6c7086
inactive_tab_background #181825
inactive_tab_foreground #cdd6f4
mark1_background #b4befe
mark1_foreground #1e1e2e
mark2_background #cba6f7
mark2_foreground #1e1e2e
mark3_background #74c7ec
mark3_foreground #1e1e2e
selection_background #f5e0dc
selection_foreground #1e1e2e
tab_bar_background #11111b
url_color #f5e0dc
Important environment variables seen by the kitty process:
PATH /run/wrappers/bin:/home/zoriya/.local/share/flatpak/exports/bin:/var/lib/flatpak/exports/bin:/home/zoriya/.nix-profile/bin:/home/zoriya/.local/state/nix/profile/bin:/etc/profiles/per-user/zoriya/bin:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin:/home/zoriya/.config/zsh/plugins/you-should-use:/home/zoriya/.config/zsh/plugins/sudo:/home/zoriya/.config/zsh/plugins/git:/nix/store/a6l6x6jc899bv35cqyqnprk465n7i05j-kitty-0.46.1/bin:/nix/store/4pmnxyssw1xz3k8a2xx5gpqaw70jbivc-imagemagick-7.1.2-17/bin:/nix/store/n9kykjsl617qs572vc4hhb0bw5gppmai-ncurses-6.6-dev/bin
LANG en_US.UTF-8
VISUAL nvim
EDITOR nvim
SHELL /run/current-system/sw/bin/zsh
GLFW_IM_MODULE ibus
WAYLAND_DISPLAY wayland-1
USER zoriya
XCURSOR_SIZE 24
XDG_CACHE_HOME /home/zoriya/.cache
XDG_CONFIG_DIRS /etc/xdg:/home/zoriya/.local/share/flatpak/exports/etc/xdg:/var/lib/flatpak/exports/etc/xdg:/home/zoriya/.nix-profile/etc/xdg:/home/zoriya/.local/state/nix/profile/etc/xdg:/home/zoriya/.local/state/nix/profile/etc/xdg:/etc/profiles/per-user/zoriya/etc/xdg:/nix/var/nix/profiles/default/etc/xdg:/run/current-system/sw/etc/xdg
XDG_CONFIG_HOME /home/zoriya/.config
XDG_CURRENT_DESKTOP niri
XDG_DATA_DIRS /nix/store/yl5yl395iqx88kd1m7lx7p7b65n0jfx9-gtk+3-3.24.51/share/gsettings-schemas/gtk+3-3.24.51:/nix/store/xsfc5fcy12nmcdsdwm3dx1xfffh7xv30-gsettings-desktop-schemas-49.1/share/gsettings-schemas/gsettings-desktop-schemas-49.1:/nix/store/60n38g0344i2dmnqa8xqqbbwslp4h2nm-desktops/share:/home/zoriya/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/home/zoriya/.nix-profile/share:/home/zoriya/.local/state/nix/profile/share:/home/zoriya/.local/state/nix/profile/share:/etc/profiles/per-user/zoriya/share:/nix/var/nix/profiles/default/share:/run/current-system/sw/share
XDG_DATA_HOME /home/zoriya/.local/share
XDG_DESKTOP_DIR /home/zoriya
XDG_DOCUMENTS_DIR /home/zoriya/stuff
XDG_DOWNLOAD_DIR /home/zoriya/downloads
XDG_MUSIC_DIR /home/zoriya/stuff
XDG_PICTURES_DIR /home/zoriya/stuff
XDG_PUBLICSHARE_DIR /home/zoriya/stuff
XDG_RUNTIME_DIR /run/user/1000
XDG_SESSION_TYPE wayland
XDG_STATE_HOME /home/zoriya/.local/state
XDG_TEMPLATES_DIR /home/zoriya/stuff
XDG_VIDEOS_DIR /home/zoriya/stuff
Additional context
This is reproducible with no config.
Describe the bug
When using the xkb
caps:escape_shifted_capslockoption (that turns capslock into escape but keep capslock's default behavior on shift-capslock), kitty will still output an escape when pressingshift-capslock(while kitty should have output capslock).To Reproduce
Steps to reproduce the behavior:
setxkbmap us -option caps:escape_shifted_capslock(or whatever way to enable that option in your compositor)shift-capslock, observe that capslock gets activated at the system level.Environment details
Additional context
This is reproducible with no config.