TForm.Handle und GdkWindow

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
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 »

@pluto:
Das Problem ist das man mit unserer Methode ein TXID oder auch ein TWindow (ist das gleiche) zurück bekommt, er aber ein TGdkWindow möchte.

Aber ich glaube eine Funktion gesehen zu haben mit der man eine TXID zu einem TGdkWindow umwandeln kann... Mal gucken ob ich das nochmal finde...

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:Kannst du ein vergleichbares Beispiel erzeugen mit deinem Problem und das hochladen?

gdktest.tar.gz
Beispiel um zu überprüfen ob TForm.Handle ein GdkWindow referenziert
(1.71 MiB) 162-mal heruntergeladen

Das Beispiel ist wirklich trivial. Wenn bei dir eine andere Adresse als nil angezeigt wird, ist bei dir alles in Ordnung. Wichtig: Widgetset auf GTK2 stellen.

Teekeks hat geschrieben:Das Problem ist das man mit unserer Methode ein TXID oder auch ein TWindow (ist das gleiche) zurück bekommt, er aber ein TGdkWindow möchte.

Bis auf die exakten Bezeichnungen stimmt das in etwa, aber die sind erstmal egal :D. Vielleicht ist dir sogar aufgefallen, dass ihr für die ebenfalls ein GdkWindow benötigt, um von dort das X-Window zu erhalten -- und wenn man da nil hinein gibt, kommt auch nil wieder heraus.

pluto hat geschrieben: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.

Hab ich auch schon versucht, aber nichts sinnvolles gefunden. Eine Zuweisung an Cursor ergibt in etwa folgendes:
  • Zuweisung des neuen Cursors an das Feld FCursor
  • Aufruf von Perform(CM_CURSORCHANGED, 0, 0);
  • Ich kann keinen MessageHandler für diese Message finden.
Also da weiß ich auch nicht weiter, wie das überhaupt funktionieren kann.
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 »

Code: Alles auswählen

Self.Handle ist GtkWidget: True
GdkHandle: 00000000

Wenn du das Handle an anderer Stelle als OnCreate abfragst, zum Beispiel Button1.OnClick() dann steht das hier drin:

Code: Alles auswählen

Self.Handle ist GtkWidget: True
GdkHandle: 0000000000CB4E00

Damit sollte einiges klarer sein :mrgreen:

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 »

Scotty hat geschrieben:Wenn du das Handle an anderer Stelle als OnCreate abfragst, zum Beispiel Button1.OnClick() dann steht das hier drin:

Code: Alles auswählen

Self.Handle ist GtkWidget: True
GdkHandle: 0000000000CB4E00

Damit sollte einiges klarer sein :mrgreen:

An welchen stellen funktioniert das denn einwandfrei -- oder besser: wo funktionierts und wo ist es sinnvoll? Ich meine OnShow getestet zu haben, und da kam auch nichts heraus.
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 »

Wäre es denkbar, dass das Handle nicht beim onCreate eines Froms zu Verfügung steht?
Bau das mal bei OnShow ein oder onAcitivate. Das sollte reichen.
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:Wäre es denkbar, dass das Handle nicht beim onCreate eines Froms zu Verfügung steht?
Bau das mal bei OnShow ein oder onAcitivate. Das sollte reichen.

Also genau das war meine Frage.
Ich hab mal getestet:
  • Create: nein
  • FirstShow: Nein
  • Show: Nein
  • Activate: ja
Meiner Meinung nach ist es aber völlig bescheuert, bei jeder Aktivierung den Cursor zu überprüfen -- auch, wenn es in meinem Fall nur einmal sein sollte.
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 »

Bau einen OnIdle-Handler ein und hänge den am Ende wieder ab (OnIdle:=nil).

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 »

Scotty hat geschrieben:Bau einen OnIdle-Handler ein und hänge den am Ende wieder ab (OnIdle:=nil).

Dann kann ich mein OnActivate-Event genau so gut auch wieder als Event-Handler austragen.
Davon mal abgesehen, hat sich an meinem Cursor eh recht wenig (genauer: gar nichts) geändert
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von MitjaStachowiak »

Hy, der Thread ist zwar uralt, aber ich komme an der gleichen Stelle nicht weiter:
Ich möchte mit gtk_widget_hide ein Fenster verstecken, äquivalent zu Windows.ShowWindow(...). Habe das versucht:

Code: Alles auswählen

 
uses gtk2;
gtk_widget_hide(PGtkWidget(myForm.Handle)); // dud nix
gtk_widget_hide_all(PGtkWidget(myForm.Handle)); // macht alle Elemente im Fenster unsichtbar, das Fenster selbst bleibt sichtbar
 


Wenn ich mir das Verhalten von hide_all so ansehe, ist das Handle hier offenbar auch nicht der richtige Ansprechpartner, da es sich sozusagen auf den Inhalt des Fensters bezieht. Mit PGtkWidget(myForm.Handle)^.window hatte ich auch keinen Erfolg.

Eigentlich möchte ich gtk_widget_set_parent_window benutzen, aber der Einfachheit halber erst mal gtk_widget_hide zum laufen bringen. Nur wie? myForm.visible := false; geht auch nicht. Kann's sein, dass das alles überhaupt nicht implementiert ist?

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: TForm.Handle und GdkWindow

Beitrag von MitjaStachowiak »

Hmm, offenbar geht es unter Linux generell nicht, ein Fenster in einem anderen Fenster eines anderen Prozesses anzuzeigen. Ich muss die gesamte GUI also in einem Programm halten und alle Infos, die vom Zweitprozess an die GUI gehen, über das MemmoryMapping schaufeln. Das wird 'ne Menge Arbeit :|

Antworten