Beispiel #1
0
/*-------------------------------------------------------------------------*/
HWND mswin_init_command_window () {
	static int run_once = 0;
	HWND ret;

	/* register window class */
	if( !run_once ) {
		register_command_window_class();
		run_once = 1;
	}

	/* create window */
	ret = CreateWindow(
			szNHCmdWindowClass,		/* registered class name */
			NULL,					/* window name */
			WS_CHILD | WS_CLIPSIBLINGS, /* window style */
			0,  /* horizontal position of window - set it later */
			0,  /* vertical position of window - set it later */
			0,  /* window width - set it later */
			0,  /* window height - set it later*/
			GetNHApp()->hMainWnd,	/* handle to parent or owner window */
			NULL,					/* menu handle or child identifier */
			GetNHApp()->hApp,		/* handle to application instance */
			NULL );					/* window-creation data */
	if( !ret ) {
		panic("Cannot create command window");
	}
	return ret;
}
Beispiel #2
0
HWND
mswin_init_main_window()
{
    static int run_once = 0;
    HWND ret;
    RECT rc;

    /* register window class */
    if (!run_once) {
        LoadString(GetNHApp()->hApp, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        register_main_window_class();
        run_once = 1;
    }

    /* create the main window */
    SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0);

    ret = CreateWindow(szMainWindowClass,  /* registered class name */
                       szTitle,            /* window name */
                       WS_CLIPCHILDREN,    /* window style */
                       rc.left,            /* horizontal position of window */
                       rc.top,             /* vertical position of window */
                       rc.right - rc.left, /* window width */
                       rc.bottom - rc.top, /* window height */
                       NULL, /* handle to parent or owner window */
                       NULL, /* menu handle or child identifier */
                       GetNHApp()->hApp, /* handle to application instance */
                       NULL              /* window-creation data */
                       );

    if (!ret)
        panic("Cannot create main window");
    return ret;
}
Beispiel #3
0
/* on WM_CREATE */
void
onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    PNHMapWindow data;
    int i, j;

    /* set window data */
    data = (PNHMapWindow) malloc(sizeof(NHMapWindow));
    if (!data)
        panic("out of memory");

    ZeroMemory(data, sizeof(NHMapWindow));
    for (i = 0; i < COLNO; i++)
        for (j = 0; j < ROWNO; j++) {
            data->map[i][j] = -1;
        }

    data->bAsciiMode = FALSE;

    data->xScrTile = GetNHApp()->mapTile_X;
    data->yScrTile = GetNHApp()->mapTile_Y;

    data->xLastMouseClick = data->yLastMouseClick = -1;

    SetWindowLong(hWnd, GWL_USERDATA, (LONG) data);
}
Beispiel #4
0
HWND
mswin_init_map_window()
{
    static int run_once = 0;
    HWND ret;
    DWORD styles;

    if (!run_once) {
        register_map_window_class();
        run_once = 1;
    }

    styles = WS_CHILD | WS_CLIPSIBLINGS;
    if (!GetNHApp()->bHideScrollBars)
        styles |= WS_HSCROLL | WS_VSCROLL;
    ret = CreateWindow(
        szNHMapWindowClass, /* registered class name */
        NULL,               /* window name */
        styles,             /* window style */
        0,                  /* horizontal position of window - set it later */
        0,                  /* vertical position of window - set it later */
        0,                  /* window width - set it later */
        0,                  /* window height - set it later*/
        GetNHApp()->hMainWnd, /* handle to parent or owner window */
        NULL,                 /* menu handle or child identifier */
        GetNHApp()->hApp,     /* handle to application instance */
        NULL);                /* window-creation data */
    if (!ret) {
        panic("Cannot create map window");
    }
    return ret;
}
Beispiel #5
0
HWND mswin_init_status_window(void)
{
    static int run_once = 0;
    HWND ret;
    NHStatusWindow* data;

    if( !run_once ) {
        register_status_window_class( );
        run_once = 1;
    }

    ret = CreateWindow(
              szStatusWindowClass,
              NULL,
              WS_CHILD | WS_DISABLED | WS_CLIPSIBLINGS,
              0,  /* x position */
              0,  /* y position */
              0,  /* x-size - we will set it later */
              0,  /* y-size - we will set it later */
              GetNHApp()->hMainWnd,
              NULL,
              GetNHApp()->hApp,
              NULL );
    if( !ret ) panic("Cannot create status window");

    EnableWindow(ret, FALSE);

    data = (PNHStatusWindow)malloc(sizeof(NHStatusWindow));
    if( !data ) panic("out of memory");

    ZeroMemory(data, sizeof(NHStatusWindow));
    SetWindowLongPtr(ret, GWLP_USERDATA, (LONG_PTR)data);
    return ret;
}
Beispiel #6
0
/*-------------------------------------------------------------------------*/
void NHSPhoneSetKeypadDefault()
{
	PNHCmdWindow data;

	data = (PNHCmdWindow)GetWindowLong(GetNHApp()->hCmdWnd, GWL_USERDATA);
	if( !data ) return;

	if( nhcmdset_current!=nhcmdset_default ) nhcmdset_destroy( nhcmdset_current );
	nhcmdset_current = nhcmdset_default;
	SetCmdWindowLayout(
		GetNHApp()->hCmdWnd,
		data->layout_selected ? data->layout_selected : nhcmdset_get(nhcmdset_current, 0)
	);
}
Beispiel #7
0
/*-------------------------------------------------------------------------*/
void NHSPhoneSetKeypadDirection()
{
	PNHCmdWindow data;

	data = (PNHCmdWindow)GetWindowLong(GetNHApp()->hCmdWnd, GWL_USERDATA);
	if( !data ) return;

	if( nhcmdset_current!=nhcmdset_default ) nhcmdset_destroy( nhcmdset_current );
	nhcmdset_current = nhcmdset_default;
	SetCmdWindowLayout(
		GetNHApp()->hCmdWnd,
		nhcmdset_get(nhcmdset_current, NH_LAYOUT_MOVEMENT)
	);
}
Beispiel #8
0
/*-------------------------------------------------------------------------*/
void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
	PNHCmdWindow data;

	/* set window data */
	data = (PNHCmdWindow)malloc(sizeof(NHCmdWindow));
	if( !data ) panic("out of memory");

	ZeroMemory(data, sizeof(NHCmdWindow));
	SetWindowLong(hWnd, GWL_USERDATA, (LONG)data);

	data->active_cell = -1;

	/* load images bitmap */
	data->images = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_KEYPAD));
	if( !data->images ) panic("cannot load keypad bitmap");

	/* create default layouts */
	data->layout_current = 0;
	data->layout_save = 0;
	data->cells = 0;

#if defined(WIN_CE_SMARTPHONE)
	data->layout_selected = nhcmdset_get(nhcmdset_current, 0);
