]> granicus.if.org Git - nethack/commitdiff
- added ALT-keys support (except ALT-f and ALT-m which are menu
authornethack.allison <nethack.allison>
Thu, 21 Feb 2002 12:57:56 +0000 (12:57 +0000)
committernethack.allison <nethack.allison>
Thu, 21 Feb 2002 12:57:56 +0000 (12:57 +0000)
accelerators).
[...]

- added F4/F5 functionality - same as in MSDOS port
F4 toggles between fitting the tiled display to the screen
and full size (compresses the tiles to fit / uncompresses).
F5 alternates between ascii and tiles.

- added support for wc_vary_msgcount

include/winprocs.h
win/win32/mhmain.c
win/win32/mhmap.c
win/win32/mhmsgwnd.c
win/win32/mswproc.c
win/win32/winhack.rc

index 0df358bc6f27b053453f2ba14d145deacbfae33e..e01ad988b9595c00d0374282d000c4b4551b1944 100644 (file)
@@ -180,6 +180,7 @@ extern NEARDATA struct window_procs windowprocs;
 #define MAP_MODE_ASCII12x16    8
 #define MAP_MODE_ASCII10x18    9
 #define MAP_MODE_ASCII_FIT_TO_SCREEN 10
+#define MAP_MODE_TILES_FIT_TO_SCREEN 11
 
 #if 0
 #define WC_SND_SOUND    0x01L          /* 01 Port has some sound capabilities       */
index f40b8413614bc17565f9ad437bde97a50af2ddc0..9fee2a65ace94ee0374844bab4fca9ea1418ef2c 100644 (file)
@@ -15,7 +15,7 @@
 #define MAX_LOADSTRING 100
 
 typedef struct mswin_nethack_main_window {
-       int dummy;
+       int mapAcsiiModeSave;
 } NHMainWindow, *PNHMainWindow;
 
 static TCHAR szMainWindowClass[] = TEXT("MSNHMainWndClass");
@@ -125,11 +125,18 @@ numpad[KEY_LAST][3] = {
        {'.', ':', ':'} /* Del */
 };
 
+static const unsigned char alt_commands[] = "acdeijlnNopqrstuvw?2";
+/* original: "acdefijlmnNopqrstuvw?2"; */ 
 
 #define STATEON(x) ((GetKeyState(x) & 0xFFFE) != 0)
 #define KEYTABLE(x) ((iflags.num_pad ? numpad : keypad)[x] \
 [(STATEON(VK_SHIFT) ? 1 : STATEON(VK_CONTROL) ? 2 : 0)])
+
+/* map mode macros */
+#define IS_MAP_FIT_TO_SCREEN(mode) ((mode)==MAP_MODE_ASCII_FIT_TO_SCREEN || \
+                                                         (mode)==MAP_MODE_TILES_FIT_TO_SCREEN )
   
