🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: [Lazarus] Skrót klawiaturowy w Linuksie

#92753
From: 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
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-mail
References: <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