web-dev-qa-db-fra.com

L'opacité des fenêtres pour les formulaires Mono est-elle prise en charge?

Je suis en train de développer un programme multiplateforme utilisant Mono et il nécessite le support de Form Opacity. Fondamentalement, la possibilité de rendre une fenêtre semi-transparente. Cela fonctionne bien dans Windows en définissant la propriété Window.Form.Opacity sur 0,5. Dans Ubuntu 14.04, cependant, cela ne fonctionne pas immédiatement. Je pense que j'utilise Unity et Compiz, quelle que soit la configuration d'Ubuntu par défaut.

Selon la FAQ Mono, cela devrait être pris en charge:

Comment puis-je fusionner mes fenêtres alpha? (transparent)

L'implémentation Winform de Mono prend en charge la transparence sur ses fenêtres tant que le système de fenêtrage sous-jacent le prend en charge.

Pour les utilisateurs Unix/X11, cela signifie qu'ils doivent avoir l'extension COMPOSITE activée sur leur serveur et qu'ils doivent exécuter un gestionnaire de composition, comme xcompmgr.

Le wiki GenToo Linux a une bonne description sur la façon de configurer le serveur Xorg pour la prise en charge de la transparence.

http://www.mono-project.com/docs/faq/winforms/

Le lien vers lequel ils pointent est mort.

Je suis nouveau sur Linux et je ne suis pas sûr de comprendre toutes les parties impliquées dans la mise en place et la gestion d'un gestionnaire de fenêtres de composition. D'ailleurs, n'en ai-je pas déjà un (compiz?)

Que dois-je essayer de faire fonctionner mon opacité Winform?

Edit: Mon programme de test est essentiellement un formulaire avec une barre de défilement (passe de 0 à 100) qui a un gestionnaire d'événements lors du changement pour définir l'opacité du formulaire en fonction de la valeur de la barre de défilement. C'est la viande de celui-ci:

private void trackBar1_Scroll(object sender, EventArgs e)
{
    double opacity = ((double)trackBar1.Value) / 100;
    this.Opacity = opacity;
}

Fonctionne très bien sous Windows.

2
Cubicle Dragon

Vous avez en effet tout ce dont vous avez besoin avec compiz.

Réglage Window.Form.Opacity devrait définir la propriété X window _NET_WM_WINDOW_OPACITY sur la fenêtre;

Pour tester si la pièce ubuntu fonctionne, essayez de régler manuellement l'opacité à 0,5 avec cette commande de bas niveau (cliquez sur la fenêtre):

$ xprop -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY 0x7fffffff

Et revenons à la pleine opacité:

$ xprop -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY 0xffffffff


Une façon de définir Window.Form.Opacity pourrait échouer, c'est qu'il choisit une fenêtre incorrecte (mais étroitement liée) et y définit la propriété.


Selon vos commentaires, l'idée était bonne. Ajout:

Je soupçonne que c'est une erreur très spécifique qui existe également dans d'autres logiciels: la fenêtre qui est choisie pour la rendre transparente est trouvée par certaines heuristiques basées sur la façon dont les fenêtres X du décorateur de fenêtres et l'application sont liées/imbriquées, etc. Mais avec l'introduction de la WM réparente, il y avait beaucoup de changement dans le domaine - heureusement l'heuristique fonctionnait toujours. D'après ce que je comprends, c'est un cas d'échec de l'heuristique, de sorte qu'une fenêtre invisible à proximité sera rendue transparente ...

Examinez ce bogue pour mieux comprendre le problème: transset ne parvient pas à modifier la propriété _NET_WM_WINDOW_OPACITY

1
Volker Siegel