2013-03-19 13 views
9

Jestem nowy w programowaniu X.org. Chcę zbudować małą aplikację, która reaguje na przełącznik układu klawiatury X. Szukałem, ale nie znalazłem, które zdarzenie jest uruchamiane, gdy włączony jest układ kb. Proszę, wskaż mi właściwe wydarzenie. DziękiKtóre zdarzenie jest uruchamiane podczas przełączania układu kb na X.org

+0

Co robisz, aby zmienić układ klawiatury? Czy używasz klienta GUI? Lub edytując plik konfiguracyjny? Kiedy zmiana wejdzie w życie? Są to wskazówki, które mogą pomóc nam dowiedzieć się, gdzie szukać. –

+0

Przełączanie między układem językowym (en, cs, ...). Klient GUI, który nasłuchuje przełącznika kb (np. Skonfigurowałem obie zmiany, aby zmienić układ klawiatury, a ten przełącznik generuje zdarzenie, które chcę przechwycić i wykonać pewną operację). Powinien to być kod c/C++. – Pat

+0

Czy możesz napisać jakiś kod? – JoRouss

Odpowiedz

8

Istnieje typ zdarzenia XkbStateNotify, który jest częścią X Keyboard Extension. Można chwycić język układ z nim tak:

void x11Events(XEvent* evt) 
{ 
    if(evt->type == xkbEventType) { 
     XkbEvent* xkbevt = (XkbEvent*)evt; 
     if (xkbevt->any.xkb_type == XkbStateNotify) { 
      int lang = xkbevt->state.group; 
      // Some code using lang here. 
     } 
    } 
} 

Aby uzyskać xkbEventType wywołać funkcję XkbQueryExtension() (zadeklarowanego w XKBlib.h).

Jednak XkbStateNotify jest uruchamiany nie tylko przy zmianie układu. To jest od specyfikacji wskazanej powyżej:

Zmiany zgłaszane obejmują zmiany w dowolnym aspekcie stanu klawiatury : kiedy modyfikator jest ustawiony lub wyłączony, gdy prąd Grupa zmiany, lub po naciśnięciu wskaźnik jest wciśnięty lub wydany.

Z tego powodu, będziesz musiał zapisać wartość lang gdzieś, a potem, gdy przychodzi nowy event, porównaj nową wartość lang do jednego zapisanego wcześniej.

NB. Istnieje również zdarzenie XkbMapNotifyEvent, które nie informuje o przełączaniu układu jako takiego, ale o zmianie mapowania klawiatury. Możesz także zajrzeć do tego.

+0

Uwaga dla programistów może być wskazówką, jak uzyskać to zdarzenie za pomocą nowoczesnego zestawu narzędzi, takiego jak GTK. – user4815162342

+1

W GTK zwykle nie ma potrzeby przetwarzania surowych 'XEvents'ów (przynajmniej w celu wykrycia zmiany układu), ponieważ istnieją [zdarzenia gdk] (https://developer.gnome.org/pygtk/stable/class- gdkevent.html), który może być użyty do pobrania bieżącej grupy klawiszy. Ponadto wtrącanie w przetwarzanie zdarzeń X w aplikacjach gtk może podważyć zestaw narzędzi, ponieważ ma swoją własną pętlę przetwarzania zdarzeń. Niewiele o Qt, ale podejrzewam, że tam są podobne. – shakurov

+0

To jest dokładnie to, co miałem na myśli - kod równoważny powyższym, ale używanie zdarzeń GDK. Musi być możliwe uzyskanie dostępu do zdarzenia przełącznika układu Xkb z GTK/GDK, ponieważ przynajmniej aplety wskaźników klawiatury muszą wykryć przełącznik. – user4815162342

Powiązane problemy