问题标签 [ewmh]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
651 浏览

c - 在没有 EWMH 的情况下通过 X11 获取 WM 名称?

我正在编写一个程序,它需要在运行 X11 的 Linux 主机上检测正在运行的窗口管理器的名称(例如 Compiz)。

我目前依赖于扩展窗口管理器提示规范,它允许我查询_NET_SUPPORTING_WM_CHECKXGetWindowProperty获取 a 的 ID,Window然后我可以查询(通过另一个调用XGetWindowProperty_NET_WM_NAME属性:

这对于符合 EWMH 的窗口管理器非常有效,但对于不符合 EWMH 的窗口管理器根本不起作用。我尝试过获取这些WM_NAME属性,但它只包含活动窗口的标题(或与标题相关的内容)。

有没有什么方法可以在没有EWMH的情况下通过 X11 获取窗口管理器的实际名称?

0 投票
0 回答
320 浏览

qt - 以与 WM 无关的方式操作 X11 窗口菜单

基于 Motif 的窗口管理器 ( Mwm, Dtwm, 4Dwm, 5Dwm) 允许将自定义菜单项(带有相应的回调)添加到应用程序的窗口菜单中(参见屏幕截图,此处提供要点)。应用程序本身也需要链接-lXm(至少对于XmAddProtocols()并且XmAddProtocolCallback()可用)。

mwm 自定义窗口菜单

X Window的角度来看,这是通过客户端设置的几个额外Atom的 s 来实现的:

显然,任何现代EWMH兼容的窗口管理器都不支持此行为。此外,EWMH 规范似乎没有提供任何替代方案。

是否有任何非 Motif 跨 WM 方式来操作窗口菜单(GTKQtXlib)?

0 投票
0 回答
1252 浏览

window - X11:列出顶层窗口

到目前为止,我找到了两种方法:

  1. 对于每个根窗口(默认屏幕、特定屏幕、所有屏幕等),列出每个直接子窗口。递归地搜索每个直接子节点以查找具有该WM_STATE属性的窗口;该窗口成为直接子级的顶级应用程序窗口,并且所有递归都可以停止。如果直接子级的层次结构中没有窗口具有该WM_STATE属性,则假定直接子级本身就是顶级应用程序窗口。

    • 使用xcb_get_property, and xcb_query_tree(尽管名称仅列出直系子级)。

    • 这就是xlsclients通过 XCB 使用的(与上面相同的算法,或多或少)。

    • 要求:需要 ICCCM(窗口管理器)支持WM_STATE

  2. 对于每个根窗口(默认屏幕、特定屏幕、所有屏幕等),获取“_NET_CLIENT_LIST”属性,该属性列出了由窗口管理器管理的所有顶级应用程序窗口。

    • 使用xcb_get_property.

    • 这就是wmctrl通过 Xlib 使用的。

    • 需要窗口管理器来维护列表。一些窗口似乎逃脱了列表

    • 要求:EWMH(窗口管理器)支持_NET_CLIENT_LIST_WIN_CLIENT_LIST(我不知道第二个是什么;我找不到任何文档)。

问题:

  1. 还有其他方法吗?是否有任何不依赖于外部机制(如 ICCCM 或 EWMH)的方法?

  2. 哪种方法最有弹性?

    1. EWMH。我发现了一些报告(上面链接),某些应用程序没有在_NET_CLIENT_LIST. 为什么是这样?
    2. 国际商会。WM_STATE这种方法似乎更灵活,但是如果假设缺少的层次结构的直接子级是顶级应用程序窗口,则不会匹配其他无窗口应用程序吗?更糟糕的是,它不会在虚拟根窗口下严重崩溃吗?例如,虚拟根窗口成为唯一的直接子窗口,递归将在第一个应用程序窗口上停止,使用WM_STATE; 只会匹配一个窗口。针对这种可能性,xlsclients不包括对虚拟根窗口的任何检查......那么为什么它与 GNOME(使用虚拟根窗口)一起工作?
0 投票
1 回答
979 浏览

c - 如何使用 XCB 绘制标题栏

我正在用 c 开发一个简单的窗口管理器,libxcb我正在尝试用标题栏、图标和最小/最大/关闭按钮来装饰一个窗口。

我在 Xephyr 中测试我的 wm。我可以生成一个新的 xterm 窗口,移动它并调整它的大小。但现在我想装饰新的 xterm 窗口(或任何其他应用程序),使其具有标题栏、图标和最小/最大/关闭按钮。

在我的 Linux 机器上,我刚刚安装了一个 Gtk 主题,例如,如果我启动 Firefox,在我在设置中设置该主题后,窗口就会被装饰。所以在那种情况下,我认为是 Gtk 应用了窗户装饰。这是如何运作的?

我读到 EWMH 窗口属性,_NET_WM_WINDOW_TYPE可用于确定如何处理装饰您的窗口。所以我想我可以检查窗口类型是否为_NET_WM_WINDOW_TYPE_NORMALWM_NAME从应用程序中获取,然后在其顶部手动绘制一个标题栏。

这是您正常绘制窗户装饰的方式吗?或者我可以为此使用 Gtk(或其他东西)吗?

0 投票
2 回答
1735 浏览

c++ - 使用 XCB 获取活动窗口的 WId

使用 XCB 获取活动窗口(具有输入焦点的窗口)的正确方法是什么?

这似乎有时有效,有时无效。

我还看到有人提到查询 _NET_ACTIVE_WINDOW 根窗口属性,但我不知道这是如何完成的,XCB 是否总是支持它?

编辑: 上面使用xcb_get_input_focus的方法只是其中的一部分,在得到reply->focus之后,你需要通过xcb_query_tree跟进父窗口。

0 投票
1 回答
181 浏览

x11 - 如何控制 X11 应用级窗口堆叠?

有没有办法在 X11 中有 2 个窗口,具有以下条件:

  • 第二个窗口始终位于第一个窗口之上
  • 第二个窗口不会停留在其他应用程序的窗口之上
  • 切换窗口时不闪烁
  • 两个窗口都需要是顶级窗口(不是彼此下的父级)并且不阻塞

制作第二个模态几乎可以工作,但它会阻止第一个模态,这是不希望的。

0 投票
1 回答
219 浏览

x11 - X11 客户端设置 _NET_WM_STATE_DEMANDS_ATTENTION 时未收到事件

我正在为 X11 桌面构建一个任务栏,到目前为止,我已经成功地检测到新的和删除的窗口以及对窗口标题和图标的更改。

_NET_WM_STATE_DEMANDS_ATTENTION然而,尽管在客户端窗口上设置了我能想到的每个事件掩码,但当测试应用程序将原子添加到其_NET_WM_STATE属性时,我无法获得任何事件。

我正在使用 Qt5 并使用installNativeEventFilter. 但是,我也尝试过使用xprop -spy,在那里我看到了同样的问题:即使轮询_NET_WM_STATE属性显示正在添加和删除原子,也没有收到任何属性更改事件。Fluxbox 似乎也没有注意到它,直到有其他东西导致它重新查询窗口。

我的事件过滤器代码类似于:

我的测试应用程序使用QApplication::alert()计时器来声明注意标志。

原子列表属性是否需要一些特殊处理?我注定要轮询变化吗?我已经尝试查看其他窗口管理器的源代码,但我无法确定任何具体差异。

0 投票
1 回答
151 浏览

c - 如何使用 xcb 监控活动窗口的变化?

我试图找到一种方法来监视_NET_ACTIVE_WINDOW属性何时发生变化。现在我每 1 秒轮询一次以更新当前活动窗口。我知道有一种方法可以获取有关此的事件,我已经看到了对它的引用,但我似乎找不到任何代码(我可以理解)来解释如何做到这一点。

0 投票
1 回答
419 浏览

python - 我可以在 openbox 中使用 _NET_WM_WINDOW_TYPE_DOCK EWHM 扩展吗?

Openbox在这里被声明为符合 EWMH 标准。我想使用这个合规层来实现一个无装饰的窗口,正如这个问题的最佳答案所建议的那样。

因此,我正在尝试使用 python 和 Xlib 构建一个简单的窗口,该窗口使用 _NET_WM_WINDOW_TYPE_DOCK 类型提示来摆脱窗口装饰。但是该过程失败并显示以下代码:

窗户出现了,但仍然有装饰品。最后两个打印语句都返回434,所以我猜这个窗口确实有一个有效的 EWMH window_type。所以问题是双重的:

  • 我的代码是否适用于此目的?

  • openbox 应该画一个无装饰的窗口吗?(为什么不呢?)

0 投票
1 回答
108 浏览

rust - 自定义窗口管理器:一些 GTK+ 3 窗口接收焦点但不接受鼠标点击

正如标题所说。我正在使用xcb库在 Rust 中编写自定义 X11 窗口管理器。一个特定的窗口——“配置”窗口cairo-dock——在聚焦时不会点击按钮 1,尽管在该窗口上取消了按钮 1。

以前,我认为所说的窗口没有保持焦点,但事实证明这是不正确的。相反,有问题的窗口正在接收焦点,但不允许单击任何按钮 1。


设置焦点的相关代码: