gpt4 book ai didi

c++ - 处理 Xlib/Xt 中的 "new top level window"事件

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:00 33 4
gpt4 key购买 nike

因此,我需要知道何时创建顶级窗口。我在 Xlib/Xt 级别和不支持 EWMH 规范的窗口管理器上工作。我的想法是挂接到根窗口的 SubstructureNotify 事件。但事情并没有这么简单。

问题是并非每个 CreateNotify 事件都对应于 [b]顶级 [/b] 窗口的创建。所以我认为我需要做的是以某种方式测试我从事件中获得的窗口,以确认它是顶级窗口。我已经接近了,但一些虚假的窗口仍然通过我的网络。例如,在 GTK 应用程序中,如果您有一个下拉框并单击它,则会创建一个新窗口,我不知道如何捕捉和忽略它。这样的窗口很难与典型的顶级应用程序窗口区分开来。

这是我目前所拥有的:

// I am omiting (tons of) cleanup code and where I set the display and toplevel variables.

Display* display;
Widget toplevel;

bool has_name(Window window)
{
XTextProperty data = XTextProperty ();
return (!XGetWMName (display, window, &data));
}

bool has_client_leader(Window window)
{
unsigned long nitems = 0;
unsigned char* data = 0;
Atom actual_type;
int actual_format;
unsigned long bytes;
// WM_CLIENT_LEADER is an interned Atom for the WM_CLIENT_LEADER property
int status = XGetWindowProperty (display, window, WM_CLIENT_LEADER, 0L, (~0L), False,
AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes, &data);
if (status != Success || acutal_type == None) return false;
Window* leader = reinterpret_cast<Window*> (data);
return (*leader != 0);
}

bool has_class(Window window)
{
XClassHint data = XClassHint ();
return (!GetClassHint (display, window, &data));
}

void handle_event(Widget widget, XtPointer, XEvent* event, Boolean*)
{
if (event->type != CreateNotify) return;

Window w = event->xcreatewindow.window;

// confirm window has a name
if (!has_name (w)) return;

// confirm window is a client window
Window client = XmuClientWindow (display, w);
if (!client || client != w) return;

// confirm window has a client leader that is not 0x0
if (!has_client_leader (client)) return;

// confirm window has a class
if (!has_class (client)) return;

// The window has passed all our checks!
// Go on to do stuff with the window ...
}

int main(int argc, char* argv[])
{
// ...

// Setting up the event handler for SubstructureNotify on root window
Window root_window = XDefaultRootWindow (display);
Widget dummy = XtCreateWidget ("dummy", coreWidgetClass, toplevel, 0, 0);
XtRegisterDrawable (display, root_window, dummy);
XSelectInput (display, root_window, SubstructureNotifyMask);
XtAddRawEventHandler (dummy, SubstructureNotifyMask, False, handle_event, 0);

// ...
}

不太可能,但有人有什么想法可以让我尝试吗?我想不出我还能在这里做什么。

最佳答案

我假设您熟悉 ICCCM及其 long-winded discussion .

您检查过 WM_TRANSIENT_FOR 属性了吗?

关于c++ - 处理 Xlib/Xt 中的 "new top level window"事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/736345/

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