web-dev-qa-db-fra.com

Comment obtenir des décorations Windows natives sur GTK3 sous Windows 7+ et MSYS2

J'essaie de porter mon application de Linux à Windows et j'ai un problème de thématisation. Sous Linux, cela fonctionne à partir d'une boîte, il suffit de le compiler et l'application utilise un bon thème et semble native. 

J'ai installé gtkmm3 et gtk3 dans MSYS2 et je le construis avec CMake. C'est OK, j'ai dû copier toutes les dll dans un répertoire avec binaire pour pouvoir l'exécuter. Je n'ai rien copié d'autre. J'essaie de créer un package "décompresser et exécuter".

Mon problème est, cette application semble hors de propos. Il ne semble pas du tout natif. Il y a des ombres autour de la fenêtre, ce qui convient à Windows 10, mais sous Windows 7, cela ne semble pas natif. Plusieurs icônes sont également manquantes.

 bad gtk3 application theme on Windows10

Même gitk3-demo ne semble pas natif de la même manière (mais au moins les icônes minimiser/maximiser/fermer sont correctes).

La question est donc: comment puis-je obtenir l’apparence native de l’application GTK3 sous Windows? Ou du moins des décorations de fenêtre indigènes? 

Merci

13
kracejic

Il existe deux sous-problèmes: les icônes manquantes et la définition du bon thème. 

Icônes manquantes

Pour les icônes manquantes, il suffisait de copier ces icônes

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

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

to: "votre dossier exécutable"\share\icons\Adwaita\22x22\actions

Thème

Utilisation du thème natif win32

Il y a en fait un thème intégré de type natif dans GTK3. Pour utiliser un thème de type natif, créez simplement le fichier "votre dossier exécutable"\etc\gtk-3.0\settings.ini contenant ceci

[Settings]
gtk-theme-name=win32

le thème win32 est intégré à GTK3 et seules trois icônes de l’étape précédente semblent nécessaires. 

Sous Windows 7, cela ressemble à ce qui suit:

 enter image description here

Le problème est que les décorations ont la même apparence sous Windows 10 (y compris les décorations de fenêtres). 

Extrait du commentaire de @andlabs: GTK + 3 utilise les API uxtheme.dll pour obtenir son apparence Windows. Malheureusement, Microsoft a conservé ces fenêtres de type Windows 7 pour les bordures de fenêtres. (plus dans les commentaires)

Vous pouvez voir l'application Windows 10 Gtk3 avec le thème win32 ici:

 enter image description here

Utiliser un thème autre que celui par défaut

Et si vous n'êtes pas satisfait du thème par défaut ou win32, vous pouvez utiliser des thèmes personnalisés (comme ce Flat-Pat ) à partir d'Internet. :) Pour ce faire, vous devez créer un fichier de configuration:

"votre dossier exécutable"\etc\gtk-3.0\settings.ini avec ceci dedans

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

et vous devez copier les fichiers de thème dans le répertoire dans le chemin de votre exécutable

"votre dossier exécutable"\share\themes\Flat-Plat

dans ce dossier, les fichiers index.theme et gtk-x.x doivent être présents. De toute évidence, gtk-theme-name et le nom du dossier doivent correspondre.

Après avoir exécuté l'exécutable, vous devriez pouvoir obtenir un thème différent.

 enter image description here

EDIT: Donc, il y a un thème win32 intégré, merci @andlabs

EDIT2: Ajout de captures d'écran

EDIT3: Ajout de la capture d'écran Windows 10 et des faits corrigés. 

11
kracejic

Vous pouvez définir la variable d'environnement GTK_CSD = 0 pour désactiver les décorations de fenêtre côté client et activer les décorations natives de Windows, ce qui supprime la barre de titre laide, semblable à win7, ainsi que la barre de titre semblable à Adwaita.

3
Alexander

Pour les personnes comme moi qui utilisent (activestate) Perl, les fichiers/share et/etc doivent être placés dans un répertoire au-dessus du fichier Perl.exe (par exemple, dans C:\Perl64 si Perl.exe se trouve dans C:\Perl64\bin).

0
Guillaume