Article View: pl.comp.lang.pascal
Article #92753Re: [Lazarus] Skrót klawiaturowy w Linuksie
From: 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
Technical Details
Message-ID:
<gh1m54$3mi$1@achot.icm.edu.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news2.icm.edu.pl!not-for-mailReferences:
<ggum6m$a7f$1@achot.icm.edu.pl> <ggut30$j1e$1@achot.icm.edu.pl> <1e1rz5s7181lg.1r5mxgapek4gh.dlg@40tude.net>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news2.icm.edu.pl!not-for-mail From: Terrmit <terrmitv@poczta.onet.pl> Newsgroups: pl.comp.lang.pascal Subject: Re: [Lazarus] Skrót klawiaturowy w Linuksie Date: Mon, 01 Dec 2008 22:49:23 +0100 Organization: http://news.icm.edu.pl/ Lines: 81 Message-ID: <gh1m54$3mi$1@achot.icm.edu.pl> References: <ggum6m$a7f$1@achot.icm.edu.pl> <ggut30$j1e$1@achot.icm.edu.pl> <1e1rz5s7181lg.1r5mxgapek4gh.dlg@40tude.net> NNTP-Posting-Host: chello089076219239.chello.pl Mime-Version: 1.0 X-Trace: achot.icm.edu.pl 1228168164 3794 89.76.219.239 (1 Dec 2008 21:49:24 GMT) X-Complaints-To: abuse@icm.edu.pl NNTP-Posting-Date: Mon, 1 Dec 2008 21:49:24 +0000 (UTC) In-Reply-To: <1e1rz5s7181lg.1r5mxgapek4gh.dlg@40tude.net> User-Agent: Thunderbird 2.0.0.18 (X11/20081119) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit