diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2015-02-27 23:34:48 +0100 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2015-02-27 23:42:24 +0100 |
commit | 6fb83a404396f72f8eff6b14b2fff9fd67a7382d (patch) | |
tree | e28a597c27a5a5b4020e1d8c430e29897276d194 | |
parent | 7db828f62b36f4735f9d013c53afec6cae13bcf1 (diff) | |
download | tdv-6fb83a404396f72f8eff6b14b2fff9fd67a7382d.tar.gz tdv-6fb83a404396f72f8eff6b14b2fff9fd67a7382d.tar.xz tdv-6fb83a404396f72f8eff6b14b2fff9fd67a7382d.zip |
Don't let GLib/GTK+ draw messages over curses
-rw-r--r-- | src/sdtui.c | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/src/sdtui.c b/src/sdtui.c index 062bc0f..0823038 100644 --- a/src/sdtui.c +++ b/src/sdtui.c @@ -1380,6 +1380,62 @@ on_watch_primary_selection (G_GNUC_UNUSED const gchar *option_name, } #endif // WITH_GTK +static void +log_handler (const gchar *domain, GLogLevelFlags level, + const gchar *message, gpointer data) +{ + // There's probably no point in trying to display a fatal message nicely + if (level & G_LOG_FLAG_FATAL) + g_log_default_handler (domain, level, message, NULL); + + const gchar *prefix; + switch (level & G_LOG_LEVEL_MASK) + { + case G_LOG_LEVEL_ERROR: prefix = "E"; break; + case G_LOG_LEVEL_CRITICAL: prefix = "C"; break; + case G_LOG_LEVEL_WARNING: prefix = "W"; break; + case G_LOG_LEVEL_MESSAGE: prefix = "M"; break; + case G_LOG_LEVEL_INFO: prefix = "I"; break; + case G_LOG_LEVEL_DEBUG: prefix = "D"; break; + default: prefix = "?"; + } + + gchar *out; + if (domain) + out = g_strdup_printf ("%s: %s: %s", prefix, domain, message); + else + out = g_strdup_printf ("%s: %s", prefix, message); + + // If the standard error output isn't redirected, try our best at showing + // the message to the user; it will probably get overdrawn soon + if (isatty (STDERR_FILENO)) + { + // Beep, beep, I'm a jeep; let the user know + beep (); + + // We certainly don't want to end up in a possibly infinite recursion + static gboolean in_processing; + if (in_processing) + goto out; + + in_processing = TRUE; + SAVE_CURSOR + + Application *self = data; + attrset (A_REVERSE); + mvwhline (stdscr, 0, 0, A_REVERSE, COLS); + app_add_utf8_string (self, out, 0, COLS); + + RESTORE_CURSOR + in_processing = FALSE; + } + else + fprintf (stderr, "%s\n", out); + +out: + g_free (out); +} + int main (int argc, char *argv[]) { @@ -1456,10 +1512,13 @@ G_GNUC_END_IGNORE_DEPRECATIONS if (!initscr () || nonl () == ERR) abort (); + app_redraw (&app); + // g_unix_signal_add() cannot handle SIGWINCH install_winch_handler (); - app_redraw (&app); + // GtkClipboard can internally issue some rather disruptive warnings + g_log_set_default_handler (log_handler, &app); // Message loop guint watch_term = g_unix_signal_add (SIGTERM, on_terminated, &app); @@ -1477,6 +1536,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS g_source_remove (watch_winch); endwin (); + g_log_set_default_handler (g_log_default_handler, NULL); app_destroy (&app); if (close (g_winch_pipe[0]) == -1 |