C 如何识别gnome终端配置文件?

C 如何识别gnome终端配置文件?,c,bash,gnome-terminal,C,Bash,Gnome Terminal,不久前我发布了一个问题。由于没有行动,我也挖了一些,我将在这里尝试。可能是一个更正确的地方,(我不知道是否还有可能(我没有任何选择)) 无论如何: 有没有办法获取gnome终端配置文件ID?需要在bash脚本中使用它–例如 gconftool-2 "do some change to some value for current profile." 在我努力寻找答案的过程中,我取得了一些进展——但没有令人满意的解决方案。老实说,它真的让我很害怕,因为它是一个终端仿真器,所以应用程序无法从命令行

不久前我发布了一个问题。由于没有行动,我也挖了一些,我将在这里尝试。可能是一个更正确的地方,(我不知道是否还有可能(我没有任何选择))

无论如何:

有没有办法获取gnome终端配置文件ID?需要在bash脚本中使用它–例如

gconftool-2 "do some change to some value for current profile."
在我努力寻找答案的过程中,我取得了一些进展——但没有令人满意的解决方案。老实说,它真的让我很害怕,因为它是一个终端仿真器,所以应用程序无法从命令行进行修改!对我来说这是无法理解的

除了触及gnome终端的源代码(我不想要自定义版本)之外,还有什么合法的方法来实现这一点吗?事实上,它是vte的一个包装器,它使用各种共享库,某种我没有想到的方式,等等

在混合中添加一些C代码是可以的

到目前为止:

  • 我已经签出了“保存配置”选项,但它是1。不满意,aka 100%,和2。更重要的是,它完全失败了。更多细节请参见下面我自己的答案

  • 没有用于此的环境变量

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

  • 注入:虽然这是可能的,并且已经尝试过向其注入自定义代码,但这是一个非常容易出错的尝试,而不是一个解决方案

如果有人怀疑等。 决定再看一眼,并取得了一些进展

使用内置选项
--save config
,可以获得以下感兴趣的属性:

Role=gnome-terminal-window-2587-1856448950-1359348087
ActiveTerminal=Terminal0xa896200
Geometry=110x87+900+1
WorkingDirectory=/home/xxx/tmp
仔细看。在短时间内连续打开了两个窗口,并执行了
保存配置

角色 我们可以将其分为不同的部分:

gnome-terminal-window
2587
1856448950
1359348087
PID
2587
对两者都是一样的,经过快速的
pstree 2587-p
我们发现它是PID。此外,还有一个
echo$$
可以找到我们的bash(或者更喜欢哪个)

开始时间 第二个数字大不相同,这可能是一个随机值。最后一个数字tho只有最后一个数字,很可能是一个时间戳。我知道我在这个窗口的
tmp
目录中-因此,利用我们对以下方面的了解:

嗯。最后一位数字是“按历元开始”的时间戳。但不幸的是,它不是由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和时间是正确的

几何学 嗯。现在我们有三个值要检查:

  • 时间
  • 几何学
  • 路径

问题是,即使这样,我们也可以很容易地拥有两个值相同的窗口。更重要的是,;一些天才决定将其从应用程序的选项中删除


终端窗口十六进制 进一步查看代码1,可以发现
ActiveTerminal
等中的十六进制值是指向保存当前窗口的结构内存中当前地址的指针值。如果一个人不想破解内存映射,那么它就不是很有用

# 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);
}
xwininfo -id $(xdotool getactivewindow) | \
grep '^\s*-geometry' | \
sed 's/^\s*[^ ]* \(.*\)/\1/'

# yields 110x87+900+1