Где найти максимальное разрешение для сенсорного монитора в Linux? - PullRequest
2 голосов
/ 25 июня 2019

В приложении, которое я пишу, есть поток, который постоянно опрашивает местоположение /dev/input/eventX для сенсорных событий, так как ядро ​​Linux, которое я запускаю, имеет ограниченную поддержку сенсорных экранов.Из-за этой ограниченной поддержки QT5 не получает никаких событий касания, и мне приходится анализировать необработанные данные о событиях с устройства.

Мой метод работает, но я получаю дико неточные значения X и Y для касанияточки, потому что мне нужно масштабировать координаты в соответствии с разрешением монитора.Например, если я использую утилиту evtest, я могу видеть, что текущие максимальные значения X и Y для этого монитора (15360, 8640), а разрешение монитора составляет 1920x1080.Это означало бы, что мне нужно масштабировать значения X и Y на 0,125 , чтобы получить правильные координаты.

Поскольку утилита evtest способна показать мне эти максимальные значения X и Y,Я предполагаю, что информацию можно где-то прочитать, но я не могу найти никакой информации о том, где взять эту информацию.Может кто-нибудь сказать мне, где я могу найти текущие максимальные значения координат сенсорного экрана?Кроме того, если он не находится в том же месте, где я могу получить разрешение монитора?

1 Ответ

0 голосов
/ 25 июня 2019

Мне удалось найти исходный код для упомянутой мною утилиты 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 ++?Или нет C ++, эквивалентного ioctl ()?

...