使用 mutter、gdk、wnck 或 gtk 在 gnome-shell 中隐藏窗口标题

使用 mutter、gdk、wnck 或 gtk 在 gnome-shell 中隐藏窗口标题

我正在寻找一种方法来:

  1. 获取当前打开的所有应用程序窗口列表,作为 Gdk 或 Gtk 窗口
  2. 删除选定窗口的窗口装饰(在我的情况下是最大化)。

我想使用 mutter、gdk、wnck 或 gtk(或 GdkX11,...)(即任何具有 gobject 自省功能的东西)来做到这一点。

我见过以下问题:从最大化终端窗口删除标题栏但正在努力将其转换成可以工作的东西。

(我使用的语言是 javascript,但是这有点不相关,因为它都使用 gobject 自省)。

我目前正在使用 GNOME 3.2(尽管我也接受 GNOME 3.4 解决方案)。


至于1.wnck,我知道我可以相当轻松地获得所有带有和的窗口mutter(例如Wnck.Screen.get_default().get_windows()),但我如何将它们转换为 G(t 或 d?)k 窗口以删除装饰?

我可以将 mutter 窗口转换为 Gdk 窗口,如下所示:

xwin = GdkX11.X11Window.foreign_new_for_display( 
                          Gdk.Display.get_default(), 
                          mutterWindow.get_compositor_private()['x-window'] );

然而,这个xwin对象不响应诸如xwin.unmaximize()和之类的命令xwin.maximize(),所以我觉得转换时出了点问题!

我想将窗口转换为 Gdk 或 Gtk 的原因是我可以使用 Gdk 的set_decorations或者 Gtk 的set_hide_titlebar_when_maximized

我已经查看过Gdk.Screen.get_default().get_toplevel_windows()Gtk.Window.list_toplevels()但是这些返回的列表比我打开的窗口还多,而且我不确定我的实际应用程序窗口是否在列表中以及如何匹配它们。


至于2.,如果我首先从 Gdk 中获取活动窗口(因为我知道它是一个 Gdk 窗口,并且它正确响应诸如unmaximize和之类的事件maximize,而不像我使用时那样foreign_new_for_display),然后尝试按照先前链接的问题删除装饰,则窗口(和进程)会死掉!我不确定错误是什么。

const Gdk = imports.gi.Gdk;

// get current window. It's a terminal, not null.
// For now assume it's maximized.
curwin = Gdk.Screen.get_default().get_active_window();
// decorations don't seem to updated unless I unmaximize & re-maximize
curwin.unmaximize();
// try remove decorations: window + process dies!
curwin.set_decorations(0);
curwin.maximize();

如果我使用curwin.set_decorations(Gdk.WMDecoration.BORDER)(注意:GDK 窗口文档这里),当窗口未最大化时(标题栏消失),窗口按我希望的方式显示,但当窗口最大化时,仍然留有标题栏的空间,尽管文本本身并未显示。


有谁能告诉我如何实现我的目标吗?(最终,最大化窗口的标题栏自动隐藏,就像maximusUbuntu 的 Unity netbook remix 一样)。我真的希望使用 Gtk/Gdk/wnck/mutter/anything 和 gobject 内省来实现这一点,而不是使用 compiz 等外部应用程序或修改 metacity 窗口主题的 XML(我知道你可以这样做来实现这一点)。

答案1

经过与 gnome-shell 开发人员的一番讨论,这个问题得到了解决。

我在 1. 中尝试进行的转换从来都不是一个选项 —— 那种事情不起作用。

2. 中的版本是正确的代码,但只有从以下位置运行时才有效:外部gnome-shell 扩展(即使用二进制gjs文件而不是从 looking glass 或扩展中运行 javascript 文件)。事实证明,在 gnome-shell/mutter 进程中乱搞窗口装饰会导致崩溃。

因此,只要运行代码,就可以解决问题外部扩展。启动外部进程来运行选项 2 中的脚本)有效(尽管事实证明,在窗口上生成xprop并设置_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED原子更容易(由其 X ID 标识,即true孩子窗口的 ID(以及窗口参与者的 XID)。

(如果有人感兴趣的话,最终的结果是Maximus gnome shell 扩展

相关内容