🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.pascal
Article #92759

Re: [Lazarus] Skrót klawiaturowy w Linuksie

#92759
From: Łukasz 'Maly' Ostrowski
Date: Wed, 03 Dec 2008 06:58
140 lines
6131 bytes
On Tue, 02 Dec 2008 11:50:52 +0100, Terrmit wrote:

> Łukasz 'Maly' Ostrowski pisze:
>> On Mon, 01 Dec 2008 22:49:23 +0100, Terrmit wrote:
>>> XGrabKey(display, key, 0, win, true, grab, grab);
>> I jaki konkretnie klawisz łapiesz? Bo nie widzę inicjalizacji 
>> key, i w jakim trybie? Bo nie widze inicjalizacji Sync/Async
>> do grab?
> Heh, żebym jeszcze wiedział o co chodzi :/

key i grab masz niezainicjowane, 
Key musi miec kod klawisza który chcesz złapać.
[przetłumaczony np XKeysymToKeyCode()]
grab musi miec GrabModeSync, albo Async.

> W założeniu klawisz Scroll Lock ma aktywować/deaktywować
> obsługę klawiatury numerycznej w tym programie.
> Po aktywacji ekran ma być podzielony (niewidzialnie) na
> 9 części jak w grze kółko i krzyżyk. Wciśnięcie klawisza
> od 1 do 9 klawiatury numerycznej ma przenosić kursor
> do odpowiedniej części ekranu. Dzięki temu niepełnosprawna
> osoba nie musi myszką przesuwać kursora przez cały ekran
> a jedynie w obszarze 1/9 powierzchni ekranu.
> Mam nadzieję, że nie namotałem w wyjaśnieniu.

Nie namotałeś. Dość straight-forward. Tak czy inaczej, nie 
jestem pewien czy uda Ci się chwycić sam ScrollLock lub
same klawisze numeryczne po tymże ScrollLocku, prędzej
łatwiej będzie złapać Ctrl-<cyferki> czy inne combo. Z
tego co widze Xy nie pozwalają łapać czegoś co już
jest złapane, także np Grab na AnyKey z AnyModifiers
zakończa program z wyjatkiem odmowa dostępu do prywatnego
resource'a.

> Rozumiem, że trzeba jakoś inicjalizować key, czy chodzi o to,
> że muszę już w XGrabKey wskazać o jaki klawisz chodzi?

Tak, musisz.

> Nie wiem co to jest inicjalizacja Sync/Async do grab :(

Ne pierwszy rzut oka, tryb Synchroniczny nie zwraca kontroli
do window managera, tzn możesz zmodyfikować event. Np ubić
klawisz, albo gmerać myszką. A Asynchroniczny śle Ci eventa
i nie obchodzi go co z nim zrobisz. To tak na pierwszy rzut 
oka.

> Ech, trochę to "pogięte", albo po prostu mam za mało wiedzy
> z X-Window. Przejrzę jeszcze raz kody, które znalazłem,
> może coś więcej mi się "rozjaśni".

Win32 API jest takie fajne 8-D. Defacto, w razie problemów
z Win32 też chętnie służę pomocą :].

>> Jak jutro będe miał chwile to zajrzę na Slacku moim,
>> ale ostrzegam, jak wyklepie jakiegoś example'a to 
>> raczej to będzie w C/C++ bo nie lubie walczyć 
>> (z wiatrakami/z zaślepkami) w postaci lazarusa ;).
> Do jakiś fragmentów kodu w C++ to ja nawet dotarłem,
> ale nie do końca kumam jak to przełożyć na Freepascal/Lazarus.
> Jednak zależałoby mi, aby zrobić to w Lazarusie.
> Jeśli masz jakiegoś example'a, to bardzo proszę o niego.
> Im więcej kodów, tym pewnie łatwiej będzie mi to zrozumieć.

Właśnie wyklepałem minimalistyczny przykład łapiący
globalnie zdarzenie Control-Shift-Q. Skompilowane,
sprawdzone, na Slacku 12.1 z xorg działa jak powinno,
tzn wypisuje kod escape, tzn 24 na konsoli ;).

Defacto można by jeszcze posprzątać po tym for'ze
za pomocą:
XAllowEvents(), XUngrabKey(), XSync()...

