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