mensaje de error cuando se ejecuta zenity bajo 16.04: Gtk-Message: GtkDialog mapeado sin un padre transitorio. Esto se desaconseja

19

Bajo ubuntu 16.04 recibo el siguiente mensaje

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

cuando abro zenity con el comando

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

Esto no sucedió bajo 14.04. Supongo que la respuesta está relacionada con esta publicación, pero la publicación no explica cómo implementar la solución propuesta. ¿Podría alguien explicarme a qué archivo debo agregar las líneas sugeridas?

Usted arregla esta advertencia dando al GtkDialog un padre para que sea modal. Las funciones relevantes son gtk_window_set_transient_for () (que establece que esta ventana esté siempre encima o transitoria para otra) y opcionalmente gtk_window_set_modal () para convertirla en un diálogo modal. En última instancia, esto es lo que hacen los diversos constructores de GtkDialog.

Leo Simon
fuente
zenity --help-generalda --attach=WINDOW Set the parent window to attach topero no estoy seguro de cómo usarlo (¿qué es Windows?), tal vez resolverá su problema.
Al.G.
Gracias, @ Al.G. Pude recuperar la identificación de la VENTANA con la línea WINDOW_ID=$(xprop -name echo $ TITLE` | grep WM_CLIENT_LEADER | cortar -d "#" -f2 | cut -c2-20) `y luego lo intenté zenity --attach=$WINDOW_ID --text-info --filename=<filename> pero lamentablemente aún recibí la advertencia. Lástima, pero puede ser útil algún día saber cómo obtener la identificación de la ventana.
Leo Simon
En realidad, si busca gtk_window_set_transient_ en la fuente de zenity, no obtendrá resultados.
Al.G.
Sip. Si busca gtk_window_set_modal obtendrá muchos resultados, pero no sé cómo configurarlo de manera que silencia el mensaje.
Leo Simon
1
Según los documentos, le das una ventana y una ventana principal. Supongo que debería llamarse en algún lugar después de la creación de la ventana con la ventana principal establecida en NULL. Sin embargo, no pude make installzenity localmente (no pude encontrar documentos o algo sobre cómo configurar la instalación), así que finalmente me di por vencido. Tendrá que usar lo sucio 2>/dev/null.
Al.G.

Respuestas:

21

Ignoralo.

Es una advertencia , no un error. La aplicación funciona, simplemente no está codificada con las mejores prácticas en mente, como parece. Tendría que modificar zenityel código fuente para implementar la solución descrita en su pregunta vinculada y luego compilarlo usted mismo, pero ... funciona de todos modos, entonces, ¿por qué debería molestarse?

Si solo desea deshacerse de la salida en su terminal, simplemente puede redirigir STDERR (flujo de error estándar, allí es donde se imprime la advertencia) a /dev/null(dispositivo de caracteres virtual que traga datos) agregando 2> /dev/nullal final del comando, Me gusta esto:

zenity --text-info --filename=<filename> 2> /dev/null
Byte Commander
fuente
1
¡Gracias! Desafortunadamente, por alguna razón 2> /dev/nullno tiene el efecto deseado, la advertencia aún persiste. Sé que es solo una molestia, pero me encantaría poder suprimir advertencias como esta.
Leo Simon
3

Parece que los desarrolladores de Gtk decidieron agregar esta advertencia que afecta a varios paquetes. Solo tenemos que esperar a que el desarrollador de Zenity se ponga al día y arregle Zenity.

Con el shell bash (esto no es compatible con Posix) es relativamente sencillo suprimir mensajes de error específicos mientras se permiten otros mensajes a través de stderr:

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

Esto no interfiere con stdout, por lo que se puede canalizar o usar en la sustitución de comandos de manera normal:

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

zenity ... 2>/dev/nullfunciona para mi. El único problema que veo es que también se suprimirán otros mensajes de error (importantes), por lo que es mejor capturar errores de compilación de alguna manera en su código

espléndido
fuente
2
De hecho, esto parece una solución peligrosa. Mejor no lo use.
Marc Vanhoomissen
0

Sobre la base de la respuesta de Dave Rove , si tiene muchas indicaciones, puede limpiar esto creando una función como

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

luego úsalo así:

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

Esto hace que las cosas sean un poco más fáciles de leer cuando se combina con otra lógica:

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