通过 systemd 运行 xmodmap

通过 systemd 运行 xmodmap

我有一个将转义重新映射为大写锁定的脚本。我通常手动调用脚本

xmodmap /home/myusername/.Xmodmap;

.Xmodmap 是一个包含以下内容的文件:

remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

我希望这个命令在启动时运行。我所做的是转到 /etc/systemd/system 并创建一个名为“startup.service”的文件,其内容如下:

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/myusername/scripts/.qs

[Install]
WantedBy=multi-user.target

.qs 是一个具有 -rwxr-xr-x 权限的脚本,内容为:

#!/bin/bash
/usr/bin/xmodmap /home/myusername/.Xmodmap; 
rm /home/myusername/stop_time; 
date +%D' '%T > /home/myusername/stop_time

我通过键入 systemctl enablestartup(而不是startup.service)来启用该命令。

有趣的是。第二个和第三个命令在新启动上可以正常工作,而第一个命令则不能。它似乎以某种方式执行该命令或跳过它。该命令在终端窗口中执行时工作正常。我在这里缺少什么?

答案1

xmodmap在正在运行的 Xserver 上运行。它不是您在系统启动时运行的东西;而是在系统启动时运行的东西。它是您在图形登录后运行的东西,通常作为用户初始化脚本的一部分。

理论上,您可以通过 systemd 运行它来调整显示管理器的 Xserver 上的键盘映射,并After=display-manager.service在您的.service文件中使用。这将确保 systemd 在图形登录可用之前不会运行它。这不会影响基于 Wayland 的显示管理器、任何 Wayland 会话或使用新 Xserver 进程的用户会话,因此您可能希望在用户初始化期间重新运行它。


(请注意,XKB 选项的caps:swapescape功能与您的操作类似.Xmodmap,并且可以在 Wayland 和其他缺乏 Xserver 进行xmodmap操作的支持 libinput 的上下文中正常运行。 xmodmap本质上已被弃用,您应该尽可能避免使用它。)

相关内容