# include <unistd.h>
#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,
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;
}
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)
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);
}