#endif

	/* set default layout */
	SetCmdWindowLayout(hWnd, nhcmdset_get(nhcmdset_current, 0));
}
Beispiel #9
0
HWND mswin_init_menu_window (int type) {
	HWND ret;

	ret = CreateDialog(
			GetNHApp()->hApp,
			MAKEINTRESOURCE(IDD_MENU),
			GetNHApp()->hMainWnd,
			MenuWndProc
	);
	if( !ret ) {
		panic("Cannot create menu window");
	}
	
	SetMenuType(ret, type);
	return ret;
}
Beispiel #10
0
/*-------------------------------------------------------------------------*/
void register_command_window_class()
{
	WNDCLASS wcex;
	PNHCmdLayout plt;
	ZeroMemory( &wcex, sizeof(wcex));

	/* window class */
	wcex.style			= CS_NOCLOSE;
	wcex.lpfnWndProc	= (WNDPROC)NHCommandWndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= GetNHApp()->hApp;
	wcex.hIcon			= NULL;
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= mswin_get_brush(NHW_KEYPAD, MSWIN_COLOR_BG);
	wcex.lpszMenuName	= NULL;
	wcex.lpszClassName	= szNHCmdWindowClass;

	if( !RegisterClass(&wcex) ) {
		panic("cannot register Map window class");
	}

	/* create default command set */
	nhcmdset_current = nhcmdset_default = nhcmdset_create();

#ifdef WIN_CE_SMARTPHONE
	plt = nhcmdlayout_create("General", NH_CMDPAD_ROWS, NH_CMDPAD_COLS);
	nhcmdlayout_init(plt, cells_layout_general);
	nhcmdset_add(nhcmdset_current, plt);

	plt = nhcmdlayout_create("Movement", NH_CMDPAD_ROWS, NH_CMDPAD_COLS);
	nhcmdlayout_init(plt, cells_layout_movement);
	nhcmdset_add(nhcmdset_current, plt );

	plt = nhcmdlayout_create("Attack", NH_CMDPAD_ROWS, NH_CMDPAD_COLS);
	nhcmdlayout_init(plt, cells_layout_attack);
	nhcmdset_add(nhcmdset_current, plt);

	plt = nhcmdlayout_create("Item Handling", NH_CMDPAD_ROWS, NH_CMDPAD_COLS);
	nhcmdlayout_init(plt, cells_layout_item_handling);
	nhcmdset_add(nhcmdset_current, plt);

	plt = nhcmdlayout_create("Game Controls", NH_CMDPAD_ROWS, NH_CMDPAD_COLS);
	nhcmdlayout_init(plt, cells_layout_game);
	nhcmdset_add(nhcmdset_current, plt);

	plt = nhcmdlayout_create("Advanced Movement", NH_CMDPAD_ROWS, NH_CMDPAD_COLS);
	nhcmdlayout_init(plt, cells_layout_adv_movement);
	nhcmdset_add(nhcmdset_current, plt);
#else /* ! WIN_CE_SMARTPHONE */
	plt = nhcmdlayout_create("lowercase", NH_CMDPAD_ROWS, NH_CMDPAD_COLS);
	nhcmdlayout_init(plt, cells_layout_mod1);
	nhcmdset_add(nhcmdset_current, plt);

	plt = nhcmdlayout_create("uppercase", NH_CMDPAD_ROWS, NH_CMDPAD_COLS);
	nhcmdlayout_init(plt, cells_layout_mod2);
	nhcmdset_add(nhcmdset_current, plt);
#endif /* WIN_CE_SMARTPHONE */
}
Beispiel #11
0
/* on WM_HSCROLL */
void
onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    PNHMapWindow data;
    SCROLLINFO si;
    int xNewPos;
    int xDelta;

    /* get window data */
    data = (PNHMapWindow) GetWindowLong(hWnd, GWL_USERDATA);

    switch (LOWORD(wParam)) {
    /* User clicked shaft left of the scroll box. */
    case SB_PAGEUP:
        xNewPos = data->xPos - data->xPageSize;
        break;

    /* User clicked shaft right of the scroll box. */
    case SB_PAGEDOWN:
        xNewPos = data->xPos + data->xPageSize;
        break;

    /* User clicked the left arrow. */
    case SB_LINEUP:
        xNewPos = data->xPos - 1;
        break;

    /* User clicked the right arrow. */
    case SB_LINEDOWN:
        xNewPos = data->xPos + 1;
        break;

    /* User dragged the scroll box. */
    case SB_THUMBTRACK:
        xNewPos = HIWORD(wParam);
        break;

    default:
        xNewPos = data->xPos;
    }

    xNewPos = max(0, min(COLNO - data->xPageSize + 1, xNewPos));
    if (xNewPos == data->xPos)
        return;

    xDelta = xNewPos - data->xPos;
    data->xPos = xNewPos;

    ScrollWindowEx(hWnd, -data->xScrTile * xDelta, 0, (CONST RECT *) NULL,
                   (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL,
                   SW_INVALIDATE | SW_ERASE);

    if (!GetNHApp()->bHideScrollBars) {
        si.cbSize = sizeof(si);
        si.fMask = SIF_POS;
        si.nPos = data->xPos;
        SetScrollInfo(hWnd, SB_HORZ, &si, TRUE);
    }
}
Beispiel #12
0
HWND
mswin_init_text_window()
{
    HWND ret;
    PNHTextWindow data;
    RECT rt;

    /* get window position */
    if (GetNHApp()->bAutoLayout) {
        SetRect(&rt, 0, 0, 0, 0);
    } else {
        mswin_get_window_placement(NHW_TEXT, &rt);
    }

    /* create text widnow object */
    ret = CreateDialog(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_NHTEXT),
                       GetNHApp()->hMainWnd, NHTextWndProc);
    if (!ret)
        panic("Cannot create text window");

    /* move it in the predefined position */
    if (!GetNHApp()->bAutoLayout) {
        MoveWindow(ret, rt.left, rt.top, rt.right - rt.left,
                   rt.bottom - rt.top, TRUE);
    }

    /* Set window caption */
    SetWindowText(ret, "Text");
    if (!GetNHApp()->bWindowsLocked) {
        DWORD style;
        style = GetWindowLong(ret, GWL_STYLE);
        style |= WS_CAPTION;
        SetWindowLong(ret, GWL_STYLE, style);
        SetWindowPos(ret, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE
                     | SWP_NOZORDER
                     | SWP_FRAMECHANGED);
    }

    /* create and set window data */
    data = (PNHTextWindow) malloc(sizeof(NHTextWindow));
    if (!data)
        panic("out of memory");
    ZeroMemory(data, sizeof(NHTextWindow));
    SetWindowLongPtr(ret, GWLP_USERDATA, (LONG_PTR) data);
    return ret;
}
Beispiel #13
0
void
onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
    switch (wParam) {
    /* new window was just added */
    case MSNH_MSG_ADDWND: {
        PMSNHMsgAddWnd msg_param = (PMSNHMsgAddWnd) lParam;
        HWND child = GetNHApp()->windowlist[msg_param->wid].win;

        if (GetNHApp()->windowlist[msg_param->wid].type == NHW_MAP)
            mswin_select_map_mode(iflags.wc_map_mode);

        if (child)
            mswin_layout_main_window(child);
    } break;
    }
}
Beispiel #14
0
void register_main_window_class()
{
	WNDCLASS wcex;
	
	ZeroMemory(&wcex, sizeof(wcex));
	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)MainWndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= GetNHApp()->hApp;
	wcex.hIcon			= LoadIcon(GetNHApp()->hApp, (LPCTSTR)IDI_NETHACKW);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= (TCHAR*)IDC_NETHACKW;
	wcex.lpszClassName	= szMainWindowClass;

	RegisterClass(&wcex);
}
Beispiel #15
0
int
mswin_ext_cmd_window(int *selection)
{
    int ret;
    struct extcmd_data data;

    /* init dialog data */
    ZeroMemory(&data, sizeof(data));
    *selection = -1;
    data.selection = selection;

    /* create modal dialog window */
    ret = DialogBoxParam(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_EXTCMD),
                         GetNHApp()->hMainWnd, ExtCmdDlgProc, (LPARAM) &data);
    if (ret == -1)
        panic("Cannot create extcmd window");
    return ret;
}
Beispiel #16
0
HMENU
_get_main_menu(UINT menu_id)
{
    HMENU hmenuMap;
#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE)
    TBBUTTONINFO tbbi;
#endif

#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE)
    tbbi.cbSize = sizeof(tbbi);
    tbbi.dwMask = TBIF_LPARAM;
    SendMessage(GetNHApp()->hMenuBar, TB_GETBUTTONINFO, menu_id,
                (LPARAM) &tbbi);
    hmenuMap = (HMENU) tbbi.lParam;
#else
    hmenuMap = CommandBar_GetMenu(GetNHApp()->hMenuBar, 0);
#endif
    return hmenuMap;
}
Beispiel #17
0
int
mswin_player_selection_window(int *selection)
{
    int ret;
    struct plsel_data data;

    /* init dialog data */
    ZeroMemory(&data, sizeof(data));
    data.selection = selection;

    /* create modal dialog */
    ret = DialogBoxParam(
        GetNHApp()->hApp, MAKEINTRESOURCE(IDD_PLAYER_SELECTOR),
        GetNHApp()->hMainWnd, PlayerSelectorDlgProc, (LPARAM) &data);
    if (ret == -1)
        panic("Cannot create getlin window");

    return ret;
}
Beispiel #18
0
HWND mswin_init_RIP_window () {
	HWND ret;
	PNHRIPWindow data;

	ret = CreateDialog(
			GetNHApp()->hApp,
			MAKEINTRESOURCE(IDD_NHRIP),
			GetNHApp()->hMainWnd,
			NHRIPWndProc
	);
	if( !ret ) panic("Cannot create rip window");

	data = (PNHRIPWindow)malloc(sizeof(NHRIPWindow));
	if( !data ) panic("out of memory");

	ZeroMemory(data, sizeof(NHRIPWindow));
	SetWindowLong(ret, GWL_USERDATA, (LONG)data);
	return ret;
}
Beispiel #19
0
int
mswin_getlin_window(const char *question, char *result, size_t result_size)
{
    int ret;
    struct getlin_data data;

    /* initilize dialog data */
    ZeroMemory(&data, sizeof(data));
    data.question = question;
    data.result = result;
    data.result_size = result_size;

    /* create modal dialog window */
    ret = DialogBoxParam(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_GETLIN),
                         GetNHApp()->hMainWnd, GetlinDlgProc, (LPARAM) &data);
    if (ret == -1)
        panic("Cannot create getlin window");

    return ret;
}
Beispiel #20
0
HWND mswin_init_text_window () {
	HWND ret;
	PNHTextWindow data;

	ret = CreateDialog(
			GetNHApp()->hApp,
			MAKEINTRESOURCE(IDD_NHTEXT),
			GetNHApp()->hMainWnd,
			TextWndProc
	);
	if( !ret ) panic("Cannot create text window");

	data = (PNHTextWindow)malloc(sizeof(NHTextWindow));
	if( !data ) panic("out of memory");

	ZeroMemory(data, sizeof(NHTextWindow));
	data->window_text = mswin_init_text_buffer(
			program_state.gameover? FALSE : GetNHApp()->bWrapText
		);
	SetWindowLong(ret, GWL_USERDATA, (LONG)data);
	return ret;
}
Beispiel #21
0
// Mesage handler for about box.
LRESULT CALLBACK
About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    char buf[BUFSZ];
    TCHAR wbuf[NHSTR_BUFSIZE];
    RECT main_rt, dlg_rt;
    SIZE dlg_sz;

    switch (message) {
    case WM_INITDIALOG:
        getversionstring(buf);
        SetDlgItemText(hDlg, IDC_ABOUT_VERSION,
                       NH_A2W(buf, wbuf, NHSTR_BUFSIZE));

        SetDlgItemText(hDlg, IDC_ABOUT_COPYRIGHT,
                       NH_A2W(COPYRIGHT_BANNER_A "\n" COPYRIGHT_BANNER_B
                                                 "\n" COPYRIGHT_BANNER_C
                                                 "\n" COPYRIGHT_BANNER_D,
                              wbuf, NHSTR_BUFSIZE));

        /* center dialog in the main window */
        GetWindowRect(GetNHApp()->hMainWnd, &main_rt);
        GetWindowRect(hDlg, &dlg_rt);
        dlg_sz.cx = dlg_rt.right - dlg_rt.left;
        dlg_sz.cy = dlg_rt.bottom - dlg_rt.top;

        dlg_rt.left = (main_rt.left + main_rt.right - dlg_sz.cx) / 2;
        dlg_rt.right = dlg_rt.left + dlg_sz.cx;
        dlg_rt.top = (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2;
        dlg_rt.bottom = dlg_rt.top + dlg_sz.cy;
        MoveWindow(hDlg, (main_rt.left + main_rt.right - dlg_sz.cx) / 2,
                   (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2, dlg_sz.cx,
                   dlg_sz.cy, TRUE);

        return TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;
    }
    return FALSE;
}
Beispiel #22
0
void
register_status_window_class()
{
    WNDCLASS wcex;

    ZeroMemory(&wcex, sizeof(wcex));
    wcex.style = CS_NOCLOSE;
    wcex.lpfnWndProc = (WNDPROC) StatusWndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = GetNHApp()->hApp;
    wcex.hIcon = NULL;
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = mswin_get_brush(NHW_STATUS, MSWIN_COLOR_BG);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = szStatusWindowClass;

    RegisterClass(&wcex);
}
Beispiel #23
0
void register_status_window_class(void)
{
    WNDCLASS wcex;
    ZeroMemory( &wcex, sizeof(wcex));

    wcex.style			= CS_NOCLOSE;
    wcex.lpfnWndProc	= (WNDPROC)StatusWndProc;
    wcex.cbClsExtra		= 0;
    wcex.cbWndExtra		= 0;
    wcex.hInstance		= GetNHApp()->hApp;
    wcex.hIcon			= NULL;
    wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground	= status_bg_brush
                          ? status_bg_brush : SYSCLR_TO_BRUSH(DEFAULT_COLOR_BG_STATUS);
    wcex.lpszMenuName	= NULL;
    wcex.lpszClassName	= szStatusWindowClass;

    RegisterClass(&wcex);
}
Beispiel #24
0
void CheckInputDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
#if defined(WIN_CE_POCKETPC)
	PNHMenuWindow data;

	data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA);

	if( !( data && 
		   data->type==MENU_TYPE_MENU &&
		   (data->how==PICK_ONE || data->how==PICK_ANY) ) ) return;
	
	switch(message) {
	case WM_SETFOCUS:
		if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_UP);
	return;

	case WM_DESTROY:
	case WM_KILLFOCUS:
		if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_DOWN);
	return;

	case WM_NOTIFY:
	{
		LPNMHDR	lpnmhdr = (LPNMHDR)lParam;
		switch(lpnmhdr->code) {
		case NM_SETFOCUS:
			if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_UP);
		break;
		case NM_KILLFOCUS:
			if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_DOWN);
		break;
		}
	} return;

	case WM_COMMAND:
		switch(HIWORD(wParam)) {
		case BN_SETFOCUS:
			if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_UP);
		break;
		case BN_KILLFOCUS:
			if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_DOWN);
		break;
		}
	return;

	} /* end switch */
