diff --git a/include/config1.h b/include/config1.h index 2f485b201..167c811ee 100644 --- a/include/config1.h +++ b/include/config1.h @@ -122,10 +122,6 @@ # define USE_STDARG # define NEED_VARARGS -/* ARM - the processor; avoids conflict with ARM in hack.h */ -# ifdef ARM -# undef ARM -# endif #endif diff --git a/win/win32/mhfont.c b/win/win32/mhfont.c index 0755e6444..3d0c77902 100644 --- a/win/win32/mhfont.c +++ b/win/win32/mhfont.c @@ -54,7 +54,7 @@ HGDIOBJ mswin_create_font(int win_type, int attr, HDC hdc) break; case NHW_MENU: - font_size = (attr==ATR_INVERSE)? 7 : 7; + font_size = (attr==ATR_INVERSE)? 8 : 8; lgfnt.lfHeight = -font_size*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font lgfnt.lfWidth = 0; // average character width lgfnt.lfEscapement = 0; // angle of escapement diff --git a/win/win32/mhmain.c b/win/win32/mhmain.c index 48d282926..c6e904480 100644 --- a/win/win32/mhmain.c +++ b/win/win32/mhmain.c @@ -79,7 +79,7 @@ void register_main_window_class() RegisterClass(&wcex); } - + /* * Keypad keys are translated to the normal values below. * Shifted keypad keys are translated to the @@ -87,55 +87,56 @@ void register_main_window_class() */ enum KEY_INDEXES { - KEY_NW, KEY_N, KEY_NE, KEY_MINUS, - KEY_W, KEY_STAY, KEY_E, KEY_PLUS, - KEY_SW, KEY_S, KEY_SE, - KEY_INV, KEY_WAITLOOK, - KEY_LAST}; +KEY_NW, KEY_N, KEY_NE, KEY_MINUS, +KEY_W, KEY_STAY, KEY_E, KEY_PLUS, +KEY_SW, KEY_S, KEY_SE, +KEY_INV, KEY_WAITLOOK, +KEY_LAST}; - static const unsigned char - /* normal, shift, control */ - keypad[KEY_LAST][3] = { - {'y', 'Y', C('y')}, /* 7 */ - {'k', 'K', C('k')}, /* 8 */ - {'u', 'U', C('u')}, /* 9 */ - {'m', C('p'), C('p')}, /* - */ - {'h', 'H', C('h')}, /* 4 */ - {'g', 'g', 'g'}, /* 5 */ - {'l', 'L', C('l')}, /* 6 */ - {'p', 'P', C('p')}, /* + */ - {'b', 'B', C('b')}, /* 1 */ - {'j', 'J', C('j')}, /* 2 */ - {'n', 'N', C('n')}, /* 3 */ - {'i', 'I', C('i')}, /* Ins */ - {'.', ':', ':'} /* Del */ -}, numpad[KEY_LAST][3] = { - {'7', M('7'), '7'}, /* 7 */ - {'8', M('8'), '8'}, /* 8 */ - {'9', M('9'), '9'}, /* 9 */ - {'m', C('p'), C('p')}, /* - */ - {'4', M('4'), '4'}, /* 4 */ - {'g', 'G', 'g'}, /* 5 */ - {'6', M('6'), '6'}, /* 6 */ - {'p', 'P', C('p')}, /* + */ - {'1', M('1'), '1'}, /* 1 */ - {'2', M('2'), '2'}, /* 2 */ - {'3', M('3'), '3'}, /* 3 */ - {'i', 'I', C('i')}, /* Ins */ - {'.', ':', ':'} /* Del */ +static const unsigned char +/* normal, shift, control */ +keypad[KEY_LAST][3] = { + {'y', 'Y', C('y')}, /* 7 */ + {'k', 'K', C('k')}, /* 8 */ + {'u', 'U', C('u')}, /* 9 */ + {'m', C('p'), C('p')}, /* - */ + {'h', 'H', C('h')}, /* 4 */ + {'g', 'g', 'g'}, /* 5 */ + {'l', 'L', C('l')}, /* 6 */ + {'p', 'P', C('p')}, /* + */ + {'b', 'B', C('b')}, /* 1 */ + {'j', 'J', C('j')}, /* 2 */ + {'n', 'N', C('n')}, /* 3 */ + {'i', 'I', C('i')}, /* Ins */ + {'.', ':', ':'} /* Del */ +}, +numpad[KEY_LAST][3] = { + {'7', M('7'), '7'}, /* 7 */ + {'8', M('8'), '8'}, /* 8 */ + {'9', M('9'), '9'}, /* 9 */ + {'m', C('p'), C('p')}, /* - */ + {'4', M('4'), '4'}, /* 4 */ + {'g', 'G', 'g'}, /* 5 */ + {'6', M('6'), '6'}, /* 6 */ + {'p', 'P', C('p')}, /* + */ + {'1', M('1'), '1'}, /* 1 */ + {'2', M('2'), '2'}, /* 2 */ + {'3', M('3'), '3'}, /* 3 */ + {'i', 'I', C('i')}, /* Ins */ + {'.', ':', ':'} /* Del */ }; #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)]) - +[(STATEON(VK_SHIFT) ? 1 : STATEON(VK_CONTROL) ? 2 : 0)]) + + /* // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. */ - LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PNHMainWindow data; @@ -161,63 +162,73 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar /* translate arrow keys into nethack commands */ switch (wParam) { - case VK_LEFT: + case VK_LEFT: NHEVENT_KBD(KEYTABLE(KEY_W)); - return 0; + return 0; - case VK_RIGHT: + case VK_RIGHT: NHEVENT_KBD(KEYTABLE(KEY_E)); - return 0; + return 0; - case VK_UP: + case VK_UP: NHEVENT_KBD(KEYTABLE(KEY_N)); - return 0; + return 0; - case VK_DOWN: + case VK_DOWN: NHEVENT_KBD(KEYTABLE(KEY_S)); - return 0; + return 0; - case VK_HOME: + case VK_HOME: NHEVENT_KBD(KEYTABLE(KEY_NW)); - return 0; + return 0; - case VK_END: + case VK_END: NHEVENT_KBD(KEYTABLE(KEY_SW)); - return 0; + return 0; - case VK_PRIOR: + case VK_PRIOR: NHEVENT_KBD(KEYTABLE(KEY_NE)); - return 0; + return 0; - case VK_NEXT: + case VK_NEXT: NHEVENT_KBD(KEYTABLE(KEY_SE)); - return 0; + return 0; case VK_DECIMAL: - case VK_DELETE: + case VK_DELETE: NHEVENT_KBD(KEYTABLE(KEY_WAITLOOK)); - return 0; + return 0; case VK_INSERT: case VK_NUMPAD0: NHEVENT_KBD(KEYTABLE(KEY_INV)); - return 0; + return 0; case VK_SUBTRACT: - return 0; NHEVENT_KBD(KEYTABLE(KEY_MINUS)); + return 0; case VK_ADD: - return 0; NHEVENT_KBD(KEYTABLE(KEY_PLUS)); - } - return 1; - } break; + return 0; - case WM_CHAR: - /* all characters go to nethack */ - NHEVENT_KBD(wParam); - return 0; + default: { + WORD c[4]; + BYTE kbd_state[256]; + + ZeroMemory(kbd_state, sizeof(kbd_state)); + ZeroMemory(c, sizeof(c)); + GetKeyboardState(kbd_state); + + if( ToAscii( LOWORD(wParam), 0, kbd_state, c, 0)==1 ) { + NHEVENT_KBD(c[0]); + return 0; + } else { + return 1; + } + } + } + } break; case WM_COMMAND: /* process commands - menu commands mostly */ @@ -226,6 +237,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar else return 0; + case WM_MOVE: case WM_SIZE: mswin_layout_main_window(NULL); break; diff --git a/win/win32/mhmap.c b/win/win32/mhmap.c index 29e8e71fa..15d168443 100644 --- a/win/win32/mhmap.c +++ b/win/win32/mhmap.c @@ -815,7 +815,7 @@ void nhglyph2charcolor(short g, uchar* ch, int* color) COLORREF nhcolor_to_RGB(int c) { switch(c) { - case CLR_BLACK: return RGB(85, 85, 85); + case CLR_BLACK: return RGB( 85, 85, 85); case CLR_RED: return RGB(255, 0, 0); case CLR_GREEN: return RGB( 0, 128, 0); case CLR_BROWN: return RGB(165, 42, 42); diff --git a/win/win32/mhmenu.c b/win/win32/mhmenu.c index b8cf502fb..de1545711 100644 --- a/win/win32/mhmenu.c +++ b/win/win32/mhmenu.c @@ -7,7 +7,6 @@ #include "mhmain.h" #include "mhmsg.h" #include "mhfont.h" -#include #define MENU_MARGIN 0 #define NHMENU_STR_SIZE BUFSZ @@ -35,6 +34,7 @@ typedef struct mswin_nethack_menu_window { PNHMenuItem items; /* menu items */ char gacc[QBUFSZ]; /* group accelerators */ BOOL counting; /* counting flag */ + char prompt[QBUFSZ]; /* menu prompt */ } menu; struct menu_text { @@ -468,6 +468,17 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) data->menu.size++; } break; + + case MSNH_MSG_ENDMENU: + { + PMSNHMsgEndMenu msg_data = (PMSNHMsgEndMenu)lParam; + if( msg_data->text ) { + strncpy( data->menu.prompt, msg_data->text, sizeof(data->menu.prompt)-1 ); + } else { + ZeroMemory(data->menu.prompt, sizeof(data->menu.prompt)); + } + } break; + } } @@ -558,22 +569,26 @@ void SetMenuListType(HWND hWnd, int how) switch(how) { case PICK_NONE: dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD - | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_NOCOLUMNHEADER + | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_SINGLESEL; break; case PICK_ONE: dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD - | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_NOCOLUMNHEADER + | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_SINGLESEL; break; case PICK_ANY: dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD - | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_NOCOLUMNHEADER + | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_SINGLESEL; break; default: panic("how should be one of PICK_NONE, PICK_ONE or PICK_ANY"); }; + if( strlen(data->menu.prompt)==0 ) { + dwStyles |= LVS_NOCOLUMNHEADER ; + } + GetWindowRect(GetDlgItem(hWnd, IDC_MENU_LIST), &rt); DestroyWindow(GetDlgItem(hWnd, IDC_MENU_LIST)); control = CreateWindow(WC_LISTVIEW, NULL, @@ -598,8 +613,9 @@ void SetMenuListType(HWND hWnd, int how) /* add column to the list view */ ZeroMemory(&lvcol, sizeof(lvcol)); - lvcol.mask = LVCF_WIDTH; - lvcol.cx = 1024; + lvcol.mask = LVCF_WIDTH | LVCF_TEXT; + lvcol.cx = GetSystemMetrics(SM_CXFULLSCREEN); + lvcol.pszText = NH_A2W(data->menu.prompt, wbuf, BUFSZ); ListView_InsertColumn(control, 0, &lvcol); /* add items to the list view */ @@ -926,6 +942,8 @@ BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch) i, -1 ); + ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); + ListView_EnsureVisible(hwndList, i, FALSE); break; } } @@ -1021,6 +1039,7 @@ BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch) NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); + ListView_EnsureVisible(hwndList, i, FALSE); return -2; } else if( data->how == PICK_ONE ) { SelectMenuItem( @@ -1060,7 +1079,7 @@ void mswin_menu_window_size (HWND hWnd, LPSIZE sz) data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); if(data && data->type==MENU_TYPE_MENU ) { hdc = GetDC(GetMenuControl(hWnd)); - saveFont = SelectObject(hdc, mswin_create_font(NHW_MENU, ATR_INVERSE, hdc)); + saveFont = SelectObject(hdc, mswin_create_font(NHW_MENU, ATR_NONE, hdc)); GetTextMetrics(hdc, &tm); /* Set the height of the list box items. */ diff --git a/win/win32/mhmsg.h b/win/win32/mhmsg.h index 0cc94114f..135e8d942 100644 --- a/win/win32/mhmsg.h +++ b/win/win32/mhmsg.h @@ -15,6 +15,7 @@ #define MSNH_MSG_STARTMENU 105 #define MSNH_MSG_ADDMENU 106 #define MSNH_MSG_CURSOR 107 +#define MSNH_MSG_ENDMENU 108 typedef struct mswin_nhmsg_add_wnd { winid wid; @@ -51,4 +52,8 @@ typedef struct mswin_nhmsg_cursor { int y; } MSNHMsgCursor, *PMSNHMsgCursor; +typedef struct mswin_nhmsg_end_menu { + const char* text; +} MSNHMsgEndMenu, *PMSNHMsgEndMenu; + #endif diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index b94ddf179..d641951d6 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -580,15 +580,18 @@ end_menu(window, prompt) */ void mswin_end_menu(winid wid, const char *prompt) { - TCHAR wbuf[255]; logDebug("mswin_end_menu(%d, %s)\n", wid, prompt); - if ((wid >= 0) && + if ((wid >= 0) && (wid < MAXWINDOWS) && (GetNHApp()->windowlist[wid].win != NULL)) { - SetWindowText ( - GetNHApp()->windowlist[wid].win, - NH_A2W(prompt, wbuf ,sizeof(wbuf)) + MSNHMsgEndMenu data; + ZeroMemory(&data, sizeof(data)); + data.text = prompt; + + SendMessage( + GetNHApp()->windowlist[wid].win, + WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_ENDMENU, (LPARAM)&data ); } } diff --git a/win/win32/winhack.rc b/win/win32/winhack.rc index ee7e2e7ee..af8d91db7 100644 --- a/win/win32/winhack.rc +++ b/win/win32/winhack.rc @@ -1,9 +1,5 @@ //Microsoft Developer Studio generated resource script. // -#if defined(__BORLANDC__) -LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US -#endif - #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS @@ -11,6 +7,9 @@ LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US // // Generated from the TEXTINCLUDE 2 resource. // +#if defined(__BORLANDC__) +LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US +#endif #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS @@ -42,7 +41,7 @@ IDI_NETHACKW ICON DISCARDABLE "NETHACK.ICO" // Menu // -IDC_NETHACKW MENU DISCARDABLE +IDC_NETHACKW MENU DISCARDABLE BEGIN POPUP "&File" BEGIN @@ -85,7 +84,7 @@ END // Accelerator // -IDC_NETHACKW ACCELERATORS MOVEABLE PURE +IDC_NETHACKW ACCELERATORS MOVEABLE PURE BEGIN "?", IDM_ABOUT, ASCII, ALT "/", IDM_ABOUT, ASCII, ALT @@ -110,7 +109,7 @@ END IDD_NHTEXT DIALOGEX 0, 0, 172, 178 STYLE DS_SETFOREGROUND | WS_POPUP | WS_THICKFRAME EXSTYLE WS_EX_STATICEDGE -FONT 8, "MS Sans Serif" +FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,54,163,50,14 EDITTEXT IDC_TEXT_CONTROL,0,0,170,160,ES_MULTILINE | @@ -118,12 +117,9 @@ BEGIN END IDD_MENU DIALOGEX 0, 0, 187, 153 -STYLE WS_POPUP | WS_CLIPSIBLINGS | WS_THICKFRAME | WS_CAPTION +STYLE WS_POPUP | WS_CLIPSIBLINGS | WS_THICKFRAME EXSTYLE WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT | WS_EX_STATICEDGE FONT 8, "MS Sans Serif" -#ifndef __BORLANDC__ - , 0, 0, 0x1 -#endif BEGIN DEFPUSHBUTTON "OK",IDOK,7,132,50,14,BS_FLAT PUSHBUTTON "Cancel",IDCANCEL,130,132,50,14,BS_FLAT @@ -193,6 +189,9 @@ END 2 TEXTINCLUDE DISCARDABLE BEGIN + "#if defined(__BORLANDC__)\r\n" + "LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US\r\n" + "#endif\r\n" "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"