linux x11 window 管理器 - 阻止鼠标事件
linux x11 window manager - blocking mouse events
让我们假设一些 windows 是可见的 - 我需要实施机制来阻止选定 windows 的事件,例如当用户单击 window_nr1 中的按钮并且window_nr2 当用户单击 window_nr3 事件中的按钮时,什么也没有发生。合成 window 管理器渲染纹理和 XServer 实际的 window 位置可能不同,但这是某种解决方法,所以我们还假设 window 纹理在没有转换的情况下渲染。在 Compiz 中,XGrabPointer 用于捕获鼠标事件:
XGrabPointer (privateScreen.dpy, privateScreen.eventManager.getGrabWindow(), true,
ButtonReleaseMask | ButtonPressMask | PointerMotionMask ,
GrabModeAsync, GrabModeAsync, privateScreen.rootWindow(),
cursor, CurrentTime);
grab window 的创建如下所示:
grabWindow = XCreateWindow (dpy, root, -100, -100, 1, 1, 0,
CopyFromParent, InputOnly, CopyFromParent,
CWOverrideRedirect | CWEventMask,
attrib);
在那种情况下,整个屏幕的鼠标事件都被捕获(即仅重定向到 window 管理器事件循环),看起来 XGrabPointer 不能用于捕获特定鼠标事件window.
您对如何实施这种机制有一些想法吗?
抓住鼠标指针并将事件传递到目的地window。
让我们假设一些 windows 是可见的 - 我需要实施机制来阻止选定 windows 的事件,例如当用户单击 window_nr1 中的按钮并且window_nr2 当用户单击 window_nr3 事件中的按钮时,什么也没有发生。合成 window 管理器渲染纹理和 XServer 实际的 window 位置可能不同,但这是某种解决方法,所以我们还假设 window 纹理在没有转换的情况下渲染。在 Compiz 中,XGrabPointer 用于捕获鼠标事件:
XGrabPointer (privateScreen.dpy, privateScreen.eventManager.getGrabWindow(), true,
ButtonReleaseMask | ButtonPressMask | PointerMotionMask ,
GrabModeAsync, GrabModeAsync, privateScreen.rootWindow(),
cursor, CurrentTime);
grab window 的创建如下所示:
grabWindow = XCreateWindow (dpy, root, -100, -100, 1, 1, 0,
CopyFromParent, InputOnly, CopyFromParent,
CWOverrideRedirect | CWEventMask,
attrib);
在那种情况下,整个屏幕的鼠标事件都被捕获(即仅重定向到 window 管理器事件循环),看起来 XGrabPointer 不能用于捕获特定鼠标事件window.
您对如何实施这种机制有一些想法吗?
抓住鼠标指针并将事件传递到目的地window。