🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.pascal
12 messages
12 total messages Started by Terrmit Sun, 30 Nov 2008 18:31
[Lazarus] Skrót klawiaturowy w Linuksie
#92749
Author: Terrmit
Date: Sun, 30 Nov 2008 18:31
15 lines
1271 bytes
Witam,
Do obsłużenia globalnego skrótu klawiaturowego w Windows
można użyć funkcji
   RegisterHotKey
Czy jest jakiś sposób na zarejestrowanie globalnego
HotKey w Linuksie (X-Windows), albo chociaż w Gnome i/lub KDE?
Czy ktoś ma jakąś wiedzę na ten ten temat i zechciał
się nią podzielić? Bo ja jakoś nie mogę natrafić
na nic sensownego w necie (google). Potrzebuję
wykorzystać w tym celu klawisz "Scroll Lock".
Po jego wciśnięciu moja aplikacja ma wykonać
zadaną procedurę nawet wtedy gdy siedzi sobie
w tray-u.

Sławek.
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92750
Author: Terrmit
Date: Sun, 30 Nov 2008 20:29
26 lines
1852 bytes
Terrmit pisze:
> Witam,
> Do obsłużenia globalnego skrótu klawiaturowego w Windows
> można użyć funkcji
>   RegisterHotKey
> Czy jest jakiś sposób na zarejestrowanie globalnego
> HotKey w Linuksie (X-Windows), albo chociaż w Gnome i/lub KDE?
> Czy ktoś ma jakąś wiedzę na ten ten temat i zechciał
> się nią podzielić? Bo ja jakoś nie mogę natrafić
> na nic sensownego w necie (google). Potrzebuję
> wykorzystać w tym celu klawisz "Scroll Lock".
> Po jego wciśnięciu moja aplikacja ma wykonać
> zadaną procedurę nawet wtedy gdy siedzi sobie
> w tray-u.
> 
> Sławek.
Przypuszczam, że należałoby użyć biblioteki XLib.
Znalazłem programik o nazwie xhotkeys dla Linuksa
i próbowałem rozgryźć jak on działa. Przeglądałem
plik źródeł najstarszej, najmniej rozbudowanej wersji:
http://download.savannah.gnu.org/releases/xhotkeys/xhotkeys-0.1.tar.gz
Niestety praktycznie nie znam pythona.
Ten program najwyraźniej korzysta właśnie z biblioteki XLib.
Czy ktoś mógłby pomóc?

Sławek
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92751
Author: Łukasz 'Maly' Ostrowski
Date: Mon, 01 Dec 2008 00:19
25 lines
1793 bytes
On Sun, 30 Nov 2008 21:29:18 +0100, Terrmit wrote:
> Przypuszczam, że należałoby użyć biblioteki XLib.
> Znalazłem programik o nazwie xhotkeys dla Linuksa
> i próbowałem rozgryźć jak on działa. Przeglądałem
> plik źródeł najstarszej, najmniej rozbudowanej wersji:
> http://download.savannah.gnu.org/releases/xhotkeys/xhotkeys-0.1.tar.gz
> Niestety praktycznie nie znam pythona.
> Ten program najwyraźniej korzysta właśnie z biblioteki XLib.
> Czy ktoś mógłby pomóc?

W uproszczeniu:

1. display = XOpenDisplay(0)
2. rootWindow = DefaultRootWindow(display)
3. XGrabKey() na rootWindow
4. XNextEvent() w pętelce czekając na ev.type == KeyPress

http://tronche.com/gui/x/xlib/input/XGrabKey.html
oraz okolice.

-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.         http://maly.nemo.pl/
ICQ: 148498663     GG: 2544385   AIM: malyzgora
GTalk: l3vi4than@gmail.com       ASTRA: L3viathan
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92752
Author: Terrmit
Date: Mon, 01 Dec 2008 10:04
33 lines
2264 bytes
Łukasz 'Maly' Ostrowski pisze:
> On Sun, 30 Nov 2008 21:29:18 +0100, Terrmit wrote:
>> Przypuszczam, że należałoby użyć biblioteki XLib.
>> Znalazłem programik o nazwie xhotkeys dla Linuksa
>> i próbowałem rozgryźć jak on działa. Przeglądałem
>> plik źródeł najstarszej, najmniej rozbudowanej wersji:
>> http://download.savannah.gnu.org/releases/xhotkeys/xhotkeys-0.1.tar.gz
>> Niestety praktycznie nie znam pythona.
>> Ten program najwyraźniej korzysta właśnie z biblioteki XLib.
>> Czy ktoś mógłby pomóc?
> 
> W uproszczeniu:
> 
> 1. display = XOpenDisplay(0)
> 2. rootWindow = DefaultRootWindow(display)
> 3. XGrabKey() na rootWindow
> 4. XNextEvent() w pętelce czekając na ev.type == KeyPress
> 
> http://tronche.com/gui/x/xlib/input/XGrabKey.html
> oraz okolice.
> 
Dzięki za cenne wskazówki. XGrabKey, tak się już domyślałem.
Spróbuję to zaimplementować w programie.

