TForm.Handle und GdkWindow

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

TForm.Handle und GdkWindow

Beitrag von Socke »

Hallo,

ich benötige das GdkWindow zu meinem Hauptformular um damit ein paar GDK-API-Funktionen zu benutzen (z.B. Cursor ändern).

An sich sollte das so gehen, wie auch auf der Mailingliste zu lesen ist:

Code: Alles auswählen

uses
  gtk2, gdk2;
var
  wdk: PGtkWidget;
  wnd: PGdkWindow;
begin
  wdk := PGtkWidget(Form1.Handle);
  wnd := wdk^.window;

Das Formular-Handle ist gültig, enthält aber in .window nur nil.

Getestet unter
  • Linux 32bit, FPC 2.5.1 R16611, Lazarus 0.9.31 R29692, GTK 2.20.0
  • Windows XP 32bit, FPC 2.2.2, Lazarus 0.9.26, GTK 2.14.3

Kann das jemand nachvollziehen oder auch widerlegen?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: TForm.Handle und GdkWindow

Beitrag von Teekeks »

Code: Alles auswählen

win := GDK_WINDOW_XWINDOW(PGtkWidget(PtrUInt(Handle))^.window);

win ist vom Typ TWindow
uses: x und gdk2x

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von Scotty »

Ist das Gdk-Handle denn wirklich verschieden von Application.Mainform.Handle (bzw. TForm.Handle)?

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von Socke »

Vielen Dank für eure Antworten.
Scotty hat geschrieben:Ist das Gdk-Handle denn wirklich verschieden von Application.Mainform.Handle (bzw. TForm.Handle)?

TForm.Handle ist ein GtkWidget, genauer ein GtkWindow (letzteres ist von ersterem abgeleitet) und daher niemals ein Gdk-Handle. Wenn du nur den Wert meinst (was sich aus dem ersten Satz bereits ergibt), möchte ich die Auffassung vertreten, dass nil von allem verschieden ist.

Teekeks hat geschrieben:

Code: Alles auswählen

win := GDK_WINDOW_XWINDOW(PGtkWidget(PtrUInt(Handle))^.window);

Warum castest du das Handle zuerst in einen PtrUInt und dann in PGtkWidget?
Was macht/ist GDK_WINDOW_XWINDOW -- nur ein weiterer Typcast oder eine Funktion? -- und was kann man mit nil als Eingabe erreichen? Ganz grob geraten: erhält man mit GDK_WINDOW_XWINDOW das X-Fenster von einem GdkWindow?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: TForm.Handle und GdkWindow

Beitrag von Teekeks »

Socke hat geschrieben:Warum castest du das Handle zuerst in einen PtrUInt und dann in PGtkWidget?
Was macht/ist GDK_WINDOW_XWINDOW -- nur ein weiterer Typcast oder eine Funktion? -- und was kann man mit nil als Eingabe erreichen? Ganz grob geraten: erhält man mit GDK_WINDOW_XWINDOW das X-Fenster von einem GdkWindow?

Oh, Tatsache, das Casten auf PtrUint kann man weg lassen, hab das nur aus einem Projekt von mir raus kopiert ^^.
GDK_WINDOW_XWINDOW ist eine Funktion.
Und deine Vermutung ist (soweit ich das weiß ^^) genau richtig.
Wie meinst du das mit nil als Eingabe?
Wenn du kein Handle angibst oder wie?

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von Socke »

Teekeks hat geschrieben:Und deine Vermutung ist (soweit ich das weiß ^^) genau richtig.

Ich brauche aber ein GdkWindow-Handle; gdk_window_set_cursor() (oder so ähnlich) will ich nicht zumuten mit irgendetwas anderem zu arbeiten.

Teekeks hat geschrieben:Wie meinst du das mit nil als Eingabe?
Wenn du kein Handle angibst oder wie?

Socke hat geschrieben:Das Formular-Handle ist gültig, enthält aber in .window nur nil.

Gemeint war, dass PGtkWidget(TForm.Handle)^.window = nil bei mir eine Tautologie ist :D Somit habe ich zwar ein GtkWidget aber kein GdkWindow. Oder stehe ich hier auf dem Schlauch und TForm.Handle ist gar nicht das richtige Handle für meine Zwecke?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TForm.Handle und GdkWindow

Beitrag von pluto »