#endif
}
Beispiel #25
0
/* register window class for map window */
void register_map_window_class()
{
	WNDCLASS wcex;
	ZeroMemory( &wcex, sizeof(wcex));

	/* window class */
	wcex.style			= CS_NOCLOSE | CS_DBLCLKS;
	wcex.lpfnWndProc	= (WNDPROC)MapWndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= GetNHApp()->hApp;
	wcex.hIcon			= NULL;
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= CreateSolidBrush(RGB(0, 0, 0)); /* set backgroup here */
	wcex.lpszMenuName	= NULL;
	wcex.lpszClassName	= szNHMapWindowClass;

	if( !RegisterClass(&wcex) ) {
		panic("cannot register Map window class");
	}
}
Beispiel #26
0
/* Set map display mode */
void
mswin_select_map_mode(int mode)
{
    HMENU hmenuMap;
    PNHMainWindow data;
    winid map_id;

    map_id = WIN_MAP;
    data = (PNHMainWindow) GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA);
#if defined(WIN_CE_SMARTPHONE)
    /* Smartphone manu has only 2 items */
    hmenuMap = _get_main_menu(ID_VIEW);
#else
    hmenuMap = _get_main_menu(ID_MAP);
#endif

    /* override for Rogue level */
    if (Is_rogue_level(&u.uz) && !IS_MAP_ASCII(mode))
        return;

    /* set map mode menu mark */
    if (IS_MAP_ASCII(mode)) {
        CheckMenuRadioItem(hmenuMap, IDM_MAP_TILES, IDM_MAP_FIT_TO_SCREEN,
                           mapmode2menuid(IS_MAP_FIT_TO_SCREEN(mode)
                                              ? data->mapAcsiiModeSave
                                              : mode),
                           MF_BYCOMMAND);
    } else {
        CheckMenuRadioItem(hmenuMap, IDM_MAP_TILES, IDM_MAP_FIT_TO_SCREEN,
                           mapmode2menuid(MAP_MODE_TILES), MF_BYCOMMAND);
    }

