Further to my previous blog post on error-reporting in libgeda, I've made some pretty good progress on implementing the ideas that I described. In particular:
- The file opening functions (f_open() and f_open_flags) now use GError to return error messages rather than just spewing them to the console.
- gschem now shows an informative dialog box when it fails to load a file.
- All programs now actually tell you the real reason for failing to load a file (e.g. "Permission denied" or "File does not exist") rather than just giving a generic "Could not open file" message.
- The libgeda logging mechanism now handles most levels of GLib log message rather than just the "message" level (seeing as the log is most useful when some sort of error has occurred, this seems sensible).
- gschem now highlights warnings and errors in the log window.
- Lots of ways in which libgeda could randomly kill your program have been eradicated.
These changes are not yet in the unstable branch, but barring someone objecting to my changes I'll push them upstream tomorrow sometime.
The next (probably thankless) task is to work through libgeda converting all calls to directly output debugging/error-reporting information to the console to use the GLib logging functions instead, and to make log messages be sent at appropriate levels rather than all at the "message" level (this will allow filtering of log messages in the gschem log window, for instance).
I'm still of two minds about the best way to do this. Currently, libgeda defines a macro s_log_message() which is equivalent to GLib's g_message(). For adding logging at multiple levels, the two options are:
- Get rid of s_log_message entirely, and just use the GLib logging macros directly.
- Define s_log_debug, s_log_warning etc so that the exact implementation could be easily modified at a later date (e.g. for the purpose of making libgeda always log in the "libgeda" log domain).
I'm currently leaning towards the latter, but haven't as yet made up my mind about exactly which will be the best way to go.