Как временно замаскировать события касания сенсорного экрана в C в Linux? - PullRequest
1 голос
/ 06 апреля 2019

Я написал программу на C, которая активирует команды, когда пользователь щелкает по краям экрана. Например, взмах вверх от нижнего края поднимает клавиатуру. Эта часть моего кода работает нормально.

Проблема, с которой я сталкиваюсь, заключается в том, что само движение щелчком также прерывает приложения, так как пальцы должны перетаскивать часть экрана, чтобы активировать триггер. Я не хочу, чтобы это действие влияло на приложения, отображаемые на экране, пока пользователь щелкает края экрана.

Я хотел бы добавить код на C, который будет временно маскировать сенсорные события. Я могу обработать код, который правильно активирует маскирование (например, события, происходящие с краев экрана) и когда снимать маску.

Я могу справиться со всем вышеперечисленным, за исключением кода, который маскирует и снимает маску событий касания. Я не прошу полный полный код, а просто указатель в правильном направлении. Я хотел бы знать, какую библиотеку использовать, и соответствующую команду, которая выполняет маскирование.

Я не буду публиковать код, так как он длиной в пару сотен строк и, несомненно, приведет к отклонению от вопроса; код работает нормально, кроме вопроса выше.

Я на Raspberry Pi 3b + с Rasbian OS и официальным сенсорным экраном Raspberry Pi 7 ". Основные библиотеки C, которые я использую для программы, - это linux / input.h и X11 / extensions / XTest.h.

Я предоставлю любую дополнительную информацию, если ее попросят.

* РЕДАКТИРОВАТЬ *

Наконец-то понял! Самая большая проблема в том, что найти, что искать ...

Я замаскировал события указателя / касания следующей командой:

XGrabPointer(dpy, root, False, PointerMotionMask, GrabModeSync, GrabModeAsync, None, None, CurrentTime);

В приведенном выше коде движение касания маскируется (PointerMotionMask), указатель / касание для окон маскируется (GrabModeSync), а события клавиш клавиатуры не маскируются (GrabModeAsync).

Для снятия маски я использовал следующие команды:

        XQueryPointer(dpy, RootWindow (dpy, 0),
         &event.xbutton.root, &event.xbutton.window,
         &event.xbutton.x_root, &event.xbutton.y_root,
         &event.xbutton.x, &event.xbutton.y,
         &event.xbutton.state);

        usleep(10000);

        XUngrabPointer(dpy, CurrentTime);

        usleep(10000);

        XQueryPointer(dpy, RootWindow (dpy, 0),
         &event.xbutton.root, &event.xbutton.window,
         &event.xbutton.x_root, &event.xbutton.y_root,
         &event.xbutton.x, &event.xbutton.y,
         &event.xbutton.state);

Я все еще изучаю Xlib, поэтому я не совсем понимаю, зачем нужно добавлять usleep и XQueryPointer, но я обнаружил, что это необходимо, или программа непредсказуема. Я просто скопировал этот тип кода из моей функции buttonPress (). Я не смог найти никакого полного, простого и ясного ответа, поэтому для этого потребовалось много попыток / неудач.

Теперь я могу провести по краям на сенсорном экране Raspberry Pi, и в текущее активное окно не прерывается.

Если кто-то захочет увидеть код, просто спросите, и я выложу его полностью. И если кто-нибудь знает, как работает этот код и почему мне нужно добавить usleep и XQueryPointer, я бы хотел услышать.

Использованные источники: X11: будет ли XGrabPointer предотвращать другие приложения от какого-либо события мыши? https://tronche.com/gui/x/xlib/input/pointer-grabbing.html

...