#if defined(WIN_CE_SMARTPHONE)
    /* update "Fit To Screen" item text */
    {
        TCHAR wbuf[BUFSZ];
        TBBUTTONINFO tbbi;

        ZeroMemory(wbuf, sizeof(wbuf));
        if (!LoadString(GetNHApp()->hApp,
                        (IS_MAP_FIT_TO_SCREEN(mode) ? IDS_CAP_NORMALMAP
                                                    : IDS_CAP_ENTIREMAP),
                        wbuf, BUFSZ)) {
            panic("cannot load main menu strings");
        }

        ZeroMemory(&tbbi, sizeof(tbbi));
        tbbi.cbSize = sizeof(tbbi);
        tbbi.dwMask = TBIF_TEXT;
        tbbi.pszText = wbuf;
        if (!SendMessage(GetNHApp()->hMenuBar, TB_SETBUTTONINFO,
                         IDM_MAP_FIT_TO_SCREEN, (LPARAM) &tbbi)) {
            error("Cannot update IDM_MAP_FIT_TO_SCREEN menu item.");
        }
    }
#else
    /* set fit-to-screen mode mark */
    CheckMenuItem(hmenuMap, IDM_MAP_FIT_TO_SCREEN,
                  MF_BYCOMMAND | (IS_MAP_FIT_TO_SCREEN(mode) ? MF_CHECKED
                                                             : MF_UNCHECKED));
