diff options
| -rw-r--r-- | cube.c | 1 | ||||
| -rw-r--r-- | fifteen.c | 1 | ||||
| -rw-r--r-- | midend.c | 16 | ||||
| -rw-r--r-- | mines.c | 19 | ||||
| -rw-r--r-- | net.c | 1 | ||||
| -rw-r--r-- | netslide.c | 1 | ||||
| -rw-r--r-- | nullgame.c | 1 | ||||
| -rw-r--r-- | pattern.c | 1 | ||||
| -rw-r--r-- | puzzles.h | 4 | ||||
| -rw-r--r-- | rect.c | 1 | ||||
| -rw-r--r-- | sixteen.c | 1 | ||||
| -rw-r--r-- | solo.c | 1 | ||||
| -rw-r--r-- | twiddle.c | 1 |
13 files changed, 41 insertions, 8 deletions
@@ -1645,4 +1645,5 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, FALSE, game_timing_state, + 0, /* mouse_priorities */ }; @@ -840,4 +840,5 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, FALSE, game_timing_state, + 0, /* mouse_priorities */ }; @@ -441,6 +441,14 @@ int midend_process_key(midend_data *me, int x, int y, int button) * pressed, invent a button-up for the first one and then * pass the button-down through as before. * + * 2005-05-31: An addendum to the above. Some games might want + * a `priority order' among buttons, such that if one button is + * pressed while another is down then a fixed one of the + * buttons takes priority no matter what order they're pressed + * in. Mines, in particular, wants to treat a left+right click + * like a left click for the benefit of users of other + * implementations. So the last of the above points is modified + * in the presence of an (optional) button priority order. */ if (IS_MOUSE_DRAG(button) || IS_MOUSE_RELEASE(button)) { if (me->pressed_mouse_button) { @@ -454,6 +462,14 @@ int midend_process_key(midend_data *me, int x, int y, int button) } else return ret; /* ignore it */ } else if (IS_MOUSE_DOWN(button) && me->pressed_mouse_button) { + /* + * If the new button has lower priority than the old one, + * don't bother doing this. + */ + if (me->ourgame->mouse_priorities & + BUTTON_BEATS(me->pressed_mouse_button, button)) + return ret; /* just ignore it */ + /* * Fabricate a button-up for the previously pressed button. */ @@ -2457,7 +2457,8 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, if (cx < 0 || cx >= from->w || cy < 0 || cy > from->h) return NULL; - if (button == LEFT_BUTTON || button == LEFT_DRAG) { + if (button == LEFT_BUTTON || button == LEFT_DRAG || + button == MIDDLE_BUTTON || button == MIDDLE_DRAG) { /* * Mouse-downs and mouse-drags just cause highlighting * updates. @@ -2487,7 +2488,7 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, return ret; } - if (button == LEFT_RELEASE) { + if (button == LEFT_RELEASE || button == MIDDLE_RELEASE) { ui->hx = ui->hy = -1; ui->hradius = 0; @@ -2501,8 +2502,9 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, * permitted if the tile is marked as a mine, for safety. * (Unmark it and _then_ open it.) */ - if (from->grid[cy * from->w + cx] == -2 || - from->grid[cy * from->w + cx] == -3) { + if (button == LEFT_RELEASE && + (from->grid[cy * from->w + cx] == -2 || + from->grid[cy * from->w + cx] == -3)) { ret = dup_game(from); ret->just_used_solve = FALSE; open_square(ret, cx, cy); @@ -2512,10 +2514,10 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, } /* - * Left-clicking on an uncovered tile: first we check to see if - * the number of mine markers surrounding the tile is equal to - * its mine count, and if so then we open all other surrounding - * squares. + * Left-clicking or middle-clicking on an uncovered tile: + * first we check to see if the number of mine markers + * surrounding the tile is equal to its mine count, and if + * so then we open all other surrounding squares. */ if (from->grid[cy * from->w + cx] > 0) { int dy, dx, n; @@ -3006,4 +3008,5 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, TRUE, game_timing_state, + BUTTON_BEATS(LEFT_BUTTON, RIGHT_BUTTON), }; @@ -2604,4 +2604,5 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, FALSE, game_timing_state, + 0, /* mouse_priorities */ }; @@ -1762,4 +1762,5 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, FALSE, game_timing_state, + 0, /* mouse_priorities */ }; @@ -254,4 +254,5 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, FALSE, game_timing_state, + 0, /* mouse_priorities */ }; @@ -1143,6 +1143,7 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, FALSE, game_timing_state, + 0, /* mouse_priorities */ }; #ifdef STANDALONE_SOLVER @@ -47,6 +47,9 @@ enum { #define IS_MOUSE_RELEASE(m) ( (unsigned)((m) - LEFT_RELEASE) <= \ (unsigned)(RIGHT_RELEASE - LEFT_RELEASE)) +/* Bit flags indicating mouse button priorities */ +#define BUTTON_BEATS(x,y) ( 1 << (((x)-LEFT_BUTTON)*3+(y)-LEFT_BUTTON) ) + #define IGNOREARG(x) ( (x) = (x) ) typedef struct frontend frontend; @@ -245,6 +248,7 @@ struct game { int (*wants_statusbar)(void); int is_timed; int (*timing_state)(game_state *state); + int mouse_priorities; }; /* @@ -2553,4 +2553,5 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, FALSE, game_timing_state, + 0, /* mouse_priorities */ }; @@ -1011,4 +1011,5 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, FALSE, game_timing_state, + 0, /* mouse_priorities */ }; @@ -2179,6 +2179,7 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, FALSE, game_timing_state, + 0, /* mouse_priorities */ }; #ifdef STANDALONE_SOLVER @@ -1179,4 +1179,5 @@ const struct game thegame = { game_flash_length, game_wants_statusbar, FALSE, game_timing_state, + 0, /* mouse_priorities */ }; |