message d'erreur lors de l'exécution de zenity sous 16.04: Gtk-Message: GtkDialog mappé sans parent transitoire. C'est découragé

19

Sous Ubuntu 16.04, je reçois le message suivant

 Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged

quand j'ouvre zenity avec la commande

  zenity --text-info --filename=<filename>

Cela ne s'est pas produit sous 14.04. Je suppose que la réponse est liée à ce post, mais le post n'explique pas comment implémenter la solution proposée. Quelqu'un pourrait-il expliquer à quel fichier je dois ajouter les lignes suggérées?

Vous corrigez cet avertissement en attribuant au GtkDialog un parent auquel il doit être modal. Les fonctions pertinentes sont gtk_window_set_transient_for () (qui définit cette fenêtre pour qu'elle soit toujours au-dessus ou transitoire pour une autre) et éventuellement gtk_window_set_modal () pour en faire une boîte de dialogue modale. C'est finalement ce que font les différents constructeurs GtkDialog.

Leo Simon
la source
zenity --help-generaldonne --attach=WINDOW Set the parent window to attach tomais je ne sais pas comment l'utiliser (qu'est-ce que Windows?), peut-être que cela résoudra votre problème.
Al.G.
Merci, @ Al.G. J'ai pu récupérer l'identifiant WINDOW avec la ligne WINDOW_ID=$(xprop -name echo $ TITLE` | grep WM_CLIENT_LEADER | cut -d "#" -f2 | cut -c2-20) `et j'ai ensuite essayé zenity --attach=$WINDOW_ID --text-info --filename=<filename> mais malheureusement j'ai quand même reçu l'avertissement. Dommage, mais il peut être utile un jour de savoir comment obtenir l'identifiant de la fenêtre!
Leo Simon
En fait, si vous recherchez la source de zénité pour gtk_window_set_transient_for, vous n'obtiendrez aucun résultat.
Al.G.
Ouaip. Si vous recherchez gtk_window_set_modal, vous obtenez beaucoup de résultats, mais je ne sais pas comment le définir de manière à faire taire le message.
Leo Simon
1
Selon les documents, vous lui donnez une fenêtre et une fenêtre parent. Je suppose qu'il devrait être appelé quelque part après la création de la fenêtre avec la fenêtre parent définie sur NULL. Cependant, je ne pouvais pas make installzenity localement (je n'ai pas pu trouver de documentation ou quelque chose sur la façon de configurer l'installation), j'ai donc finalement abandonné. Devra utiliser le sale 2>/dev/null.
Al.G.

Réponses:

21

Ignorez-le.

C'est un avertissement , pas une erreur. L'application fonctionne, elle n'est tout simplement pas codée avec les meilleures pratiques à l'esprit, comme il semble. Vous devrez modifier zenityle code source de pour implémenter le correctif décrit dans votre question liée, puis le compiler vous-même, mais ... cela fonctionne quand même, alors pourquoi devriez-vous vous embêter?

Si vous voulez simplement vous débarrasser de la sortie dans votre terminal, vous pouvez simplement rediriger STDERR (flux d'erreur standard, c'est là que l'avertissement est imprimé) vers /dev/null(périphérique de caractère virtuel qui avale des données) en ajoutant 2> /dev/nullà la fin de la commande, comme ça:

zenity --text-info --filename=<filename> 2> /dev/null
Byte Commander
la source
1
Merci! Malheureusement, pour une raison quelconque, 2> /dev/nulln'a pas l'effet souhaité, l'avertissement persiste. Je sais que ce n'est qu'une nuisance, mais j'aimerais pouvoir supprimer des avertissements comme celui-ci.
Leo Simon
3

Il semble que les développeurs Gtk aient décidé d'ajouter cet avertissement qui affecte un certain nombre de packages. Nous devons juste attendre que le développeur Zenity rattrape et corrige Zenity.

Avec le shell bash (ce n'est pas compatible Posix), il est relativement simple de supprimer des messages d'erreur spécifiques tout en permettant à d'autres messages de passer par stderr:

zenity --info --text "hello" 2> >(grep -v 'GtkDialog' >&2)

Cela n'interfère pas avec stdout, donc cela peut être canalisé ou utilisé dans la substitution de commandes comme d'habitude:

echo message: $(zenity --entry  2> >(grep -v 'GtkDialog' >&2) )
Dave Rove
la source
2

zenity ... 2>/dev/nulltravaille pour moi. Le seul problème que je vois est que d'autres messages d'erreurs (importants) seront également supprimés, donc une meilleure capture d'erreur de construction en quelque sorte dans votre code

splaisan
la source
2
En effet, cela ressemble à une solution dangereuse. Mieux vaut ne pas l'utiliser.
Marc Vanhoomissen
0

En s'appuyant sur la réponse de Dave Rove , si vous avez de nombreuses invites, vous pouvez nettoyer cela en créant une fonction telle que

function zenityNoWarn() {
    zenity "$@" 2> >(grep -v 'GtkDialog' >&2)
}

puis utilisez-le comme ceci:

zenityNoWarn --question --text "Are you sure?"

Cela rend les choses un peu plus faciles à lire lors de la combinaison avec d'autres logiques:

if [[ `zenityNoWarn --question --text "Are you sure?"; echo $?` -eq 0 ]]; then
    echo "Yes!"
else
    echo "No..."
fi
EmpireJones
la source