#endif

    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;

    /*
    ** first, check if WIN_MAP has been inialized.
    ** If not - attempt to retrieve it by type, then check it again
    */
    if (WIN_MAP != WIN_ERR)
        mswin_map_mode(mswin_hwnd_from_winid(WIN_MAP), mode);
}
Beispiel #27
0
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);

    // process the menu selections:
    switch (wmId) {
    case IDM_ABOUT:
        DialogBox(GetNHApp()->hApp, (LPCTSTR) IDD_ABOUTBOX, hWnd,
                  (DLGPROC) About);
        break;

    case IDM_EXIT:
        done2();
        break;

    case IDM_SAVE:
        dosave();
        break;

    case IDM_MAP_TILES:
    case IDM_MAP_ASCII4X6:
    case IDM_MAP_ASCII6X8:
    case IDM_MAP_ASCII8X8:
    case IDM_MAP_ASCII16X8:
    case IDM_MAP_ASCII7X12:
    case IDM_MAP_ASCII8X12:
    case IDM_MAP_ASCII12X16:
    case IDM_MAP_ASCII16X12:
    case IDM_MAP_ASCII10X18:
        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_VIEW_KEYPAD:
        GetNHApp()->bCmdPad = !GetNHApp()->bCmdPad;
        CheckMenuItem(
            _get_main_menu(ID_VIEW), IDM_VIEW_KEYPAD,
            MF_BYCOMMAND | (GetNHApp()->bCmdPad ? MF_CHECKED : MF_UNCHECKED));
        mswin_layout_main_window(GetNHApp()->hCmdWnd);
        break;

    case IDM_VIEW_OPTIONS:
        doset();
        break;

    case IDM_DIRECT_COMMAND: /* SmartPhone: display dialog to type in arbitary
                                command text */
        mswin_direct_command();
        break;

    case IDM_HELP_LONG:
        display_file(HELP, TRUE);
        break;

    case IDM_HELP_COMMANDS:
        display_file(SHELP, TRUE);
        break;

    case IDM_HELP_HISTORY:
        (void) dohistory();
        break;

    case IDM_HELP_INFO_CHAR:
        (void) dowhatis();
        break;

    case IDM_HELP_INFO_KEY:
        (void) dowhatdoes();
        break;

    case IDM_HELP_OPTIONS:
        option_help();
        break;

    case IDM_HELP_OPTIONS_LONG:
        display_file(OPTIONFILE, TRUE);
        break;

    case IDM_HELP_EXTCMD:
        (void) doextlist();
        break;

    case IDM_HELP_LICENSE:
        display_file(LICENSE, TRUE);
        break;

    case IDM_HELP_MENU:
        dohelp();
        break;

    default:
        return 1;
    }
    return 0;
}
Beispiel #28
0
/* adjust windows to fit main window layout
   ---------------------------
   |        Status           |
   +-------------------------+
   |                         |
   |                         |
   |          MAP            |
   |                         |
   |                         |
   +-------------------------+
   |      Command pad        |
   +-------------------------+
   |        Messages         |
   ---------------------------
*/
void
mswin_layout_main_window(HWND changed_child)
{
    winid i;
    RECT client_rt, wnd_rect;
    POINT status_org;
    SIZE status_size;
    POINT msg_org;
    SIZE msg_size;
    POINT map_org;
    SIZE map_size;
    POINT cmd_org;
    SIZE cmd_size;
    HWND wnd_status, wnd_msg;
    PNHMainWindow data;
#if defined(WIN_CE_POCKETPC)
    SIPINFO sip;
    RECT menu_bar;
    RECT visible_rt;
    POINT pt;
#endif

    GetClientRect(GetNHApp()->hMainWnd, &client_rt);

#if defined(WIN_CE_POCKETPC)
    ZeroMemory(&sip, sizeof(sip));
    sip.cbSize = sizeof(sip);
    SHSipInfo(SPI_GETSIPINFO, 0, &sip, 0);
    if (GetNHApp()->bFullScreen)
        sip.rcVisibleDesktop.top = 0;

    /* adjust client rectangle size */
    GetWindowRect(GetNHApp()->hMenuBar, &menu_bar);
    client_rt.bottom -= menu_bar.bottom - menu_bar.top;

    /* calcuate visible rect in client coordinates */
    pt.x = sip.rcVisibleDesktop.left;
    pt.y = sip.rcVisibleDesktop.top;
    ScreenToClient(GetNHApp()->hMainWnd, &pt);
    SetRect(&wnd_rect, pt.x, pt.y,
            pt.x + sip.rcVisibleDesktop.right - sip.rcVisibleDesktop.left,
            pt.y + sip.rcVisibleDesktop.bottom - sip.rcVisibleDesktop.top);
    IntersectRect(&visible_rt, &client_rt, &wnd_rect);
#else
#if !defined(WIN_CE_SMARTPHONE)
    client_rt.top += CommandBar_Height(GetNHApp()->hMenuBar);
#else
    /* Smartphone only */
    if (GetNHApp()->bFullScreen) {
        RECT menu_bar;
        GetWindowRect(GetNHApp()->hMenuBar, &menu_bar);
        client_rt.bottom -= menu_bar.bottom - menu_bar.top;
    }
#endif
#endif

    /* get window data */
    data = (PNHMainWindow) GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA);

    /* get sizes of child windows */
    wnd_status = mswin_hwnd_from_winid(WIN_STATUS);
    if (IsWindow(wnd_status)) {
        mswin_status_window_size(wnd_status, &status_size);
    } else {
        status_size.cx = status_size.cy = 0;
    }

    wnd_msg = mswin_hwnd_from_winid(WIN_MESSAGE);
    if (IsWindow(wnd_msg)) {
        mswin_message_window_size(wnd_msg, &msg_size);
    } else {
        msg_size.cx = msg_size.cy = 0;
    }

    cmd_size.cx = cmd_size.cy = 0;
    if (GetNHApp()->bCmdPad && IsWindow(GetNHApp()->hCmdWnd)) {
        mswin_command_window_size(GetNHApp()->hCmdWnd, &cmd_size);
    }

/* set window positions */

/* calculate the application windows size */
#if defined(WIN_CE_POCKETPC)
    SetRect(&wnd_rect, visible_rt.left, visible_rt.top, visible_rt.right,
            visible_rt.bottom);
    if (sip.fdwFlags & SIPF_ON)
        cmd_size.cx = cmd_size.cy = 0; /* hide keypad window */
#else
    SetRect(&wnd_rect, client_rt.left, client_rt.top, client_rt.right,
            client_rt.bottom);
#endif

#if !defined(WIN_CE_SMARTPHONE)
    /* other ports have it at the bottom of the screen */
    cmd_size.cx = (wnd_rect.right - wnd_rect.left);
    cmd_org.x = wnd_rect.left;
    cmd_org.y = wnd_rect.bottom - cmd_size.cy;
    wnd_rect.bottom -= cmd_size.cy;
