Mit GTK4 spielen.

Zur Vorstellung von Komponenten und Units für Lazarus
Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mit GTK4 spielen.

Beitrag von Mathias »

Ich wollte mal das Tool gir2pas ausprobieren.

Da habe ich mal folgendes probiert:

Code: Alles auswählen

./gir2pas -i /usr/share/gir-1.0/Gtk-4.0.gir -o gtk4_units
Nun habe ich einen Ordner mit Units bekommen unter anderem auch eine gtk4.pas

Die wollte ich ausprobieren und wurde mit vielen Fehlern bombardiert.
Viele Bezeichner werden nicht gefunden.

Anscheinend ist da noch sehr viel Handarbeit nötig, oder ich mache etwas falsch.
Ob da Theo sehr viele Stunden investiert hat, denke ich kaum ?

Was noch interesant ist, es werden viele Objecte erstellt, obwohl die bei GTK eigentlich gar nicht nötig ist.

Code: Alles auswählen

  { TGtkButton }
  PPGtkButton = ^PGtkButton;
  PGtkButton = ^TGtkButton;
  TGtkButton = object(TGtkWidget)
    function new: PGtkButton; cdecl; inline; static;
    function new_from_icon_name(icon_name: Pgchar): PGtkButton; cdecl; inline; static;
    ....
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: Mit GTK4 spielen.

Beitrag von theo »

Ja, da ist immer noch Nacharbeit nötig.
Ich hatte ja mal einen Patch gemacht, damit gir2pas für GTK4 überhaupt was tut.
https://gitlab.com/freepascal.org/lazar ... sues/40196

Soner
Beiträge: 724
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Mit GTK4 spielen.

Beitrag von Soner »

Mathias hat geschrieben: Mo 8. Jul 2024, 15:51 ...
Was noch interesant ist, es werden viele Objecte erstellt, obwohl die bei GTK eigentlich gar nicht nötig ist.
...
Jemand, der die gtk3-Units übersetzt hat, hatte gir2pas geändert, damit es Objekte erzeugt, damals war es war beim englischen Forum zu lesen. Vielleicht kannst du es wieder rückgänging machen, weil es dem Projekt überhaubt nicht gut getan hat.
Wenn er damals wie bei Gtk2 normale prozedurale Bibliotheken erzeugt hätte, wäre Gtk3- und Gtk4-Schnittstelle wahrscheinlich schon fertig, weil man nur Gtk2-Widgetset kopiert und geänderte Sachen anpassen musste.

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: Mit GTK4 spielen.

Beitrag von theo »

Soner hat geschrieben: Mi 10. Jul 2024, 00:58 Wenn er damals wie bei Gtk2 normale prozedurale Bibliotheken erzeugt hätte, wäre Gtk3- und Gtk4-Schnittstelle wahrscheinlich schon fertig, weil man nur Gtk2-Widgetset kopiert und geänderte Sachen anpassen musste.
Das glaube ich eigentlich nicht.
Das Problem scheint mir eher, dass man zu sehr auf dem GTK1- und GTK2-Lazarus-Interface aufgebaut hat, obwohl man das ganze besser "neu gedacht" hätte.
Aber es ist natürlich zu verlockend es so zu versuchen, auch wenn es am Ende zu fast unlösbaren Verrenkungen und Verstrickungen führt, da sich halt doch vieles geändert hat zw. GTK2 und GTK3.

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mit GTK4 spielen.

Beitrag von Mathias »

Das Problem scheint mir eher, dass man zu sehr auf dem GTK1- und GTK2-Lazarus-Interface aufgebaut hat, obwohl man das ganze besser "neu gedacht" hätte.
Wie alles wissen, sollte die LCL möglichst kompatibel zu Delphi sein und Delphi hat vieles von der WINAPI übernommen.
Daher vermute ich, das die LCL für Linux viel mehr Murkse braucht, als mit der Verbindung zur WINAPI.
GTKx ist ganz anders aufgebaut als die WINAPI.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6762
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Mit GTK4 spielen.