Sławek

P.S. Mam znajomego, który jest osobą niepełnosprawną ruchowo.
Jedynym jego oknem na świat jest komputer. Prosił, abym
pomógł mu w sterowaniu kursorem z klawiatury, co też staram się
zrobić (myszka jest dla niego dość uciążliwa).
Dzięki za wszelką pomoc. Gotowy program zamierzam
opublikować wraz ze źródłami, aby inne niepełnosprawne osoby
też mogły z tego korzystać. Programik ma być przenośny.
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92753
Author: Terrmit
Date: Mon, 01 Dec 2008 21:49
81 lines
3367 bytes
Łukasz 'Maly' Ostrowski pisze:
> On Sun, 30 Nov 2008 21:29:18 +0100, Terrmit wrote:
>> Przypuszczam, że należałoby użyć biblioteki XLib.
>> Znalazłem programik o nazwie xhotkeys dla Linuksa
>> i próbowałem rozgryźć jak on działa. Przeglądałem
>> plik źródeł najstarszej, najmniej rozbudowanej wersji:
>> http://download.savannah.gnu.org/releases/xhotkeys/xhotkeys-0.1.tar.gz
>> Niestety praktycznie nie znam pythona.
>> Ten program najwyraźniej korzysta właśnie z biblioteki XLib.
>> Czy ktoś mógłby pomóc?
> 
> W uproszczeniu:
> 
> 1. display = XOpenDisplay(0)
> 2. rootWindow = DefaultRootWindow(display)
> 3. XGrabKey() na rootWindow
> 4. XNextEvent() w pętelce czekając na ev.type == KeyPress
> 
> http://tronche.com/gui/x/xlib/input/XGrabKey.html
> oraz okolice.
>
Wykombinowałem coś takiego:

var
   Form1: TForm1;
   display : PDisplay;

implementation

procedure TForm1.FormCreate(Sender: TObject);
var win: TWindow;
     key, grab: Integer; //GrabModeAsync