#endif

    /* status window */
    switch (iflags.wc_align_status) {
    case ALIGN_LEFT:
        status_size.cx = (wnd_rect.right - wnd_rect.left) / 4;
        status_size.cy =
            (wnd_rect.bottom - wnd_rect.top); // that won't look good
        status_org.x = wnd_rect.left;
        status_org.y = wnd_rect.top;
        wnd_rect.left += status_size.cx;
        break;

    case ALIGN_RIGHT:
        status_size.cx = (wnd_rect.right - wnd_rect.left) / 4;
        status_size.cy =
            (wnd_rect.bottom - wnd_rect.top); // that won't look good
        status_org.x = wnd_rect.right - status_size.cx;
        status_org.y = wnd_rect.top;
        wnd_rect.right -= status_size.cx;
        break;

    case ALIGN_TOP:
        status_size.cx = (wnd_rect.right - wnd_rect.left);
        status_org.x = wnd_rect.left;
        status_org.y = wnd_rect.top;
        wnd_rect.top += status_size.cy;
        break;

    case ALIGN_BOTTOM:
    default:
        status_size.cx = (wnd_rect.right - wnd_rect.left);
        status_org.x = wnd_rect.left;
        status_org.y = wnd_rect.bottom - status_size.cy;
        wnd_rect.bottom -= status_size.cy;
        break;
    }

    /* message window */
    switch (iflags.wc_align_message) {
    case ALIGN_LEFT:
#if defined(WIN_CE_SMARTPHONE)
        /* smartphone has a keypad window on the right (bottom) side of the
         * message window */
        msg_size.cx = cmd_size.cx = max(msg_size.cx, cmd_size.cx);
        msg_size.cy = (wnd_rect.bottom - wnd_rect.top) - cmd_size.cy;
        msg_org.x = cmd_org.x = wnd_rect.left;
        msg_org.y = wnd_rect.top;
        cmd_org.y = msg_org.y + msg_size.cy;
#else
        msg_size.cx = (wnd_rect.right - wnd_rect.left) / 4;
        msg_size.cy = (wnd_rect.bottom - wnd_rect.top);
        msg_org.x = wnd_rect.left;
        msg_org.y = wnd_rect.top;
#endif
        wnd_rect.left += msg_size.cx;

        break;

    case ALIGN_RIGHT:
#if defined(WIN_CE_SMARTPHONE)
        /* smartphone has a keypad window on the right (bottom) side of the
         * message window */
        msg_size.cx = cmd_size.cx = max(msg_size.cx, cmd_size.cx);
        msg_size.cy = (wnd_rect.bottom - wnd_rect.top) - cmd_size.cy;
        msg_org.x = cmd_org.x = wnd_rect.right - msg_size.cx;
        msg_org.y = wnd_rect.top;
        cmd_org.y = msg_org.y + msg_size.cy;
#else
        msg_size.cx = (wnd_rect.right - wnd_rect.left) / 4;
        msg_size.cy = (wnd_rect.bottom - wnd_rect.top);
        msg_org.x = wnd_rect.right - msg_size.cx;
        msg_org.y = wnd_rect.top;
#endif

        wnd_rect.right -= msg_size.cx;
        break;

    case ALIGN_TOP:
#if defined(WIN_CE_SMARTPHONE)
        /* smartphone has a keypad window on the right side of the message
         * window */
        msg_size.cy = cmd_size.cy = max(msg_size.cy, cmd_size.cy);
        msg_size.cx = (wnd_rect.right - wnd_rect.left) - cmd_size.cx;
        msg_org.x = wnd_rect.left;
        cmd_org.x = msg_org.x + msg_size.cx;
        msg_org.y = cmd_org.y = wnd_rect.bottom - msg_size.cy;
#else
        msg_size.cx = (wnd_rect.right - wnd_rect.left);
        msg_org.x = wnd_rect.left;
        msg_org.y = wnd_rect.top;
#endif
        wnd_rect.top += msg_size.cy;
        break;

    case ALIGN_BOTTOM:
    default:
#if defined(WIN_CE_SMARTPHONE)
        /* smartphone has a keypad window on the right side of the message
         * window */
        msg_size.cy = cmd_size.cy = max(msg_size.cy, cmd_size.cy);
        msg_size.cx = (wnd_rect.right - wnd_rect.left) - cmd_size.cx;
        msg_org.x = wnd_rect.left;
        cmd_org.x = msg_org.x + msg_size.cx;
        msg_org.y = cmd_org.y = wnd_rect.bottom - msg_size.cy;
#else
        msg_size.cx = (wnd_rect.right - wnd_rect.left);
        msg_org.x = wnd_rect.left;
        msg_org.y = wnd_rect.bottom - msg_size.cy;
#endif
        wnd_rect.bottom -= msg_size.cy;
        break;
    }

    map_org.x = wnd_rect.left;
    map_org.y = wnd_rect.top;
    map_size.cx = wnd_rect.right - wnd_rect.left;
    map_size.cy = wnd_rect.bottom - wnd_rect.top;

    /* go through the windows list and adjust sizes */
    for (i = 0; i < MAXWINDOWS; i++) {
        if (GetNHApp()->windowlist[i].win
            && !GetNHApp()->windowlist[i].dead) {
            switch (GetNHApp()->windowlist[i].type) {
            case NHW_MESSAGE:
                MoveWindow(GetNHApp()->windowlist[i].win, msg_org.x,
                           msg_org.y, msg_size.cx, msg_size.cy, TRUE);
                break;
            case NHW_MAP:
                MoveWindow(GetNHApp()->windowlist[i].win, map_org.x,
                           map_org.y, map_size.cx, map_size.cy, TRUE);
                break;
            case NHW_STATUS:
                MoveWindow(GetNHApp()->windowlist[i].win, status_org.x,
                           status_org.y, status_size.cx, status_size.cy,
                           TRUE);
                break;

            case NHW_TEXT:
            case NHW_MENU:
            case NHW_RIP: {
                POINT menu_org;
                SIZE menu_size;

                menu_org.x = client_rt.left;
                menu_org.y = client_rt.top;
#if defined(WIN_CE_POCKETPC)
                menu_size.cx = min(sip.rcVisibleDesktop.right
                                       - sip.rcVisibleDesktop.left,
                                   client_rt.right - client_rt.left);
                menu_size.cy = min(sip.rcVisibleDesktop.bottom
                                       - sip.rcVisibleDesktop.top,
                                   client_rt.bottom - client_rt.top);
#else
                menu_size.cx = client_rt.right - client_rt.left;
                menu_size.cy = client_rt.bottom - client_rt.top;
#endif

#if defined(WIN_CE_SMARTPHONE)
                /* leave room for the command window */
                if (GetNHApp()->windowlist[i].type == NHW_MENU) {
                    menu_size.cy -= cmd_size.cy;
                }

                /* dialogs are popup windows unde SmartPhone so we need
                   to convert to screen coordinates */
                ClientToScreen(GetNHApp()->hMainWnd, &menu_org);
#endif
                MoveWindow(GetNHApp()->windowlist[i].win, menu_org.x,
                           menu_org.y, menu_size.cx, menu_size.cy, TRUE);
            } break;
            }
            ShowWindow(GetNHApp()->windowlist[i].win, SW_SHOW);
            InvalidateRect(GetNHApp()->windowlist[i].win, NULL, TRUE);
        }
    }

    if (IsWindow(GetNHApp()->hCmdWnd)) {
        /* show command window only if it exists and
           the game is ready (plname is set) */
        if (GetNHApp()->bCmdPad && cmd_size.cx > 0 && cmd_size.cy > 0
            && *plname) {
            MoveWindow(GetNHApp()->hCmdWnd, cmd_org.x, cmd_org.y, cmd_size.cx,
                       cmd_size.cy, TRUE);
            ShowWindow(GetNHApp()->hCmdWnd, SW_SHOW);
        } else {
            ShowWindow(GetNHApp()->hCmdWnd, SW_HIDE);
        }
    }
}
Beispiel #29
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;

    switch (message) {
    /*-----------------------------------------------------------------------*/
    case WM_CREATE: {
#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE)
        SHMENUBARINFO menubar;
#endif
        /* set window data */
        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;

/* create menu bar */
#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE)
        ZeroMemory(&menubar, sizeof(menubar));
        menubar.cbSize = sizeof(menubar);
        menubar.hwndParent = hWnd;
        menubar.dwFlags = 0;
        menubar.nToolBarId = IDC_WINHACK;
        menubar.hInstRes = GetNHApp()->hApp;
#if defined(WIN_CE_POCKETPC)
        menubar.nBmpId = IDB_MENUBAR;
        menubar.cBmpImages = 2;
#else
        menubar.nBmpId = 0;
        menubar.cBmpImages = 0;
#endif
        if (!SHCreateMenuBar(&menubar))
            panic("cannot create menu");
        GetNHApp()->hMenuBar = menubar.hwndMB;
#else
        GetNHApp()->hMenuBar = CommandBar_Create(GetNHApp()->hApp, hWnd, 1);
        if (!GetNHApp()->hMenuBar)
            panic("cannot create menu");
        CommandBar_InsertMenubar(GetNHApp()->hMenuBar, GetNHApp()->hApp,
                                 IDC_WINHACK, 0);
#endif
        CheckMenuItem(
            _get_main_menu(ID_VIEW), IDM_VIEW_KEYPAD,
            MF_BYCOMMAND | (GetNHApp()->bCmdPad ? MF_CHECKED : MF_UNCHECKED));

    } break;

    /*-----------------------------------------------------------------------*/

    case WM_MSNH_COMMAND:
        onMSNHCommand(hWnd, wParam, lParam);
        break;

    /*-----------------------------------------------------------------------*/

    case WM_KEYDOWN:
        data = (PNHMainWindow) GetWindowLong(hWnd, GWL_USERDATA);

        /* translate arrow keys into nethack commands */
        switch (wParam) {
        case VK_LEFT:
            if (STATEON(VK_CONTROL)) {
                /* scroll map window one line left */
                SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL,
                            MAKEWPARAM(SB_LINEUP, 0), (LPARAM) NULL);
            } else {
                NHEVENT_KBD(KEYTABLE(KEY_W));
            }
            return 0;

        case VK_RIGHT:
            if (STATEON(VK_CONTROL)) {
                /* scroll map window one line right */
                SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL,
                            MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM) NULL);
            } else {
                NHEVENT_KBD(KEYTABLE(KEY_E));
            }
            return 0;

        case VK_UP:
            if (STATEON(VK_CONTROL)) {
                /* scroll map window one line up */
                SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL,
                            MAKEWPARAM(SB_LINEUP, 0), (LPARAM) NULL);
            } else {
                NHEVENT_KBD(KEYTABLE(KEY_N));
            }
            return 0;

        case VK_DOWN:
            if (STATEON(VK_CONTROL)) {
                /* scroll map window one line down */
                SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL,
                            MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM) NULL);
            } else {
                NHEVENT_KBD(KEYTABLE(KEY_S));
            }
            return 0;

        case VK_HOME:
            if (STATEON(VK_CONTROL)) {
                /* scroll map window to upper left corner */
                SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL,
                            MAKEWPARAM(SB_THUMBTRACK, 0), (LPARAM) NULL);

                SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL,
                            MAKEWPARAM(SB_THUMBTRACK, 0), (LPARAM) NULL);
            } else {
                NHEVENT_KBD(KEYTABLE(KEY_NW));
            }
            return 0;

        case VK_END:
            if (STATEON(VK_CONTROL)) {
                /* scroll map window to lower right corner */
                SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL,
                            MAKEWPARAM(SB_THUMBTRACK, ROWNO), (LPARAM) NULL);

                SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL,
                            MAKEWPARAM(SB_THUMBTRACK, COLNO), (LPARAM) NULL);
            } else {
                NHEVENT_KBD(KEYTABLE(KEY_SW));
            }
            return 0;

        case VK_PRIOR:
            if (STATEON(VK_CONTROL)) {
                /* scroll map window one page up */
                SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL,
                            MAKEWPARAM(SB_PAGEUP, 0), (LPARAM) NULL);
            } else {
                NHEVENT_KBD(KEYTABLE(KEY_NE));
            }
            return 0;

        case VK_NEXT:
            if (STATEON(VK_CONTROL)) {
                /* scroll map window one page down */
                SendMessage(mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL,
                            MAKEWPARAM(SB_PAGEDOWN, 0), (LPARAM) NULL);
            } else {
                NHEVENT_KBD(KEYTABLE(KEY_SE));
            }
            return 0;

        case VK_DECIMAL:
        case VK_DELETE:
            NHEVENT_KBD(KEYTABLE(KEY_WAITLOOK));
            return 0;

        case VK_INSERT:
            NHEVENT_KBD(KEYTABLE(KEY_INV));
            return 0;

        case VK_SUBTRACT:
            NHEVENT_KBD(KEYTABLE(KEY_MINUS));
            return 0;

        case VK_ADD:
            NHEVENT_KBD(KEYTABLE(KEY_PLUS));
            return 0;

        case VK_CLEAR: /* This is the '5' key */
            NHEVENT_KBD(KEYTABLE(KEY_GOINTERESTING));
            return 0;

        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_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;

        case VK_RETURN: {
            int x, y;
            if (WIN_MAP != WIN_ERR) {
                mswin_map_get_cursor(mswin_hwnd_from_winid(WIN_MAP), &x, &y);
            } else {
                x = u.ux;
                y = u.uy;
            }
            NHEVENT_MS(CLICK_1, x, y);
        }
            return 0;
        }

