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
Author: Terrmit
Date: Sun, 30 Nov 2008 18:31
Date: Sun, 30 Nov 2008 18:31
15 lines
1271 bytes
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
Author: Terrmit
Date: Sun, 30 Nov 2008 20:29
Date: Sun, 30 Nov 2008 20:29
26 lines
1852 bytes
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
Author: Łukasz 'Maly' Ostrowski
Date: Mon, 01 Dec 2008 00:19
Date: Mon, 01 Dec 2008 00:19
25 lines
1793 bytes
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
Author: Terrmit
Date: Mon, 01 Dec 2008 10:04
Date: Mon, 01 Dec 2008 10:04
33 lines
2264 bytes
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
Author: Terrmit
Date: Mon, 01 Dec 2008 21:49
Date: Mon, 01 Dec 2008 21:49
81 lines
3367 bytes
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
Author: Terrmit
Date: Mon, 01 Dec 2008 21:58
Date: Mon, 01 Dec 2008 21:58
7 lines
1196 bytes
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
Author: Łukasz 'Maly' Ostrowski
Date: Mon, 01 Dec 2008 23:59
Date: Mon, 01 Dec 2008 23:59
55 lines
2687 bytes
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
Author: Tomasz Minkiewicz
Date: Tue, 02 Dec 2008 08:17
Date: Tue, 02 Dec 2008 08:17
12 lines
1601 bytes
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
Author: Terrmit
Date: Tue, 02 Dec 2008 10:22
Date: Tue, 02 Dec 2008 10:22
13 lines
1487 bytes
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
Author: Terrmit
Date: Tue, 02 Dec 2008 10:50
Date: Tue, 02 Dec 2008 10:50
88 lines
4354 bytes
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
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 03 Dec 2008 06:58
Date: Wed, 03 Dec 2008 06:58
140 lines
6131 bytes
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
Author: Terrmit
Date: Wed, 03 Dec 2008 10:43
Date: Wed, 03 Dec 2008 10:43
6 lines
1227 bytes
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