如何读取xcb_input_fp3232_t和xcb_input_fp1616_t

问题描述

我已经使用以下代码在窗口中实现了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 numberhttps://en.wikipedia.org/wiki/Fixed-point_arithmetic

例如,数字1.0表示为1 << 16。数字1.51.5 * (1 << 16),等于3 << 15

您的计算结果“几乎正确”。您使用0xffff作为因子,但是正确的数字是0x10000。这应该导致微小的差异。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...