#if defined(WIN_CE_SMARTPHONE)
        if (GetNHApp()->bCmdPad
            && NHSPhoneTranslateKbdMessage(wParam, lParam, TRUE))
            return 0;
#endif
        return 1; /* end of WM_KEYDOWN */

/*-----------------------------------------------------------------------*/

#if defined(WIN_CE_SMARTPHONE)
    case WM_KEYUP:
        if (GetNHApp()->bCmdPad
            && NHSPhoneTranslateKbdMessage(wParam, lParam, FALSE))
            return 0;
        return 1; /* end of WM_KEYUP */
#endif
    /*-----------------------------------------------------------------------*/

    case WM_CHAR:
#if defined(WIN_CE_SMARTPHONE)
        /* if smartphone cmdpad is up then translation happens - disable
           WM_CHAR processing
           to avoid double input */
        if (GetNHApp()->bCmdPad) {
            return 1;
        }
#endif

        if (wParam == '\n' || wParam == '\r' || wParam == C('M'))
            return 0; /* we already processed VK_RETURN */

        /* all characters go to nethack except Ctrl-P that scrolls message
         * window up */
        if (wParam == C('P') || wParam == C('p')) {
            SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_VSCROLL,
                        MAKEWPARAM(SB_LINEUP, 0), (LPARAM) NULL);
        } else {
            NHEVENT_KBD((lParam & 1 << 29) ? M(tolower(wParam)) : wParam);
        }
        return 0;

    /*-----------------------------------------------------------------------*/

    case WM_COMMAND:
        /* process commands - menu commands mostly */
        if (IsWindow(GetNHApp()->hPopupWnd)) {
            return SendMessage(GetNHApp()->hPopupWnd, message, wParam,
                               lParam);
        } else if (onWMCommand(hWnd, wParam, lParam))
            return DefWindowProc(hWnd, message, wParam, lParam);
        else
            return 0;

    /*-----------------------------------------------------------------------*/

    case WM_ACTIVATE:
        if (LOWORD(wParam) != WA_INACTIVE) {
#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE)
            if (GetNHApp()->bFullScreen)
                SHFullScreen(GetNHApp()->hMainWnd,
                             SHFS_HIDETASKBAR | SHFS_HIDESTARTICON);
            else
                SHFullScreen(GetNHApp()->hMainWnd,
                             SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON);
#endif
            mswin_layout_main_window(NULL);
        }
        break;

    case WM_SETTINGCHANGE:
#if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE)
        if (GetNHApp()->bFullScreen)
            SHFullScreen(GetNHApp()->hMainWnd,
                         SHFS_HIDETASKBAR | SHFS_HIDESTARTICON);
        else
            SHFullScreen(GetNHApp()->hMainWnd,
                         SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON);
