XQueryPointer 的 mask_return 值中的位代表什么键?
What keys do the bits in the XQueryPointer's mask_return values represent?
在 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);
}
}
使用这种方法,我已经能够分离出以下标志:
- 00000000000000000000000000000001(1):如果在调用 XQueryPointer 时按下左移键或右移键,则此标志打开。
- 00000000000000000000000000001000(4):如果在调用 XQueryPointer 时按下左控制键或右控制键,则此标志打开。
- 00000000000000000000000000010000(8):如果在调用 XQueryPointer 时按下左或右 alt 键,则此标志打开。
- 00000000000000000000001000000000(256):如果在调用 XQueryPointer 时按下 mouse1,则此标志打开。
- 00000000000000000000010000000000(512):如果在调用 XQueryPointer 时按下 mouse3,则此标志打开。
- 00000000000000000000100000000000(1024):如果在调用 XQueryPointer 时按下 mouse2,则此标志打开。
对于一个 30 多岁的人来说,API 您可能会认为这些标志的文档随处可见,但我似乎无法在任何地方找到它们。
有人知道 if/what 剩余的标志用于或我可以在哪里阅读更多关于它们的信息吗?
此外,我可以相信相同的标志在不同的系统上总是意味着相同的东西吗?
直接来自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)
在 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);
}
}
使用这种方法,我已经能够分离出以下标志:
- 00000000000000000000000000000001(1):如果在调用 XQueryPointer 时按下左移键或右移键,则此标志打开。
- 00000000000000000000000000001000(4):如果在调用 XQueryPointer 时按下左控制键或右控制键,则此标志打开。
- 00000000000000000000000000010000(8):如果在调用 XQueryPointer 时按下左或右 alt 键,则此标志打开。
- 00000000000000000000001000000000(256):如果在调用 XQueryPointer 时按下 mouse1,则此标志打开。
- 00000000000000000000010000000000(512):如果在调用 XQueryPointer 时按下 mouse3,则此标志打开。
- 00000000000000000000100000000000(1024):如果在调用 XQueryPointer 时按下 mouse2,则此标志打开。
对于一个 30 多岁的人来说,API 您可能会认为这些标志的文档随处可见,但我似乎无法在任何地方找到它们。
有人知道 if/what 剩余的标志用于或我可以在哪里阅读更多关于它们的信息吗?
此外,我可以相信相同的标志在不同的系统上总是意味着相同的东西吗?
直接来自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)