Console Output

From Inkscape Wiki
Revision as of 18:15, 23 November 2018 by Patrick87 (talk | contribs) (→‎Windows Encoding: fix comment link and add relevant bug for glib)
Jump to navigation Jump to search

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:

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
  • 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).