aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keen.c46
-rw-r--r--solo.c46
-rw-r--r--towers.c47
-rw-r--r--undead.c85
-rw-r--r--unequal.c46
-rw-r--r--unfinished/group.c46
6 files changed, 262 insertions, 54 deletions
diff --git a/keen.c b/keen.c
index 7022611..2d03b6b 100644
--- a/keen.c
+++ b/keen.c
@@ -1525,6 +1525,17 @@ struct game_ui {
* allowed on immutable squares.
*/
bool hcursor;
+
+ /*
+ * User preference option: if the user right-clicks in a square
+ * and presses a number key to add/remove a pencil mark, do we
+ * hide the mouse highlight again afterwards?
+ *
+ * Historically our answer was yes. The Android port prefers no.
+ * There are advantages both ways, depending how much you dislike
+ * the highlight cluttering your view. So it's a preference.
+ */
+ bool pencil_keep_highlight;
};
static game_ui *new_ui(const game_state *state)
@@ -1535,6 +1546,8 @@ static game_ui *new_ui(const game_state *state)
ui->hpencil = false;
ui->hshow = ui->hcursor = getenv_bool("PUZZLES_SHOW_CURSOR", false);
+ ui->pencil_keep_highlight = false;
+
return ui;
}
@@ -1543,6 +1556,28 @@ static void free_ui(game_ui *ui)
sfree(ui);
}
+static config_item *get_prefs(game_ui *ui)
+{
+ config_item *ret;
+
+ ret = snewn(2, config_item);
+
+ ret[0].name = "Keep mouse highlight after changing a pencil mark";
+ ret[0].kw = "pencil-keep-highlight";
+ ret[0].type = C_BOOLEAN;
+ ret[0].u.boolean.bval = ui->pencil_keep_highlight;
+
+ ret[1].name = NULL;
+ ret[1].type = C_END;
+
+ return ret;
+}
+
+static void set_prefs(game_ui *ui, const config_item *cfg)
+{
+ ui->pencil_keep_highlight = cfg[0].u.boolean.bval;
+}
+
static void game_changed_state(game_ui *ui, const game_state *oldstate,
const game_state *newstate)
{
@@ -1791,7 +1826,14 @@ static char *interpret_move(const game_state *state, game_ui *ui,
sprintf(buf, "%c%d,%d,%d",
(char)(ui->hpencil && n > 0 ? 'P' : 'R'), ui->hx, ui->hy, n);
- if (!ui->hcursor) ui->hshow = false;
+ /*
+ * Hide the highlight after a keypress, if it was mouse-
+ * generated. Also, don't hide it if this move has changed
+ * pencil marks and the user preference says not to hide the
+ * highlight in that situation.
+ */
+ if (!ui->hcursor && !(ui->hpencil && ui->pencil_keep_highlight))
+ ui->hshow = false;
return dupstr(buf);
}
@@ -2479,7 +2521,7 @@ const struct game thegame = {
free_game,
true, solve_game,
false, NULL, NULL, /* can_format_as_text_now, text_format */
- NULL, NULL, /* get_prefs, set_prefs */
+ get_prefs, set_prefs,
new_ui,
free_ui,
NULL, /* encode_ui */
diff --git a/solo.c b/solo.c
index 29ae1dd..b9e4ab3 100644
--- a/solo.c
+++ b/solo.c
@@ -4557,6 +4557,17 @@ struct game_ui {
* allowed on immutable squares.
*/
bool hcursor;
+
+ /*
+ * User preference option: if the user right-clicks in a square
+ * and presses a number or letter key to add/remove a pencil mark,
+ * do we hide the mouse highlight again afterwards?
+ *
+ * Historically our answer was yes. The Android port prefers no.
+ * There are advantages both ways, depending how much you dislike
+ * the highlight cluttering your view. So it's a preference.
+ */
+ bool pencil_keep_highlight;
};
static game_ui *new_ui(const game_state *state)
@@ -4567,6 +4578,8 @@ static game_ui *new_ui(const game_state *state)
ui->hpencil = false;
ui->hshow = ui->hcursor = getenv_bool("PUZZLES_SHOW_CURSOR", false);
+ ui->pencil_keep_highlight = false;
+
return ui;
}
@@ -4575,6 +4588,28 @@ static void free_ui(game_ui *ui)
sfree(ui);
}
+static config_item *get_prefs(game_ui *ui)
+{
+ config_item *ret;
+
+ ret = snewn(2, config_item);
+
+ ret[0].name = "Keep mouse highlight after changing a pencil mark";
+ ret[0].kw = "pencil-keep-highlight";
+ ret[0].type = C_BOOLEAN;
+ ret[0].u.boolean.bval = ui->pencil_keep_highlight;
+
+ ret[1].name = NULL;
+ ret[1].type = C_END;
+
+ return ret;
+}
+
+static void set_prefs(game_ui *ui, const config_item *cfg)
+{
+ ui->pencil_keep_highlight = cfg[0].u.boolean.bval;
+}
+
static void game_changed_state(game_ui *ui, const game_state *oldstate,
const game_state *newstate)
{
@@ -4723,7 +4758,14 @@ static char *interpret_move(const game_state *state, game_ui *ui,
sprintf(buf, "%c%d,%d,%d",
(char)(ui->hpencil && n > 0 ? 'P' : 'R'), ui->hx, ui->hy, n);
- if (!ui->hcursor) ui->hshow = false;
+ /*
+ * Hide the highlight after a keypress, if it was mouse-
+ * generated. Also, don't hide it if this move has changed
+ * pencil marks and the user preference says not to hide the
+ * highlight in that situation.
+ */
+ if (!ui->hcursor && !(ui->hpencil && ui->pencil_keep_highlight))
+ ui->hshow = false;
return dupstr(buf);
}
@@ -5632,7 +5674,7 @@ const struct game thegame = {
free_game,
true, solve_game,
true, game_can_format_as_text_now, game_text_format,
- NULL, NULL, /* get_prefs, set_prefs */
+ get_prefs, set_prefs,
new_ui,
free_ui,
NULL, /* encode_ui */
diff --git a/towers.c b/towers.c
index 297ada8..0e93c09 100644
--- a/towers.c
+++ b/towers.c
@@ -1174,6 +1174,17 @@ struct game_ui {
* it in just in case.
*/
int three_d;
+
+ /*
+ * User preference option: if the user right-clicks in a square
+ * and presses a number key to add/remove a pencil mark, do we
+ * hide the mouse highlight again afterwards?
+ *
+ * Historically our answer was yes. The Android port prefers no.
+ * There are advantages both ways, depending how much you dislike
+ * the highlight cluttering your view. So it's a preference.
+ */
+ bool pencil_keep_highlight;
};
static void legacy_prefs_override(struct game_ui *ui_out)
@@ -1199,6 +1210,7 @@ static game_ui *new_ui(const game_state *state)
ui->hshow = ui->hcursor = getenv_bool("PUZZLES_SHOW_CURSOR", false);
ui->three_d = true;
+ ui->pencil_keep_highlight = false;
legacy_prefs_override(ui);
return ui;
@@ -1213,24 +1225,30 @@ static config_item *get_prefs(game_ui *ui)
{
config_item *ret;
- ret = snewn(2, config_item);
+ ret = snewn(3, config_item);
- ret[0].name = "Puzzle appearance";
- ret[0].kw = "appearance";
- ret[0].type = C_CHOICES;
- ret[0].u.choices.choicenames = ":2D:3D";
- ret[0].u.choices.choicekws = ":2d:3d";
- ret[0].u.choices.selected = ui->three_d;
+ ret[0].name = "Keep mouse highlight after changing a pencil mark";
+ ret[0].kw = "pencil-keep-highlight";
+ ret[0].type = C_BOOLEAN;
+ ret[0].u.boolean.bval = ui->pencil_keep_highlight;
- ret[1].name = NULL;
- ret[1].type = C_END;
+ ret[1].name = "Puzzle appearance";
+ ret[1].kw = "appearance";
+ ret[1].type = C_CHOICES;
+ ret[1].u.choices.choicenames = ":2D:3D";
+ ret[1].u.choices.choicekws = ":2d:3d";
+ ret[1].u.choices.selected = ui->three_d;
+
+ ret[2].name = NULL;
+ ret[2].type = C_END;
return ret;
}
static void set_prefs(game_ui *ui, const config_item *cfg)
{
- ui->three_d = cfg[0].u.choices.selected;
+ ui->pencil_keep_highlight = cfg[0].u.boolean.bval;
+ ui->three_d = cfg[1].u.choices.selected;
}
static void game_changed_state(game_ui *ui, const game_state *oldstate,
@@ -1550,7 +1568,14 @@ static char *interpret_move(const game_state *state, game_ui *ui,
sprintf(buf, "%c%d,%d,%d",
(char)(ui->hpencil && n > 0 ? 'P' : 'R'), ui->hx, ui->hy, n);
- if (!ui->hcursor) ui->hshow = false;
+ /*
+ * Hide the highlight after a keypress, if it was mouse-
+ * generated. Also, don't hide it if this move has changed
+ * pencil marks and the user preference says not to hide the
+ * highlight in that situation.
+ */
+ if (!ui->hcursor && !(ui->hpencil && ui->pencil_keep_highlight))
+ ui->hshow = false;
return dupstr(buf);
}
diff --git a/undead.c b/undead.c
index 38543ba..0213d0e 100644
--- a/undead.c
+++ b/undead.c
@@ -1644,6 +1644,17 @@ struct game_ui {
int hx, hy; /* as for solo.c, highlight pos */
bool hshow, hpencil, hcursor; /* show state, type, and ?cursor. */
bool ascii;
+
+ /*
+ * User preference option: if the user right-clicks in a square
+ * and presses a monster key to add/remove a pencil mark, do we
+ * hide the mouse highlight again afterwards?
+ *
+ * Historically our answer was yes. The Android port prefers no.
+ * There are advantages both ways, depending how much you dislike
+ * the highlight cluttering your view. So it's a preference.
+ */
+ bool pencil_keep_highlight;
};
static game_ui *new_ui(const game_state *state)
@@ -1653,6 +1664,9 @@ static game_ui *new_ui(const game_state *state)
ui->hx = ui->hy = ui->hshow = ui->hcursor =
getenv_bool("PUZZLES_SHOW_CURSOR", false);
ui->ascii = false;
+
+ ui->pencil_keep_highlight = false;
+
return ui;
}
@@ -1660,24 +1674,30 @@ static config_item *get_prefs(game_ui *ui)
{
config_item *ret;
- ret = snewn(2, config_item);
+ ret = snewn(3, config_item);
+
+ ret[0].name = "Keep mouse highlight after changing a pencil mark";
+ ret[0].kw = "pencil-keep-highlight";
+ ret[0].type = C_BOOLEAN;
+ ret[0].u.boolean.bval = ui->pencil_keep_highlight;
- ret[0].name = "Monster representation";
- ret[0].kw = "monsters";
- ret[0].type = C_CHOICES;
- ret[0].u.choices.choicenames = ":Pictures:Letters";
- ret[0].u.choices.choicekws = ":pictures:letters";
- ret[0].u.choices.selected = ui->ascii;
+ ret[1].name = "Monster representation";
+ ret[1].kw = "monsters";
+ ret[1].type = C_CHOICES;
+ ret[1].u.choices.choicenames = ":Pictures:Letters";
+ ret[1].u.choices.choicekws = ":pictures:letters";
+ ret[1].u.choices.selected = ui->ascii;
- ret[1].name = NULL;
- ret[1].type = C_END;
+ ret[2].name = NULL;
+ ret[2].type = C_END;
return ret;
}
static void set_prefs(game_ui *ui, const config_item *cfg)
{
- ui->ascii = cfg[0].u.choices.selected;
+ ui->pencil_keep_highlight = cfg[0].u.boolean.bval;
+ ui->ascii = cfg[1].u.choices.selected;
}
static void free_ui(game_ui *ui) {
@@ -1840,39 +1860,34 @@ static char *interpret_move(const game_state *state, game_ui *ui,
if (ui->hshow && ui->hpencil) {
xi = state->common->xinfo[ui->hx + ui->hy*(state->common->params.w+2)];
if (xi >= 0 && !state->common->fixed[xi]) {
+ buf[0] = '\0';
+
if (button == 'g' || button == 'G' || button == '1') {
sprintf(buf,"g%d",xi);
- if (!ui->hcursor) {
- ui->hpencil = false;
- ui->hshow = false;
- }
- return dupstr(buf);
- }
- if (button == 'v' || button == 'V' || button == '2') {
+ } else if (button == 'v' || button == 'V' || button == '2') {
sprintf(buf,"v%d",xi);
- if (!ui->hcursor) {
- ui->hpencil = false;
- ui->hshow = false;
- }
- return dupstr(buf);
- }
- if (button == 'z' || button == 'Z' || button == '3') {
+ } else if (button == 'z' || button == 'Z' || button == '3') {
sprintf(buf,"z%d",xi);
- if (!ui->hcursor) {
- ui->hpencil = false;
- ui->hshow = false;
- }
- return dupstr(buf);
+ } else if (button == 'e' || button == 'E' ||
+ button == CURSOR_SELECT2 || button == '0' ||
+ button == '\b') {
+ if (state->pencils[xi] == 0)
+ return ui->hcursor ? NULL : MOVE_UI_UPDATE;
+ sprintf(buf,"E%d",xi);
}
- if (button == 'e' || button == 'E' || button == CURSOR_SELECT2 ||
- button == '0' || button == '\b') {
- if (!ui->hcursor) {
+
+ if (buf[0]) {
+ /*
+ * Hide the highlight after a keypress, if it was mouse-
+ * generated. Also, don't hide it if this move has changed
+ * pencil marks and the user preference says not to hide the
+ * highlight in that situation.
+ */
+ if (!ui->hcursor &&
+ !(ui->hpencil && ui->pencil_keep_highlight)) {
ui->hpencil = false;
ui->hshow = false;
}
- if (state->pencils[xi] == 0)
- return ui->hcursor ? NULL : MOVE_UI_UPDATE;
- sprintf(buf,"E%d",xi);
return dupstr(buf);
}
}
diff --git a/unequal.c b/unequal.c
index 0adee9d..f778df0 100644
--- a/unequal.c
+++ b/unequal.c
@@ -1436,6 +1436,17 @@ static char *solve_game(const game_state *state, const game_state *currstate,
struct game_ui {
int hx, hy; /* as for solo.c, highlight pos */
bool hshow, hpencil, hcursor; /* show state, type, and ?cursor. */
+
+ /*
+ * User preference option: if the user right-clicks in a square
+ * and presses a number key to add/remove a pencil mark, do we
+ * hide the mouse highlight again afterwards?
+ *
+ * Historically our answer was yes. The Android port prefers no.
+ * There are advantages both ways, depending how much you dislike
+ * the highlight cluttering your view. So it's a preference.
+ */
+ bool pencil_keep_highlight;
};
static game_ui *new_ui(const game_state *state)
@@ -1446,6 +1457,8 @@ static game_ui *new_ui(const game_state *state)
ui->hpencil = false;
ui->hshow = ui->hcursor = getenv_bool("PUZZLES_SHOW_CURSOR", false);
+ ui->pencil_keep_highlight = false;
+
return ui;
}
@@ -1454,6 +1467,28 @@ static void free_ui(game_ui *ui)
sfree(ui);
}
+static config_item *get_prefs(game_ui *ui)
+{
+ config_item *ret;
+
+ ret = snewn(2, config_item);
+
+ ret[0].name = "Keep mouse highlight after changing a pencil mark";
+ ret[0].kw = "pencil-keep-highlight";
+ ret[0].type = C_BOOLEAN;
+ ret[0].u.boolean.bval = ui->pencil_keep_highlight;
+
+ ret[1].name = NULL;
+ ret[1].type = C_END;
+
+ return ret;
+}
+
+static void set_prefs(game_ui *ui, const config_item *cfg)
+{
+ ui->pencil_keep_highlight = cfg[0].u.boolean.bval;
+}
+
static void game_changed_state(game_ui *ui, const game_state *oldstate,
const game_state *newstate)
{
@@ -1632,7 +1667,14 @@ static char *interpret_move(const game_state *state, game_ui *ui,
sprintf(buf, "%c%d,%d,%d",
(char)(ui->hpencil && n > 0 ? 'P' : 'R'), ui->hx, ui->hy, n);
- if (!ui->hcursor) ui->hshow = false;
+ /*
+ * Hide the highlight after a keypress, if it was mouse-
+ * generated. Also, don't hide it if this move has changed
+ * pencil marks and the user preference says not to hide the
+ * highlight in that situation.
+ */
+ if (!ui->hcursor && !(ui->hpencil && ui->pencil_keep_highlight))
+ ui->hshow = false;
return dupstr(buf);
}
@@ -2155,7 +2197,7 @@ const struct game thegame = {
free_game,
true, solve_game,
true, game_can_format_as_text_now, game_text_format,
- NULL, NULL, /* get_prefs, set_prefs */
+ get_prefs, set_prefs,
new_ui,
free_ui,
NULL, /* encode_ui */
diff --git a/unfinished/group.c b/unfinished/group.c
index 8eac96a..c622e9a 100644
--- a/unfinished/group.c
+++ b/unfinished/group.c
@@ -1252,6 +1252,17 @@ struct game_ui {
int dragnum; /* element being dragged */
int dragpos; /* its current position */
int edgepos;
+
+ /*
+ * User preference option: if the user right-clicks in a square
+ * and presses a letter key to add/remove a pencil mark, do we
+ * hide the mouse highlight again afterwards?
+ *
+ * Historically our answer was yes. The Android port prefers no.
+ * There are advantages both ways, depending how much you dislike
+ * the highlight cluttering your view. So it's a preference.
+ */
+ bool pencil_keep_highlight;
};
static game_ui *new_ui(const game_state *state)
@@ -1264,6 +1275,8 @@ static game_ui *new_ui(const game_state *state)
ui->hcursor = false;
ui->drag = 0;
+ ui->pencil_keep_highlight = false;
+
return ui;
}
@@ -1272,6 +1285,28 @@ static void free_ui(game_ui *ui)
sfree(ui);
}
+static config_item *get_prefs(game_ui *ui)
+{
+ config_item *ret;
+
+ ret = snewn(2, config_item);
+
+ ret[0].name = "Keep mouse highlight after changing a pencil mark";
+ ret[0].kw = "pencil-keep-highlight";
+ ret[0].type = C_BOOLEAN;
+ ret[0].u.boolean.bval = ui->pencil_keep_highlight;
+
+ ret[1].name = NULL;
+ ret[1].type = C_END;
+
+ return ret;
+}
+
+static void set_prefs(game_ui *ui, const config_item *cfg)
+{
+ ui->pencil_keep_highlight = cfg[0].u.boolean.bval;
+}
+
static void game_changed_state(game_ui *ui, const game_state *oldstate,
const game_state *newstate)
{
@@ -1676,7 +1711,14 @@ static char *interpret_move(const game_state *state, game_ui *ui,
}
movebuf = sresize(movebuf, buflen+1, char);
- if (!ui->hcursor) ui->hshow = false;
+ /*
+ * Hide the highlight after a keypress, if it was mouse-
+ * generated. Also, don't hide it if this move has changed
+ * pencil marks and the user preference says not to hide the
+ * highlight in that situation.
+ */
+ if (!ui->hcursor && !(ui->hpencil && ui->pencil_keep_highlight))
+ ui->hshow = false;
return movebuf;
}
@@ -2323,7 +2365,7 @@ const struct game thegame = {
free_game,
true, solve_game,
true, game_can_format_as_text_now, game_text_format,
- NULL, NULL, /* get_prefs, set_prefs */
+ get_prefs, set_prefs,
new_ui,
free_ui,
NULL, /* encode_ui */