Portál AbcLinuxu, 9. května 2025 20:58

Dotaz: Přeposílání XEvent

17.6.2010 16:58 kralyk z abclinuxu | skóre: 29 | blog:
Přeposílání XEvent
Přečteno: 160×
Odpovědět | Admin
Ahoj,
řeším následující problém: Potřebuju globálně odchytávat klávesu; při stlačení něco udělat a při uvolnění zase něco udělat (například zobrazi a skrýt tooltip apod., to je jedno).

Našel jsem zatím dva způsoby řešení.
1.) Můžu Pravidelně (v nějakém vedlejším threadu) volat XQueryKeymap() a zjišťovat si, kdy je klávesa dole a kdy nahoře. Četl jsem ale, že tahle metoda má výkonový dopad - zatěžuje Xka.
2.) Můžu použít XGrabKey na root window, což je jednoduché a čisté, problém ale je, že daná klávesa bude fungovat pouze v mém programu, bude grabována výhradně. Abych tenhle problém obešel, přepošlu vždycky daný XEvent znova.
Kód vypadá takhle:
  hotkey = XKeysymToKeycode(d, XStringToKeysym("Super_L"));
  XGrabKey(d, hotkey, 0, root, True, GrabModeAsync, GrabModeAsync);
  while (1)
  {
    XNextEvent(d, &e);
    if (e.type == KeyPress)
    {
      cout << "KeyPress:\n  keycode: " << e.xkey.keycode << " state: " << hex << e.xkey.state << endl;
      XSendEvent(d, root, False, KeyPressMask, &e);
    }
    if (e.type == KeyRelease)
    {
      cout << "KeyRelease:\n  keycode: " << e.xkey.keycode << " state: " << hex << e.xkey.state << endl;
      XSendEvent(d, root, False, KeyReleaseMask, &e);
    }
  }
Blbý je, že tohle nefunguje jak má. Teda XEvent se přepošle, ale například u klávesových zkratek pro compiz, konkrétně u Expa, mi to dělalo divný věci; expo se spustilo, ale focus klávesnice zůstal na aktivní ploše, takže se expo nedalo ovládat klávesnicí, a stisky kláves se posílaly aplikaci s focusem na aktivní ploše místo compizu.
Co dělám špatně?

Díky za všecky rady.
SPD vůbec není proruská
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.6.2010 12:27 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Přeposílání XEvent
Odpovědět | | Sbalit | Link | Blokovat | Admin
Opravdu nikdo neví?
Anebo nevíte případně, kde bych se mohl po internetu ještě zeptat (anglicky mluvim)?
SPD vůbec není proruská
22.6.2010 13:38 chrono
Rozbalit Rozbalit vše Re: Přeposílání XEvent
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nebolo by jednoduchšie použiť Gtk a gdk_window_add_filter (prípadne niečo podobné z Qt)? Tam potom stačí vrátiť GDK_FILTER_REMOVE alebo GDK_FILTER_CONTINUE a Gdk sa postará o poslanie tej udalosti správnemu oknu.
22.6.2010 15:20 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Přeposílání XEvent
Používám tenhle mechanismus v Qt, problém je, že když event ve filtru odmítnu, Qt jej přepošle "správnému oknu" pouze v rámci aplikace, ne v rámci celého WM. Nevím, jak je tohle u GTK, ale hádám, že to bude stejné...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.