#endif
        mswin_layout_main_window(NULL);
        break;

    case WM_SIZE:
        mswin_layout_main_window(NULL);
        break;

    /*-----------------------------------------------------------------------*/

    case WM_SETFOCUS:
        /* if there is a menu window out there -
           transfer input focus to it */
        if (IsWindow(GetNHApp()->hPopupWnd)) {
            SetFocus(GetNHApp()->hPopupWnd);
        }
        break;

    /*-----------------------------------------------------------------------*/

    case WM_CLOSE: {
/* exit gracefully */
#ifdef SAFERHANGUP
        /* destroy popup window - it has its own loop and we need to
           return control to NetHack core at this point */
        if (IsWindow(GetNHApp()->hPopupWnd))
            SendMessage(GetNHApp()->hPopupWnd, WM_COMMAND, IDCANCEL, 0);

        /* tell NetHack core that "hangup" is requested */
        hangup(1);
#else
        dosave0();
        terminate(EXIT_SUCCESS);
#endif
    }
        return 0;

    /*-----------------------------------------------------------------------*/

    case WM_DESTROY: {
        /* apparently we never get here
           TODO: work on exit routines - need to send
           WM_QUIT somehow */

        /* clean up */
        free((PNHMainWindow) GetWindowLong(hWnd, GWL_USERDATA));
        SetWindowLong(hWnd, GWL_USERDATA, (LONG) 0);

        terminate(EXIT_SUCCESS);
    } break;

    /*-----------------------------------------------------------------------*/

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Beispiel #30
0
void
mswin_display_splash_window(BOOL show_ver)
{
    MSG msg;
    int left, top;
    RECT splashrt;
    RECT clientrt;
    RECT controlrt;
    HWND hWnd;
    int buttop;
    int strsize = 0;
    int bufsize = BUFSZ;
    char *buf = malloc(bufsize);

    if (buf == NULL)
        panic("out of memory");
    buf[0] = '\0';

    hWnd = CreateDialog(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_SPLASH),
                        GetNHApp()->hMainWnd, NHSplashWndProc);
    if (!hWnd)
        panic("Cannot create Splash window");
    mswin_init_splashfonts(hWnd);
    GetNHApp()->hPopupWnd = hWnd;
    /* Get control size */
    GetWindowRect(GetDlgItem(hWnd, IDOK), &controlrt);
    controlrt.right -= controlrt.left;
    controlrt.bottom -= controlrt.top;
    /* Get current client area */
    GetClientRect(hWnd, &clientrt);
    /* Get window size */
    GetWindowRect(hWnd, &splashrt);
    splashrt.right -= splashrt.left;
    splashrt.bottom -= splashrt.top;
    /* Get difference between requested client area and current value */
    splashrt.right += SPLASH_WIDTH + SPLASH_OFFSET_X * 2 - clientrt.right;
    splashrt.bottom += SPLASH_HEIGHT + controlrt.bottom + SPLASH_OFFSET_Y * 3
                       - clientrt.bottom;
    /* Place the window centered */
    /* On the screen, not on the parent window */
    left = (GetSystemMetrics(SM_CXSCREEN) - splashrt.right) / 2;
    top = (GetSystemMetrics(SM_CYSCREEN) - splashrt.bottom) / 2;
    MoveWindow(hWnd, left, top, splashrt.right, splashrt.bottom, TRUE);
    /* Place the OK control */
    GetClientRect(hWnd, &clientrt);
    MoveWindow(GetDlgItem(hWnd, IDOK),
               (clientrt.right - clientrt.left - controlrt.right) / 2,
               clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y,
               controlrt.right, controlrt.bottom, TRUE);
    buttop = clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y;
    /* Place the text control */
    GetWindowRect(GetDlgItem(hWnd, IDC_EXTRAINFO), &controlrt);
    controlrt.right -= controlrt.left;
    controlrt.bottom -= controlrt.top;
    GetClientRect(hWnd, &clientrt);
    MoveWindow(GetDlgItem(hWnd, IDC_EXTRAINFO),
               clientrt.left + SPLASH_OFFSET_X,
               buttop - controlrt.bottom - SPLASH_OFFSET_Y,
               clientrt.right - 2 * SPLASH_OFFSET_X, controlrt.bottom, TRUE);

    /* Fill the text control */
    Sprintf(buf, "%s\r\n%s\r\n%s\r\n%s\r\n\r\n", COPYRIGHT_BANNER_A,
            COPYRIGHT_BANNER_B, COPYRIGHT_BANNER_C, COPYRIGHT_BANNER_D);
    strsize = strlen(buf);

    if (show_ver) {
        /* Show complete version information */
        dlb *f;
        char verbuf[BUFSZ];
        int verstrsize = 0;
 
        getversionstring(verbuf);
        verstrsize = strlen(verbuf);
        if (verstrsize + strlen("\r\n\r\n") + 1  <  BUFSZ - 1)
            strcat(verbuf, "\r\n\r\n");
        verstrsize = strlen(verbuf);

        if (strsize + verstrsize + 1 > bufsize) {
            bufsize += BUFSZ;
            buf = realloc(buf, bufsize);
            if (buf == NULL)
                panic("out of memory");
        }
        strcat(buf, verbuf);
        strsize = strlen(buf);
            
        /* Add compile options */
        f = dlb_fopen(OPTIONS_USED, RDTMODE);
        if (f) {
            char line[LLEN + 1];

            while (dlb_fgets(line, LLEN, f)) {
                size_t len;
                len = strlen(line);
                if (len > 0 && line[len - 1] == '\n') {
                    line[len - 1] = '\r';
                    line[len] = '\n';
                    line[len + 1] = '\0';
                    len++;
                }
                if (strsize + (int) len + 1 > bufsize) {
                    bufsize += BUFSZ;
                    buf = realloc(buf, bufsize);
                    if (buf == NULL)
                        panic("out of memory");
                }
                strcat(buf, line);
                strsize += len;
            }
            (void) dlb_fclose(f);
        }
    } else {
        /* Show news, if any */
        if (iflags.news) {
            FILE *nf;

            iflags.news = 0; /* prevent newgame() from re-displaying news */
            nf = fopen(NEWS, "r");
            if (nf != NULL) {
                char line[LLEN + 1];

                while (fgets(line, LLEN, nf)) {
                    size_t len;
                    len = strlen(line);
                    if (len > 0 && line[len - 1] == '\n') {
                        line[len - 1] = '\r';
                        line[len] = '\n';
                        line[len + 1] = '\0';
                        len++;
                    }
                    if (strsize + (int) len + 1 > bufsize) {
                        bufsize += BUFSZ;
                        buf = realloc(buf, bufsize);
                        if (buf == NULL)
                            panic("out of memory");
                    }
                    strcat(buf, line);
                    strsize += len;
                }
                (void) fclose(nf);
            } else {
                strcat(buf, "No news.");
            }
        }
    }
    SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), buf);
    free(buf);
    ShowWindow(hWnd, SW_SHOW);

    while (IsWindow(hWnd) && GetMessage(&msg, NULL, 0, 0) != 0) {
        if (!IsDialogMessage(hWnd, &msg)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    GetNHApp()->hPopupWnd = NULL;
    mswin_destroy_splashfonts();
}