X-Git-Url: https://git.draconx.ca/gitweb/rrace.git/blobdiff_plain/ceb2df0fe41852ba3f5637dcd04217113b4259ba..ca97af514870895e228df0443adc5a16be4d9a78:/src/x11.c diff --git a/src/x11.c b/src/x11.c index 6d09a7d..459694a 100644 --- a/src/x11.c +++ b/src/x11.c @@ -38,6 +38,11 @@ # include #endif +/* status flags in the upper bits are ORed into the game mask which only + * needs the lower 25 bits */ +#define X11_TICK_INSTALLED (1ul << 31) +#define X11_PROC_INSTALLED (1ul << 30) + enum { NUM_TILE_COLOURS = COLOUR_MAX*(TILE_MAX-1), COLOUR_UI_GAMEBG = NUM_TILE_COLOURS, @@ -321,8 +326,6 @@ static Boolean do_render(void *data) x11_redraw_game(state, state->render_game_mask); state->render_goal_mask = state->render_game_mask = 0; - state->render_proc = 0; - state->render_tick = 0; return True; } @@ -331,11 +334,12 @@ static void start_render(void *data, XtIntervalId *id) struct app_state *state = data; XtAppContext app; - if (state->render_proc) + if (state->render_game_mask & X11_PROC_INSTALLED) return; + state->render_game_mask |= X11_PROC_INSTALLED; app = XtWidgetToApplicationContext(state->game); - state->render_proc = XtAppAddWorkProc(app, do_render, state); + XtAppAddWorkProc(app, do_render, state); } void x11_queue_render(struct app_state *state, uint_fast32_t mask, int mode) @@ -343,14 +347,16 @@ void x11_queue_render(struct app_state *state, uint_fast32_t mask, int mode) uint_fast32_t changed = 0; XtAppContext app; + mask &= GAME_MASK; if (mode & RENDER_MODE_GOAL) changed |= state->render_goal_mask |= mask; if (mode & RENDER_MODE_GAME) changed |= state->render_game_mask |= mask; - if (state->render_tick || !changed) + if (changed & X11_TICK_INSTALLED || !changed) return; + state->render_game_mask |= X11_TICK_INSTALLED; app = XtWidgetToApplicationContext(state->game); - state->render_tick = XtAppAddTimeOut(app, 3, start_render, state); + XtAppAddTimeOut(app, 3, start_render, state); }