从挂起状态唤醒时出现多个键盘映射问题

从挂起状态唤醒时出现多个键盘映射问题

尝试在恢复时对该文件进行 xmodmap 操作。已尝试如何在暂停恢复后执行命令?通过使用 xmodmap -e 添加多个键映射但没有成功(每次它只接受第一行)。我觉得它应该能够使用 .Xmodmap 来保持代码简单。Ubuntu 14.04。谢谢。

我的 .Xmodmap(具有可执行权限)位于 /home/dadtwo/

clear control
clear mod4

keycode 133 = Control_L NoSymbol Control_L
keycode 37 = Super_L NoSymbol Super_L

add control = Control_L
add mod4 = Super_L

我的 10_keyboard-swap(具有可执行权限)位于 /etc/pm/sleep.d

#!/bin/sh

# Remap Swap Super_L and Control_L

case "${1}" in
    resume|thaw)
    DISPLAY=:0.0 ; export DISPLAY
    su $dadtwo -c "sleep 3; /usr/bin/xmodmap /home/dadtwo/.Xmodmap"&
;;
esac

/var/log/pm-suspend.log 显示“/usr/bin/xmodmap:无法打开显示‘:0.0’”

答案1

ldd $(type -p xmodmap)表示xmodmap使用来与 X 服务器通信。因此,在 X 服务器运行之前 libX11.so.6不能使用。xmodmap

$ ldd $(type -p xmodmap)
    linux-vdso.so.1 =>  (0x00007ffc5c1f3000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f8abffa6000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8abfbe1000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f8abf9c2000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8abf7be000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f8ac02db000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f8abf5ba000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f8abf3b4000)

在我的 Ubuntu 14.04.5 上(YMMV),通过使用pgrep X,和ps -fp$(pgrep X)并按照PPID字段后退两步,我看到:

$ ps -fp1851,1801,1603
UID        PID  PPID  C STIME TTY          TIME CMD
root      1603     1  0 Jul27 ?        00:00:00 gdm
root      1801  1603  0 Jul27 ?        00:00:00 /usr/lib/gdm/gdm-simple-slave --display-id /org/gnome/DisplayManager/Displays/_0
root      1851  1801  1 Jul27 tty7     04:30:37 /usr/bin/X :0 -background none -verbose -logverbose 7 -core -auth /var/run/gdm/auth-for-gdm-ZKZ4jH/database -seat seat0 -nolisten t

它告诉我 X 服务器 ( X),PID 1851(在我的系统上,目前,YMMV)由 PID 1801 ( /usr/lib/gdm/gdm-simple-slave) 启动,而后者又由 PID 1603 ( ) 启动gdm

gdm仅在您登录后启动gdm-simple-slave(启动X),因此在登录之前它将不起作用。

在开始xmodmap之前运行,或者在 之前不放入脚本,并且已经在 X 会话中完成。Xexport DISPLAY=:0xmodmapman xhost;xhost +local:

重新措辞的答案:

man xhost

登录后,打开终端窗口并查看:

$ echo $DISPLAY
:0

允许在此系统上运行但不允许在X服务器进程下运行的进程与服务器进程进行通信X

$ xhost +local:
non-network local connections being added to access control list

这将持续到您将其改回(xhost -local:)或直到X服务器退出,因此,如果这对您有用,请将其放在用户启动中的某个地方。

只要xhost +locakl:有效,您就可以xmodmap在任何上下文中运行您的(例如从/etc/pm/power.d/),方法是:

env DISPLAY=:0 xmodmap ....

或者,如果你想使用多个xmodmap命令,

export DISPLAY=:0
xmodmap ...
xmodmap ...

注意:允许X通过“非网络本地连接”连接到您的服务器确实会降低系统的安全性。

相关内容