Strona 1 z 1
C++ - globalne skroty klawiszowe
: 03 listopada 2008, 16:44
autor: Chodak
Witam. Potrzebuje aby nieaktywna aplikacja (z ikonka w trayu) reagowala na skroty klawiszowe. Program pisany jest w Qt4. Na windowsie moge skorzystac z GetAsyncKeyState(), ale czy istnieje moze jakis odpowiednik na linuksie? moze w Xlib? Bede wdzieczny za kazda podpowiedz.
Pozdrawiam
Chodak
: 03 listopada 2008, 19:24
autor: Theq
Tak, w xlib jest cos takiego jak XGrabKey.
: 03 listopada 2008, 21:56
autor: Chodak
Dzieki Theq, mysle ze oto chodzilo jednak jestem o krok od rozwiazania problemu. Wyprobowalem XGrabKey i dziala bardzo ladnie jednak tylko pod oknem ktore wczesniej stworze:
Kod: Zaznacz cały
XEvent ev;
Display * dis = XOpenDisplay(0);
if(!dis) return;
//Window win = ???????
Window win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 1, 1, 500, 500, 0, BlackPixel (dis, 0), BlackPixel(dis, 0));
XMapWindow(dis, win);
XFlush(dis);
KeyCode key = XKeysymToKeycode(dis, XStringToKeysym("F6"));
XGrabKey(dis, key , AnyModifier, win, True, GrabModeAsync, GrabModeAsync);
while(1)
{
XNextEvent(dis, &ev);
if(ev.type == KeyPress && ev.xkey.keycode == key)
qDebug() << "S U K C E S";
}
Domyslam sie, ze wlasnie zamiast tworzyc to okienko powinienem jakos wyciagnac globalny kontekst tak zeby moj program nie musial byc aktywny, z tym ze nie mam pojecia jak... Jakies pomysly?
: 04 listopada 2008, 08:12
autor: Theq
: 04 listopada 2008, 15:47
autor: Chodak
Z DefaultRootWindow probowalem juz wczesniej, niestety:
X Error: BadAccess (attempt to access private resource denied) 10
Major opcode: 33 (X_GrabKey)
Resource id: 0x188
kompilacja przebiega pomyslnie, powyzszy error ukazuje sie po uruchomieniu.
EDIT:
Problem rozwiazany - BadAccess jest powodowany przez AnyModifier, zastapienie go przez np ShiftMask lub '0' rozwiazuje sprawe.
Pozdrawiam
Chodak
: 04 listopada 2008, 18:18
autor: Theq
Z tego co się orientuję, taki blad BadAccess jest wtedy jak cos juz zarezerwowalo sobie dany skrot klawiszowy. Przy AnyModifier miales po prostu skroty F6, shift+F6, Ctrl+F6 itd. wiec pewnie cos sie na siebie nalozylo.
: 04 listopada 2008, 19:38
autor: Chodak
Dokladnie, BadAccess wywala mi tez np przy ControlMask. Szkoda bo pewnie bede musial sie gimnastykowac z "Control_L", jest jakis sposob aby ten BadAccess ominac? a jesli nie to przynajmniej sprawdzic czy dany modifier jest juz zajety?
: 04 listopada 2008, 20:36
autor: Theq
http://www.libqxt.org
Rozszerzenie do qt, mozesz sobie podejrzec jak zaimplementowali tu (qxtwindowsystem_x11.cpp) globalne skroty w Xach. Z tego co tu widze XGrabKey zwraca GrabSuccess jak jest sukces
