aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPřemysl Janouch <p.janouch@gmail.com>2015-02-27 23:34:48 +0100
committerPřemysl Janouch <p.janouch@gmail.com>2015-02-27 23:42:24 +0100
commit6fb83a404396f72f8eff6b14b2fff9fd67a7382d (patch)
treee28a597c27a5a5b4020e1d8c430e29897276d194 /src
parent7db828f62b36f4735f9d013c53afec6cae13bcf1 (diff)
downloadtdv-6fb83a404396f72f8eff6b14b2fff9fd67a7382d.tar.gz
tdv-6fb83a404396f72f8eff6b14b2fff9fd67a7382d.tar.xz
tdv-6fb83a404396f72f8eff6b14b2fff9fd67a7382d.zip
Don't let GLib/GTK+ draw messages over curses
Diffstat (limited to 'src')
-rw-r--r--src/sdtui.c62
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