Sté*_*las 15
可能有什么东西在不断地窃取 X 选择。要找出它是谁。你可以编译这个:
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
int main() {
printf("%#lx\n", XGetSelectionOwner (XOpenDisplay(0), XA_PRIMARY));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和:
gcc that-file.c -lX11
Run Code Online (Sandbox Code Playgroud)
该代码是返回PRIMARYX 选择的所有者的窗口 ID 。然后您可以使用xdotool获取拥有该窗口的进程的 PID(假设 Window 来自本地客户端并且它让窗口管理器知道它的 PID):
ps -fp "$(xdotool getwindowpid "$(./a.out)")"
Run Code Online (Sandbox Code Playgroud)
如果您没有xdotool,则可以采用困难的方法:您可以在以下输出中查找该窗口 ID xwininfo -root -all:
xwininfo -root -all | less "+/$(./a.out)"
Run Code Online (Sandbox Code Playgroud)
拥有选择的窗口可能没有名称,但您可以查看其父级或祖父级以获取更多线索。找到由窗口管理器管理的祖先后,您可以通过以下方式获取进程 ID(假设窗口来自本地进程):
xprop -id that-id _NET_WM_PID
Run Code Online (Sandbox Code Playgroud)
例子:
$ xwininfo -root -wm -tree | grep -B3 "$(./a.out)"
24 children:
0x2800024 "Sun 12 May - 21:40 - zsh (2)": ("xterm" "XTerm") 1920x1059+0+19 +0+19
1 child:
0x280002f (has no name): () 1920x1059+0+0 +0+19
Run Code Online (Sandbox Code Playgroud)
0x280002f 拥有 PRIMARY 选择,其父项是“xterm”(0x2800024 由窗口管理器管理)。
$ xprop -id 0x2800024 _NET_WM_PID
_NET_WM_PID(CARDINAL) = 9707
$ ps -fp 9707
UID PID PPID C STIME TTY TIME CMD
chazelas 9707 1 0 08:50 ? 00:00:02 xterm
Run Code Online (Sandbox Code Playgroud)
这就是它的pid。
一旦您知道谁拥有该选择,就可能会更清楚发生了什么。