From: Keith Packard Date: Sat, 14 Jun 2003 09:04:59 +0000 (+0000) Subject: Use raw g_source APIs to track rr connection X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=505b2ac4058af02bc3d02c42fa4757715ef0d3a1;p=grrobot Use raw g_source APIs to track rr connection --- diff --git a/src/grrobot.c b/src/grrobot.c index 0154c0e..95f4363 100644 --- a/src/grrobot.c +++ b/src/grrobot.c @@ -50,20 +50,19 @@ typedef struct grr_game { 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; @@ -85,10 +84,10 @@ main (int argc, char **argv) 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); @@ -97,14 +96,68 @@ main (int argc, char **argv) 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 @@ -206,8 +259,6 @@ grr_game_entry_callback (GtkWidget *widget, gtk_entry_set_text (GTK_ENTRY (game->command_entry), ""); - grr_game_read_notices (game); - /* XXX: Huh? Why is this triggering valgrind? free (response); */ @@ -283,8 +334,6 @@ grr_game_start_gui (grr_game_t *game) gtk_widget_show (window); - grr_game_read_notices (game); - gtk_main (); return 0;