static int
grr_game_start_gui (grr_game_t *game);
-static void
-grr_game_read_callback (gpointer data,
- gint fd,
- GdkInputCondition condition);
-
static void
grr_game_read_notices (grr_game_t *game);
+static GSource *
+grr_game_notices_source_new (grr_game_t *game);
+
int
main (int argc, char **argv)
{
args_t args;
rr_status_t status;
grr_game_t game;
+ GSource *source;
char *diagram;
game.board = rr_board_create (16, 16);
- gdk_input_add (rr_client_fd (game.client),
- GDK_INPUT_READ,
- grr_game_read_callback,
- &game);
+ source = grr_game_notices_source_new (&game);
+ g_source_set_priority (source, GDK_PRIORITY_EVENTS);
+ g_source_attach (source, NULL);
+ g_source_unref (source);
rr_client_show (game.client, &diagram);
rr_board_parse (game.board, diagram);
return grr_game_start_gui (&game);
}
-static void
-grr_game_read_callback (gpointer data,
- gint fd,
- GdkInputCondition condition)
+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)
{
- grr_game_t *game = data;
+ 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;
}
static void
gtk_entry_set_text (GTK_ENTRY (game->command_entry), "");
- grr_game_read_notices (game);
-
/* XXX: Huh? Why is this triggering valgrind?
free (response);
*/
gtk_widget_show (window);
- grr_game_read_notices (game);
-
gtk_main ();
return 0;