mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
Better mouse button handling in Mines:
- middle button now also triggers the clear-around-square action - a special-case handler in midend_process_key() arranges that the left button always trumps the right button if both are pressed together, meaning that Windows Minesweeper players used to pressing L+R to clear around a square should still be able to do so without any strange behaviour. (The latter touches all game backends, yet again, to add a field to the game structure which is zero in everything except Mines.) [originally from svn r5888]
This commit is contained in:
1
cube.c
1
cube.c
@ -1645,4 +1645,5 @@ const struct game thegame = {
|
|||||||
game_flash_length,
|
game_flash_length,
|
||||||
game_wants_statusbar,
|
game_wants_statusbar,
|
||||||
FALSE, game_timing_state,
|
FALSE, game_timing_state,
|
||||||
|
0, /* mouse_priorities */
|
||||||
};
|
};
|
||||||
|
@ -840,4 +840,5 @@ const struct game thegame = {
|
|||||||
game_flash_length,
|
game_flash_length,
|
||||||
game_wants_statusbar,
|
game_wants_statusbar,
|
||||||
FALSE, game_timing_state,
|
FALSE, game_timing_state,
|
||||||
|
0, /* mouse_priorities */
|
||||||
};
|
};
|
||||||
|
16
midend.c
16
midend.c
@ -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
|
* pressed, invent a button-up for the first one and then
|
||||||
* pass the button-down through as before.
|
* 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 (IS_MOUSE_DRAG(button) || IS_MOUSE_RELEASE(button)) {
|
||||||
if (me->pressed_mouse_button) {
|
if (me->pressed_mouse_button) {
|
||||||
@ -454,6 +462,14 @@ int midend_process_key(midend_data *me, int x, int y, int button)
|
|||||||
} else
|
} else
|
||||||
return ret; /* ignore it */
|
return ret; /* ignore it */
|
||||||
} else if (IS_MOUSE_DOWN(button) && me->pressed_mouse_button) {
|
} 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.
|
* Fabricate a button-up for the previously pressed button.
|
||||||
*/
|
*/
|
||||||
|
19
mines.c
19
mines.c
@ -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)
|
if (cx < 0 || cx >= from->w || cy < 0 || cy > from->h)
|
||||||
return NULL;
|
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
|
* Mouse-downs and mouse-drags just cause highlighting
|
||||||
* updates.
|
* updates.
|
||||||
@ -2487,7 +2488,7 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (button == LEFT_RELEASE) {
|
if (button == LEFT_RELEASE || button == MIDDLE_RELEASE) {
|
||||||
ui->hx = ui->hy = -1;
|
ui->hx = ui->hy = -1;
|
||||||
ui->hradius = 0;
|
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.
|
* permitted if the tile is marked as a mine, for safety.
|
||||||
* (Unmark it and _then_ open it.)
|
* (Unmark it and _then_ open it.)
|
||||||
*/
|
*/
|
||||||
if (from->grid[cy * from->w + cx] == -2 ||
|
if (button == LEFT_RELEASE &&
|
||||||
from->grid[cy * from->w + cx] == -3) {
|
(from->grid[cy * from->w + cx] == -2 ||
|
||||||
|
from->grid[cy * from->w + cx] == -3)) {
|
||||||
ret = dup_game(from);
|
ret = dup_game(from);
|
||||||
ret->just_used_solve = FALSE;
|
ret->just_used_solve = FALSE;
|
||||||
open_square(ret, cx, cy);
|
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
|
* Left-clicking or middle-clicking on an uncovered tile:
|
||||||
* the number of mine markers surrounding the tile is equal to
|
* first we check to see if the number of mine markers
|
||||||
* its mine count, and if so then we open all other surrounding
|
* surrounding the tile is equal to its mine count, and if
|
||||||
* squares.
|
* so then we open all other surrounding squares.
|
||||||
*/
|
*/
|
||||||
if (from->grid[cy * from->w + cx] > 0) {
|
if (from->grid[cy * from->w + cx] > 0) {
|
||||||
int dy, dx, n;
|
int dy, dx, n;
|
||||||
@ -3006,4 +3008,5 @@ const struct game thegame = {
|
|||||||
game_flash_length,
|
game_flash_length,
|
||||||
game_wants_statusbar,
|
game_wants_statusbar,
|
||||||
TRUE, game_timing_state,
|
TRUE, game_timing_state,
|
||||||
|
BUTTON_BEATS(LEFT_BUTTON, RIGHT_BUTTON),
|
||||||
};
|
};
|
||||||
|
1
net.c
1
net.c
@ -2604,4 +2604,5 @@ const struct game thegame = {
|
|||||||
game_flash_length,
|
game_flash_length,
|
||||||
game_wants_statusbar,
|
game_wants_statusbar,
|
||||||
FALSE, game_timing_state,
|
FALSE, game_timing_state,
|
||||||
|
0, /* mouse_priorities */
|
||||||
};
|
};
|
||||||
|
@ -1762,4 +1762,5 @@ const struct game thegame = {
|
|||||||
game_flash_length,
|
game_flash_length,
|
||||||
game_wants_statusbar,
|
game_wants_statusbar,
|
||||||
FALSE, game_timing_state,
|
FALSE, game_timing_state,
|
||||||
|
0, /* mouse_priorities */
|
||||||
};
|
};
|
||||||
|
@ -254,4 +254,5 @@ const struct game thegame = {
|
|||||||
game_flash_length,
|
game_flash_length,
|
||||||
game_wants_statusbar,
|
game_wants_statusbar,
|
||||||
FALSE, game_timing_state,
|
FALSE, game_timing_state,
|
||||||
|
0, /* mouse_priorities */
|
||||||
};
|
};
|
||||||
|
@ -1143,6 +1143,7 @@ const struct game thegame = {
|
|||||||
game_flash_length,
|
game_flash_length,
|
||||||
game_wants_statusbar,
|
game_wants_statusbar,
|
||||||
FALSE, game_timing_state,
|
FALSE, game_timing_state,
|
||||||
|
0, /* mouse_priorities */
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef STANDALONE_SOLVER
|
#ifdef STANDALONE_SOLVER
|
||||||
|
@ -47,6 +47,9 @@ enum {
|
|||||||
#define IS_MOUSE_RELEASE(m) ( (unsigned)((m) - LEFT_RELEASE) <= \
|
#define IS_MOUSE_RELEASE(m) ( (unsigned)((m) - LEFT_RELEASE) <= \
|
||||||
(unsigned)(RIGHT_RELEASE - 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) )
|
#define IGNOREARG(x) ( (x) = (x) )
|
||||||
|
|
||||||
typedef struct frontend frontend;
|
typedef struct frontend frontend;
|
||||||
@ -245,6 +248,7 @@ struct game {
|
|||||||
int (*wants_statusbar)(void);
|
int (*wants_statusbar)(void);
|
||||||
int is_timed;
|
int is_timed;
|
||||||
int (*timing_state)(game_state *state);
|
int (*timing_state)(game_state *state);
|
||||||
|
int mouse_priorities;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
1
rect.c
1
rect.c
@ -2553,4 +2553,5 @@ const struct game thegame = {
|
|||||||
game_flash_length,
|
game_flash_length,
|
||||||
game_wants_statusbar,
|
game_wants_statusbar,
|
||||||
FALSE, game_timing_state,
|
FALSE, game_timing_state,
|
||||||
|
0, /* mouse_priorities */
|
||||||
};
|
};
|
||||||
|
@ -1011,4 +1011,5 @@ const struct game thegame = {
|
|||||||
game_flash_length,
|
game_flash_length,
|
||||||
game_wants_statusbar,
|
game_wants_statusbar,
|
||||||
FALSE, game_timing_state,
|
FALSE, game_timing_state,
|
||||||
|
0, /* mouse_priorities */
|
||||||
};
|
};
|
||||||
|
1
solo.c
1
solo.c
@ -2179,6 +2179,7 @@ const struct game thegame = {
|
|||||||
game_flash_length,
|
game_flash_length,
|
||||||
game_wants_statusbar,
|
game_wants_statusbar,
|
||||||
FALSE, game_timing_state,
|
FALSE, game_timing_state,
|
||||||
|
0, /* mouse_priorities */
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef STANDALONE_SOLVER
|
#ifdef STANDALONE_SOLVER
|
||||||
|
Reference in New Issue
Block a user