]> git.draconx.ca Git - rrace.git/blobdiff - src/motif.c
Use new packed option format from gen-options.awk.
[rrace.git] / src / motif.c
index c4ea62dbbd25b5d5e4a4b7d6ceec50a3d8f4e40d..8b0fa4113d9139e6019abc8ced27fac3485b8859 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * X11 GUI for slide puzzle game
- * Copyright © 2022 Nick Bowler
+ * Copyright © 2022-2023 Nick Bowler
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,6 +25,7 @@
 #include <Xm/XmAll.h>
 
 #include "help.h"
+#include "xtra.h"
 #include "motif.h"
 #include "ewmhicon.h"
 #include "motifopt.h"
@@ -40,7 +41,6 @@
 
 #define PROGNAME "rrace"
 static const char *progname = PROGNAME;
-static const struct option lopts[] = { LOPTS_INITIALIZER, {0} };
 
 static char * const default_resources[] = {
        "*title: RRace",
@@ -76,7 +76,7 @@ static void print_usage(FILE *f)
                fprintf(f, "Try %s --help for more information.\n", progname);
 }
 
-static void print_help(void)
+static void print_help(const struct option *lopts)
 {
        struct lopt_help help = {0};
        const struct option *opt;
@@ -100,6 +100,8 @@ static Widget early_setup(XtAppContext *app, int argc, char **argv)
        Widget shell;
        int opt;
 
+       XTRA_PACKED_LOPTS(lopts);
+
        /* Check for --help/--version early (before X connection) */
        opterr = 0;
        while ((opt = getopt_long_only(argc, argv, "", lopts, NULL)) != -1) {
@@ -108,7 +110,7 @@ static Widget early_setup(XtAppContext *app, int argc, char **argv)
                        print_version();
                        exit(EXIT_SUCCESS);
                case LOPT_HELP:
-                       print_help();
+                       print_help(lopts);
                        exit(EXIT_SUCCESS);
                }
        }
@@ -143,14 +145,13 @@ static void timer_tick(void *data, XtIntervalId *id)
 
        if (state->board.x > 4) {
                /* Game is over */
-               state->timer_tick = 0;
+               state->flags &= ~FLAG_TIMER_RUNNING;
                return;
        }
 
-       app = XtWidgetToApplicationContext(state->game);
        ui_timer_update(state, game_elapsed(&state->board));
-       state->timer_tick = XtAppAddTimeOut(app, TIMER_UPDATE_MS,
-                                           timer_tick, state);
+       app = XtWidgetToApplicationContext(state->game);
+       XtAppAddTimeOut(app, TIMER_UPDATE_MS, timer_tick, state);
 }
 
 static void do_input_move(struct app_state *state, int x, int y)
@@ -159,16 +160,7 @@ static void do_input_move(struct app_state *state, int x, int y)
 
        if ((mask = game_do_move(&state->board, x, y)) != 0) {
                if (game_check_goal(&state->board) == 0) {
-                       int_fast32_t ms = game_finish(&state->board);
-                       unsigned min, sec;
-
-                       ui_timer_update(state, ms);
-
-                       sec = ms / 1000, ms %= 1000;
-                       min = sec / 60, sec %= 60;
-                       printf("You won!  Time was %u:%.2u.%.3u\n",
-                              min, sec, (unsigned)ms);
-
+                       ui_timer_update(state, game_finish(&state->board));
                        mask |= ~GOAL_MASK;
                }
 
@@ -178,7 +170,9 @@ static void do_input_move(struct app_state *state, int x, int y)
 
 static void set_view_goal(struct app_state *state, int view_goal)
 {
-       state->view_goal_on_game = view_goal;
+       state->flags &= ~FLAG_VIEW_GOAL_ON_GAME;
+       state->flags |= view_goal ? FLAG_VIEW_GOAL_ON_GAME : 0;
+
        x11_redraw_game(state, game_check_goal(&state->board));
 }
 
@@ -231,18 +225,19 @@ static void proc_exit(Widget w, XEvent *e, String *argv, Cardinal *argc)
 
 static void proc_new_game(Widget w, XEvent *e, String *argv, Cardinal *argc)
 {
+       XtAppContext app;
+
        game_reset(&state.board);
 
+       state.flags &= ~FLAG_VIEW_GOAL_ON_GAME;
        x11_redraw_goal(&state, -1, get_shell(w));
        x11_redraw_game(&state, -1);
 
-       if (!state.timer_tick) {
-               XtAppContext app = XtWidgetToApplicationContext(w);
-               state.timer_tick = XtAppAddTimeOut(app, TIMER_UPDATE_MS,
-                                                  timer_tick, &state);
-       }
-
        game_begin(&state.board);
+       if (!(state.flags & FLAG_TIMER_RUNNING)) {
+               state.flags |= FLAG_TIMER_RUNNING;
+               timer_tick(&state, 0);
+       }
 }
 
 static void proc_about(Widget w, XEvent *e, String *argv, Cardinal *argc)
@@ -312,7 +307,7 @@ static XtAppContext app_initialize(int argc, char **argv)
                state.board.game[i] = state.board.goal[i] << GOAL_SHIFT;
        game_finish(&state.board);
 
-       state.use_ewmh_icons = ewmh_probe_wm_icon(shell);
+       state.flags = ewmh_probe_wm_icon(shell);
        XtRealizeWidget(shell);
 
        x11_redraw_goal(&state, 0, shell);