From: Nick Bowler Date: Wed, 7 Dec 2022 05:44:19 +0000 (-0500) Subject: motif: Combine game/goal expose functions. X-Git-Url: http://git.draconx.ca/gitweb/rrace.git/commitdiff_plain/bbea7e79f7bbf9246db751d8fccaf6e31ccfd7cb motif: Combine game/goal expose functions. These functions are almost identical. A single function can serve both purposes, allowing the overall code size to be reduced a little bit. --- diff --git a/src/motif_ui.c b/src/motif_ui.c index 3edd3ab..5056d9c 100644 --- a/src/motif_ui.c +++ b/src/motif_ui.c @@ -258,14 +258,12 @@ construct_menu(const struct ui_menuitem *root, Widget parent, unsigned i) } /* Figure out which tiles intersect a rectangle. */ -static uint_fast32_t -expose_mask(int rect_x, int rect_y, int rect_w, int rect_h, - int tile_w, int tile_h) +static uint_fast32_t x11_expose_mask(XExposeEvent *e, int tile_w, int tile_h) { - return board_rect( rect_x/tile_w, - rect_y/tile_h, - (rect_x+rect_w-1)/tile_w, - (rect_y+rect_h-1)/tile_h ); + return board_rect( e->x/tile_w, + e->y/tile_h, + (e->x+e->width-1)/tile_w, + (e->y+e->height-1)/tile_h ); } static void game_resize(Widget w, void *data, void *cb_data) @@ -278,42 +276,36 @@ static void goal_resize(Widget w, void *data, void *cb_data) x11_queue_render(data, 0, -1); } -static void game_expose(Widget w, void *data, void *cb_data) +static void expose(Widget w, void *data, void *cb_data) { XmDrawingAreaCallbackStruct *cbs = cb_data; XExposeEvent *e = &cbs->event->xexpose; struct app_state *state = data; - uint_least32_t *gp = state->board.game; - Dimension width, height; - uint_fast32_t mask; - - XtVaGetValues(w, XmNwidth, &width, XmNheight, &height, (char *)NULL); - if (!(width /= 5) || !(height /= 5)) - return; - - /* - * Only draw exposed nonempty tiles; exposed areas are filled with the - * background automatically and thus exposed empty spaces don't need - * to be drawn again. - */ - mask = gp[0] | gp[1] | gp[2]; - mask &= expose_mask(e->x, e->y, e->width, e->height, width, height); - x11_queue_render(state, mask, 0); -} - -static void goal_expose(Widget w, void *data, void *cb_data) -{ - XmDrawingAreaCallbackStruct *cbs = cb_data; - XExposeEvent *e = &cbs->event->xexpose; - Dimension width, height; - uint_fast32_t mask; - - XtVaGetValues(w, XmNwidth, &width, XmNheight, &height, (char *)NULL); - if (!(width /= 3) || !(height /= 3)) - return; - - mask = expose_mask(e->x, e->y, e->width, e->height, width, height); - x11_queue_render(data, 0, mask); + Dimension tile_w, tile_h; + + XtVaGetValues(w, XmNwidth, &tile_w, XmNheight, &tile_h, (char *)NULL); + if (w == state->game) { + uint_least32_t *gp = state->board.game; + uint_fast32_t mask; + + if (!(tile_w /= 5) || !(tile_h /= 5)) + return; + + /* + * Only draw exposed nonempty tiles; exposed areas are filled + * with the background automatically and thus exposed empty + * spaces don't need to be drawn again. + */ + mask = gp[0] | gp[1] | gp[2]; + mask &= x11_expose_mask(e, tile_w, tile_h); + + x11_queue_render(state, mask, 0); + } else { + if (!(tile_w /= 3) || !(tile_h /= 3)) + return; + + x11_queue_render(state, 0, x11_expose_mask(e, tile_w, tile_h)); + } } void ui_initialize(struct app_state *state, Widget shell) @@ -334,13 +326,13 @@ void ui_initialize(struct app_state *state, Widget shell) XmNheight, &state->game_sz[1], (char *)NULL); XtAddCallback(state->game, XmNresizeCallback, game_resize, state); - XtAddCallback(state->game, XmNexposeCallback, game_expose, state); + XtAddCallback(state->game, XmNexposeCallback, expose, state); XtVaGetValues(state->game, XmNwidth, &state->goal_sz[0], XmNheight, &state->goal_sz[1], (char *)NULL); XtAddCallback(state->goal, XmNresizeCallback, goal_resize, state); - XtAddCallback(state->goal, XmNexposeCallback, goal_expose, state); + XtAddCallback(state->goal, XmNexposeCallback, expose, state); } static void dialog_close(Widget w, void *data, void *cb_data)