(from <Someone>)
The patch that deals with tabs is attached. I also fixed bug when the program won't quit if Quit option is selected in the player selection dialog.
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#define MENU_MARGIN 0
|
#define MENU_MARGIN 0
|
||||||
#define NHMENU_STR_SIZE BUFSZ
|
#define NHMENU_STR_SIZE BUFSZ
|
||||||
|
#define MIN_TABSTOP_SIZE 8
|
||||||
|
|
||||||
typedef struct mswin_menu_item {
|
typedef struct mswin_menu_item {
|
||||||
int glyph;
|
int glyph;
|
||||||
@@ -35,6 +36,7 @@ typedef struct mswin_nethack_menu_window {
|
|||||||
char gacc[QBUFSZ]; /* group accelerators */
|
char gacc[QBUFSZ]; /* group accelerators */
|
||||||
BOOL counting; /* counting flag */
|
BOOL counting; /* counting flag */
|
||||||
char prompt[QBUFSZ]; /* menu prompt */
|
char prompt[QBUFSZ]; /* menu prompt */
|
||||||
|
int tab_stop_size; /* for options menu we use tabstops to align option values */
|
||||||
} menu;
|
} menu;
|
||||||
|
|
||||||
struct menu_text {
|
struct menu_text {
|
||||||
@@ -71,6 +73,7 @@ static void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int coun
|
|||||||
static void reset_menu_count(HWND hwndList, PNHMenuWindow data);
|
static void reset_menu_count(HWND hwndList, PNHMenuWindow data);
|
||||||
static BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch);
|
static BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch);
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
HWND mswin_init_menu_window (int type) {
|
HWND mswin_init_menu_window (int type) {
|
||||||
HWND ret;
|
HWND ret;
|
||||||
|
|
||||||
@@ -87,8 +90,7 @@ HWND mswin_init_menu_window (int type) {
|
|||||||
SetMenuType(ret, type);
|
SetMenuType(ret, type);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected)
|
int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected)
|
||||||
{
|
{
|
||||||
MSG msg;
|
MSG msg;
|
||||||
@@ -219,7 +221,7 @@ int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected)
|
|||||||
|
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
PNHMenuWindow data;
|
PNHMenuWindow data;
|
||||||
@@ -405,7 +407,7 @@ BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
PNHMenuWindow data;
|
PNHMenuWindow data;
|
||||||
@@ -451,11 +453,14 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||||||
data->menu.allocated = 0;
|
data->menu.allocated = 0;
|
||||||
data->done = 0;
|
data->done = 0;
|
||||||
data->result = 0;
|
data->result = 0;
|
||||||
|
data->menu.tab_stop_size = MIN_TABSTOP_SIZE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSNH_MSG_ADDMENU:
|
case MSNH_MSG_ADDMENU:
|
||||||
{
|
{
|
||||||
PMSNHMsgAddMenu msg_data = (PMSNHMsgAddMenu)lParam;
|
PMSNHMsgAddMenu msg_data = (PMSNHMsgAddMenu)lParam;
|
||||||
|
char *p, *p1;
|
||||||
|
int new_item;
|
||||||
|
|
||||||
if( data->type!=MENU_TYPE_MENU ) break;
|
if( data->type!=MENU_TYPE_MENU ) break;
|
||||||
if( strlen(msg_data->str)==0 ) break;
|
if( strlen(msg_data->str)==0 ) break;
|
||||||
@@ -465,15 +470,27 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||||||
data->menu.items = (PNHMenuItem)realloc(data->menu.items, data->menu.allocated*sizeof(NHMenuItem));
|
data->menu.items = (PNHMenuItem)realloc(data->menu.items, data->menu.allocated*sizeof(NHMenuItem));
|
||||||
}
|
}
|
||||||
|
|
||||||
ZeroMemory( &data->menu.items[data->menu.size], sizeof(data->menu.items[data->menu.size]));
|
new_item = data->menu.size;
|
||||||
data->menu.items[data->menu.size].glyph = msg_data->glyph;
|
ZeroMemory( &data->menu.items[new_item], sizeof(data->menu.items[new_item]));
|
||||||
data->menu.items[data->menu.size].identifier = *msg_data->identifier;
|
data->menu.items[new_item].glyph = msg_data->glyph;
|
||||||
data->menu.items[data->menu.size].accelerator = msg_data->accelerator;
|
data->menu.items[new_item].identifier = *msg_data->identifier;
|
||||||
data->menu.items[data->menu.size].group_accel = msg_data->group_accel;
|
data->menu.items[new_item].accelerator = msg_data->accelerator;
|
||||||
data->menu.items[data->menu.size].attr = msg_data->attr;
|
data->menu.items[new_item].group_accel = msg_data->group_accel;
|
||||||
strncpy(data->menu.items[data->menu.size].str, msg_data->str, NHMENU_STR_SIZE);
|
data->menu.items[new_item].attr = msg_data->attr;
|
||||||
data->menu.items[data->menu.size].presel = msg_data->presel;
|
strncpy(data->menu.items[new_item].str, msg_data->str, NHMENU_STR_SIZE);
|
||||||
|
data->menu.items[new_item].presel = msg_data->presel;
|
||||||
|
|
||||||
|
/* calculate tabstop size */
|
||||||
|
p1 = data->menu.items[new_item].str;
|
||||||
|
p = strchr(data->menu.items[new_item].str, '\t');
|
||||||
|
while( p ) {
|
||||||
|
data->menu.tab_stop_size =
|
||||||
|
max( data->menu.tab_stop_size, p - p1 );
|
||||||
|
p1 = p;
|
||||||
|
p = strchr(p+1, '\t');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* increment size */
|
||||||
data->menu.size++;
|
data->menu.size++;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@@ -489,7 +506,7 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
void LayoutMenu(HWND hWnd)
|
void LayoutMenu(HWND hWnd)
|
||||||
{
|
{
|
||||||
PNHMenuWindow data;
|
PNHMenuWindow data;
|
||||||
@@ -528,7 +545,7 @@ void LayoutMenu(HWND hWnd)
|
|||||||
MoveWindow(menu_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE );
|
MoveWindow(menu_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE );
|
||||||
MoveWindow(menu_cancel, pt_cancel.x, pt_cancel.y, sz_cancel.cx, sz_cancel.cy, TRUE );
|
MoveWindow(menu_cancel, pt_cancel.x, pt_cancel.y, sz_cancel.cx, sz_cancel.cy, TRUE );
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
void SetMenuType(HWND hWnd, int type)
|
void SetMenuType(HWND hWnd, int type)
|
||||||
{
|
{
|
||||||
PNHMenuWindow data;
|
PNHMenuWindow data;
|
||||||
@@ -555,7 +572,7 @@ void SetMenuType(HWND hWnd, int type)
|
|||||||
}
|
}
|
||||||
LayoutMenu(hWnd);
|
LayoutMenu(hWnd);
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
void SetMenuListType(HWND hWnd, int how)
|
void SetMenuListType(HWND hWnd, int how)
|
||||||
{
|
{
|
||||||
PNHMenuWindow data;
|
PNHMenuWindow data;
|
||||||
@@ -645,8 +662,7 @@ void SetMenuListType(HWND hWnd, int how)
|
|||||||
}
|
}
|
||||||
SetFocus(control);
|
SetFocus(control);
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
HWND GetMenuControl(HWND hWnd)
|
HWND GetMenuControl(HWND hWnd)
|
||||||
{
|
{
|
||||||
PNHMenuWindow data;
|
PNHMenuWindow data;
|
||||||
@@ -659,8 +675,7 @@ HWND GetMenuControl(HWND hWnd)
|
|||||||
return GetDlgItem(hWnd, IDC_MENU_LIST);
|
return GetDlgItem(hWnd, IDC_MENU_LIST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
BOOL onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
BOOL onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
LPMEASUREITEMSTRUCT lpmis;
|
LPMEASUREITEMSTRUCT lpmis;
|
||||||
@@ -686,7 +701,7 @@ BOOL onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||||||
ReleaseDC(GetMenuControl(hWnd), hdc);
|
ReleaseDC(GetMenuControl(hWnd), hdc);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
LPDRAWITEMSTRUCT lpdis;
|
LPDRAWITEMSTRUCT lpdis;
|
||||||
@@ -700,6 +715,7 @@ BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||||||
int x, y;
|
int x, y;
|
||||||
TCHAR wbuf[BUFSZ];
|
TCHAR wbuf[BUFSZ];
|
||||||
RECT drawRect;
|
RECT drawRect;
|
||||||
|
DRAWTEXTPARAMS dtp;
|
||||||
|
|
||||||
lpdis = (LPDRAWITEMSTRUCT) lParam;
|
lpdis = (LPDRAWITEMSTRUCT) lParam;
|
||||||
|
|
||||||
@@ -739,8 +755,10 @@ BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||||||
SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom );
|
SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom );
|
||||||
DrawText(lpdis->hDC, NH_A2W(buf, wbuf, 2), 1, &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
|
DrawText(lpdis->hDC, NH_A2W(buf, wbuf, 2), 1, &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
|
||||||
}
|
}
|
||||||
x += tm.tmAveCharWidth + 5;
|
x += tm.tmAveCharWidth + tm.tmOverhang + 5;
|
||||||
SelectObject(tileDC, saveBmp);
|
SelectObject(tileDC, saveBmp);
|
||||||
|
} else {
|
||||||
|
x += TILE_X + tm.tmAveCharWidth + tm.tmOverhang + 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* print glyph if present */
|
/* print glyph if present */
|
||||||
@@ -762,12 +780,18 @@ BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||||||
|
|
||||||
x += TILE_X + 5;
|
x += TILE_X + 5;
|
||||||
|
|
||||||
|
/* draw item text */
|
||||||
SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom );
|
SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom );
|
||||||
DrawText(lpdis->hDC,
|
|
||||||
NH_A2W(item->str, wbuf, BUFSZ),
|
ZeroMemory(&dtp, sizeof(dtp));
|
||||||
strlen(item->str),
|
dtp.cbSize = sizeof(dtp);
|
||||||
&drawRect,
|
dtp.iTabLength = max(MIN_TABSTOP_SIZE, data->menu.tab_stop_size);
|
||||||
DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX
|
DrawTextEx(lpdis->hDC,
|
||||||
|
NH_A2W(item->str, wbuf, BUFSZ),
|
||||||
|
strlen(item->str),
|
||||||
|
&drawRect,
|
||||||
|
DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE | DT_TABSTOP,
|
||||||
|
&dtp
|
||||||
);
|
);
|
||||||
|
|
||||||
/* draw focused item */
|
/* draw focused item */
|
||||||
@@ -812,7 +836,7 @@ BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||||||
DeleteDC(tileDC);
|
DeleteDC(tileDC);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch)
|
BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -1079,7 +1103,7 @@ BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch)
|
|||||||
reset_menu_count(hwndList, data);
|
reset_menu_count(hwndList, data);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
|
void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
|
||||||
{
|
{
|
||||||
TEXTMETRIC tm;
|
TEXTMETRIC tm;
|
||||||
@@ -1089,6 +1113,7 @@ void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
|
|||||||
PNHMenuWindow data;
|
PNHMenuWindow data;
|
||||||
int i;
|
int i;
|
||||||
RECT rt;
|
RECT rt;
|
||||||
|
TCHAR wbuf[BUFSZ];
|
||||||
|
|
||||||
GetClientRect(hWnd, &rt);
|
GetClientRect(hWnd, &rt);
|
||||||
sz->cx = rt.right - rt.left;
|
sz->cx = rt.right - rt.left;
|
||||||
@@ -1100,15 +1125,31 @@ void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
|
|||||||
hdc = GetDC(control);
|
hdc = GetDC(control);
|
||||||
|
|
||||||
if( data->type==MENU_TYPE_MENU ) {
|
if( data->type==MENU_TYPE_MENU ) {
|
||||||
/* Set the height of the list box items. */
|
/* Calculate the width of the list box. */
|
||||||
saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE));
|
saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE));
|
||||||
GetTextMetrics(hdc, &tm);
|
GetTextMetrics(hdc, &tm);
|
||||||
for(i=0; i<data->menu.size; i++ ) {
|
for(i=0; i<data->menu.size; i++ ) {
|
||||||
|
DRAWTEXTPARAMS dtp;
|
||||||
|
RECT drawRect;
|
||||||
|
|
||||||
|
SetRect(&drawRect, 0, 0, 1, 1);
|
||||||
|
ZeroMemory(&dtp, sizeof(dtp));
|
||||||
|
dtp.cbSize = sizeof(dtp);
|
||||||
|
dtp.iTabLength = max(MIN_TABSTOP_SIZE, data->menu.tab_stop_size);
|
||||||
|
DrawTextEx(hdc,
|
||||||
|
NH_A2W(data->menu.items[i].str, wbuf, BUFSZ),
|
||||||
|
strlen(data->menu.items[i].str),
|
||||||
|
&drawRect,
|
||||||
|
DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE | DT_TABSTOP,
|
||||||
|
&dtp
|
||||||
|
);
|
||||||
|
|
||||||
sz->cx = max(sz->cx,
|
sz->cx = max(sz->cx,
|
||||||
(LONG)(2*TILE_X + tm.tmAveCharWidth*(strlen(data->menu.items[i].str)+12) + tm.tmOverhang));
|
(LONG)(2*TILE_X + (drawRect.right - drawRect.left) + tm.tmAveCharWidth*12 + tm.tmOverhang));
|
||||||
}
|
}
|
||||||
SelectObject(hdc, saveFont);
|
SelectObject(hdc, saveFont);
|
||||||
} else {
|
} else {
|
||||||
|
/* Calculate the width of the text box. */
|
||||||
RECT text_rt;
|
RECT text_rt;
|
||||||
saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE));
|
saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE));
|
||||||
GetTextMetrics(hdc, &tm);
|
GetTextMetrics(hdc, &tm);
|
||||||
@@ -1122,7 +1163,7 @@ void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
|
|||||||
ReleaseDC(control, hdc);
|
ReleaseDC(control, hdc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count)
|
void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -1141,7 +1182,7 @@ void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count)
|
|||||||
ListView_RedrawItems( hwndList, item, item );
|
ListView_RedrawItems( hwndList, item, item );
|
||||||
reset_menu_count(hwndList, data);
|
reset_menu_count(hwndList, data);
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
void reset_menu_count(HWND hwndList, PNHMenuWindow data)
|
void reset_menu_count(HWND hwndList, PNHMenuWindow data)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -1151,7 +1192,7 @@ void reset_menu_count(HWND hwndList, PNHMenuWindow data)
|
|||||||
if( i>=0 ) ListView_RedrawItems( hwndList, i, i );
|
if( i>=0 ) ListView_RedrawItems( hwndList, i, i );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* List window Proc */
|
/* List window Proc */
|
||||||
LRESULT CALLBACK NHMenuListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK NHMenuListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
@@ -1203,7 +1244,7 @@ LRESULT CALLBACK NHMenuListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
|
|||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Text control window proc - implements close on space */
|
/* Text control window proc - implements close on space */
|
||||||
LRESULT CALLBACK NHMenuTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK NHMenuTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
@@ -1223,4 +1264,4 @@ LRESULT CALLBACK NHMenuTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
|
|||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
|||||||
@@ -133,8 +133,7 @@ void mswin_player_selection(void)
|
|||||||
|
|
||||||
/* select a role */
|
/* select a role */
|
||||||
if( mswin_player_selection_window( &nRole ) == IDCANCEL ) {
|
if( mswin_player_selection_window( &nRole ) == IDCANCEL ) {
|
||||||
clearlocks();
|
bail(0);
|
||||||
mswin_exit_nhwindows(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user