如果有人想知道等等。
决定再看看这个 - 并取得了一些进展。
使用内置选项--save-config
有以下感兴趣的属性:
Role=gnome-terminal-window-2587-1856448950-1359348087
ActiveTerminal=Terminal0xa896200
Geometry=110x87+900+1
WorkingDirectory=/home/xxx/tmp
仔细看。连续打开两个窗口,做了一个save-config
。
角色
我们可以将其拆分为各个部分:
gnome-terminal-window
2587
1856448950
1359348087
PID
2587
两者都是一样的,很快pstree 2587 -p
我们发现它是PID。此外,还可以echo $$
找到我们的 bash(或任何一个更喜欢的)。
开始时间
现在第二个数字完全不同,这表明它可能是一个随机值。最后一个,tho,只有 diff 中的最后一个数字。很可能是时间戳。我知道我在这个tmp
窗口的目录中——所以,通过我们对proc 文件系统的了解:
# btime: boot time, in seconds since the Epoch
$ cat /proc/stat | grep ^btime | cut -d' ' -f2
1359039155
# starttime: The time in jiffies the process started after system boot.
$ cat /proc/$$/stat | cut -d' ' -f22
30893222
# WANT: 1359348087
btime + starttime / Hertz
1359039155 + (30893222 / 100) = 1359348087.22 ~ 1359348087
好的。最后一位是 Epoch 开始的时间戳。但不幸的是,它不是 jiffies 和舍入的值,所以如果我们通过例如脚本启动了几个窗口,我们最终会得到相同的值。
(经过一些检查后,似乎秒数被四舍五入到最接近的值而不是零等)
随机值
好的。那么PID之后的值呢?很可能是一个随机值,但可以肯定的是。要检查这一点,我们必须去源头。
$ git clone git://git.gnome.org/gnome-terminal
$ gnome-terminal --version
GNOME Terminal 3.6.0
$ git log --grep="3\.6\.0"
commit f4d291a90dc4f513fc15f80fdebcdc3c3349b70a
...
Version 3.6.0
$ git checkout f4d291a90dc4f513fc15f80fdebcdc3c3349b70a
经过一番挖掘,我们发现:
# terminal-util.c
48: void
terminal_util_set_unique_role (GtkWindow *window, const char *prefix)
{
char *role;
role = g_strdup_printf(
"%s-%d-%d-%d",
prefix,
getpid(),
g_random_int(),
(int) time (NULL)
);
gtk_window_set_role (window, role);
g_free (role);
}
好的。我们不仅确认秒是随机值,而且确认 PI 和时间是正确的。
几何学
xwininfo -id $(xdotool getactivewindow) | \
grep '^\s*-geometry' | \
sed 's/^\s*[^ ]* \(.*\)/\1/'
# yields 110x87+900+1
好的。现在我们要检查三个值:
问题是即使这样,我们也可以轻松地拥有两个具有相同值的窗口。更重要的是;一些天才决定从应用程序的选项中删除它。
终端窗口十六进制
进一步查看代码,发现ActiveTerminal
etc. 中的十六进制值是指向当前窗口结构的内存中当前地址的指针值。如果不想破解内存映射,AKA 就不是很有用。