Warum brauchst du Api Funktionen um den Cursor zu ändern? Meinst du den Mauszeiger? Oder den Tastertur Cursor? Bei SynEdit kann z.b. beides geändert werden.
Theoretisch könnte man auch Relativ leicht den Cursor von einem Edit oder Memo Ändern. Es gibt entsprechende Funktionen in der LCLInft oder LCLType oder LCLProc(Da bin ich mir nicht mehr so sicher)....
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von Socke »

pluto hat geschrieben:Warum brauchst du Api Funktionen um den Cursor zu ändern? Meinst du den Mauszeiger? Oder den Tastertur Cursor?

Ich möchte den Mauszeiger ändern. GDK-API deshalb, weil es ein paar GDK-Standard-Cursor gibt, die ich gerne einmal ausprobieren möchte (z.B. GDK_CROSS und GDK_CROSSHAIR). Denen kommt der Lazarus-Cursor crCross am Nächsten, bietet in der Mitte aber kein "Fenster" zum durchschauen.

Mir fällt da gerade noch ein, dass ich eventuell den Mauszeiger noch an einer zweiten Position/in einem zweiten Fenster zeichnen will; dafür brauche ich wahrscheinlich eine Rastergrafik (oder kann man einen Mauszeiger an zwei Positionen in zwei Größen zeichnen?).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von Scotty »

Interessant, was so alles im Handle drin steht...
Ich habe das gerade mal ausprobiert und bei mir enthält .window Daten (Debugger wdk^.window^):

Code: Alles auswählen

record TGDKDRAWABLE {
  PARENT_INSTANCE = {
    G_TYPE_INSTANCE = {
      G_CLASS = $cd35d0},
    REF_COUNT = 9,
    QDATA = $db4480}}

Lazarus 0.9.31 r28865M FPC 2.5.1 x86_64-linux-gtk 2
Linux 2.6.37.1-14-desktop #1 SMP PREEMPT 2011-02-18 11:48:25 +0100 x86_64 x86_64 x86_64 GNU/Linux
SuSE 11.3 mit KDE, Lazarus kompiliert und Target als gtk2

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von Socke »

Welche GTK2-Version hast du denn?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von Scotty »

pkg-config --modversion gtk+-x11-2.0
2.20.1

(Hat 'ne Weile gedauert, bis ich rausgefunden hatte, wo man die Gtk-Version finden)

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von Socke »

So groß ist der Unterschied jetzt auch nicht, weder bei GTK2 noch bei Lazarus oder FPC.

Kann mir mal bitte jemand erklären, warum ich auf zwei verschiedenen Maschinen kein Handle hab, du aber schon?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TForm.Handle und GdkWindow

Beitrag von pluto »

ich habe das bei meiner XINE-Unit genau so gemacht, jedoch für GTK1: win := GDK_WINDOW_XWINDOW(PGtkWidget(PtrUInt(Handle))^.window);
Sollte aber auch für GTK2 gehen. Probiere doch mal ein Panel zu nehmen satt ein Form.
(Dürfte zwar kein Unterschied machen, in diesenfall, aber wer weiß)
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von Socke »

pluto hat geschrieben:ich habe das bei meiner XINE-Unit genau so gemacht, jedoch für GTK1: win := GDK_WINDOW_XWINDOW(PGtkWidget(PtrUInt(Handle))^.window);

Bisher gehe ich immernoch davon aus, dass ich ein GDK- und kein X11-Handle brauche, aber keins habe ... Aber das zeigt wohl, dass ich irgendwo ein Problem habe.
pluto hat geschrieben:Sollte aber auch für GTK2 gehen. Probiere doch mal ein Panel zu nehmen satt ein Form.

Eigentlich wollte ich so wenig Komponeten wie möglich verwenden; daher zeichne ich alles auf den Canvas des Formulars (der hat schließlich auch noch 'nen Handle zum Testen!), aber einen Versuch ist es wert.

Edit: gerade getestet, aber weder Panel noch GroupBox haben ein GDK-Window...
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TForm.Handle und GdkWindow

Beitrag von pluto »

Kannst du ein vergleichbares Beispiel erzeugen mit deinem Problem und das hochladen?
Dann können wir es ebenfalls versuchen. Dein Ziel ist es doch einen eigenen Mauszeiger zu verwenden bzw. die vorhandenen Mauzeiger zu erweitern.

hast du dir schon mal angeschaut, wie Lazarus bzw. die LCL die Mauszeiger verwaltet? Vielleicht kannst du es erweitern. Meines wissens sind es Konstanten. Wenn du die Nummern raus bekommst, müsste es klappen.
Es könnte aber auch sein, dass Einträge in der Res Datei fehlen.
MFG
Michael Springwald

Antworten