X11鼠标移动事件

7
创建XLib中的窗口时,
  1. 我需要提供什么掩码来设置SetWindowAttributes.event_mask成员?
  2. 我需要传递什么参数到XCreateWindow()的第11个参数?
  3. 在主消息循环中,我正在寻找哪些事件(我在其中使用XNextEvent(lDisplay, &xEvent);?)
  4. 由于X与微软的Win32 API行为不同,如何确定鼠标是否在我的窗口或我的“应用程序”中的窗口上,而不是在桌面上?

我已经搜索了类似的帖子。如果已经有一个,请指引我正确的方向。


更新

对于那些想要简单回答前三个问题的人:

1.

xAttributes.event_mask =  ExposureMask | KeyPressMask | ButtonPress |
                          StructureNotifyMask | ButtonReleaseMask |
                          KeyReleaseMask | EnterWindowMask | LeaveWindowMask |
                          PointerMotionMask | Button1MotionMask | VisibilityChangeMask |
                          ColormapChangeMask;

2.

unsigned long valuemask = CWEventMask | CWBackPixel | CWBorderPixel | CWCursor;


这段代码定义了一个无符号长整型变量valuemask,并将它赋值为CWEventMask、CWBackPixel、CWBorderPixel和CWCursor的按位或操作结果。
  1.                 switch (xEvent.type)
                    {
                    case MapNotify:
                        break;
                    case Expose:
                        // If this is not the last expose event break
                        if (xEvent.xexpose.count != 0)
                            break;
                        else
                            break;
                    case ConfigureNotify:
                        break;
                    case VisibilityNotify:
                        break;
                    case DestroyNotify:
                        break;
                    case ButtonPress:
                    case ButtonRelease:
                    case EnterNotify:
                    case MotionNotify:
                    case LeaveNotify:
                        if(_mouseHandler)
                            _mouseHandler->HandleInput(lDisplay, &xEvent);
                        break;
                    case KeyPress:
                    case KeyRelease:
                        if(_keyboardHandler)
                            _keyboardHandler->HandleInput(lDisplay, &xEvent);
                        break;
                    default:
                        if(_keyboardHandler)
                            _keyboardHandler->HandleInput(lDisplay, &xEvent);
                        break;
                    }
    

1
XLib 文档非常完备。你尝试过在互联网上搜索吗?例如 XLib 编程手册:事件掩码 - Jim Garrison
2个回答

4

只是想让您知道 - 那个链接现在已经失效了。 - NmdMystery
不再是了。 - striking

2

前三个问题我认为已经有详细记录了。

要确定鼠标是否在您的窗口上方,请侦听Enter和Leave事件。使用xev工具可以很好地了解X窗口系统中存在哪些事件以及它们何时被发送。


我完全忘记了 xev,确实非常有用。 - erb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接