在哪里可以找到 Linux 中触摸屏显示器的最大分辨率?

Where to find the max resolution for a touchscreen monitor in Linux?

我正在编写的应用程序有一个线程不断轮询触摸事件的 /dev/input/eventX 位置,因为我 运行 的 Linux 内核对触摸屏的支持有限。由于这种有限的支持,QT5 没有接收到任何触摸事件,我必须解析来自设备的原始事件数据。

我的方法有效,但我得到的触摸点的 X 和 Y 值非常不准确,因为我需要根据显示器的分辨率缩放坐标。例如,如果我使用 evtest 实用程序,我可以看到此显示器的当前最大 X 和 Y 值为 (15360, 8640),并且显示器分辨率为 1920x1080。这意味着我需要将 X 和 Y 值缩放 0.125 以获得正确的坐标。

由于 evtest 实用程序能够向我显示这些最大 X 和 Y 值,我假设可以在某处读取信息,但我找不到有关从何处获取该信息的任何信息.谁能告诉我在哪里可以找到触摸屏的当前最大坐标值?另外,如果不在同一个位置,我也可以从哪里获得显示器分辨率?

我设法找到了我提到的 evtest 实用程序的源代码,并且能够使用以下代码片段找到触摸屏的最大 X 和 Y 值:

const char * filename = "/dev/input/event15";
char * absval[6] = { "Value", "Min", "Max", "Fuzz", "Flat", "Resolution" };
int fd = open(filename, O_RDONLY);
if((fd < 0) && (errno == EACCES) && (getuid() != 0)) {
    cout << "Could not open device file. Try running as root." << endl;
}

int absX[6] = {};
int absY[6] = {};

ioctl(fd, EVIOCGABS(ABS_MT_POSITION_X), absX);
ioctl(fd, EVIOCGABS(ABS_MT_POSITION_Y), absY);

cout << "ABS_MT_POSITION_X Properties" << endl;
for(int x = 0; x < 6; x++) {
    if((x < 3) || absX[x]) {
        cout << absval[x] << ": " << absX[x] << endl;
    }
}

cout << "ABS_MT_POSITION_Y Properties" << endl;
for(int y = 0; y < 6; y++) {
    if((y < 3) || absX[y]) {
        cout << absval[y] << ": " << absY[y] << endl;
    }
}

SCALE_X = (1920.0f / absX[2]);
SCALE_Y = (1080.0f / absY[2]);

close(fd);

这让我得到了正确的缩放量。

有没有办法使用 C++ 库来做到这一点?还是没有与 ioctl() 等效的 C++?