Pod Ubuntu 16.04 otrzymuję następujący komunikat
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged
kiedy otwieram zenity za pomocą polecenia
zenity --text-info --filename=<filename>
Nie wydarzyło się to przed 14.04. Zakładam, że odpowiedź jest związana z tym postem, ale post nie wyjaśnia, jak wdrożyć proponowane rozwiązanie. Czy ktoś mógłby wyjaśnić, do którego pliku powinienem dodać sugerowane linie?
Naprawiasz to ostrzeżenie, nadając GtkDialog rodzicowi, który ma być modalny. Odpowiednie funkcje to gtk_window_set_transient_for () (który ustawia to okno, aby zawsze znajdowało się na innym lub przejściowe dla innego) i opcjonalnie gtk_window_set_modal (), aby uczynić z niego modalne okno dialogowe. To właśnie robią różne konstruktory GtkDialog.
zenity --help-general
daje,--attach=WINDOW Set the parent window to attach to
ale nie jestem pewien jak go używać (co to jest Window?), być może rozwiąże twój problem.WINDOW_ID=$(xprop -name
echa linii $ TITLE` | grep WM_CLIENT_LEADER | cut -d "#" -f2 | cut -c2-20) `i wtedy spróbowałem,zenity --attach=$WINDOW_ID --text-info --filename=<filename>
ale niestety nadal otrzymałem ostrzeżenie. Szkoda, ale może się przydać pewnego dnia dowiedzieć się, jak uzyskać identyfikator okna!NULL
. Jednak nie mogłemmake install
zenity lokalnie (nie mogłem znaleźć dokumentów ani czegoś takiego, jak skonfigurować instalację), więc ostatecznie się poddałem. Będę musiał użyć brudnego2>/dev/null
.Odpowiedzi:
Zignoruj to.
To ostrzeżenie , a nie błąd. Aplikacja działa, po prostu nie jest zakodowana z myślą o najlepszych praktykach, jak się wydaje. Będziesz musiał zmodyfikować
zenity
kod źródłowy, aby wdrożyć poprawkę opisaną w połączonym pytaniu, a następnie samodzielnie go skompilować, ale ... i tak działa, więc dlaczego miałbyś się przejmować?Jeśli chcesz tylko pozbyć się danych wyjściowych w swoim terminalu, możesz po prostu przekierować STDERR (standardowy strumień błędów, tam właśnie drukowane jest ostrzeżenie) na
/dev/null
(wirtualne urządzenie znakowe, które połyka dane), dołączając2> /dev/null
na końcu polecenia, lubię to:źródło
2> /dev/null
ostrzeżenie nadal nie działa. Wiem, że to tylko uciążliwość, ale chciałbym móc tłumić takie ostrzeżenia.Wygląda na to, że deweloperzy Gtk postanowili dodać to ostrzeżenie, które wpływa na wiele pakietów. Musimy tylko poczekać, aż twórca Zenity dogoni i naprawi Zenity.
Z powłoce bash (nie jest to zgodne z Posix) stosunkowo łatwo jest ukryć określone komunikaty o błędach, jednocześnie pozwalając innym przesyłać do stderr:
Nie koliduje to ze standardowym wyjściem, więc może być normalnie przesyłane potokowo lub zastępowane poleceniami:
źródło
zenity ... 2>/dev/null
pracuje dla mnie. Jedyny problem, jaki widzę, to to, że inne (ważne) komunikaty o błędach również będą pomijane, więc lepiej buduj wychwytywanie błędów w swoim kodzieźródło
Opierając się na Dave Rove za odpowiedź , jeśli masz wiele monitów, można to oczyścić poprzez stworzenie funkcji, takich jak
użyj tego w następujący sposób:
To sprawia, że rzeczy są nieco łatwiejsze do odczytania w połączeniu z inną logiką:
źródło