+#define IS_MAP_ASCII(mode) ((mode)!=MAP_MODE_TILES && (mode)!=MAP_MODE_TILES_FIT_TO_SCREEN)
     
 /*
 //  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
@@ -147,6 +154,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
                        data = (PNHMainWindow)malloc(sizeof(NHMainWindow));
                        if( !data ) panic("out of memory");
                        ZeroMemory(data, sizeof(NHMainWindow));
+                       data->mapAcsiiModeSave = MAP_MODE_ASCII12x16;
                        SetWindowLong(hWnd, GWL_USERDATA, (LONG)data);
 
                        GetNHApp()->hMainWnd = hWnd;
@@ -158,11 +166,13 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
 
         case WM_KEYDOWN: 
                {
+                       data = (PNHMainWindow)GetWindowLong(hWnd, GWL_USERDATA);
+
                        /* translate arrow keys into nethack commands */
             switch (wParam) 
             { 
                        case VK_LEFT:
-                               if( GetKeyState(VK_CONTROL)&0x80 ) {
+                               if( STATEON(VK_CONTROL) ) {
                                        /* scroll map window one line left */
                                        SendMessage(
                                                mswin_hwnd_from_winid(WIN_MAP),
@@ -176,7 +186,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
                        return 0;
 
                        case VK_RIGHT:
-                               if( GetKeyState(VK_CONTROL)&0x80 ) {
+                               if( STATEON(VK_CONTROL) ) {
                                        /* scroll map window one line right */
                                        SendMessage(
                                                mswin_hwnd_from_winid(WIN_MAP),
@@ -190,7 +200,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
                        return 0;
 
                        case VK_UP:
-                               if( GetKeyState(VK_CONTROL)&0x80 ) {
+                               if( STATEON(VK_CONTROL) ) {
                                        /* scroll map window one line up */
                                        SendMessage(
                                                mswin_hwnd_from_winid(WIN_MAP),
@@ -204,7 +214,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
                        return 0;
 
                        case VK_DOWN:
-                               if( GetKeyState(VK_CONTROL)&0x80 ) {
+                               if( STATEON(VK_CONTROL) ) {
                                        /* scroll map window one line down */
                                        SendMessage(
                                                mswin_hwnd_from_winid(WIN_MAP),
@@ -218,7 +228,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
                        return 0;
 
                        case VK_HOME:
-                               if( GetKeyState(VK_CONTROL)&0x80 ) {
+                               if( STATEON(VK_CONTROL) ) {
                                        /* scroll map window to upper left corner */
                                        SendMessage(
                                                mswin_hwnd_from_winid(WIN_MAP),
@@ -239,7 +249,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
                        return 0;
 
                        case VK_END:
-                               if( GetKeyState(VK_CONTROL)&0x80 ) {
+                               if( STATEON(VK_CONTROL) ) {
                                        /* scroll map window to lower right corner */
                                        SendMessage(
                                                mswin_hwnd_from_winid(WIN_MAP),
@@ -260,7 +270,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
                        return 0;
 
                        case VK_PRIOR:
-                               if( GetKeyState(VK_CONTROL)&0x80 ) {
+                               if( STATEON(VK_CONTROL) ) {
                                        /* scroll map window one page up */
                                        SendMessage(
                                                mswin_hwnd_from_winid(WIN_MAP),
@@ -274,7 +284,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
                        return 0;
 
                        case VK_NEXT:
-                               if( GetKeyState(VK_CONTROL)&0x80 ) {
+                               if( STATEON(VK_CONTROL) ) {
                                        /* scroll map window one page down */
                                        SendMessage(
                                                mswin_hwnd_from_winid(WIN_MAP),
@@ -305,12 +315,36 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
                                NHEVENT_KBD(KEYTABLE(KEY_PLUS));
                        return 0;
 
-                       case VK_F3:
-                               mswin_select_map_mode(MAP_MODE_TILES);
+                       case VK_F4:
+                               if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) {
+                                       mswin_select_map_mode(
+                                               IS_MAP_ASCII(iflags.wc_map_mode)? 
+                                                       data->mapAcsiiModeSave :
+                                                       MAP_MODE_TILES
+                                       );
+                               } else {
+                                       mswin_select_map_mode(
+                                               IS_MAP_ASCII(iflags.wc_map_mode)?
+                                                       MAP_MODE_ASCII_FIT_TO_SCREEN :
+                                                       MAP_MODE_TILES_FIT_TO_SCREEN
+                                       );
+                               }
                        return 0;
 
-                       case VK_F4:
-                               mswin_select_map_mode(MAP_MODE_ASCII_FIT_TO_SCREEN);
+                       case VK_F5:
+                               if( IS_MAP_ASCII(iflags.wc_map_mode) ) {
+                                       if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) {
+                                               mswin_select_map_mode(MAP_MODE_TILES_FIT_TO_SCREEN);
+                                       } else {
+                                               mswin_select_map_mode(MAP_MODE_TILES);
+                                       }
+                               } else {
+                                       if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) {
+                                               mswin_select_map_mode(MAP_MODE_ASCII_FIT_TO_SCREEN);
+                                       } else {
+                                               mswin_select_map_mode(data->mapAcsiiModeSave);
+                                       }
+                               }
                        return 0;
 
                        default: {
@@ -332,6 +366,25 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
                        } /* end switch */
                } break;
 
+        case WM_SYSKEYDOWN:
+               {
+                       /* see if this is something we need */
+                       WORD c;
+                       BYTE kbd_state[256];
+
+                       c = 0;
+                       ZeroMemory(kbd_state, sizeof(kbd_state));
+                       GetKeyboardState(kbd_state);
+
+                       if( ToAscii( wParam, (lParam>>16)&0xFF, kbd_state, &c, 0) &&
+                               index(alt_commands, c&0xFF) ) {
+                               NHEVENT_KBD( M(c&0xFF) );
+                               return 0;
+                       } else {
+                               return DefWindowProc(hWnd, message, wParam, lParam);
+                       }
+               } break;
+
                case WM_COMMAND:
                        /* process commands - menu commands mostly */
                        if( onWMCommand(hWnd, wParam, lParam) )
@@ -573,7 +626,9 @@ void mswin_layout_main_window(HWND changed_child)
 LRESULT onWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
        int wmId, wmEvent;
+       PNHMainWindow  data;
 
+       data = (PNHMainWindow)GetWindowLong(hWnd, GWL_USERDATA);
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
 
@@ -602,10 +657,25 @@ LRESULT onWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
                case IDM_MAP_ASCII12X16:
                case IDM_MAP_ASCII16X12:
                case IDM_MAP_ASCII10X18:
-               case IDM_MAP_FIT_TO_SCREEN:
                        mswin_select_map_mode(menuid2mapmode(wmId));
                        break;
 
+               case IDM_MAP_FIT_TO_SCREEN:
+                       if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) {
+                               mswin_select_map_mode(
+                                       IS_MAP_ASCII(iflags.wc_map_mode)? 
+                                               data->mapAcsiiModeSave :
+                                               MAP_MODE_TILES
+                               );
+                       } else {
+                               mswin_select_map_mode(
+                                       IS_MAP_ASCII(iflags.wc_map_mode)?
+                                               MAP_MODE_ASCII_FIT_TO_SCREEN :
+                                               MAP_MODE_TILES_FIT_TO_SCREEN
+                               );
+                       }
+                       break;
+
                case IDM_HELP_LONG:     
                        display_file(HELP, TRUE);  
                        break;
@@ -704,18 +774,43 @@ LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 
 void mswin_select_map_mode(int mode)
 {
-       CheckMenuRadioItem(
-               GetMenu(GetNHApp()->hMainWnd), 
-               IDM_MAP_TILES, 
-               IDM_MAP_FIT_TO_SCREEN, 
-               mapmode2menuid(mode), 
-               MF_BYCOMMAND);
-       
+       PNHMainWindow  data;
+       data = (PNHMainWindow)GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA);
+
        /* override for Rogue level */
 #ifdef REINCARNATION
-    if( Is_rogue_level(&u.uz) ) return;
+    if( Is_rogue_level(&u.uz) && !IS_MAP_ASCII(mode) ) return;
 #endif
 
+       /* set map mode menu mark */
+       if( IS_MAP_ASCII(mode) ) {
+               CheckMenuRadioItem(
+                       GetMenu(GetNHApp()->hMainWnd), 
+                       IDM_MAP_TILES, 
+                       IDM_MAP_ASCII10X18, 
+                       mapmode2menuid( IS_MAP_FIT_TO_SCREEN(mode)? data->mapAcsiiModeSave : mode ), 
+                       MF_BYCOMMAND);
+       } else {
+               CheckMenuRadioItem(
+                       GetMenu(GetNHApp()->hMainWnd), 
+                       IDM_MAP_TILES, 
+                       IDM_MAP_ASCII10X18, 
+                       mapmode2menuid( MAP_MODE_TILES ), 
+                       MF_BYCOMMAND);
+       }
+
+       /* set fit-to-screen mode mark */
+       CheckMenuItem(
+               GetMenu(GetNHApp()->hMainWnd),
+               IDM_MAP_FIT_TO_SCREEN,
+               MF_BYCOMMAND | 
+               (IS_MAP_FIT_TO_SCREEN(mode)? MF_CHECKED : MF_UNCHECKED)
+       );
+
+       if( IS_MAP_ASCII(iflags.wc_map_mode) && !IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode)) {
+               data->mapAcsiiModeSave = iflags.wc_map_mode;
+       }
+
        iflags.wc_map_mode = mode;
        mswin_map_mode(mswin_hwnd_from_winid(WIN_MAP), mode);
 }
index 83e388a1df6c1b72a9591b33761487c3eef106b9..37faca82282d63c16ba4198a33401128914c824e 100644 (file)
@@ -20,6 +20,7 @@ typedef struct mswin_nethack_map_window {
 
        int      mapMode;                               /* current map mode */
        boolean bAsciiMode;                     /* switch ASCII/tiled mode */
+       boolean bFitToScreenMode;       /* switch Fit map to screen mode on/off */
        int  xPos, yPos;                        /* scroll position */
        int  xPageSize, yPageSize;      /* scroll page size */
        int  xCur, yCur;                        /* position of the cursor */
@@ -91,8 +92,8 @@ void mswin_map_stretch(HWND hWnd, LPSIZE lpsz, BOOL redraw)
        
        /* set new screen tile size */
        data = (PNHMapWindow)GetWindowLong(hWnd, GWL_USERDATA);
-       data->xScrTile = ((data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN)? wnd_size.cx : lpsz->cx) / COLNO;
-       data->yScrTile = ((data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN)? wnd_size.cy : lpsz->cy) / ROWNO;
+       data->xScrTile = (data->bFitToScreenMode? wnd_size.cx : lpsz->cx) / COLNO;
+       data->yScrTile = (data->bFitToScreenMode? wnd_size.cy : lpsz->cy) / ROWNO;
 
        /* set map origin point */
        data->map_orig.x = max(0, client_rt.left + (wnd_size.cx - data->xScrTile*COLNO)/2 );
@@ -102,7 +103,7 @@ void mswin_map_stretch(HWND hWnd, LPSIZE lpsz, BOOL redraw)
        data->map_orig.y -= data->map_orig.y % data->yScrTile;
 
        /* adjust horizontal scroll bar */
-       if( data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN )
+       if( data->bFitToScreenMode )
                data->xPageSize = COLNO+1;  /* disable scroll bar */
        else
                data->xPageSize = wnd_size.cx/data->xScrTile;
@@ -124,7 +125,7 @@ void mswin_map_stretch(HWND hWnd, LPSIZE lpsz, BOOL redraw)
     SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); 
 
        /* adjust vertical scroll bar */
-       if( data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN )
+       if( data->bFitToScreenMode )
                data->yPageSize = ROWNO+1;   /* disable scroll bar */
        else
                data->yPageSize = wnd_size.cy/data->yScrTile;
@@ -186,54 +187,63 @@ int mswin_map_mode(HWND hWnd, int mode)
 
        case MAP_MODE_ASCII4x6:
                data->bAsciiMode = TRUE;
+               data->bFitToScreenMode = FALSE;
                mapSize.cx = 4*COLNO;
                mapSize.cy = 6*ROWNO;
        break;
 
        case MAP_MODE_ASCII6x8:
                data->bAsciiMode = TRUE;
+               data->bFitToScreenMode = FALSE;
                mapSize.cx = 6*COLNO;
                mapSize.cy = 8*ROWNO;
        break;
 
        case MAP_MODE_ASCII8x8:
                data->bAsciiMode = TRUE;
+               data->bFitToScreenMode = FALSE;
                mapSize.cx = 8*COLNO;
                mapSize.cy = 8*ROWNO;
        break;
 
        case MAP_MODE_ASCII16x8:
                data->bAsciiMode = TRUE;
+               data->bFitToScreenMode = FALSE;
                mapSize.cx = 16*COLNO;
                mapSize.cy = 8*ROWNO;
        break;
 
        case MAP_MODE_ASCII7x12:
                data->bAsciiMode = TRUE;
+               data->bFitToScreenMode = FALSE;
                mapSize.cx = 7*COLNO;
                mapSize.cy = 12*ROWNO;
        break;
 
        case MAP_MODE_ASCII8x12:
                data->bAsciiMode = TRUE;
+               data->bFitToScreenMode = FALSE;
                mapSize.cx = 8*COLNO;
                mapSize.cy = 12*ROWNO;
        break;
 
        case MAP_MODE_ASCII16x12:
                data->bAsciiMode = TRUE;
+               data->bFitToScreenMode = FALSE;
                mapSize.cx = 16*COLNO;
                mapSize.cy = 12*ROWNO;
        break;
 
        case MAP_MODE_ASCII12x16:
                data->bAsciiMode = TRUE;
+               data->bFitToScreenMode = FALSE;
                mapSize.cx = 12*COLNO;
                mapSize.cy = 16*ROWNO;
        break;
 
        case MAP_MODE_ASCII10x18:
                data->bAsciiMode = TRUE;
+               data->bFitToScreenMode = FALSE;
                mapSize.cx = 10*COLNO;
                mapSize.cy = 18*ROWNO;
        break;
@@ -245,11 +255,23 @@ int mswin_map_mode(HWND hWnd, int mode)
                mapSize.cy = client_rt.bottom - client_rt.top;
 
                data->bAsciiMode = TRUE;
+               data->bFitToScreenMode = TRUE;
+       } break;
+
+       case MAP_MODE_TILES_FIT_TO_SCREEN: {
+               RECT client_rt;
+               GetClientRect(hWnd, &client_rt);
+               mapSize.cx = client_rt.right - client_rt.left;
+               mapSize.cy = client_rt.bottom - client_rt.top;
+
+               data->bAsciiMode = FALSE;
+               data->bFitToScreenMode = TRUE;
        } break;
 
        case MAP_MODE_TILES:
        default:
                data->bAsciiMode = FALSE;
+               data->bFitToScreenMode = FALSE;
                mapSize.cx = GetNHApp()->mapTile_X*COLNO;
                mapSize.cy = GetNHApp()->mapTile_Y*ROWNO;
        break;
@@ -320,7 +342,7 @@ LRESULT CALLBACK MapWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
     { 
                SIZE size;
 
-               if( data->mapMode == MAP_MODE_ASCII_FIT_TO_SCREEN ) {
+               if( data->bFitToScreenMode ) {
                        size.cx = LOWORD(lParam);
                        size.cy = HIWORD(lParam);
                } else {
index 5dddd58cd96d723233bce9761ee6dd976fe583dc..5696c790dddc1f57a782a3907ec7e2ea3284451a 100644 (file)
@@ -8,7 +8,7 @@
 
 #define MSG_WRAP_TEXT 
 
-#define MSG_VISIBLE_LINES     4
+#define MSG_VISIBLE_LINES     max(iflags.wc_vary_msgcount, 2)
 #define MAX_MSG_LINES            32
 #define MSG_LINES                        (int)min(iflags.msg_history, MAX_MSG_LINES)
 #define MAXWINDOWTEXT            200
index eff30d40911d64f6cb301ec44ec81d14a65779cf..276c4177a0f39555ba0773e073419369e7072610 100644 (file)
@@ -40,7 +40,7 @@ struct window_procs mswin_procs = {
        WC_INVERSE|WC_SCROLL_MARGIN|WC_MAP_MODE|
        WC_FONT_MESSAGE|WC_FONT_STATUS|WC_FONT_MENU|WC_FONT_TEXT|
        WC_FONTSIZ_MESSAGE|WC_FONTSIZ_STATUS|WC_FONTSIZ_MENU|WC_FONTSIZ_TEXT|
-       WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE,
+       WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE|WC_VARY_MSGCOUNT,
     mswin_init_nhwindows,
     mswin_player_selection,
     mswin_askname,
@@ -143,6 +143,8 @@ void mswin_init_nhwindows(int* argc, char** argv)
        if( iflags.wc_tile_width==0 ) iflags.wc_tile_width = TILE_X;
        if( iflags.wc_tile_height==0 ) iflags.wc_tile_height = TILE_Y;
 
+       if( iflags.wc_vary_msgcount==0 ) iflags.wc_vary_msgcount = 4;
+
        /* force tabs in menus */
        iflags.menu_tab_sep = 1;
 
@@ -168,7 +170,8 @@ void mswin_init_nhwindows(int* argc, char** argv)
                WC_FONTSIZ_MESSAGE | 
                WC_FONTSIZ_STATUS | 
                WC_FONTSIZ_MENU | 
-               WC_FONTSIZ_TEXT,
+               WC_FONTSIZ_TEXT |
+               WC_VARY_MSGCOUNT,
                SET_IN_GAME 
        );
 
@@ -1181,6 +1184,12 @@ void mswin_preference_update(const char *pref)
                mswin_layout_main_window(NULL);
                return;
        }
+
+       if( stricmp( pref, "vary_msgcount")==0 ) {
+               InvalidateRect(mswin_hwnd_from_winid(WIN_MESSAGE), NULL, TRUE);
+               mswin_layout_main_window(NULL);
+               return;
+       }
 }
 
 
index af8d91db76d7ab5418b75bbe7cdcef7eb0be2455..9840a905d031f0e530323cc3244c346ed62d06f0 100644 (file)
@@ -61,7 +61,8 @@ BEGIN
         MENUITEM "&7 - ASCII (16x12)",          IDM_MAP_ASCII16X12
         MENUITEM "&8 - ASCII (12x16)",          IDM_MAP_ASCII12X16
         MENUITEM "&9 - ASCII  (10x18)",         IDM_MAP_ASCII10X18
-        MENUITEM "&Fit To Screen (ASCII only)", IDM_MAP_FIT_TO_SCREEN
+        MENUITEM SEPARATOR
+        MENUITEM "&Fit To Screen ",             IDM_MAP_FIT_TO_SCREEN
     END
     POPUP "&Help"
     BEGIN