Beitrag von af0815 »

wenn man sich das tiefer ansieht, so ist gtk4 (auch gtk3) näher bei QTx. Wenn ich da was machen müsste, würde ich den Ansatz eher von QT nehmen als das ganze mit gtk2 zu betrachten. Die gtk2 Implementierung würde ich mal außen vor lassen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mit GTK4 spielen.

Beitrag von Mathias »

wenn man sich das tiefer ansieht, so ist gtk4 (auch gtk3) näher bei QTx.
So viel mir ist, braucht QTx zwingend C++, da es objektorientiert mit class ist
GTKx läuft mit einfachem C.

Das es für FPC die libqt5pas-dev gibt, hat eigentlioch mit C/C++ gar nichts zu tun.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6762
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Mit GTK4 spielen.

Beitrag von af0815 »

Ich meine die Art und Weise wie auf das Interface zugegriffen wird, ob da jetzt die libqt5pas oder eine libgtk4pas liegt ist Nebensache, schau dir die Implementierung in der Tiefe Mal an.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

PascalDragon
Beiträge: 945
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Mit GTK4 spielen.

Beitrag von PascalDragon »

Mathias hat geschrieben: Mi 10. Jul 2024, 17:35
wenn man sich das tiefer ansieht, so ist gtk4 (auch gtk3) näher bei QTx.
So viel mir ist, braucht QTx zwingend C++, da es objektorientiert mit class ist
GTKx läuft mit einfachem C.
GTK ist auch objektorientiert. Die glib und ähnliche Bibliotheken bauen ein Objektframework auf, welches ähnliche Mächtigkeit wie das von C++ oder Object Pascal hat. Demnach, ja, GTK, vor allem höhere Versionen, sind da ähnlicher zu Qt. Außerdem war auch die Idee für die GTK3 Schnittstelle von Lazarus aus den Problemen des GTK2 Backends zu lernen (welches letztlich auf GTK1 basiert und wiederum die allererste von Lazarus unterstützte Schnittstelle war).
Mathias hat geschrieben: Mi 10. Jul 2024, 17:35 Das es für FPC die libqt5pas-dev gibt, hat eigentlioch mit C/C++ gar nichts zu tun.
Doch, es hat sogar sehr viel mit C++ zu tun, da C++-Klassen nicht einfach so mit FPC genutzt werden können.
FPC Compiler Entwickler

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mit GTK4 spielen.

Beitrag von Mathias »

Ich bin auch am üben mit GTK4. Unter Linux läuft es bestens.
Aber mit Windows und dem Einbinden der DLLs habe ich Mühe.

Ich konnte GTK4 für Windows bauen, alle DLLs sehen in der Form so aus 'libxxx-x.x.dll'

Ein vorweg, ich habe ein C-HelloWorld unter Linux für Windows Cross compiliert.
Dies mache ich so.

Code: Alles auswählen

$ x86_64-w64-mingw32-gcc -o main main.c `pkg-config --cflags gtk4 --libs gtk4` -I/usr/local/include
Um zu sehen, was mit "pkg-config" eingebunden wird, habe ich folgendes gemacht.

Code: Alles auswählen

$ pkg-config --cflags gtk4 --libs gtk4
-I/usr/local/include/gtk-4.0 -I/usr/local/include/pango-1.0 -I/usr/local/include -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -I/usr/local/include/harfbuzz -I/usr/local/include/fribidi -I/usr/local/include/cairo -I/usr/local/include/pixman-1 -I/usr/local/include/gdk-pixbuf-2.0 -I/usr/local/include/graphene-1.0 -I/usr/local/lib/graphene-1.0/include -mfpmath=sse -msse -msse2 -mms-bitfields -L/usr/local/lib -lgtk-4 -lpangowin32-1.0 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lgraphene-1.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl 
Die erstellte exe funktioniert, bis auf eine kleine Darstellungsfehler.
Aber was viel spannender ist, ist '-lgtk-4', ' -lgio-2.0 -lgobject-2.0',
Diese 3 Parameter sehen recht nackt aus. vonrne ohne 'lib' und hinten ohne 'dll'.

