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
Odpowiedz
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.
Uwaga dla programistów może być wskazówką, jak uzyskać to zdarzenie za pomocą nowoczesnego zestawu narzędzi, takiego jak GTK. – user4815162342
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
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
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ć. –
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
Czy możesz napisać jakiś kod? – JoRouss