ldd $(type -p xmodmap)
mostra que xmodmap
usa libX11.so.6
para se comunicar com o servidor X. Portanto, não é possível usar xmodmap
antes de o servidor X estar em execução.
$ 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)
No meu Ubuntu 14.04.5, (YMMV), usando pgrep X
e ps -fp$(pgrep X)
e seguindo o campo PPID
de volta, vejo:
$ 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
O que me diz que o servidor X ( X
), PID 1851 (no meu sistema, neste momento, YMMV) foi iniciado pelo PID 1801 ( /usr/lib/gdm/gdm-simple-slave
), que, por sua vez, foi iniciado pelo PID 1603 (%código%).
gdm
inicia somente gdm
(que inicia gdm-simple-slave
) DEPOIS de você fazer login, isso não funcionará antes do login.
Executando X
antes de xmodmap
ser iniciado, ou sem colocar X
em seu script antes do export DISPLAY=:0
, E ter feito xmodmap
em sua sessão X.
Resposta reformulada:
Leia man xhost;xhost +local:
.
Depois de ter logado, abra uma janela de terminal e olhe:
$ echo $DISPLAY
:0
Permitir que os processos em execução neste sistema, mas NÃO em execução no processo man xhost
server, comuniquem-se com o processo X
server:
$ xhost +local:
non-network local connections being added to access control list
Isso durará até que você o altere de volta ( X
) OU até que o servidor xhost -local:
seja encerrado, portanto, se isso funcionar para você, coloque-o na inicialização de seu usuário em algum lugar.
Enquanto X
estiver em vigor, você poderá executar seu xhost +locakl:
em qualquer contexto (por exemplo, de xmodmap
) fazendo:
env DISPLAY=:0 xmodmap ....
ou, se você quiser usar vários comandos /etc/pm/power.d/
,
export DISPLAY=:0
xmodmap ...
xmodmap ...
Observação: Permitir conexões com o seu servidor xmodmap
por "conexões locais que não são de rede" torna seu sistema menos seguro.