c++ - XQueryPointer 掩码返回值中的位代表什么键?

标签 c++ x11 xlib

在 X11 编程中,我们有时会使用 XQueryPointer 函数来确定鼠标在屏幕上的位置。

在 xlib.h 中,我们还可以看到该函数使用代表按键的各个标志填充一个名为 mask_return 的整数:

extern Bool XQueryPointer(
    Display*,
    Window,
    Window*,
    Window*,
    int*,
    int*,
    int*,
    int*,
    unsigned int*  /* mask_return */
);

我使用以下代码对此进行了试验:

Display *display = XOpenDisplay(nullptr);
int screen = DefaultScreen(display);
Window rootWin = RootWindow(display, screen);
Window qRoot;
Window qChild;
int qRootX;
int qRootY;
int qChildX;
int qChildY;
unsigned int qMask;
while(true)
{
  if(XQueryPointer(display, rootWin, &qRoot, &qChild, &qRootX, &qRootY, &qChildX, &qChildY, &qMask))
  {
    for(int i = 0; i < sizeof(int) * 8; i++)
    {
      int mask = 1 << sizeof(int) * 8 - i - 1;
      if(mask & qMask)
      {
        printf("1");
      }
      else
      {
        printf("0");
      }
    }
    printf("(%d)\n", qMask);
  }
}

使用这种方法,我已经能够分离出以下标志:

  • 0000000000000000000000000000001(1):如果在调用 XQueryPointer 时按下左移键或右移键,则此标志打开。
  • 0000000000000000000000000001000(4):如果在调用 XQueryPointer 时按下左控制键或右控制键,则此标志打开。
  • 0000000000000000000000000010000(8):如果在调用 XQueryPointer 时按下左或右 alt 键,则此标志打开。
  • 00000000000000000000001000000000(256):如果在调用 XQueryPointer 时按下 mouse1,则此标志打开。
  • 0000000000000000000010000000000(512):如果在调用 XQueryPointer 时按下 mouse3,则此标志打开。
  • 0000000000000000000100000000000(1024):如果在调用 XQueryPointer 时按下 mouse2,则此标志打开。

你会认为对于一个 30 多年的 API,这些标志的文档会广泛可用,但我似乎无法在任何地方找到它们的提及。

有谁知道剩余的标志是否/用于什么,或者我可以在哪里阅读更多关于它们的信息?

此外,我可以相信相同的标志在不同的系统上总是意味着相同的事情吗?

最佳答案

直接来自X.h:

/* Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer,
   state in various key-, mouse-, and button-related events. */

#define ShiftMask       (1<<0)
#define LockMask        (1<<1)
#define ControlMask     (1<<2)
#define Mod1Mask        (1<<3)
#define Mod2Mask        (1<<4)
#define Mod3Mask        (1<<5)
#define Mod4Mask        (1<<6)
#define Mod5Mask        (1<<7)

稍后在同一个文件中:

/* button masks.  Used in same manner as Key masks above. Not to be confused
   with button names below. */

#define Button1Mask     (1<<8)
#define Button2Mask     (1<<9)
#define Button3Mask     (1<<10)
#define Button4Mask     (1<<11)
#define Button5Mask     (1<<12)

关于c++ - XQueryPointer 掩码返回值中的位代表什么键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51469333/

相关文章:

c++ - 访问使用不同模板参数实例化的模板类的成员

c++ - 指针追逐基准 : Read+Write(+CLFLUSH) faster than Read(+CLFLUSH)

C++ 无法重新填充字符串流

创建插件管理系统

c - 如何使用Xlib逐帧显示像素来制作视频序列?

c++ - 如何在cocos2dx中绘制任意曲线

c++ - libavdevice 和 x11 的静态链接库应该以什么顺序链接?

从 Xlib 转换为 xcb

c - 如何找到两条线段(不是两条直线)是否相交

c - 我应该使用 GTK 线程/关于 GTK 线程的好教程吗?