我正在尝试在X11会话中获取所有顶级桌面窗口的列表.基本上,我想获得窗口管理器应用程序切换UI中显示的所有窗口的列表(通常在用户按下ALT + TAB时打开).
我之前从未做过任何X11编程,但到目前为止,我已经设法通过整个窗口列表进行枚举,代码看起来像这样:
void CSoftwareInfoLinux::enumerateWindows(Display *display, Window rootWindow)
{
Window parent;
Window *children;
Window *child;
quint32 nNumChildren;
XTextProperty wmName;
XTextProperty wmCommand;
int status = XGetWMName(display, rootWindow, &wmName);
if (status && wmName.value && wmName.nitems)
{
int i;
char **list;
status = XmbTextPropertyToTextList(display, &wmName, &list, &i);
if (status >= Success && i && *list)
{
qDebug() << "Found window with name:" << (char*) *list;
}
status = XGetCommand(display, rootWindow, &list, &i);
if (status >= Success && i && *list)
{
qDebug() …Run Code Online (Sandbox Code Playgroud) 我有一个Python/Linux应用程序,它在GTK窗口中显示我需要的一些信息.出于本讨论的目的,它应该像Dock一样 - 存在于所有虚拟桌面上,并且最大化的窗口不会与它重叠.
第一点非常简单,但是我花了几天的时间猛烈地对着我的显示器试图获得第二点 - 防止重叠.如果另一个窗口最大化,我的应用程序不应该被覆盖.设置"永远在顶部"是不够的,因为其他窗口只是坐在我的信息栏后面而不是停在它的边缘.
简而言之:使用停靠/面板样式窗口,如何防止其他窗口在其上/下方最大化?
更新:由于vsemenov问题解决了
我在Gnome有一个窗口,我想删除它的标题栏.这在FVWM2中很简单:我只是将窗口样式设置为包含NoTitle.在Gnome中似乎没有类似的选择.
我最近学会了使用wmctrl修改符合EWMH的窗口选项,但它也没有删除标题栏的方法(我可以看到).
但是,必须有一些方法可以做到这一点,因为像Audacious这样的应用程序可以告诉Gnome不要显示窗口装饰.
谷歌搜索,我发现一些页面讨论删除标题栏的问题wmctrl,但在每种情况下,解决方案只是fullscreen在窗口,以便标题栏完全移出屏幕.(那不是我要找的!)
谢谢你的帮助.
我正在尝试使用xcb编写一个全屏应用程序用于我自己的启发,我遇到上述问题.我发现了一些使用Xlib执行此操作的代码,但没有使用xcb.我找到了xcb_ewmh_connection_t结构,我试探性地使用它:
xcb_connection_t *Connection = xcb_connect(NULL, NULL);
xcb_ewmh_connection_t EWMH;
xcb_intern_atom_cookie_t *EWMHCookie = xcb_ewmh_init_atoms(Connection, &EWMH);
Run Code Online (Sandbox Code Playgroud)
然后使用结构内部的原子EWMH._NET_WM_STATE等
鉴于这个小背景,我怎么能暗示窗口管理器窗口应该全屏?
到目前为止,我发现了两种方法:
对于每个根窗口(默认屏幕、特定屏幕、所有屏幕等),列出每个直接子窗口。递归地搜索每个直接子节点以查找具有该WM_STATE属性的窗口;该窗口成为直接子级的顶级应用程序窗口,所有递归都可以停止。如果直接子级的层次结构中没有窗口具有该WM_STATE属性,则假定直接子级本身就是顶级应用程序窗口。
使用xcb_get_property, and xcb_query_tree(尽管名称仅列出直系孩子)。
这就是xlsclients使用的,通过 XCB(与上面相同的算法,或多或少)。
要求:需要 ICCCM(窗口管理器)支持WM_STATE.
对于每个根窗口(默认屏幕、特定屏幕、所有屏幕等),获取“_NET_CLIENT_LIST”属性,该属性列出了窗口管理器管理的所有顶级应用程序窗口。
使用xcb_get_property.
这是wmctrl通过 Xlib 使用的。
需要窗口管理器来维护列表。一些窗口似乎逃脱了列表。
要求:EWMH(窗口管理器)支持_NET_CLIENT_LIST或_WIN_CLIENT_LIST(我不知道第二个是什么;我找不到任何文档)。
问题:
还有其他方法吗?是否有任何方法不依赖于外部机制,例如 ICCCM 或 EWMH?
哪种方法最有弹性?
_NET_CLIENT_LIST. 为什么是这样?WM_STATE级是顶级应用程序窗口,那么是否会匹配无窗口应用程序?更糟糕的是,它不会在虚拟根窗口下严重崩溃吗?例如,虚拟根窗口成为唯一的直接子窗口,递归将在第一个应用程序窗口上停止WM_STATE;只会匹配一个窗口。针对这种可能性,xlsclients不包括对虚拟根窗口的任何检查……那么为什么它可以与 GNOME(使用虚拟根窗口)一起使用?我在c中使用一个简单的窗口管理器libxcb,我正在尝试用标题栏,图标和最小/最大/关闭按钮来装饰窗口.
我在Xephyr测试我的wm.我可以生成一个新的xterm窗口,移动它并调整它的大小.但现在我想装饰新的xterm窗口(或任何其他应用程序),以便它有一个标题栏,图标和最小/最大/关闭按钮.
在我的Linux机器上,我刚刚安装了一个Gtk主题,如果我以Firefox为例,那么在我在我的设置中设置该主题后,窗口就会被装饰.所以在这种情况下,我认为应用窗户装饰的是Gtk.这是如何运作的?
我读到EWMH窗口属性,_NET_WM_WINDOW_TYPE可用于确定如何处理装饰窗口.所以我想我可以检查窗口类型是否是_NET_WM_WINDOW_TYPE_NORMAL,WM_NAME从应用程序中获取,然后在其上面手动绘制标题栏.
这是你应该如何正常绘制窗饰?或者我可以使用Gtk(或其他东西)吗?