/* sys_directx_restore_console_state: * Restores console window size and position. */ static void sys_directx_restore_console_state(void) { HWND allegro_wnd = win_get_window(); /* unacquire input devices */ wnd_schedule_proc(key_dinput_unacquire); wnd_schedule_proc(mouse_dinput_unacquire); wnd_schedule_proc(joystick_dinput_unacquire); /* reset switch mode */ _win_reset_switch_mode(); /* re-size and hide window */ SetWindowPos(allegro_wnd, HWND_TOP, wnd_rect.left, wnd_rect.top, wnd_rect.right - wnd_rect.left, wnd_rect.bottom - wnd_rect.top, SWP_NOCOPYBITS); ShowWindow(allegro_wnd, SW_SHOW); }
/* directx_wnd_proc: * Window procedure for the Allegro window class. */ static LRESULT CALLBACK directx_wnd_proc(HWND wnd, UINT message, WPARAM wparam, LPARAM lparam) { PAINTSTRUCT ps; if (message == msg_call_proc) return ((int (*)(void))wparam) (); if (message == msg_suicide) { DestroyWindow(wnd); return 0; } /* See get_reverse_mapping() in wkeybd.c to see what this is for. */ if (FALSE && (message == WM_KEYDOWN || message == WM_SYSKEYDOWN)) { static char name[256]; TCHAR str[256]; WCHAR wstr[256]; GetKeyNameText(lparam, str, sizeof str); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstr, sizeof wstr); uconvert((char *)wstr, U_UNICODE, name, U_CURRENT, sizeof name); _TRACE(PREFIX_I" key[%s] = 0x%08lx;\n", name, lparam & 0x1ff0000); } switch (message) { case WM_CREATE: if (!user_wnd_proc) allegro_wnd = wnd; break; case WM_DESTROY: if (user_wnd_proc) { exit_window_modules(NULL); _win_reset_switch_mode(); } else { PostQuitMessage(0); } allegro_wnd = NULL; break; case WM_SETCURSOR: if (!user_wnd_proc || _mouse_installed) { mouse_set_syscursor(); return 1; /* not TRUE */ } break; case WM_ACTIVATE: if (LOWORD(wparam) == WA_INACTIVE) { _win_switch_out(); } else { /* Ignore the WM_ACTIVATE event if the window is minimized. */ if (HIWORD(wparam)) break; if (gfx_driver && !gfx_driver->windowed) { /* 1.2s delay to let Windows complete the switch in fullscreen mode */ SetTimer(allegro_wnd, SWITCH_TIMER, 1200, NULL); } else { /* no delay in windowed mode */ _win_switch_in(); } } break; case WM_TIMER: if (wparam == SWITCH_TIMER) { KillTimer(allegro_wnd, SWITCH_TIMER); _win_switch_in(); return 0; } break; case WM_ENTERSIZEMOVE: if (win_gfx_driver && win_gfx_driver->enter_sysmode) win_gfx_driver->enter_sysmode(); break; case WM_EXITSIZEMOVE: if (win_gfx_driver && win_gfx_driver->exit_sysmode) win_gfx_driver->exit_sysmode(); break; case WM_MOVE: if (GetActiveWindow() == allegro_wnd) { if (!IsIconic(allegro_wnd)) { wnd_x = (short) LOWORD(lparam); wnd_y = (short) HIWORD(lparam); if (win_gfx_driver && win_gfx_driver->move) win_gfx_driver->move(wnd_x, wnd_y, wnd_width, wnd_height); } else if (win_gfx_driver && win_gfx_driver->iconify) { win_gfx_driver->iconify(); } } break; case WM_SIZE: wnd_width = LOWORD(lparam); wnd_height = HIWORD(lparam); break; case WM_PAINT: if (!user_wnd_proc || win_gfx_driver) { BeginPaint(wnd, &ps); if (win_gfx_driver && win_gfx_driver->paint) win_gfx_driver->paint(&ps.rcPaint); EndPaint(wnd, &ps); return 0; } break; case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: /* Disable the default message-based key handler * in order to prevent conflicts on NT kernels. */ if (!user_wnd_proc || _keyboard_installed) return 0; break; case WM_SYSCOMMAND: if (wparam == SC_MONITORPOWER || wparam == SC_SCREENSAVE) { if (_screensaver_policy == ALWAYS_DISABLED || (_screensaver_policy == FULLSCREEN_DISABLED && gfx_driver && !gfx_driver->windowed)) return 0; } break; case WM_INITMENUPOPUP: wnd_sysmenu = TRUE; mouse_set_sysmenu(TRUE); if (win_gfx_driver && win_gfx_driver->enter_sysmode) win_gfx_driver->enter_sysmode(); break; case WM_MENUSELECT: if ((HIWORD(wparam) == 0xFFFF) && (!lparam)) { wnd_sysmenu = FALSE; mouse_set_sysmenu(FALSE); if (win_gfx_driver && win_gfx_driver->exit_sysmode) win_gfx_driver->exit_sysmode(); } break; case WM_MENUCHAR : return (MNC_CLOSE<<16)|(wparam&0xffff); case WM_CLOSE: if (!user_wnd_proc) { if (user_close_proc) (*user_close_proc)(); return 0; } break; } /* pass message to default window proc */ if (user_wnd_proc) return CallWindowProc(user_wnd_proc, wnd, message, wparam, lparam); else return DefWindowProc(wnd, message, wparam, lparam); }
/* sys_directx_display_switch_init: */ void sys_directx_display_switch_init(void) { foreground_event = CreateEvent(NULL, TRUE, TRUE, NULL); _win_reset_switch_mode(); }
/* sys_directx_display_switch_init: */ void sys_directx_display_switch_init(void) { _win_reset_switch_mode(); }