Мое приложение для X System остается в фоновом режиме (и на панели в качестве индикатора) и должно всплывать всякий раз, когда пользователь нажимает клавишу, независимо от того, какое бы оно ни было активное окно.
Аналогично приложению Меню.
Попробовал следующее:
- Прослушивание глобальных сочетаний клавиш в python в Linux
Но не могу найти, как интегрировать этот основной цикл Gtk.
- Глобальное связывание клавиш на X с использованием Python gtk3
Единственный ответ на этот вопрос - Python 2 и не работает.
Смешивая два выше, я получил следующий код:
from Xlib.display import Display
from Xlib import X, error
from Xlib.ext import record
from Xlib.protocol import rq
from gi.repository import Gtk, GObject, Gdk
import threading
class GlobalKeyBinding(GObject.GObject, threading.Thread):
def __init__(self):
GObject.GObject.__init__(self)
threading.Thread.__init__(self)
self.setDaemon(True)
self.display = Display()
self.Win = Gtk.Window()
self.Win.add(Gtk.Label("Hello"))
self.root = self.display.screen().root
ctx = self.display.record_create_context(
0,
[record.AllClients],
[{
'core_requests': (0, 0),
'core_replies': (0, 0),
'ext_requests': (0, 0, 0, 0),
'ext_replies': (0, 0, 0, 0),
'delivered_events': (0, 0),
'device_events': (X.KeyReleaseMask,
X.ButtonReleaseMask),
'errors': (0, 0),
'client_started': False,
'client_died': False,
}])
self.state = 0
self.display.record_enable_context(ctx, self.handler)
self.display.record_free_context(ctx)
def handler(self, reply):
data = reply.data
wait_for_release = False
while len(data):
event, data = rq.EventField(None).parse_binary_value(
data, self.display.display, None, None)
# KEYCODE IS FOUND USERING event.detail
print(event.detail)
if event.type == X.KeyPress:
# BUTTON PRESSED
print("pressed")
if not self.state:
self.Win.show_all()
self.state = 1
else:
self.Win.hide()
self.state = 0
elif event.type == X.KeyRelease:
# BUTTON RELEASED
print("released")
def run(self):
self.running = True
while self.running:
event = self.display.next_event () # registered keycode(or probably rather event) has been received.
while Gtk.main_iteration():
Gtk.main_iteration_do(True)
def main():
print("starting...")
Gdk.threads_init ()
keybindings=GlobalKeyBinding()
keybindings.start ()
Gtk.main ()
main()
Хотя это ловит мой ввод, оно никогда не показывает окно.
Пожалуйста, помогите:)