Nun habe ich es in Pascal folgendermassen probiert, auch dies funktioniert.

Code: Alles auswählen

program project1;

uses
  Math;

{$IFDEF linux}
const
  gtklib = 'libgtk-4.so';
  libgio = 'libgio-2.0.so.0';
  gobjectlib = 'libgobject-2.0.so';
{$ENDIF}
{$IFDEF WINDOWS}
const
  gtklib = 'libgtk-4-1.dll';
  libgio = 'libgio-2.0-0.dll';
  gobjectlib = 'libgobject-2.0-0.dll';
{$ENDIF}

// ---- libgtk-4

type
  TGTKWidget = Pointer;
  PGTKWidget = ^TGTKWidget;

  TGTKButton = Pointer;
  PGTKButton = ^TGTKButton;

  TGTKWindow = Pointer;
  PGTKWindow = ^TGTKWindow;

  TGtkApplication = Pointer;
  PGtkApplication = ^TGtkApplication;

  function gtk_application_new(application_id: PChar; flags: int64): PGtkApplication; cdecl; external gtklib;
  function gtk_application_window_new(application: PGtkApplication): PGtkWidget; cdecl; external gtklib;
  procedure gtk_window_present(window: PGtkWindow); cdecl; external gtklib;
  function gtk_button_new_with_label(_label: PChar): PGtkWidget; cdecl; external gtklib;
  procedure gtk_window_set_child(window: PGtkWindow; child: PGtkWidget); cdecl; external gtklib;
  procedure gtk_window_set_default_size(window: PGtkWindow; Width: longint; Height: longint); cdecl; external gtklib;
  procedure gtk_window_set_title(window: PGtkWindow; title: PChar); cdecl; external gtklib;
  function gtk_button_get_label(button: PGtkButton): PChar; cdecl; external gtklib;

// ------ libgio

  function g_application_run(application: Pointer; argc: longint; argv: PPchar): longint; cdecl; external libgio;

// ------ glib

type
  TGCallBackProcedure = procedure;
  TGCallback = procedure(para1: TGCallBackProcedure); cdecl;

  TGClosureNotify = procedure(Data: Pointer; closure: Pointer); cdecl;


  function g_signal_connect_data(instance: Pointer; detailed_signal: PChar; c_handler: TGCallback; Data: Pointer; destroy_data: TGClosureNotify; connect_flags: longint): longint; cdecl; external gobjectlib;

  function g_signal_connect(instance: Pointer; detailed_signal: PChar; c_handler: TGCallback; Data: Pointer): longint;
  begin
    g_signal_connect := g_signal_connect_data(instance, detailed_signal, c_handler, Data, nil, 0);
  end;

  function G_CALLBACK(f: pointer): TGCallback;
  begin
    G_CALLBACK := TGCallback(f);
  end;

// ------- Eigenes

  procedure btn_Click(button: PGTKWidget; user_data: Pointer);
  begin
    WriteLn(gtk_button_get_label(button));
  end;

  procedure activate(app: PGtkApplication; user_data: Pointer);
  var
    window, button: PGTKWidget;
  begin
    window := gtk_application_window_new(app);

    gtk_window_set_default_size(window, 640, 480);
    gtk_window_set_title(window, 'Hello GTK-4');

    button := gtk_button_new_with_label('Mein Button');

    g_signal_connect(button, 'clicked', G_CALLBACK(@btn_Click), nil);
    gtk_window_set_child(window, button);

    gtk_window_present(window);
  end;

  procedure main;
  var
    app: PGtkApplication;
  begin
    app := gtk_application_new('org.gtk.example', 0);

    g_signal_connect(app, 'activate', G_CALLBACK(@activate), nil);
    g_application_run(app, 0, nil);
  end;