...ale jest nieskończony więc olałem. ;).

#include <stdio.h>
#include <X11/Xlib.h>

int main()
{
    Display* disp = XOpenDisplay(NULL);
    if(disp==NULL)
        return 1;
    printf("disp = %.8X\n", disp);

    Window root = DefaultRootWindow(disp);

    XGrabKey(disp, XKeysymToKeycode(disp,'q'), ShiftMask | ControlMask,
root, False, GrabModeAsync, GrabModeAsync);

    for(;;)
    {
        XEvent event;
        XNextEvent(disp, &event);
        if(event.type==KeyPress)
        {
            printf("key = %d\n", event.xkey.keycode);
        }
    }

    return 0;
}

$ gcc -L/usr/X11/include -lX11 -o test test.cpp

>> 
>> P.S. W KDE nie ma accessibility programów do wspomagania
>>      obsługi myszy?
> Chodzi przede wszystkim o to, żeby dostosować program
> do potrzeb głównie konkretnej osoby i żeby program
> działał tak samo w Gnome, KDE i MS Windows.

To może lepiej dopasować coś co już jest? Jakby nie patrzeć
GPL.

> Jak zrobię/zrozumiem "łapanie" klawiszy w X-Window, to dalej
> jak sądzę pójdzie mi z górki.

To się dopiero okaże.

>> P.P.S. Co do tego timera, to dośc ekhm, metoda 'hackerów'
>>        z pl.comp.lang.delphi ['czy ktoś ma komponent do
>>        dodawania?' ;)]. Podejrzewam że w modelu Xlib, 
>>        jeżeli nie możesz tego wstawić do main loopa,
>>        a nie możesz bo tam masz message-pump gui, to
>>        pewnie trzeba to wydelegować do osobnego 
>>        wątku.
> Hmm, racja. Trzeba by to wsadzić do osobnego wątku.
> 
> Dzięki za zainteresowanie i pomoc. Może z Waszą pomocą powoli
> dojdę jak to wszystko zrobić.

Żeby zrobić proof-of-concept, zmodyfikuj mój minimalny przykład
żeby całość działała na pthreads, a żeby main() zasypiał.

-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.         http://maly.nemo.pl/
ICQ: 148498663     GG: 2544385   AIM: malyzgora
GTalk: l3vi4than@gmail.com       ASTRA: L3viathan
Technical Details
Message-ID: <1up67ctdruk2y.1rmgo2b3wf6hl.dlg@40tude.net>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail
References: <ggum6m$a7f$1@achot.icm.edu.pl> <ggut30$j1e$1@achot.icm.edu.pl> <1e1rz5s7181lg.1r5mxgapek4gh.dlg@40tude.net> <gh1m54$3mi$1@achot.icm.edu.pl> <p5fjcwlif1kz.1lfc5tzflch4w.dlg@40tude.net> <gh33ud$26p$1@achot.icm.edu.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail
From: Łukasz 'Maly' Ostrowski <maly@USUNnemo.pl>
Newsgroups: pl.comp.lang.pascal
Subject: Re: [Lazarus] Skrót klawiaturowy w Linuksie
Date: Wed, 3 Dec 2008 07:58:37 +0100
Organization: Acme
Lines: 140
Message-ID: <1up67ctdruk2y.1rmgo2b3wf6hl.dlg@40tude.net>
References: <ggum6m$a7f$1@achot.icm.edu.pl> <ggut30$j1e$1@achot.icm.edu.pl> <1e1rz5s7181lg.1r5mxgapek4gh.dlg@40tude.net> <gh1m54$3mi$1@achot.icm.edu.pl> <p5fjcwlif1kz.1lfc5tzflch4w.dlg@40tude.net> <gh33ud$26p$1@achot.icm.edu.pl>
NNTP-Posting-Host: static-78-8-208-81.ssp.dialog.net.pl
Mime-Version: 1.0
X-Trace: news.dialog.net.pl 1228287573 883 78.8.208.81 (3 Dec 2008 06:59:33 GMT)
X-Complaints-To: abuse@dialog.net.pl
NNTP-Posting-Date: Wed, 3 Dec 2008 06:59:33 +0000 (UTC)
User-Agent: 40tude_Dialog/2.0.15.1
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit