问题描述
我已经使用以下代码在窗口中实现了xinput2侦听器:
...
else if(eID == XCB_GE_GENERIC){ // Generic events = XINPUT
auto* gev = (xcb_ge_generic_event_t*)event;
if(gev->extension != extensionXInput->major_opcode){
continue;
}
auto inputEvent = gev->event_type;
if(inputEvent == XCB_INPUT_MOTION){
auto *ev = (xcb_input_motion_event_t *)event;
std::cout << ev->event_x << " - " << ev->event_y << std::endl;
//BUTTON_ON_MOTION(ev);
}
但是当我读取event_x和event_y字段时,我得到了很高的数字。
如何正确读取这些数字?
解决方法
虽然我不知道它在内部如何工作以及返回的吞噬代表什么,但以下代码会将它们转换为可读数字。
double fp3232val(xcb_input_fp3232_t* val)
{
return val->integral + val->frac / (double)UINT_MAX;
}
double fp1616val(xcb_input_fp1616_t val)
{
return val / (double)UINT16_MAX;
}
,
fp1616表示“固定点16.16”。这意味着前16位代表数字的整数部分,后16位代表小数部分。
例如参见Fixed point vs Floating point number和https://en.wikipedia.org/wiki/Fixed-point_arithmetic
例如,数字1.0
表示为1 << 16
。数字1.5
是1.5 * (1 << 16)
,等于3 << 15
。
您的计算结果“几乎正确”。您使用0xffff
作为因子,但是正确的数字是0x10000
。这应该导致微小的差异。