gpt4 book ai didi

c++ - 许多 XSetInputFocus 和 XSync 导致错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:30 25 4
gpt4 key购买 nike

将输入焦点切换到具有匹配进程 ID 的每个窗口后,关闭显示(或同步显示)时出现错误。下面是我收到的错误以及产生它的源代码。

源代码:

#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <iostream>
#include <list>

using namespace std;

class WindowsMatchingPid{
public:
WindowsMatchingPid(Display *display, Window wRoot, unsigned long pid)
: _display(display)
, _pid(pid)
{
// Get the PID property atom.
_atomPID = XInternAtom(display, "_NET_WM_PID", True);
if(_atomPID == None)
{
cout << "No such atom" << endl;
return;
}

search(wRoot);
}

const list<Window> &result() const { return _result; }

private:
unsigned long _pid;
Atom _atomPID;
Display *_display;
list<Window> _result;

void search(Window w)
{
// Get the PID for the current Window.
Atom type;
int format;
unsigned long nItems;
unsigned long bytesAfter;
unsigned char *propPID = 0;
if(Success == XGetWindowProperty(_display, w, _atomPID, 0, 1, False, XA_CARDINAL,
&type, &format, &nItems, &bytesAfter, &propPID))
{
if(propPID != 0)
{
// If the PID matches, add this window to the result set.
if(_pid == *((unsigned long *)propPID))
_result.push_back(w);

XFree(propPID);
}
}

// Recurse into child windows.
Window wRoot;
Window wParent;
Window *wChild;
unsigned nChildren;
if(0 != XQueryTree(_display, w, &wRoot, &wParent, &wChild, &nChildren))
{
for(unsigned i = 0; i < nChildren; i++)
search(wChild[i]);
}
}
};

main()
{
// Obtain the X11 display.
Display *display = XOpenDisplay(0);
if(display == NULL)
return -1;

// Get the root window for the current display.
Window winRoot = XDefaultRootWindow(display);

WindowsMatchingPid wmp(display,winRoot,4344);
list<Window> lw = wmp.result();

for(list<Window>::iterator it=lw.begin(); it != lw.end(); it++ ){
XSetInputFocus(display,*it,RevertToParent,CurrentTime);
}
//XSync(display,false);
XCloseDisplay(display);
return 0;
}

错误:

X Error of failed request:  BadMatch (invalid parameter attributes)
Major opcode of failed request: 42 (X_SetInputFocus)
Serial number of failed request: 495
Current serial number in output stream: 506

它在到达 XSyncXCloseDisplay 时产生错误。当我删除这两个调用时,它不会产生这些错误。我不确定我在这里做错了什么会导致 XSyncXCloseDisplay 提示。

最佳答案

从文档中,它声明如下:

The specified focus window must be viewable at the time XSetInputFocus is called, or a BadMatch error results. If the focus window later becomes not viewable, the X server evaluates the revert_to argument to determine the new focus window as follows:

  • If revert_to is RevertToParent, the focus reverts to the parent (or the closest viewable ancestor), and the new revert_to value is taken to be RevertToNone.

  • If revert_to is RevertToPointerRoot or RevertToNone, the focus reverts to PointerRoot or None, respectively. When the focus reverts, the X server generates FocusIn and FocusOut events, but the last-focus-change time is not affected.

XSetInputFocus can generate BadMatch, BadValue, and BadWindow errors.

因此,我错过了确定窗口是否可见的检查。以下更改将解决此问题:

main()
{
// Obtain the X11 display.
Display *display = XOpenDisplay(0);
if(display == NULL)
return -1;

// Get the root window for the current display.
Window winRoot = XDefaultRootWindow(display);

WindowsMatchingPid wmp(display,winRoot,4344);
list<Window> lw = wmp.result();

for(list<Window>::iterator it=lw.begin(); it != lw.end(); it++ ){
XWindowAttributes attribute; // <-- Added
XGetWindowAttributes(display,*it,&attribute); // <-- Added
if(attribute.map_state == IsViewable ){ // <-- Added
XSetInputFocus(display,*it,RevertToParent,CurrentTime);
} // <-- Added
}
XCloseDisplay(display);
return 0;
}

关于c++ - 许多 XSetInputFocus 和 XSync 导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16720961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com