+ return grr_game_start_gui (&game);
+}
+
+typedef struct _GrrNoticeSource {
+ GSource source;
+ grr_game_t *game;
+} GrrNoticeSource;
+
+static gboolean
+grr_game_notices_prepare (GSource *source,
+ gint *timeout)
+{
+ GrrNoticeSource *src = (GrrNoticeSource*)source;
+ grr_game_t *game = src->game;
+ gboolean retval;
+
+ GDK_THREADS_ENTER ();
+ *timeout = -1;
+ retval = rr_client_notice_pending (game->client);
+ GDK_THREADS_LEAVE ();
+
+ return retval;
+}
+
+static gboolean
+grr_game_notices_check (GSource *source)
+{
+ GrrNoticeSource *src = (GrrNoticeSource*)source;
+ grr_game_t *game = src->game;
+ gboolean retval;
+
+ GDK_THREADS_ENTER ();
+ retval = rr_client_notice_pending (game->client);
+ GDK_THREADS_LEAVE ();
+
+ return retval;
+}
+
+static gboolean
+grr_game_notices_dispatch (GSource *source,
+ GSourceFunc callback,
+ gpointer user_data)
+{
+ GrrNoticeSource *src = (GrrNoticeSource*)source;
+ grr_game_t *game = src->game;
+
+ grr_game_read_notices (game);
+
+ return TRUE;
+}
+
+static GSourceFuncs game_notices_funcs = {
+ grr_game_notices_prepare,
+ grr_game_notices_check,
+ grr_game_notices_dispatch,
+ NULL
+};
+
+static GSource *
+grr_game_notices_source_new (grr_game_t *game)
+{
+ GSource *source = g_source_new (&game_notices_funcs, sizeof (GrrNoticeSource));
+ GrrNoticeSource *src = (GrrNoticeSource*)source;
+ src->game = game;
+ return source;