begin
  SetExceptionMask([exDenormalized, exInvalidOp, exOverflow, exPrecision, exUnderflow, exZeroDivide]);
  main;
end.
Man beachte zuoberst die lin Konstanten.

Diese wollte ich auch abspecken, so wie es bei "pkg-config" der Fall ist.

Code: Alles auswählen

{$IFDEF WINDOWS}
const
  gtklib = 'gtk-4';
  libgio = 'gio-2.0';
  gobjectlib = 'gobject-2.0';
//const
//  gtklib = 'libgtk-4-1.dll';
//  libgio = 'libgio-2.0-0.dll';
//  gobjectlib = 'libgobject-2.0-0.dll';
{$ENDIF}  
Nur dann bekomme ich folgende Fehler, wen ich mein Project starte.

Einer eine Idee woran dies liegt ?

Code: Alles auswählen

$ wine project1.exe 
00dc:err:module:import_dll Library gtk-4.dll (which is needed by L"Z:\\home\\tux\\Schreibtisch\\gtk_4_native\\project1.exe") not found
00dc:err:module:import_dll Library gio-2.0 (which is needed by L"Z:\\home\\tux\\Schreibtisch\\gtk_4_native\\project1.exe") not found
00dc:err:module:import_dll Library gobject-2.0 (which is needed by L"Z:\\home\\tux\\Schreibtisch\\gtk_4_native\\project1.exe") not found
00dc:err:module:loader_init Importing dlls for L"Z:\\home\\tux\\Schreibtisch\\gtk_4_native\\project1.exe" failed, status c0000135
Mache ich das selbe unter Linux, dann geht es,

Code: Alles auswählen

{$IFDEF linux}
const
  gtklib = 'gtk-4';
  libgio = 'gio-2.0';
  gobjectlib = 'gobject-2.0';
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 945
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Mit GTK4 spielen.

Beitrag von PascalDragon »

Mathias hat geschrieben: Mo 11. Nov 2024, 18:17 Einer eine Idee woran dies liegt ?
Unter *nix-Systemen ist lib ein gängiges Präfix, weshalb FPC bzw. der Linker das automatisch hinzufügt. Unter Windows aber eben nicht. Wenn du also lib vorne haben möchtest, dann musst du das auch hinzufügen (du könntest zum Beispiel eine Konstante LibPrefix = 'lib' unter Windows und LibPrefix = '' unter *nix machen und die in all deinen Konstantendeklarationen verwenden). Oder dafür sorgen, dass deine Bibliotheken ohne lib Präfix gebaut werden.
FPC Compiler Entwickler

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mit GTK4 spielen.

Beitrag von Mathias »

Unter *nix-Systemen ist lib ein gängiges Präfix, weshalb FPC bzw. der Linker das automatisch hinzufügt. Unter Windows aber eben nicht.
Wen ich es richtig verstehe, liegt die an FPC unter Windows, mit gcc geht es ja scheinbar ohne.

Irgendwas hatte es gestern blöde getan, heute bei einem neuen Anlauf funktionierte es. Immerhin läuft jetzt GTK4 unter Windows in der VB. Wine hat Grafikfehler. Die Test-App benutzt aber schon einige Widgets von GTK4.
Dateianhänge
bild.png
bild.png (72.25 KiB) 2568 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 945
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Mit GTK4 spielen.

Beitrag von PascalDragon »

Mathias hat geschrieben: Mo 11. Nov 2024, 20:23
Unter *nix-Systemen ist lib ein gängiges Präfix, weshalb FPC bzw. der Linker das automatisch hinzufügt. Unter Windows aber eben nicht.
Wen ich es richtig verstehe, liegt die an FPC unter Windows, mit gcc geht es ja scheinbar ohne.
GCC stammt aus dem *nix-Umfeld. FPC passt sich mehr den jeweiligen Plattformen an.
FPC Compiler Entwickler

Antworten