fix #2251 - M-5 operation with number_pad:2
From a bug report, using Alt+5 when number_pad mode is set to MSDOS compatibility (where Alt+5 is supposed to function as the 'G' movement prefix) didn't work correctly. The code that did M-5 to G conversion was being executed after the code which should have gotten G's direction, resulting in strange behavior, probably using stale values for u.dx and u.dy. (With current dev code, I evidently had u.dx==0 && u.dy==0 so was getting "You can't get there from here..." which is actually pretty amusing in the current context. 3.4.3 didn't have that feedback so I'm not sure what happened in it; possibly just silent refusal to move.)
This commit is contained in:
26
src/cmd.c
26
src/cmd.c
@@ -2800,18 +2800,6 @@ register char *cmd;
|
||||
context.move = FALSE;
|
||||
return; /* probably we just had an interrupt */
|
||||
}
|
||||
if (Cmd.pcHack_compat) {
|
||||
/* This handles very old inconsistent DOS/Windows behaviour
|
||||
* in a new way: earlier, the keyboard handler mapped these,
|
||||
* which caused counts to be strange when entered from the
|
||||
* number pad. Now do not map them until here.
|
||||
*/
|
||||
switch (*cmd) {
|
||||
case '5': *cmd = 'g'; break;
|
||||
case M('5'): *cmd = 'G'; break;
|
||||
case M('0'): *cmd = 'I'; break;
|
||||
}
|
||||
}
|
||||
|
||||
/* handle most movement commands */
|
||||
do_walk = do_rush = prefix_seen = FALSE;
|
||||
@@ -3412,6 +3400,20 @@ parse()
|
||||
} else {
|
||||
save_cm = (char *)0;
|
||||
}
|
||||
/* in 3.4.3 this was in rhack(), where it was too late to handle M-5 */
|
||||
if (Cmd.pcHack_compat) {
|
||||
/* This handles very old inconsistent DOS/Windows behaviour
|
||||
in a different way: earlier, the keyboard handler mapped
|
||||
these, which caused counts to be strange when entered
|
||||
from the number pad. Now do not map them until here. */
|
||||
switch (foo) {
|
||||
case '5': foo = 'g'; break;
|
||||
case M('5'): foo = 'G'; break;
|
||||
case M('0'): foo = 'I'; break;
|
||||
default: break; /* as is */
|
||||
}
|
||||
}
|
||||
|
||||
in_line[0] = foo;
|
||||
in_line[1] = '\0';
|
||||
if (foo == 'g' || foo == 'G' || foo == 'm' || foo == 'M' ||
|
||||
|
||||
Reference in New Issue
Block a user