我想找个办法:
我想用mutter,gdk,wnck或gtk (或GdkX11,.)来做这件事。(即任何带有客观反省的事物)。
我已经看到了以下问题:从最大化的终端窗口中删除标题栏,但我很难将它转换为有用的东西。
(我使用的语言是javascript,但这有点无关紧要,因为它都使用gobject自省)。
我目前正在使用GNOME3.2(不过,我可以使用GNOM3.4解决方案)。
至于1.我知道我可以很容易地获得wnck和mutter的所有窗口(例如Wnck.Screen.get_default().get_windows()),但是如何将这些窗口转换为G(t或d?)k窗口以删除装饰?
我可以将喃喃的窗口转换为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时),然后按照前面链接的问题尝试删除装饰,窗口(& process)就会死!我不知道这是什么错误。
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窗口文档这里),当窗口未最大化(标题栏消失)时,窗口会以我希望的方式出现,但是当标题栏最大化时,标题栏的空间仍然会留下,尽管文本本身没有显示。
有人能让我洞察到如何实现我的目标吗?(最终,自动标题栏隐藏的最大化窗口,如maximus为Ubuntu的统一上网本混音)。我确实希望使用Gtk/Gdk/wnck/mutter/任何带有gobject内省功能的应用程序,而不是像compiz这样的外部应用程序或修改元操作窗口主题的XML (我知道您可以这样做)。
发布于 2013-01-22 00:15:31
在与gnome开发人员进行了一些讨论之后,这个问题得到了解决。
我试图在1中进行的转换从来不是一种选择--这类事情不起作用。
2中的版本是正确的代码,但只有在gnome扩展之外运行时才能工作(即使用gjs二进制文件运行javascript文件,而不是使用外观玻璃或扩展名)。事实证明,在gnome/喃喃过程中乱搞这样的窗口装饰会导致崩溃。
因此,只要代码从扩展外部运行,问题就可以解决。启动外部进程以运行选项2中的脚本是有效的(尽管结果证明只生成xprop并在窗口上将_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED原子设置为true更容易(通过其XID标识,它是窗口参与者的XID的子窗口)。
(如果有人感兴趣,最终结果是极大gnome壳扩展)
https://askubuntu.com/questions/131159
复制相似问题