begin
   display := XOpenDisplay(nil);
   if display = nil then ShowMessage('Błąd: Nie mogę połączyć się z 
serwerem X')
   else begin
     win := DefaultRootWindow(display);
     XGrabKey(display, key, 0, win, true, grab, grab);
   end;
   Timer1.Interval := 10;
end;

//W timerze wyświetlam sobie współrzędne kursora
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Label1.Caption:=IntToStr(Mouse.CursorPos.X);
   Label2.Caption:=IntToStr(Mouse.CursorPos.Y);
end;

No i gdzieś powinna być ta pętelka, ale nie bardzo łapię
gdzie ją wstawić

var ev: TXEvent;
     keys : Integer;

   repeat
     XNextEvent(display, @ev);
     if ev._type = X.KeyPress then
       //tu chciałbym kontrolnie wyświetlić kod naciśniętego klawisza
       Label3.Caption := 'Key: '+IntToStr(ev.xkey.keycode);
   until false;

Najbardziej pasowałoby chyba wstawić zawartość pętelki w timera
jakoś tak:
procedure TForm1.Timer1Timer(Sender: TObject);
var ev: TXEvent;
     keys : Integer;
begin
   Label1.Caption:=IntToStr(Mouse.CursorPos.X);
   Label2.Caption:=IntToStr(Mouse.CursorPos.Y);
   XNextEvent(display, @ev);
   if ev._type = X.KeyPress then
     Label3.Caption := 'Key: '+IntToStr(ev.xkey.keycode);
end;

Ale to nie działa - program kończy się bez żadnego komunikatu
błędu. Pewnie coś tu strasznie nachrzaniłem, ale nie radzę
sobie z tym. Może ktoś mi pomóc?

Sławek
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92754
Author: Terrmit
Date: Mon, 01 Dec 2008 21:58
7 lines
1196 bytes
PS. Program w założeniu ma odpowiednio zmieniać położenie
kursora po naciśnięciu klawiszy z klawiatury numerycznej,
Dlatego muszę wykryć, które zostały naciśnięte.
Sam programik po uruchomieniu ma sobie siedzieć w tray-u,
dlatego nie będzie na nim "focusa".

Sławek
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92757
Author: Łukasz 'Maly' Ostrowski
Date: Mon, 01 Dec 2008 23:59
55 lines
2687 bytes
On Mon, 01 Dec 2008 22:49:23 +0100, Terrmit wrote:
> Wykombinowałem coś takiego:
> 
> var
>    Form1: TForm1;
>    display : PDisplay;
> 
> implementation
> 
> procedure TForm1.FormCreate(Sender: TObject);
> var win: TWindow;
>      key, grab: Integer; //GrabModeAsync
> begin
>    display := XOpenDisplay(nil);
>    if display = nil then ShowMessage('Błąd: Nie mogę połączyć się z 
> serwerem X')
>    else begin
>      win := DefaultRootWindow(display);
>      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?

>    end;
>    Timer1.Interval := 10;
> end;
>
> <snippety-snip> 
>
> Ale to nie działa - program kończy się bez żadnego komunikatu
> błędu. Pewnie coś tu strasznie nachrzaniłem, ale nie radzę
> sobie z tym. Może ktoś mi pomóc?

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

P.S. W KDE nie ma accessibility programów do wspomagania
     obsługi myszy?

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.

-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.         http://maly.nemo.pl/
ICQ: 148498663     GG: 2544385   AIM: malyzgora
GTalk: l3vi4than@gmail.com       ASTRA: L3viathan
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92755
Author: Tomasz Minkiewicz
Date: Tue, 02 Dec 2008 08:17
12 lines
1601 bytes
On Mon, 01 Dec 2008 22:58:34 +0100
Terrmit <terrmitv@poczta.onet.pl> wrote:

> PS. Program w założeniu ma odpowiednio zmieniać położenie
> kursora po naciśnięciu klawiszy z klawiatury numerycznej,

W Gnomie jest do tego gotowe rozwiązanie. A jak w Gnomie jest,
to i w KDE na pewno też. W innych środowiskach to nie wiem czy
jest ootb, ale pewnie da się przenieść.

-- 
Tomasz Minkiewicz <tommink@gmail.com>
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92756
Author: Terrmit
Date: Tue, 02 Dec 2008 10:22
13 lines
1487 bytes
Tomasz Minkiewicz pisze:
> On Mon, 01 Dec 2008 22:58:34 +0100
> Terrmit <terrmitv@poczta.onet.pl> wrote:
> 
>> PS. Program w założeniu ma odpowiednio zmieniać położenie
>> kursora po naciśnięciu klawiszy z klawiatury numerycznej,
> 
> W Gnomie jest do tego gotowe rozwiązanie. A jak w Gnomie jest,
> to i w KDE na pewno też. W innych środowiskach to nie wiem czy
> jest ootb, ale pewnie da się przenieść.
> 
Istniejące rozwiązania nie do końca spełniają oczekiwania
mojego znajomego.
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92758
Author: Terrmit
Date: Tue, 02 Dec 2008 10:50
88 lines
4354 bytes
Łukasz 'Maly' Ostrowski pisze:
> On Mon, 01 Dec 2008 22:49:23 +0100, Terrmit wrote:
>> Wykombinowałem coś takiego:
>>
>> var
>>    Form1: TForm1;
>>    display : PDisplay;
>>
>> implementation
>>
>> procedure TForm1.FormCreate(Sender: TObject);
>> var win: TWindow;
>>      key, grab: Integer; //GrabModeAsync
>> begin
>>    display := XOpenDisplay(nil);
>>    if display = nil then ShowMessage('Błąd: Nie mogę połączyć się z 
>> serwerem X')
>>    else begin
>>      win := DefaultRootWindow(display);
>>      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 :/
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.

Rozumiem, że trzeba jakoś inicjalizować key, czy chodzi o to,
że muszę już w XGrabKey wskazać o jaki klawisz chodzi?
Nie wiem co to jest inicjalizacja Sync/Async do grab :(
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".

Jeśli to możliwe prosiłbym o bliższe wskazówki.

> 
>>    end;
>>    Timer1.Interval := 10;
>> end;
>>
>> <snippety-snip> 
>>
>> Ale to nie działa - program kończy się bez żadnego komunikatu
>> błędu. Pewnie coś tu strasznie nachrzaniłem, ale nie radzę
>> sobie z tym. Może ktoś mi pomóc?
> 
> 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ć.

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

> 
> 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ć.

Sławek
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92759
Author: Ł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
Re: [Lazarus] Skrót klawiaturowy w Linuksie
#92760
Author: Terrmit
Date: Wed, 03 Dec 2008 10:43
6 lines
1227 bytes
Serdeczne dzięki za te objaśnienia i przykładzik.
Mam teraz na głowie trochę innej pracy, ale
za chwilę popracuję znów nad tym programem.
Dam znać jak mi idzie.

Sławek
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads