OT: zacyceni stisku klavesy neaktivni GTK aplikaci

Lubos Lunak l.lunak na sh.cvut.cz
Pondělí Duben 2 21:36:08 CEST 2001


Michal Krause wrote:

> On 01/04/2001, Lubos Lunak wrote:
> 
>> > Napsal jsem malou aplikaci wmcliphist
>> > (http://linux.nawebu.cz/wmcliphist/), ktera dela zhruba totez, jako
>> > klipper z KDE - proste uchovava seznam nekolika poslednich obsahu
>> > clipboardu a umoznuje se k nim zase vratit. Program je napsany s
>> > vyuzitim GTK a bezi v docku Window Makeru. Chtel bych jeho funkcnost
>> > vylepsit o moznost vyvolat menu s historii klavesovou zkratkou.
>> 
>> No co jit takhle zacatou cestou dale a "vypujcit" si z KDE i to
>> odchytavani klavesy? Je to trida KGlobalAccel, z kdelibs/kdecore.
>> Jinak je to tedy v podstate volani XGrabKey().
> 
> Dival jsem se na to a zatim se uspech nedostavil. Podle zdrojaku kdelibs
> i podle manualu mam pocit, ze XGrabKey je treba predat root okno, jinak
> to nebude mit skutecne globalni dopad. Jenze kdyz to takto udelam,
> udalost zase nedorazi do meho okna. Mozna mi neco uniklo?
> 
> Takhle vypada moje volani XGrabKey:
> 
> XGrabKey(GDK_DISPLAY(),
>                 AnyKey, AnyModifier,
>                 GDK_ROOT_WINDOW(),
>                 TRUE,
>                 GrabModeAsync,
>                 GrabModeSync);
> 
> IMHO je to totez, jak volani z kdelibs:
> 
> XGrabKey(qt_xdisplay(),
>                 XKeysymToKeycode(qt_xdisplay(), keysym), mod,
>                 qt_xrootwin(),
>                 True,
>                 GrabModeAsync,
>                 GrabModeSync);
> 
> Rozdil je jenom v tom, ze ja v ramci testu lapam vsechny klavesy, kdezto
> zde uz je to filtr na urcitou konkretni klavesu. Grabovani klavesnice
> funguje - po zavolani XGrabKey prestane vstup znaku atd. fungovat, ale
> udalosti zrejme obdrzi root okno.

 Ten event asi bude pro root okno, ale ta aplikace ho dostane, jen si to 
musi ten kod spravne odchytit ( viz. KGlobalAccelPrivate ). Pak se musi ten 
event spravne osetrit ( viz. KGlobalAccel::x11EventFilter() ). Kousne se to 
proto, protoze v tom osetreni asi chybi povoleni dalsiho vstupu. Myslim, ze 
zkratka pouzit jen kod KGlobalAccelPrivate, KGlobalAccel::grabKey(), 
KGlobalAccel::ungrabKey() a KGlobalAccel::x11EventFilter() musi stacit.
 Jinak jestli to tedy z nejakeho divneho duvodu nepujde, tak bych pripadne 
doporucil to vytahnout z nejakeho Gnome programu ( prece to tam musi aspon 
neco pouzivat, treba to menu s otiskem tlapy na panelu - v KDE se takhle 
KGlobalAccel pouziva na takovych veci ) nebo nejakeho WM ( i kdyz tedy 
nevim, jestli nejaky WM pouziva Gtk+ ).
 Nebo bych jako nouzovy plan pripadne zkusil prelozil Klipper se staticky 
prelozenymi kdelibs a pak ho poustet 'klipper --nofork', at nepousti KDE 
daemony dcopserver & spol.

> 
> Zajimave je, ze funkce XGrabKeyboard funguje presne podle mych predstav,
> jenomze ta zase neumoznuje zachytavat jenom zvolenou klavesu/kombinaci
> klaves.

 Jestli se nepletu, tak XGrabKey() zafunguje stejne jako XGrabKeyboard(), 
sotva bude stisknuta ta dana kl. kombinace.

> 
> S pozdravem

 Lubos Lunak
--
 l.lunak na email.cz ; l.lunak na kde.org
 http://dforce.sh.cvut.cz/~seli



Další informace o konferenci Linux