如何识别gnome-terminal配置文件?

时间:2013-01-28 05:48:57

标签: c bash gnome-terminal

前一段时间我在askubuntu发布了一个问题。因为没有动作,而且我还挖了一些,我会在这里试试。可能是一个更正确的地方,(我不知道是否有可能再move questions(我没有得到任何这些选项)。)

总之:

有没有办法获取gnome-terminal个人资料ID?在bash脚本中需要它 - 例如 -

gconftool-2 "do some change to some value for current profile."

在我努力回答这个问题时,我取得了一些进展 - 但没有令人满意的解决方案。说实话,这真的让我感到害怕应用程序屏蔽了如何从命令行进行修改作为终端模拟器!对我来说这是不可理解的。

除了触摸gnome-terminal的源代码(我不是一个自定义版本),是否有一些合法的方式来获取它?事实上,它是vte的包装器,它使用了各种共享库,这是我没想过的,等等。

在混合中添加一些C代码就可以了。

到目前为止:

  • 我已经查看了“save-config”选项,但因为它是1.不满意,又名100%,2更重要的是是{{3}它彻底失败了。有关更多详细信息,请参阅下面的答案。

  • 此处没有环境变量。

  • dbus:似乎没有传输任何消息或任何可用于此类信息的功能。测试了当前(3.6.0)版本和最新版本。

  • 注射:很可能,并且已经为它注入了自定义代码,这是一个容易出错的尝试,它不是解决方案。

1 个答案:

答案 0 :(得分:2)

如果有人想到等等。

决定再看看这个 - 并取得了一些进展。

使用内置选项--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(或者更喜欢的)。

开始时间

现在第二个数字非常不同,给出一个线索,它可能是一个随机值。最后一个,只有差异中的最后一个数字。最有可能是时间戳。我知道我在这个窗口的tmp目录中 - 所以,通过使用我们对proc file system的了解:

# 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等中的十六进制值是指向保存当前窗口的结构的内存中的当前地址的指针值。如果不想破解内存映射,AKA不是很有用。