it-swarm.com.de

So erhalten Sie native Windows-Dekorationen für GTK3 unter Windows 7+ und MSYS2

Ich versuche, meine Anwendung von Linux auf Windows zu portieren, und ich habe ein Problem mit dem Theming. In Linux funktioniert das aus einer Box, kompilieren Sie es einfach und die Anwendung verwendet ein gutes Thema und sieht nativ aus. 

Ich habe gtkmm3 und gtk3 in MSYS2 installiert und baue es mit CMake auf. Das ist OK, ich musste alle dlls mit binär in ein Verzeichnis kopieren, um es ausführen zu können. Ich habe nichts anderes kopiert. Ich versuche ein "Entpacken und Ausführen" -Paket zu erstellen.

Mein Problem ist, dass die Anwendung falsch aussieht. Es sieht überhaupt nicht nativ aus. Es gibt Schatten um das Fenster, was in Windows10 in Ordnung ist, aber in Windows 7 sieht es nicht nativ aus. Es fehlen auch einige Icons.

 bad gtk3 application theme on Windows10

Sogar gitk3-demo sieht auf die gleiche Weise nicht nativ aus (allerdings sind mindestens die Symbole zum Minimieren/Maximieren/Schließen korrekt).

Die Frage ist also: Wie kann ich die GTK3-Anwendung unter Windows nativ aussehen lassen? Oder zumindest einheimische Fensterdekorationen? 

Vielen Dank

13
kracejic

Es gibt zwei Unterprobleme: fehlende Symbole und das richtige Thema einstellen. 

Fehlende Symbole

Für fehlende Symbole genügte es, diese Symbole zu kopieren

  • window-close-symbolic.symbolic.png 
  • window-maximize-symbolic.symbolic.png 
  • window-minim-symbolic.symbolic.png

von: C:\msys64\mingw32\share\icons\Adwaita\22x22\actions

an: "Ihr ausführbarer Ordner"\share\icons\Adwaita\22x22\actions

Thema

Verwenden des nativen Win32-Designs

In GTK3 gibt es tatsächlich ein eingebettetes, nativähnliches Thema. Um ein native-ähnliches Design zu verwenden, erstellen Sie einfach die Datei "Ihren ausführbaren Ordner"\etc\gtk-3.0\settings.ini mit diesem Inhalt

[Settings]
gtk-theme-name=win32

das Win32-Theme ist in GTK3 integriert und es werden nur drei Icons aus dem vorherigen Schritt benötigt. 

Unter Windows 7 sieht das folgendermaßen aus:

 enter image description here

Das Problem ist, dass die Dekorationen selbst unter Windows 10 (einschließlich Fensterdekorationen) gleich aussehen. 

Aus dem Kommentar von @andlabs: GTK + 3 verwendet die uxtheme.dll-APIs, um sein Windows-Erscheinungsbild zu erhalten, und leider hat Microsoft diese Windows 7-ähnlichen Fensterrahmen beibehalten. (mehr in den Kommentaren)

Sie können die Windows 10 Gtk3-Anwendung mit dem win32-Design hier sehen:

 enter image description here

Nicht standardmäßiges Design verwenden

Wenn Sie mit dem Standard- oder Win32-Thema nicht zufrieden sind, können Sie benutzerdefinierte Themen (wie dieses Flat-Pat ) aus dem Internet verwenden. :) Dazu müssen Sie die Konfigurationsdatei erstellen:

"Ihr ausführbarer Ordner"\etc\gtk-3.0\settings.ini mit diesem Inhalt

[Settings]
gtk-theme-name=Flat-Plat

und Sie müssen die Designdateien in das Verzeichnis im Pfad Ihrer ausführbaren Datei kopieren

"Ihr ausführbarer Ordner"\share\themes\Flat-Plat

in diesem Ordner sollten die Ordner index.theme und gtk-x.x vorhanden sein. Offensichtlich sollten gtk-theme-name und Ordnername übereinstimmen.

Nachdem Sie die ausführbare Datei ausgeführt haben, sollten Sie ein anderes Thema erhalten können.

 enter image description here

EDIT: Es ist also ein Win32-Theme eingebaut, danke @andlabs

EDIT2: Screenshots hinzugefügt

EDIT3: Windows 10-Screenshot hinzugefügt und Fakten korrigiert. 

11
kracejic

Sie können die Umgebungsvariable GTK_CSD = 0 festlegen, um clientseitige Fensterdekorationen zu deaktivieren und Windows-native Dekorationen zu aktivieren, wodurch die hässliche win7-artige Titelleiste sowie die Adwaita-artige entfernt werden.

3
Alexander

Während GTK_CSD = 0 gute Arbeit für Windows-Rahmensymbole leistet, fehlen anscheinend auch die Standard-Drag-and-Drop-Symbole (DND).

Beim Ziehen von GtkEntry- oder GtkTreeView-Inhalten wird ein Drag-Symbol angezeigt.

Ich habe eine Schaltfläche als Ziehquelle unter Gtk + -3.24.4 vorbereitet. Beim Ziehen der Schaltfläche verschwindet der Mauszeiger und es wird kein Ziehsymbol angezeigt.

Bei Verwendung von gtk_drag_source_set_icon_pixbuf (bt, pixbuf) wird der Pixbuf als Drag-Symbol angezeigt. Dies ist jedoch nur die halbe Arbeit, da auf dem Symbol keine Verschiebungs-/Kopieranzeigen vorhanden sind.

0
Fredy Paquet

Für Leute wie mich, die Perl verwenden, müssen/share und/etc ein Verzeichnis über der Perl.exe platziert werden (z. B. in C:\Perl64, wenn Perl.exe in C:\Perl64\bin ist).

0
Guillaume