From f77a07d781bf8f7bfefc9c9fe2c5ef52214b0f5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Eug=C3=AAnio?= Date: Wed, 1 Jul 2026 15:38:52 -0300 Subject: [PATCH] kde: sync XWayland keyboard layout with KDE --- scripts/default.nix | 7 +++++ scripts/kde-sync-xkbmap | 51 ++++++++++++++++++++++++++++++++++++ user/kde.nix | 5 +++- user/kde/kde-sync-xkbmap.nix | 22 ++++++++++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100755 scripts/kde-sync-xkbmap create mode 100644 user/kde/kde-sync-xkbmap.nix diff --git a/scripts/default.nix b/scripts/default.nix index 3ebf1dd..e8e1462 100644 --- a/scripts/default.nix +++ b/scripts/default.nix @@ -146,6 +146,13 @@ xorg.setxkbmap jq ]; + kde-sync-xkbmap = [ + xorg.setxkbmap + dbus + gnugrep + gnused + gawk + ]; print-battery-icon = [ ]; controller-battery = [ print-battery-icon ]; mouse-battery = [ print-battery-icon ]; diff --git a/scripts/kde-sync-xkbmap b/scripts/kde-sync-xkbmap new file mode 100755 index 0000000..40b1858 --- /dev/null +++ b/scripts/kde-sync-xkbmap @@ -0,0 +1,51 @@ +#!/bin/sh + +set -euo pipefail + +get_layout_display_name() { + idx="$1" + dbus-send --session --print-reply --dest=org.kde.keyboard /Layouts org.kde.KeyboardLayouts.getLayoutsList 2>/dev/null \ + | grep 'string "' \ + | sed 's/.*string "\([^"]*\)".*/\1/' \ + | awk -v idx="$idx" 'NR%3==0 { if (c++ == idx) { print; exit } }' +} + +get_layout_index() { + dbus-send --session --print-reply --dest=org.kde.keyboard /Layouts org.kde.KeyboardLayouts.getLayout 2>/dev/null \ + | awk '/uint32/ { print $2; exit }' +} + +LAST_LAYOUT="" + +apply_layout() { + idx="$1" + CURRENT_LAYOUT=$(get_layout_display_name "$idx") + + if test "$LAST_LAYOUT" = "$CURRENT_LAYOUT"; then + return 0 + elif test "$CURRENT_LAYOUT" = "English (Colemak)"; then + echo "Setting layout to colemak" + setxkbmap us colemak + elif test "$CURRENT_LAYOUT" = "Portuguese (Brazil)"; then + echo "Setting layout to br" + setxkbmap br + fi + + LAST_LAYOUT="$CURRENT_LAYOUT" +} + +update_layout() { + INDEX=$(get_layout_index) + apply_layout "$INDEX" +} + +while ! get_layout_index; do + sleep 1s +done +update_layout + +dbus-monitor --session \ + "type='signal',interface='org.kde.KeyboardLayouts',member='layoutChanged',path='/Layouts'" \ + | while read -r line; do + update_layout + done diff --git a/user/kde.nix b/user/kde.nix index 3e647b8..6a19816 100644 --- a/user/kde.nix +++ b/user/kde.nix @@ -4,6 +4,9 @@ config, ... }: -lib.mkIf (config.my.desktop == "kde") { +{ + imports = [ ./kde/kde-sync-xkbmap.nix ]; +} +// lib.mkIf (config.my.desktop == "kde") { services.gpg-agent.pinentry.package = lib.mkForce pkgs.pinentry-qt; } diff --git a/user/kde/kde-sync-xkbmap.nix b/user/kde/kde-sync-xkbmap.nix new file mode 100644 index 0000000..6a8dc00 --- /dev/null +++ b/user/kde/kde-sync-xkbmap.nix @@ -0,0 +1,22 @@ +{ + config, + pkgs, + lib, + ... +}: +lib.mkIf (config.my.desktop == "kde") { + systemd.user.services.kde-sync-xkbmap = { + Unit = { + Description = "Sync xkbmap with KDE keyboard layout"; + PartOf = [ "graphical-session.target" ]; + After = [ "graphical-session.target" ]; + }; + Service = { + ExecStart = lib.getExe pkgs.kde-sync-xkbmap; + Restart = "on-failure"; + }; + Install = { + WantedBy = [ "plasma-workspace.target" ]; + }; + }; +}