2015-05-14 69 views
1

让我们假设几个窗口是可见的 - 我需要实现机制来阻止选定窗口的事件,例如当用户单击window_nr1和window_nr2中的按钮时什么也没有发生,但是当用户单击window_nr3事件处理中的按钮。合成窗口管理器渲染纹理和XServer实际的窗口位置可能不同,但这是一种解决方法,因此我们还假定窗口纹理在不进行转换的情况下呈现。在Compiz的XGrabPointer是用来捕获鼠标事件:linux x11窗口管理器 - 阻止鼠标事件

XGrabPointer (privateScreen.dpy, privateScreen.eventManager.getGrabWindow(), true, 
       ButtonReleaseMask | ButtonPressMask | PointerMotionMask , 
       GrabModeAsync, GrabModeAsync, privateScreen.rootWindow(), 
       cursor, CurrentTime); 

那里抢窗口的创建是这样的:

grabWindow = XCreateWindow (dpy, root, -100, -100, 1, 1, 0, 
          CopyFromParent, InputOnly, CopyFromParent, 
          CWOverrideRedirect | CWEventMask, 
          attrib); 

在这种情况下,鼠标事件被捕获(即只重定向到一个窗口管理器事件循环),看起来像XGrabPointer不能用于特定窗口的捕获鼠标事件。

你有一些想法如何实现这样的机制?

回答

2

抓住鼠标指针并将事件传递到目标窗口。

+0

你的意思是XSendEvent?我知道Windows参数,所以我可以重新发送鼠标事件,只有窗口是不被阻止,但我不知道它是否不会引入一些滞后... – Irbis

+1

@Irbis:是的XSendEvent。是的,如果你的WM不在X11服务器的同一台机器上运行,那么可能会引入一个明显的滞后。但是,如果WM和X11服务器在同一台计算机上,则延迟时间应低于1毫秒(如果WM有效写入,则只需几个10μs左右)。 – datenwolf