Прослушивание событий клавиатуры без их перехвата?

Я пишу приложение командной строки, которое прослушивает события отпускания клавиши Control в X Windows и предупреждает другой процесс, когда обнаруживает их.

Поскольку я новичок в GNU / Linux, я бы предпочел не возиться с GCC, и поэтому я ищу решение на основе сценариев. Поскольку я немного знаю Python, мне казалось естественным выбрать решение на основе Python, и после поиска в Интернете примеров и чтения документации Python Xlib я собрал эти программы, которые работают, но с одной оговоркой: они ловушки события вместо того, чтобы просто прислушиваться к ним (я имею в виду, что такие события больше не передаются в приложение, на которое они были направлены в первую очередь).

Я отследил коды клавиш управления, запустив «xev». Поскольку я переназначил свои клавиши-модификаторы, в вашей системе они могут быть другими.

Чтобы не усложнять задачу, я опустил код, который имеет дело с внешним процессом.

Спасибо за вашу помощь.

Программное обеспечение:

  • Python 2.7.2

  • Python Xlib 0.15 RC1

  • Perl v5.10.1

  • Версия Debian GNU / Linux: 6.0.3

  • Версия ядра: Linux debian 2.6.32- 5-686

РЕДАКТИРОВАТЬ: Я не могу понять, что события клавиатуры не попадают в ловушку, если они не обрабатываются (в моих программах это означает, что выполняется строка print «KeyRelease»). Поскольку в моем коде я не вызываю никаких методов ни в Xlib, ни в объекте события, я не понимаю, в чем разница в обработке.

EDIT2: Также приветствуются предложения об альтернативных решениях, помимо использования Xlib.

EDIT3: Я тоже знаю Perl, и предложения о библиотеках Perl, которые могут помочь, также приветствуются, если они не требуют последних версий системных библиотек, поскольку Debian, как известно, отстает, когда дело доходит до пакетов, доступных в его репозиториях. , а компиляция и установка последних версий библиотек могут быть трудными, если у них много зависимостей (я пробовал установить PyGTK, но отказался от ссылки на установленную мной последнюю версию GLib).

    #!/usr/bin/env python

    from Xlib.display import Display
    from Xlib import X

    Control_R  = 64 # Keycode for right Control.
    Control_L  = 108 # Keycode for left Control.
    keycodes = [Control_R, Control_L] # Keycodes we are listening for.

    # Handle X events.
    def handle_event(event):
        # Let us know whether this event is about a Key Release of
        # one of the key we are interest in.
        if event.type == X.KeyRelease:
            keycode = event.detail
            if keycode in keycodes:
                print "KeyRelease"

    # Objects needed to call Xlib.
    display = Display()
    root = display.screen().root

    # Tell the X server we want to catch KeyRelease events.
    root.change_attributes(event_mask = X.KeyReleaseMask)

    # Grab those keys.
    for keycode in keycodes:
        root.grab_key(keycode, X.AnyModifier, 1, X.GrabModeAsync, X.GrabModeAsync)

    # Event loop.
    while 1:
        event = root.display.next_event()
        handle_event(event)
14
задан Raffaele Ricciardi 9 February 2012 в 18:27
поделиться