Xlib。框架响应发送到客户端窗口的输入

Xlib。框架响应发送到客户端窗口的输入

我正在使用以下内容创建一个框架:

frame = XCreateSimpleWindow(display, root, x_window_attributes.x, x_window_attributes.y, x_window_attributes.width, x_window_attributes.height + window_bar_height, border_width, border_color, background_color);
XSelectInput(display, frame, SubstructureRedirectMask | SubstructureNotifyMask);
XAddToSaveSet(display, window);
XReparentWindow(display, window, frame, 0, 20);
XMapWindow(display, frame);

//Map events
XGrabButton(display, Button1, 0, frame, false, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);
XGrabButton(display, Button1, 0, frame, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None);
XGrabButton(display, Button3, 0, frame, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None);

理想情况下,映射的事件仅在用户直接与框架交互时才起作用。但是,当用户与客户端窗口交互时它们也可以工作。换句话说,我不必拖动框架,而是可以拖动到任何地方,并且它仍然会移动/调整窗口大小。

我怎样才能将其仅限于框架。我认为也许 SubtstructRedirectMask 是造成此问题的原因,但删除它后我遇到了同样的问题。

任何帮助都是appriced!

答案1

这个问题是由于我完全缺乏对 Xlib 中的掩码和输入处理的了解而产生的。我必须通过太多的尝试和错误来学习这一点,此时我可能会开始留颈胡子。对于那些同样在苦苦挣扎和希望保持胡子干净的人来说,以下是答案:

现在不用担心掩码(例如SubtstructureRedirectMask),只需知道它需要接收输入即可。

至于框架,我最初的计划是创建一个与客户端窗口大小相同的框架再加上一些,然后对其进行偏移。例如,如果客户端窗口高 800 像素,我会将框架设置为 820 像素高,将客户端窗口偏移 20 像素,并使用顶部 20 像素作为标题栏。我希望客户端窗口能够阻止对框架其余部分的输入,并且只有暴露的顶部 20px 会对其做出响应*。然而事实并非如此。输入直接穿过**客户端窗口,整个框架(标题栏区域和客户端窗口区域)都会对其做出响应。

为了避免这个问题,在检查了代码并与其他窗口管理器进行测试后,我决定创建一个单独的标题栏窗口。现在我有window,它代表客户端窗口,frame,它代表框架(需要它作为父级),以及titlebar,它代表标题栏。

我之前的代码已替换为:

XGrabButton(display, Button1, 0, titlebar, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None);
XGrabButton(display, Button3, 0, titlebar, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None);

因此,现在只有titlebar位于 上方的window关心用于移动它的输入。为了调整框架和客户端窗口的大小和移动,我做了一些简单的数学计算来补偿一切。

相关内容