0

我正在用 C++ (Linux,XWindow) 编写一个程序,它应该修改活动窗口的标题。更具体地说,将某些文本附加到它。

是否可以获得活动窗口的窗口句柄(即使它与该程序无关)以在 XFetchName 和 XStoreName 中使用它?或者,也许还有其他方法可以修改某个窗口的标题?

谢谢你。

更新1:

我用了

     xprop -root | grep ^_NET_ACTIVE_WINDOW | cut -c41-49

它返回正确的句柄。谢谢你的建议。这是我之前用的

xdpyinfo | grep focus: | cut -c16-24

看起来它返回的数字比实际句柄大 1。

现在出现了一个新问题。似乎 XStoreName 修改了 WM_NAME。我有 Unity 桌面,它似乎改为读取 _NET_WM_NAME。我怎样才能修改这个呢?

更新2:找到答案

Atom Atom_name = XInternAtom(xdisplay,"_NET_WM_NAME",false);
Atom Atom_utf_type = XInternAtom(xdisplay,"UTF8_STRING",false);

XChangeProperty(xdisplay,window_handle,Atom_name,Atom_utf_type,8,PropModeReplace,(unsigned char*)new_name,strlen(new_name));

现在似乎工作正常

4

1 回答 1

1

使用外来的、不相关的窗口没有任何限制,因此XFetchName并且XStoreName会起作用(即它们将访问WM_NAME属性,这可能会产生预期的效果……或不会)。

至于确定当前窗口,你可以从这里的代码示例开始: 如何知道哪个窗口有焦点以及如何改变它?注意不被接受的答案:根窗口的属性(当 wm 设置它时)是您可以获得的当前_NET_ACTIVE_WINDOW窗口最合理的值。

请注意,有_NET_WM_NAMEtype 的属性,UTF8_STRING现代窗口管理器可能会优先使用WM_NAME它们,而不是同时设置它们。并非所有应用程序都设置它(在我当前的桌面上,我看到 firefox 可以,xterm 没有)。_NET_WM_NAME如果你想修改标题,你也应该准备好修改。

当然,应用程序可以随时决定重置其标题。XPropertyNotify如果您想注意到它并更新标题,您可以订阅事件。确保为可能执行相同操作的应用程序提供一些解决方法(即XPropertyNotify进行标题更新并将其重置为他们想要的内容)。

于 2013-02-07T19:58:35.587 回答