From d18bf800aefdcf62823f524163d87f1a33f8e56a Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 27 Nov 2018 22:15:34 -0500 Subject: [PATCH] expand mouse_support to three values rather than boolean On Windows only: 0 = turn off mouse_support 1 = turn on mouse_support and turn off QuickEdit mode 2 = turn on mouse_support and leave QuickEdit mode untouched More generally, but not implemented anywhere: 0 = turn off mouse_support 1 = turn on mouse_support and make supporting O/S adjustments (O/S adjustments not implented beyond Windows as yet) 2 = turn on mouse_support and do not make OS adjustments (unimplemented as yet so behaves as 1) --- include/flag.h | 2 +- src/options.c | 54 ++++++++++++++++++++++++++++++++++++++++++----- sys/winnt/nttty.c | 35 +++++++++++++++++++++++++----- 3 files changed, 80 insertions(+), 11 deletions(-) diff --git a/include/flag.h b/include/flag.h index b0be1a0f9..956de39f0 100644 --- a/include/flag.h +++ b/include/flag.h @@ -416,13 +416,13 @@ struct instance_flags { boolean wc_popup_dialog; /* put queries in pop up dialogs instead of * in the message window */ boolean wc_eight_bit_input; /* allow eight bit input */ - boolean wc_mouse_support; /* allow mouse support */ boolean wc2_fullscreen; /* run fullscreen */ boolean wc2_softkeyboard; /* use software keyboard */ boolean wc2_wraptext; /* wrap text */ boolean wc2_selectsaved; /* display a menu of user's saved games */ boolean wc2_darkgray; /* try to use dark-gray color for black glyphs */ boolean wc2_hitpointbar; /* show graphical bar representing hit points */ + int wc_mouse_support; /* allow mouse support */ int wc2_term_cols; /* terminal width, in characters */ int wc2_term_rows; /* terminal height, in characters */ int wc2_windowborders; /* display borders on NetHack windows */ diff --git a/src/options.c b/src/options.c index f2ad9a058..a698e20b8 100644 --- a/src/options.c +++ b/src/options.c @@ -166,11 +166,6 @@ static struct Bool_Opt { { "menu_overlay", (boolean *) 0, FALSE, SET_IN_FILE }, #endif { "monpolycontrol", &iflags.mon_polycontrol, FALSE, SET_IN_WIZGAME }, -#ifdef CURSES_GRAPHICS - { "mouse_support", &iflags.wc_mouse_support, FALSE, DISP_IN_GAME }, /*WC*/ -#else - { "mouse_support", &iflags.wc_mouse_support, TRUE, DISP_IN_GAME }, /*WC*/ -#endif #ifdef NEWS { "news", &iflags.news, TRUE, DISP_IN_GAME }, #else @@ -342,6 +337,7 @@ static struct Comp_Opt { #endif { "name", "your character's name (e.g., name:Merlin-W)", PL_NSIZ, DISP_IN_GAME }, + { "mouse_support", "game receives click info from mouse", 0, SET_IN_GAME }, { "number_pad", "use the number pad for movement", 1, SET_IN_GAME }, { "objects", "the symbols to use for objects", MAXOCLASSES, SET_IN_FILE }, { "packorder", "the inventory order of the items in your pack", @@ -2209,6 +2205,35 @@ boolean tinitial, tfrom_file; return retval; } + fullname = "mouse_support"; + if (match_optname(opts, fullname, 13, TRUE)) { + boolean compat = (strlen(opts) <= 13); + + if (duplicate) + complain_about_duplicate(opts, 1); + op = string_for_opt(opts, (compat || !initial)); + if (!op) { + if (compat || negated || initial) { + /* for backwards compatibility, "mouse_support" without a + value is a synonym for mouse_support:1 */ + iflags.wc_mouse_support = !negated; + } + } else if (negated) { + bad_negation(fullname, TRUE); + return FALSE; + } else { + int mode = atoi(op); + + if (mode < 0 || mode > 2 || (mode == 0 && *op != '0')) { + config_error_add("Illegal %s parameter '%s'", fullname, op); + return FALSE; + } else { /* mode > 0 */ + iflags.wc_mouse_support = mode; + } + } + return retval; + } + fullname = "number_pad"; if (match_optname(opts, fullname, 10, TRUE)) { boolean compat = (strlen(opts) <= 10); @@ -5496,6 +5521,25 @@ char *buf; #endif } else if (!strcmp(optname, "name")) { Sprintf(buf, "%s", plname); + } else if (!strcmp(optname, "mouse_support")) { +#ifdef WIN32 +#define MOUSEFIX1 ", QuickEdit off" +#define MOUSEFIX2 ", QuickEdit unchanged" +#else +#define MOUSEFIX1 ", O/S adjusted" +#define MOUSEFIX2 ", O/S unchanged" +#endif + int ms = iflags.wc_mouse_support; + static const char *mousemodes[] = { + "0=off", + "1=on" MOUSEFIX1, + "2=on" MOUSEFIX2, + }; + + if (ms >= 0 && ms < SIZE(mousemodes)); + Strcpy(buf, mousemodes[ms]); +#undef MOUSEFIX1 +#undef MOUSEFIX2 } else if (!strcmp(optname, "number_pad")) { static const char *numpadmodes[] = { "0=off", "1=on", "2=on, MSDOS compatible", diff --git a/sys/winnt/nttty.c b/sys/winnt/nttty.c index 5f5befc0c..579125867 100644 --- a/sys/winnt/nttty.c +++ b/sys/winnt/nttty.c @@ -87,6 +87,7 @@ static void NDECL(restore_original_console_font); /* Win32 Screen buffer,coordinate,console I/O information */ COORD ntcoord; INPUT_RECORD ir; +static boolean orig_QuickEdit; /* Support for changing console font if existing glyph widths are too wide */ @@ -311,8 +312,14 @@ const char *s; end_screen(); if (s) raw_print(s); - restore_original_console_font(); + if (orig_QuickEdit) { + DWORD cmode; + + GetConsoleMode(console.hConIn, &cmode); + cmode |= (ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS); + SetConsoleMode(console.hConIn, cmode); + } } /* called by init_nhwindows() and resume_nhwindows() */ @@ -864,12 +871,30 @@ standoutend() void toggle_mouse_support() { + static int qeinit = 0; DWORD cmode; + GetConsoleMode(console.hConIn, &cmode); - if (iflags.wc_mouse_support) - cmode |= ENABLE_MOUSE_INPUT; - else - cmode &= ~ENABLE_MOUSE_INPUT; + if (!qeinit) { + qeinit = 1; + orig_QuickEdit = ((cmode & ENABLE_QUICK_EDIT_MODE) != 0); + } + switch(iflags.wc_mouse_support) { + case 2: + cmode |= ENABLE_MOUSE_INPUT; + break; + case 1: + cmode |= ENABLE_MOUSE_INPUT; + cmode &= ~ENABLE_QUICK_EDIT_MODE; + cmode |= ENABLE_EXTENDED_FLAGS; + break; + case 0: + /*FALLTHRU*/ + default: + cmode &= ~ENABLE_MOUSE_INPUT; + if (orig_QuickEdit) + cmode |= (ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS); + } SetConsoleMode(console.hConIn, cmode); } #endif -- 2.40.0