From: nethack.allison Date: Thu, 21 Feb 2002 12:57:56 +0000 (+0000) Subject: - added ALT-keys support (except ALT-f and ALT-m which are menu X-Git-Tag: MOVE2GIT~3145 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eea83e29eacd87af54a5f8724f9e9be030578281;p=nethack - added ALT-keys support (except ALT-f and ALT-m which are menu 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 --- diff --git a/include/winprocs.h b/include/winprocs.h index 0df358bc6..e01ad988b 100644 --- a/include/winprocs.h +++ b/include/winprocs.h @@ -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 */ diff --git a/win/win32/mhmain.c b/win/win32/mhmain.c index f40b84136..9fee2a65a 100644 --- a/win/win32/mhmain.c +++ b/win/win32/mhmain.c @@ -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); } diff --git a/win/win32/mhmap.c b/win/win32/mhmap.c index 83e388a1d..37faca822 100644 --- a/win/win32/mhmap.c +++ b/win/win32/mhmap.c @@ -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 { diff --git a/win/win32/mhmsgwnd.c b/win/win32/mhmsgwnd.c index 5dddd58cd..5696c790d 100644 --- a/win/win32/mhmsgwnd.c +++ b/win/win32/mhmsgwnd.c @@ -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 diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index eff30d409..276c4177a 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -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; + } } diff --git a/win/win32/winhack.rc b/win/win32/winhack.rc index af8d91db7..9840a905d 100644 --- a/win/win32/winhack.rc +++ b/win/win32/winhack.rc @@ -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