Alternative zu Registerhotkey..

Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Alternative zu Registerhotkey..

Beitrag von corpsman »

Guten Morgen ich suche eine Alternative von Registerhotkey für Linux.

Wenns was Plattformunabhängiges gäbe auch ok.

diesen Thread gibts zu dem Thema zwar schon, doch scheint der nicht sehr Produktiv gewesen zu sein.

Ich will einen Globalen Hotkey setzen z.b. STRG + SHIFT + N und dann nen Event in meiner Anwendung haben wenn diese Kombination gedrückt wurde ;).

Google war leider auch nicht sehr hilfreich, deswegen hoffe ich nun auf euch ..
--
Just try it

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Alternative zu Registerhotkey..

Beitrag von Targion »

Du könntest das mittels XGrabKey manuell machen.
Hier wird das schön beschrieben.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Alternative zu Registerhotkey..

Beitrag von corpsman »

Hmm, ich hab das zwar gefunden, man mus xlib und x einbinden, aber wenn ich testweise mal

Code: Alles auswählen

i := XGrabKey(Nil, 65, ShiftMask { welche Maske hat STRG ? }, self.handle, 0, GrabModeAsync, GrabModeAsync);
  showmessage(inttostr(i));


Aufrufe, dann bekommte ich nur ne AV, auch ist mir nicht klar wo ich da die Callback angeben mus ?
--
Just try it

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Alternative zu Registerhotkey..

Beitrag von _X_ »

corpsman hat geschrieben:{ welche Maske hat STRG ? }
Controlmask.

mfg _X_

edit:// Ah ja, und mit nil als Display kanns nix werden.
Wenn schon, dann so:

Code: Alles auswählen

var dpy:PDisplay;
begin
dpy := XOpenDisplay(nil);
i := XGrabKey(dpy, 101, ControlMask+Shiftmask, self.handle, 0, GrabModeAsync, GrabModeAsync);
showmessage(inttostr(i));
XCloseDisplay(dpy);
PS: die xlib kenn nur Kleinbuchstaben, also dann.
Das ganze ist jetzt nur aus dem Kopf getippt. Ich gebe keine Garantie, das es funktioniert.

edit2:// Warum übersetzt du nicht einfach den Code von dem Link, von Targion?

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Alternative zu Registerhotkey..

Beitrag von corpsman »

*g*

also den 2. Link von targion hatte ich gar nicht bemerkt.

Hab das mal übersetzt und nun kommt zumindest keine AV mehr. aber so recht wills immer noch nicht.

Das Problem ist, das in dem Tutorial ja ne Endlosschleife bauen, welche die Events Abfrägt.

Ich hab also nen Timer gemacht und etwas derart :

Code: Alles auswählen

Procedure TForm1.Timer1Timer(Sender: TObject);
Var
  e: PXEvent;
Begin
  If dpy = Nil Then exit;
  new(e);
  XNextEvent(dpy, e);
  If e^._type = KeyReleaseMask Then Begin
    If e^.xkey.keycode = f2 Then Begin
      showmessage('jeha');
    End;
  End;
  dispose(e);
End;


reingesetzt. Nun bleibt die XNextEvent Methode aber einfach stehen. Und blockiert damit die Komplette Anwendung, also entweder bedeutet das , das ich nen Extra Thread aufmachen muss um die Globalen Shortcuts ab zu fragen, und dieser gibt mir dann via Callbacks an die Hauptanwendung meine Befehle weiter, oder ich hab hier etwas falsch verstanden ..
Und Wenn ich das mit Hilfe eines Threads mache, kriege ich das bestimmt hin, ja bis darauf das ich den Thread dann nicht beendet bekomme, da der ja stehen bleibt so lange kein Globaler Hotkey kam ...

Hab ich da nun irgendetwas übersehen ?
--
Just try it

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Alternative zu Registerhotkey..

Beitrag von _X_ »

Das ist blöd. Damit man an die Events zur richtigen Zeit ran kommt, müsste man die LCL verändern.
Also die Mainloop.

mfg _X_

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Alternative zu Registerhotkey..

Beitrag von Targion »

Die XNextEvent-Methode bleibt stehen? Das darf sie in keinem Fall... Die GLib bietet leider nichts vergleichbarers, und andere Lösungen, die mir einfallen sind KDE oder GNOME spezifisch...
Ein Timer ist keine gute Methode, um Events abzufangen. Mache das in einem Extrathread in einer Endlosschleife. (Obwohl auch da XNextEvent keinen freeze verursachen darf...)

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Alternative zu Registerhotkey..

Beitrag von mschnell »

_X_ hat geschrieben:Damit man an die Events zur richtigen Zeit ran kommt, müsste man die LCL verändern.

Mit Dispatch kann ein Thread eine Message in die Queue senden, die der Mainthread dann bearbeitet, wenn sie dran ist.

-Michael

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Alternative zu Registerhotkey..

Beitrag von corpsman »

So ich hab das ganze mal in ein Sample gepackt.

Das einzige es nun noch nicht zu gehen scheint, ist das ich den Shortcut auf STRG +SHIFT + N nicht bekomme, der für F2 geht aber ;)

Code: Alles auswählen

(* das geht anscheinend nicht, zumindest ist kein Hotkey auf STRG + SHIFT + N *)
    //    XGrabKey(dpy, 101, ControlMask + Shiftmask, root, 1, GrabModeAsync, GrabModeAsync);
    F2 := XKeysymToKeycode(dpy, XStringToKeysym('F2'));


[ edit ]

Jipy, man mus es nur kombinieren :

Code: Alles auswählen

STRG_SHIFT_N := XKeysymToKeycode(dpy, XStringToKeysym('N'));
    XGrabKey(dpy, STRG_SHIFT_N, ControlMask + Shiftmask, root, 1, GrabModeAsync, GrabModeAsync);


Die Frage ist nun nur noch, ob da so alles richtig frei gegeben wird.
Dateianhänge
Sample.zip
(2.88 KiB) 99-mal heruntergeladen
--
Just try it

Antworten