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
Zgadza sie:

Kod: Zaznacz cały

win = DefaultRootWindow(dis);

: 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 ;)