Console Output

From Inkscape Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

How do we handle console output?

Issues

Windows Encoding

Windows uses the wrong encoding for glib output: https://gitlab.com/inkscape/inkscape/-/merge_requests/418#note_119199350

Possible solutions:

Fixed in glib 2.62, see https://gitlab.gnome.org/GNOME/glib/-/merge_requests/767

Glib vs iostreams

Mix of glib output functions and std::cout/std::cerr. In principle mixing the two can cause problems but in practice it does not as by default std::cout/std::cerr are synced with stdio (std::sync_with_stdio).

Current Use

  • std::cout: 976
  • std::cerr: 361
  • printf: 439
  • sprintf: 285
  • fprintf: 122
  • snprintf: 47
  • g_print: 137
  • g_printerr: 12
  • g_strdup_printf: 331
  • g_snprintf: 24
  • g_log/g_logv: 23
  • g_message: 312
  • g_warning: 470
  • g_critical: 47
  • g_info: 72
  • g_debug: 4

Message dialog

Our message dialog can intercept g_log, etc. and redirect it to the dialog. This is done through g_log_set_handler if "Capture log messages" is checked. As we intercept everything, we could just intercept stdout/stderr as a comment in the message code suggests. How do actually do this is not clear.

For std::cout only:

// Start redirection
std::stringstream ss;
std::streambuf *sb = std::cout.rdbuf(ss.rdbuf());

// End redirection
std::cout.redbuf(sb);

For everything:

char huge_string_buf[1000];
freopen("/dev/null", "a", stdout);
setbuf(stdout, huge_string_buf);

Buffer could get filled up (shouldn't overflow).