#!/usr/bin/env bash # setup-keyboard-remap-poller.sh # ============================= # Installs a systemd user service that polls for keyboard plug-in / KVM switch events # and runs ~/sh/keymaps.sh (your xmodmap stuff) when it detects a change. # # Why polling? Udev is too early / env broken for X11 tools in most cases. set -euo pipefail SERVICE_NAME="keyboard-remap-poller" SERVICE_FILE="$HOME/.config/systemd/user/$SERVICE_NAME.service" POLLER_SCRIPT="$HOME/.local/bin/keyboard-remap-poller.sh" KEYMAPS_SCRIPT="$HOME/sh/keymaps.sh" if [[ ! -x "$KEYMAPS_SCRIPT" ]]; then echo "Error: $KEYMAPS_SCRIPT not found or not executable." echo "Make sure it exists and chmod +x it." exit 1 fi echo "Creating poller script: $POLLER_SCRIPT" mkdir -p "$(dirname "$POLLER_SCRIPT")" cat > "$POLLER_SCRIPT" << 'EOP' #!/usr/bin/env bash # keyboard-remap-poller.sh - checks for keyboard/input changes and runs keymaps.sh KEYMAPS_SCRIPT="$HOME/sh/keymaps.sh" LOG_FILE="$HOME/.local/share/keyboard-remap.log" LAST_COUNT_FILE="$HOME/.cache/keyboard-event-count" # Initial count of input devices (rough way to detect plug/unplug/KVM) get_input_count() { ls /dev/input/event* 2>/dev/null | wc -l } last_count=$(cat "$LAST_COUNT_FILE" 2>/dev/null || echo "0") while true; do current_count=$(get_input_count) if [[ "$current_count" != "$last_count" ]]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - Input device count changed ($last_count → $current_count). Running keymaps.sh" >> "$LOG_FILE" # Run your script in X session context if [[ -n "${DISPLAY:-}" ]]; then "$KEYMAPS_SCRIPT" >> "$LOG_FILE" 2>&1 else # Fallback: try common display :0 or :0.0 DISPLAY=:0 XAUTHORITY="$HOME/.Xauthority" "$KEYMAPS_SCRIPT" >> "$LOG_FILE" 2>&1 || \ DISPLAY=:0.0 XAUTHORITY="$HOME/.Xauthority" "$KEYMAPS_SCRIPT" >> "$LOG_FILE" 2>&1 fi echo "$(date '+%Y-%m-%d %H:%M:%S') - keymaps.sh finished (exit code $?)" >> "$LOG_FILE" echo "$current_count" > "$LAST_COUNT_FILE" fi last_count="$current_count" sleep 8 # Check every 8 seconds - low overhead done EOP chmod +x "$POLLER_SCRIPT" echo "Poller script created." echo "Creating systemd user service: $SERVICE_FILE" mkdir -p "$(dirname "$SERVICE_FILE")" cat > "$SERVICE_FILE" << EOF [Unit] Description=Poll for keyboard plug-in / KVM events and run keymaps.sh After=graphical-session.target [Service] Type=simple ExecStart=$POLLER_SCRIPT Restart=always RestartSec=5 [Install] WantedBy=graphical-session.target EOF echo "Service file created." echo "Enabling and starting the service (user level)..." systemctl --user daemon-reload systemctl --user enable --now "$SERVICE_NAME.service" echo "" echo "=== Setup Done ===" echo "The service is now running as your user." echo "" echo "Test it:" echo " 1. Switch KVM or plug/unplug a keyboard" echo " 2. Wait 10–20 seconds" echo " 3. Check if your xmodmap changes applied (e.g. press your remapped keys)" echo " 4. Look at log:" echo " tail -f $HOME/.local/share/keyboard-remap.log" echo "" echo "If it doesn't trigger reliably:" echo " - Increase sleep 8 → sleep 5 in $POLLER_SCRIPT" echo " - Or if DISPLAY is wrong, edit the DISPLAY/XAUTHORITY lines" echo "" echo "To stop/disable:" echo " systemctl --user stop $SERVICE_NAME.service" echo " systemctl --user disable $SERVICE_NAME.service" echo "" echo "Enjoy your remaps without F10 every time!"