TForm.Handle und GdkWindow

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.

TForm.Handle und GdkWindow

Beitragvon Socke » 28. Feb 2011, 23:41 TForm.Handle und GdkWindow

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
Socke
Lazarusforum e. V.
 
Beiträge: 2636
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Teekeks » 1. Mär 2011, 10:05 Re: TForm.Handle und GdkWindow

Code: Alles auswählen
win := GDK_WINDOW_XWINDOW(PGtkWidget(PtrUInt(Handle))^.window);

win ist vom Typ TWindow
uses: x und gdk2x
Teekeks
 
Beiträge: 359
Registriert: 27. Mai 2009, 19:54
Wohnort: Cottbus
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2) | 
CPU-Target: x86
Nach oben

Beitragvon Scotty » 1. Mär 2011, 10:30 Re: TForm.Handle und GdkWindow

Ist das Gdk-Handle denn wirklich verschieden von Application.Mainform.Handle (bzw. TForm.Handle)?
Scotty
 
Beiträge: 770
Registriert: 4. Mai 2009, 12:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4 | 
CPU-Target: x86_64-linux-qt/gtk2
Nach oben

Beitragvon Socke » 1. Mär 2011, 10:42 Re: TForm.Handle und GdkWindow

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
Socke
Lazarusforum e. V.
 
Beiträge: 2636
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Teekeks » 1. Mär 2011, 10:51 Re: TForm.Handle und GdkWindow

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?
Teekeks
 
Beiträge: 359
Registriert: 27. Mai 2009, 19:54
Wohnort: Cottbus
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2) | 
CPU-Target: x86
Nach oben

Beitragvon Socke » 1. Mär 2011, 10:59 Re: TForm.Handle und GdkWindow

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
Socke
Lazarusforum e. V.
 
Beiträge: 2636
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon pluto » 1. Mär 2011, 12:30 Re: TForm.Handle und GdkWindow

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
Aktuelles Projekt: ContentManager2(Ehmals NoteManager2).
pluto
Lazarusforum e. V.
 
Beiträge: 7022
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg(Oldenburg)
OS, Lazarus, FPC: Linux Mint 19.2 | 
CPU-Target: AMD
Nach oben

Beitragvon Socke » 1. Mär 2011, 12:51 Re: TForm.Handle und GdkWindow

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
Socke
Lazarusforum e. V.
 
Beiträge: 2636
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Scotty » 1. Mär 2011, 13:14 Re: TForm.Handle und GdkWindow

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
Scotty
 
Beiträge: 770
Registriert: 4. Mai 2009, 12:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4 | 
CPU-Target: x86_64-linux-qt/gtk2
Nach oben

Beitragvon Socke » 1. Mär 2011, 13:30 Re: TForm.Handle und GdkWindow

Welche GTK2-Version hast du denn?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
Lazarusforum e. V.
 
Beiträge: 2636
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Scotty » 2. Mär 2011, 10:36 Re: TForm.Handle und GdkWindow

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

(Hat 'ne Weile gedauert, bis ich rausgefunden hatte, wo man die Gtk-Version finden)
Scotty
 
Beiträge: 770
Registriert: 4. Mai 2009, 12:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4 | 
CPU-Target: x86_64-linux-qt/gtk2
Nach oben

Beitragvon Socke » 2. Mär 2011, 21:11 Re: TForm.Handle und GdkWindow

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
Socke
Lazarusforum e. V.
 
Beiträge: 2636
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon pluto » 3. Mär 2011, 13:27 Re: TForm.Handle und GdkWindow

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
Aktuelles Projekt: ContentManager2(Ehmals NoteManager2).
pluto
Lazarusforum e. V.
 
Beiträge: 7022
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg(Oldenburg)
OS, Lazarus, FPC: Linux Mint 19.2 | 
CPU-Target: AMD
Nach oben

Beitragvon Socke » 3. Mär 2011, 18:12 Re: TForm.Handle und GdkWindow

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
Socke
Lazarusforum e. V.
 
Beiträge: 2636
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon pluto » 3. Mär 2011, 19:33 Re: TForm.Handle und GdkWindow

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
Aktuelles Projekt: ContentManager2(Ehmals NoteManager2).
pluto
Lazarusforum e. V.
 
Beiträge: 7022
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg(Oldenburg)
OS, Lazarus, FPC: Linux Mint 19.2 | 
CPU-Target: AMD
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Lazarus - Bugs



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste

cron
porpoises-institution
accuracy-worried