From 06bb86e63b37fd43615492829d6457a3df1e8f85 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sun, 8 May 2005 04:22:53 +0000 Subject: [PATCH] more ^R > clear stale prompt [...] > Can someone who understands the relevant windowing code fix ^R in getpos()? I still don't understand why it wasn't working as expected, but moving the existing cursor positioning after flush_screen() instead of before now makes ^R work ok during getpos(). It doesn't restore the top line text so isn't a transparent redraw but it now displays a prompt string there instead. Likewise after typing '?' for help so that it should be move evident that nethack is still waiting for you to move the cursor somewhere. Also add support for ^L in numpad mode. I almost never use that and didn't think of it the first time around. --- doc/fixes34.4 | 2 ++ include/extern.h | 3 ++- src/cmd.c | 10 +++++++++- src/do_name.c | 22 +++++++++++----------- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/doc/fixes34.4 b/doc/fixes34.4 index 0e135111c..90853cb8e 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -142,6 +142,8 @@ when adding an item to inventory, try to stack it with the quiver slot cockatrice meat has a distinct flavor to some wish request for " armor" will match item named " mail" Fire Brand and Frost Brand have a chance to avoid taking rust damage +support ^R (and ^L in numpad mode) to request display repaint during direction + choosing and location choosing prompting modes Platform- and/or Interface-Specific New Features diff --git a/include/extern.h b/include/extern.h index 4b1e0fd39..2cea07cca 100644 --- a/include/extern.h +++ b/include/extern.h @@ -155,12 +155,13 @@ E boolean NDECL(status_hilite_menu); /* ### cmd.c ### */ +E boolean FDECL(redraw_cmd, (CHAR_P)); #ifdef USE_TRAMPOLI E int NDECL(doextcmd); E int NDECL(domonability); E int NDECL(doprev_message); E int NDECL(timed_occupation); -E int NDECL(wiz_attributes); +E int NDECL(doattributes); E int NDECL(enter_explore_mode); # ifdef WIZARD E int NDECL(wiz_detect); diff --git a/src/cmd.c b/src/cmd.c index 7282edad5..de8ee9998 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -1301,6 +1301,7 @@ minimal_enlightenment() return (n != -1); } +/* ^X command */ STATIC_PTR int doattributes() { @@ -1654,6 +1655,13 @@ add_debug_extended_commands() } } +/* decide whether a character (user input keystroke) requests screen repaint */ +boolean +redraw_cmd(c) +char c; +{ + return (c == C('r') || (iflags.num_pad && c == C('l'))); +} static const char template[] = "%-18s %4ld %6ld"; static const char count_str[] = " count bytes"; @@ -2171,7 +2179,7 @@ const char *s; dirsym = yn_function((s && *s != '^') ? s : "In what direction?", (char *)0, '\0'); - if (dirsym == C('r')) { /* ^R */ + if (redraw_cmd(dirsym)) { /* ^R */ docrt(); /* redraw */ goto retry; } diff --git a/src/do_name.c b/src/do_name.c index 0f6e7a1a7..ee6ae0541 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -23,11 +23,6 @@ nextmbuf() return bufs[bufidx]; } -/* same definition as in cmd.c */ -#ifndef C -#define C(a) ((a) & 0x1f) /* ^a */ -#endif - /* the response for '?' help request in getpos() */ STATIC_OVL void getpos_help(force, goal) @@ -71,6 +66,7 @@ const char *goal; const char *sdp; if(iflags.num_pad) sdp = ndir; else sdp = sdir; /* DICE workaround */ + if (!goal) goal = "desired location"; if (flags.verbose) { pline("(For instructions type a ?)"); msg_given = TRUE; @@ -80,8 +76,8 @@ const char *goal; #ifdef CLIPPING cliparound(cx, cy); #endif - curs(WIN_MAP, cx,cy); flush_screen(0); + curs(WIN_MAP, cx, cy); #ifdef MAC lock_mouse_cursor(TRUE); #endif @@ -139,10 +135,14 @@ const char *goal; goto nxtc; } - if(c == '?'){ - getpos_help(force, goal); - } else if (c == C('r')) { /* ^R */ - docrt(); /* redraw */ + if (c == '?' || redraw_cmd(c)) { + if (c == '?') + getpos_help(force, goal); + else /* ^R */ + docrt(); /* redraw */ + /* update message window to reflect that we're still targetting */ + pline("Move cursor to %s:", goal); + msg_given = TRUE; } else { if (!index(quitchars, c)) { char matching[MAXPCHARS]; @@ -197,8 +197,8 @@ const char *goal; #ifdef CLIPPING cliparound(cx, cy); #endif - curs(WIN_MAP,cx,cy); flush_screen(0); + curs(WIN_MAP, cx, cy); } #ifdef MAC lock_mouse_cursor(FALSE);