* The event loop functionality GMain has extensively been revised to 
  support multiple separate main loops in separate threads. All sources
  (timeouts, idle functions, etc.) are associated with a GMainContext.

  Compatibility functions exist so that most application code dealing with
  the main loop will continue to work. However, code that creates
  new custom types of sources will require modification.

  The main changes here are:

   - Sources are now exposed as GSource *, rather than simply as numeric
     IDS.

   - New types of sources are created by structure "derivation" from GSource,
     so the source_data parameter to the GSource vfuncs has been
     replaced with a GSource *.

   - Sources are first created, then later added to a specific GMainContext

   - Dispatching has been modified so both the callback and data are passed
     in to the ->dispatch() vfunc.

  To go along with this change, the vtable for GIOChannel has changed and
  add_watch() has been replaced by create_watch().

* g_list_foreach() and g_slist_foreach() have been changed so they
  are now safe against removal of the current item, not the next item.

  It's not recommended to mutate the list in the callback to these
  functions in any case.

* GDate now works in UTF-8, not in the current locale. If you
  want to use it with the encoding of the locale, you need
  to convert strings using g_locale_to_utf8 first.

* g_strsplit() has been fixed to:

  - include trailing empty tokens, rather than stripping them
  - split into a maximum of @max_tokens tokens, rather than 
    @max_tokens + 1

  Code depending on either of these bugs will need to be fixed.

* deprecated functions that got removed:
  g_set_error_handler(), g_set_warning_handler(),
  g_set_message_handler(), use g_log_set_handler() instead.
  
