Отключите клавиатуру, но продолжайте получать события - PullRequest
0 голосов
/ 15 сентября 2018

У меня ноутбук с сенсорным экраном, который откидывается достаточно, чтобы стать как планшет. Если я положу его на стол, я не хочу случайно нажимать клавиши, поэтому я работаю над сценарием, который отключает клавиатуру, когда я нажимаю Ctrl-F10, а затем снова включаю ее, когда я делаю это снова. Я использую xlib из PyPI, и я получил это до сих пор:

from Xlib.display import Display
from Xlib.ext import xinput

class Handler:
    def __init__(self, display):
        self.enabled = True
        self.display = display

    def handle(self, event):
        if event.data['detail'] == 76 and event.data['mods']['base_mods'] == 4:
            if self.enabled:
                self.display.grab_server()
            else:
                self.display.ungrab_server()
            self.enabled = not self.enabled

try:
    display = Display()
    handler = Handler(display)
    screen = display.screen()
    screen.root.xinput_select_events([
        (xinput.AllDevices, xinput.KeyPressMask),
    ])
    while True:
        event = display.next_event()
        handler.handle(event)
finally:
    display.close()

Он отключает клавиатуру на Ctrl-F10, но как только я снова включаю, все клавиши, которые я нажал, когда она была отключена, активируются одновременно. Есть ли способ очистить очередь перед повторным включением или лучший способ отключить клавиатуру?

1 Ответ

0 голосов
/ 17 сентября 2018

Попробуйте XGrabKeyboard: https://tronche.com/gui/x/xlib/input/XGrabKeyboard.html

(но для этого необходимо создать собственное окно для захвата; например, вы можете создать окно размером 1x1 в позиции -10x-10)

Я думаю, что значения для таких вещей, как owner_events и keyboard_mode не имеют большого значения.Основным эффектом должно быть то, что фокус ввода переходит к вашему собственному окну.time должно быть CurrentTime (что равно 0), а pointer_mode должно быть GrabModeAsync, чтобы вы не мешали указателю.

...