【问题标题】:X11, how to detect I’m the last window/application on the displayX11,如何检测我是显示屏上的最后一个窗口/应用程序
【发布时间】:2010-04-26 14:30:17
【问题描述】:

我有一个带有窗口管理器的 x11 显示器(遗憾的是不是一个特定的显示器,可能是 twm、dtwm、mwm、metacity ...)、myApp 和其他带有窗口的应用程序。如果其他应用程序已关闭并且 myApp 是唯一一个在显示屏上带有窗口的应用程序,我想关闭显示屏。我确实知道 myApp 的窗口,但是如何区分 windowmanger 的窗口和其他应用程序的窗口。

我目前正在使用 xwininfo -tree -root -children 进行轮询,并将其与我的预期进行比较,但这仅适用于“定义明确”的环境。

上面提到的windowmanager好像很多都不支持EWMH。

【问题讨论】:

    标签: x11 xlib icccm


    【解决方案1】:

    不会有一种完全不老套的方法。

    ICCCM 建议通过查找 WM_STATE 属性来识别顶级窗口(尤其是与 WM 框架相反)。所以你可以用它来区分应用程序窗口。但是,当 WM 将窗口重新设置为框架时,要在框架窗口内找到应用程序窗口会变得很棘手。您必须实现一个小程序来执行 xwininfo -tree 之类的操作,但只检查设置了 WM_STATE 的窗口。

    一个相对不错的解决方案是使用 libwnck,或基于它的工具之一(wmctrl,devil's pie)。然而,这需要一个 EWMH 窗口管理器(它包括任何远程现代或理智的东西,但听起来你正在处理一些非常古老的粗俗的东西)。 这些工具的优势在于它们使用 EWMH 来识别应用程序窗口,甚至是那些应用程序窗口(对话框等)的语义类型。

    另外,libwnck 不需要轮询,它可以只监视顶层窗口列表中的变化。

    【讨论】:

    • 感谢您的回答。我以为会是这样,但希望可以有一些魔法/巫术来帮助我。我最终得到了一个可编辑的允许/默认窗口列表(“mwm,metacity ...”)。 xwininfo 部分将替换为单独的自定义 c 模块(仍在轮询)。不好,但工作和适应性强。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多