int SDLash_EventFilter( SDL_Event* event) { switch ( event->type ) { case SDL_MOUSEMOTION: IN_MouseEvent(0); break; case SDL_QUIT: Host_Shutdown(); break; case SDL_KEYDOWN: case SDL_KEYUP: SDLash_KeyEvent(event->key); break; case SDL_MOUSEWHEEL: SDLash_WheelEvent(event->wheel); break; case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: SDLash_MouseEvent(event->button); break; case SDL_TEXTEDITING: MsgDev(D_INFO, "Caught a text edit: %s %n %n\n", event->edit.text, event->edit.start, event->edit.length); break; case SDL_TEXTINPUT: SDLash_InputEvent(event->text); break; case SDL_WINDOWEVENT: if( host.state == HOST_SHUTDOWN ) break; // no need to activate if( host.state != HOST_RESTART ) { switch( event->window.type ) { case SDL_WINDOWEVENT_MINIMIZED: host.state = HOST_SLEEP; break; case SDL_WINDOWEVENT_FOCUS_LOST: host.state = HOST_NOFOCUS; IN_DeactivateMouse(); break; default: host.state = HOST_FRAME; IN_ActivateMouse(true); } } } VGUI_SurfaceWndProc(event); return 0; }
/* ==================== MainWndProc main window procedure ==================== */ LONG WINAPI MainWndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LONG lRet = 0; if ( uMsg == MSH_MOUSEWHEEL ) { if ( ( ( int ) wParam ) > 0 ) { Key_Event( K_MWHEELUP, true, sys_msg_time ); Key_Event( K_MWHEELUP, false, sys_msg_time ); } else { Key_Event( K_MWHEELDOWN, true, sys_msg_time ); Key_Event( K_MWHEELDOWN, false, sys_msg_time ); } return DefWindowProc (hWnd, uMsg, wParam, lParam); } switch (uMsg) { case WM_MOUSEWHEEL: /* ** this chunk of code theoretically only works under NT4 and Win98 ** since this message doesn't exist under Win95 */ if ( ( short ) HIWORD( wParam ) > 0 ) { Key_Event( K_MWHEELUP, true, sys_msg_time ); Key_Event( K_MWHEELUP, false, sys_msg_time ); } else { Key_Event( K_MWHEELDOWN, true, sys_msg_time ); Key_Event( K_MWHEELDOWN, false, sys_msg_time ); } break; case WM_HOTKEY: return 0; case WM_CREATE: cl_hwnd = hWnd; MSH_MOUSEWHEEL = RegisterWindowMessage("MSWHEEL_ROLLMSG"); return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_PAINT: SCR_DirtyScreen (); // force entire screen to update next frame return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_DESTROY: // let sound and input know about this? cl_hwnd = NULL; return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_ACTIVATE: { int fActive, fMinimized; // KJB: Watch this for problems in fullscreen modes with Alt-tabbing. fActive = LOWORD(wParam); fMinimized = (BOOL) HIWORD(wParam); AppActivate( fActive != WA_INACTIVE, fMinimized); if ( reflib_active ) GLimp_AppActivate( !( fActive == WA_INACTIVE ) ); } return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_MOVE: { int xPos, yPos; RECT r; int style; if (!vid_fullscreen->value) { xPos = (short) LOWORD(lParam); // horizontal position yPos = (short) HIWORD(lParam); // vertical position r.left = 0; r.top = 0; r.right = 1; r.bottom = 1; style = GetWindowLong( hWnd, GWL_STYLE ); AdjustWindowRect( &r, style, FALSE ); Cvar_SetValue( "vid_xpos", xPos + r.left); Cvar_SetValue( "vid_ypos", yPos + r.top); vid_xpos->modified = false; vid_ypos->modified = false; if (ActiveApp) IN_Activate (true); } } return DefWindowProc (hWnd, uMsg, wParam, lParam); // this is complicated because Win32 seems to pack multiple mouse events into // one update sometimes, so we always check all states and look for events case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: #ifdef ENABLE_MOUSE4_MOUSE5 // mattx86: mouse4_mouse5 case WM_XBUTTONDOWN: case WM_XBUTTONUP: #endif case WM_MOUSEMOVE: { int temp; temp = 0; if (wParam & MK_LBUTTON) temp |= 1; if (wParam & MK_RBUTTON) temp |= 2; if (wParam & MK_MBUTTON) temp |= 4; #ifdef ENABLE_MOUSE4_MOUSE5 // mattx86: mouse4_mouse5 if (wParam & MK_XBUTTON1) temp |= 8; if (wParam & MK_XBUTTON2) temp |= 16; #endif IN_MouseEvent (temp); } break; case WM_SYSCOMMAND: if ( wParam == SC_SCREENSAVE ) return 0; return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_SYSKEYDOWN: if ( wParam == 13 ) { if ( vid_fullscreen ) { Cvar_SetValue( "vid_fullscreen", !vid_fullscreen->value ); } return 0; } // fall through case WM_KEYDOWN: Key_Event( MapKey( lParam ), true, sys_msg_time); break; case WM_SYSKEYUP: case WM_KEYUP: Key_Event( MapKey( lParam ), false, sys_msg_time); break; case MM_MCINOTIFY: { LONG CDAudio_MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); } break; default: // pass all unhandled messages to DefWindowProc return DefWindowProc (hWnd, uMsg, wParam, lParam); } /* return 0 if handled message, 1 if not */ return DefWindowProc( hWnd, uMsg, wParam, lParam ); }
LONG WINAPI MainWndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LONG lRet = 0; static qboolean newwindow = true; static qboolean minimized = false; if (uMsg == MSH_MOUSEWHEEL) { if (((int)wParam) > 0) { Key_Event(K_MWHEELUP, true, sys_msg_time); Key_Event(K_MWHEELUP, false, sys_msg_time); } else { Key_Event(K_MWHEELDOWN, true, sys_msg_time); Key_Event(K_MWHEELDOWN, false, sys_msg_time); } return DefWindowProc(hWnd, uMsg, wParam, lParam); } //Com_Printf("%x\n", uMsg); switch (uMsg) { case WM_MOUSEWHEEL: /* ** this chunk of code theoretically only works under NT4 and Win98 ** since this message doesn't exist under Win95 */ if ((short)HIWORD(wParam) > 0) { Key_Event(K_MWHEELUP, true, sys_msg_time); Key_Event(K_MWHEELUP, false, sys_msg_time); } else { Key_Event(K_MWHEELDOWN, true, sys_msg_time); Key_Event(K_MWHEELDOWN, false, sys_msg_time); } break; case WM_HOTKEY: return 0; case WM_CREATE: cl_hwnd = hWnd; newwindow = true; MSH_MOUSEWHEEL = RegisterWindowMessage("MSWHEEL_ROLLMSG"); return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_PAINT: SCR_DirtyScreen(); // force entire screen to update next frame return DefWindowProc(hWnd, uMsg, wParam, lParam); case WM_DESTROY: // let sound and input know about this? cl_hwnd = NULL; return DefWindowProc(hWnd, uMsg, wParam, lParam); /* case WM_KILLFOCUS: // jit - make sure mouse is deactivated if another window takes focus AppActivate(false, minimized, newwindow); if (reflib_active) re.AppActivate(false); return DefWindowProc(hWnd, uMsg, wParam, lParam); case WM_NCACTIVATE: AppActivate(wParam, minimized, newwindow); if (reflib_active) re.AppActivate(wParam); return DefWindowProc(hWnd, uMsg, wParam, lParam); */ /*case WM_ACTIVATEAPP: AppActivate(wParam, minimized, newwindow); if (reflib_active) re.AppActivate(wParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);*/ /* jit - disabled this because we run CheckActive() every frame because we aren't getting appropriate events when the game loses focus/foreground, sometimes. case WM_ACTIVATE: { int fActive; qboolean active; HWND foregroundWindow = GetForegroundWindow(); // KJB: Watch this for problems in fullscreen modes with Alt-tabbing. fActive = LOWORD(wParam); minimized = (BOOL)HIWORD(wParam); active = (fActive != WA_INACTIVE); //if (foregroundWindow != hWnd) // active = false; Com_Printf("\nForeground: %d hWnd: %d\n\n", foregroundWindow, hWnd); AppActivate(active, minimized, newwindow); if (reflib_active) re.AppActivate(active); newwindow = false; return DefWindowProc(hWnd, uMsg, wParam, lParam); } /* case WM_WINDOWPOSCHANGED: // jit - handle another case of losing app focus { LPWINDOWPOS windowpos = (LPWINDOWPOS)lParam; if (windowpos->flags & 0x800) // SWP_STATECHANGED { HWND foregroundWindow = GetForegroundWindow(); qboolean active = (foregroundWindow == hWnd); AppActivate(active, minimized, newwindow); if (reflib_active) re.AppActivate(active); } Com_Printf("\nWindowposchanged flags %x\n", windowpos->flags); return DefWindowProc(hWnd, uMsg, wParam, lParam); } */ case WM_MOVE: { int xPos, yPos; RECT r; int style; if (!vid_fullscreen->value) { xPos = (short)LOWORD(lParam); // horizontal position yPos = (short)HIWORD(lParam); // vertical position r.left = 0; r.top = 0; r.right = 1; r.bottom = 1; style = GetWindowLong(hWnd, GWL_STYLE); AdjustWindowRect(&r, style, FALSE); Cvar_SetValue("vid_xpos", xPos + r.left); Cvar_SetValue("vid_ypos", yPos + r.top); vid_xpos->modified = false; vid_ypos->modified = false; } // jitmouse - force mouse to recenter properly if (ActiveApp) IN_Activate(true); } return DefWindowProc(hWnd, uMsg, wParam, lParam); // this is complicated because Win32 seems to pack multiple mouse events into // one update sometimes, so we always check all states and look for events case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_MOUSEMOVE: case WM_XBUTTONDOWN: // jitmouse case WM_XBUTTONUP: // jitmouse { int temp = 0; if (wParam & MK_LBUTTON) temp |= 1; if (wParam & MK_RBUTTON) temp |= 2; if (wParam & MK_MBUTTON) temp |= 4; // === jitmouse if (wParam & MK_XBUTTON1) temp |= 8; if (wParam & MK_XBUTTON2) temp |= 16; // === IN_MouseEvent(temp); // ++ ARTHUR [9/04/03] - Mouse movement emulates keystroke Key_Event(K_MOUSEMOVE, true, sys_msg_time); // -- ARTHUR } break; case WM_INPUT: // jitmouse if (m_rawinput->value && !(cls.key_dest == key_console || g_windowed && M_MenuActive())) // Don't accumulate in-game mouse input when at the console or menu { UINT dwSize = 40; static BYTE lpb[40]; RAWINPUT *raw; GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)); raw = (RAWINPUT*)lpb; if (raw->header.dwType == RIM_TYPEMOUSE) { extern int g_raw_mouse_x, g_raw_mouse_y; g_raw_mouse_x += raw->data.mouse.lLastX; g_raw_mouse_y += raw->data.mouse.lLastY; } } break; case WM_SYSCOMMAND: if (wParam == SC_SCREENSAVE) return 0; return DefWindowProc(hWnd, uMsg, wParam, lParam); case WM_SYSKEYDOWN: if (wParam == 13) // alt-enter toggles fullscreen { if (!win_noaltenter || !win_noaltenter->value) // jitkeyboard { if (vid_fullscreen) Cvar_SetValue("vid_fullscreen", !vid_fullscreen->value); return 0; } } // fall through case WM_KEYDOWN: Key_Event(Sys_MapKeyModified(wParam, lParam), true, sys_msg_time); break; case WM_SYSKEYUP: case WM_KEYUP: Key_Event(Sys_MapKeyModified(wParam, lParam), false, sys_msg_time); break; case WM_SIZE: if (lParam) // This is 0 when minimized? { M_RefreshMenu(); // jitmenu re.DrawResizeWindow(LOWORD(lParam), HIWORD(lParam)); VID_NewWindow(LOWORD(lParam), HIWORD(lParam)); } if (wParam == SIZE_MINIMIZED) // jit minimized = true; else minimized = false; break; case WM_CLOSE: case WM_QUIT: Com_Quit(); break; case WM_APPCOMMAND: #ifdef OGG_SUPPORT if(ogg_started) switch(GET_APPCOMMAND_LPARAM(lParam)) { case APPCOMMAND_MEDIA_PLAY_PAUSE: Cbuf_AddText("ogg_playpause\n"); return 1; case APPCOMMAND_MEDIA_NEXTTRACK: Cbuf_AddText("ogg_play >\n"); return 1; case APPCOMMAND_MEDIA_PREVIOUSTRACK: Cbuf_AddText("ogg_play <\n"); return 1; case APPCOMMAND_MEDIA_STOP: Cbuf_AddText("ogg_stop\n"); return 1; } break; #endif case MM_MCINOTIFY: { LONG CDAudio_MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); lRet = CDAudio_MessageHandler(hWnd, uMsg, wParam, lParam); } break; default: // pass all unhandled messages to DefWindowProc return DefWindowProc(hWnd, uMsg, wParam, lParam); } //CheckActive(hWnd); // return 0 if handled message, 1 if not return DefWindowProc(hWnd, uMsg, wParam, lParam); }
LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { int fActive, fMinimized; int temp; LONG lRet = 0; PAINTSTRUCT ps; HDC hdc; switch (uMsg) { case WM_CREATE: break; case WM_MOVE: window_x = (int) LOWORD(lParam); window_y = (int) HIWORD(lParam); VID_UpdateWindowStatus (); //if ((modestate == MS_WINDOWED) && !in_mode_set && !Minimized) // VID_RememberWindowPos (); break; case WM_CLOSE: // this causes Close in the right-click task bar menu not to work, but right // now bad things happen if Close is handled in that case (garbage and a // crash on Win95) //if (!in_mode_set) { if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit", MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES) { Host_Quit (); } } break; case WM_ACTIVATE: fActive = LOWORD(wParam); fMinimized = (BOOL) HIWORD(wParam); AppActivate(!(fActive == WA_INACTIVE), fMinimized); // fix the leftover Alt from any Alt-Tab or the like that switched us away ClearAllStates (); /*if (!in_mode_set) { if (windc) MGL_activatePalette(windc,true); VID_SetPalette(vid_curpal); }*/ break; case WM_PAINT: hdc = GetDC (mainwindow); // FIXME hdc = BeginPaint(hWnd, &ps); //Com_Printf ("WM_PAINT\n"); // TESTING /* if (!in_mode_set && host_initialized) { SCR_InvalidateScreen (); SCR_UpdateScreen (); } */ EndPaint(hWnd, &ps); break; case WM_KEYDOWN: case WM_SYSKEYDOWN: if (!in_mode_set) IN_TranslateKeyEvent (lParam, true); break; case WM_KEYUP: case WM_SYSKEYUP: if (!in_mode_set) IN_TranslateKeyEvent (lParam, true); break; // this is complicated because Win32 seems to pack multiple mouse events into // one update sometimes, so we always check all states and look for events case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_XBUTTONDOWN: case WM_XBUTTONUP: case WM_MOUSEMOVE: if (!in_mode_set) { temp = 0; if (wParam & MK_LBUTTON) temp |= 1; if (wParam & MK_RBUTTON) temp |= 2; if (wParam & MK_MBUTTON) temp |= 4; // Win2k/XP let us bind button4 and button5 if (wParam & MK_XBUTTON1) temp |= 8; if (wParam & MK_XBUTTON2) temp |= 16; IN_MouseEvent (temp); } break; // JACK: This is the mouse wheel with the Intellimouse // Its delta is either positive or neg, and we generate the proper // Event. case WM_MOUSEWHEEL: if (in_mwheeltype != MWHEEL_DINPUT) { in_mwheeltype = MWHEEL_WINDOWMSG; if ((short) HIWORD(wParam) > 0) { Key_Event(K_MWHEELUP, true); Key_Event(K_MWHEELUP, false); } else { Key_Event(K_MWHEELDOWN, true); Key_Event(K_MWHEELDOWN, false); } } break; default: /* pass all unhandled messages to DefWindowProc */ lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); break; } /* return 0 if handled message, 1 if not */ return lRet; }
int SDLash_EventFilter( SDL_Event* event) { #ifdef XASH_VGUI //if( !host.mouse_visible || !VGUI_SurfaceWndProc(event)) // switch .... // CEnginePanel is visible by default, why? VGUI_SurfaceWndProc(event); #endif switch ( event->type ) { case SDL_MOUSEMOTION: if(!host.mouse_visible) IN_MouseEvent(0); break; case SDL_QUIT: Host_Shutdown(); break; case SDL_KEYDOWN: case SDL_KEYUP: SDLash_KeyEvent(event->key); break; case SDL_MOUSEWHEEL: SDLash_WheelEvent(event->wheel); break; case SDL_FINGERMOTION: case SDL_FINGERUP: case SDL_FINGERDOWN: // Pass all touch events to client library //clgame.dllFuncs.pfnIN_TouchEvent(event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, event->tfinger.dx, event->tfinger.dy ); break; case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: //if(!host.mouse_visible) SDLash_MouseEvent(event->button); break; case SDL_TEXTEDITING: //MsgDev(D_INFO, "Caught a text edit: %s %n %n\n", event->edit.text, event->edit.start, event->edit.length); break; case SDL_TEXTINPUT: SDLash_InputEvent(event->text); break; case SDL_WINDOWEVENT: if( host.state == HOST_SHUTDOWN ) break; // no need to activate if( host.state != HOST_RESTART ) { switch( event->window.event ) { case SDL_WINDOWEVENT_MINIMIZED: host.state = HOST_SLEEP; break; case SDL_WINDOWEVENT_FOCUS_LOST: case SDL_WINDOWEVENT_LEAVE: host.state = HOST_NOFOCUS; IN_DeactivateMouse(); break; default: host.state = HOST_FRAME; IN_ActivateMouse(true); } } } return 0; }
// main window procedure STATIC LONG WINAPI Win_MainWndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_MOUSEWHEEL: if( win.mouse.initialized == WIN_MOUSE_LEGACY ) { mouse_wheel_event( ( short )HIWORD( wParam ) ); } break; case WM_MOUSEHWHEEL: if( win.mouse.initialized == WIN_MOUSE_LEGACY ) { mouse_hwheel_event( ( short )HIWORD( wParam ) ); } break; case WM_NCMOUSEMOVE: if( win.mouse.initialized ) { // don't hide cursor IN_MouseEvent( -1, -1 ); } break; case WM_MOUSEMOVE: if( win.mouse.initialized ) { int x = ( short )LOWORD( lParam ); int y = ( short )HIWORD( lParam ); IN_MouseEvent( x, y ); } // fall through case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_XBUTTONDOWN: case WM_XBUTTONUP: if( win.mouse.initialized == WIN_MOUSE_LEGACY ) { legacy_mouse_event( wParam ); } break; case WM_HOTKEY: return FALSE; case WM_INPUT: if( wParam == RIM_INPUT && win.mouse.initialized == WIN_MOUSE_RAW ) { raw_input_event( ( HANDLE )lParam ); } break; case WM_CLOSE: PostQuitMessage( 0 ); return FALSE; case WM_ACTIVATE: Win_Activate( wParam ); break; case WM_WINDOWPOSCHANGING: if( !( win.flags & QVF_FULLSCREEN ) ) { WINDOWPOS *pos = ( WINDOWPOS * )lParam; if( !( pos->flags & SWP_NOSIZE ) ) { resizing_event( hWnd, pos ); } } break; case WM_SIZE: if( wParam == SIZE_RESTORED && !( win.flags & QVF_FULLSCREEN ) ) { int w = ( short )LOWORD( lParam ); int h = ( short )HIWORD( lParam ); win.rc.width = w; win.rc.height = h; win.mode_changed |= MODE_SIZE; } break; case WM_MOVE: if( !( win.flags & QVF_FULLSCREEN ) ) { int x = ( short )LOWORD( lParam ); int y = ( short )HIWORD( lParam ); RECT r; // adjust for non-client area get_nc_area_size( hWnd, &r ); win.rc.x = x + r.left; win.rc.y = y + r.top; win.mode_changed |= MODE_POS; } break; case WM_SYSCOMMAND: switch( wParam & 0xFFF0 ) { case SC_SCREENSAVE: return FALSE; case SC_MAXIMIZE: if( !vid_fullscreen->integer ) { VID_ToggleFullscreen(); } return FALSE; } break; case WM_KEYDOWN: case WM_SYSKEYDOWN: legacy_key_event( wParam, lParam, qtrue ); return FALSE; case WM_KEYUP: case WM_SYSKEYUP: legacy_key_event( wParam, lParam, qfalse ); return FALSE; case WM_SYSCHAR: case WM_CHAR: #if USE_CHAR_EVENTS Key_CharEvent( wParam ); #endif return FALSE; default: break; } // pass all unhandled messages to DefWindowProc return DefWindowProc( hWnd, uMsg, wParam, lParam ); }
/* main window procedure */ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { extern void VID_UpdateWindowStatus (void); LONG lRet = 1; int fActive, fMinimized, temp; extern unsigned int uiWheelMessage; // VVD: didn't restore gamma after ALT+TAB on some ATI video cards (or drivers?...) // HACK!!! FIXME { extern int restore_gamma; static time_t time_old; static float old_gamma; if (restore_gamma == 2) { if (time(NULL) - time_old > 0) { Cvar_SetValue(&v_gamma, old_gamma); restore_gamma = 0; } } // } if (uMsg == uiWheelMessage) { uMsg = WM_MOUSEWHEEL; wParam <<= 16; } switch (uMsg) { #ifdef USINGRAWINPUT case WM_INPUT: // raw input handling IN_RawInput_MouseRead((HANDLE)lParam); break; #endif case WM_KILLFOCUS: break; case WM_SIZE: break; case WM_CREATE: mainwindow = hWnd; break; case WM_DESTROY: // let sound and input know about this? mainwindow = NULL; // PostQuitMessage (0); break; case WM_MOVE: { int xPos, yPos; RECT r; int style; if ( !r_fullscreen.integer ) { xPos = (short) LOWORD(lParam); // horizontal position yPos = (short) HIWORD(lParam); // vertical position r.left = 0; r.top = 0; r.right = 1; r.bottom = 1; style = GetWindowLong( hWnd, GWL_STYLE ); AdjustWindowRect( &r, style, FALSE ); Cvar_SetValue( &vid_xpos, xPos + r.left ); Cvar_SetValue( &vid_ypos, yPos + r.top ); vid_xpos.modified = false; vid_ypos.modified = false; } VID_UpdateWindowStatus(); } break; case WM_CLOSE: if (MessageBox (mainwindow, "Are you sure you want to quit?", "ezQuake : Confirm Exit", MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES) { Host_Quit (); } break; case WM_ACTIVATE: fActive = LOWORD(wParam); fMinimized = (BOOL) HIWORD(wParam); AppActivate(!(fActive == WA_INACTIVE), fMinimized); // VVD: didn't restore gamma after ALT+TAB on some ATI video cards (or drivers?...) // HACK!!! FIXME { if (restore_gamma == 1) { time_old = time(NULL); restore_gamma = 2; old_gamma = v_gamma.value; Cvar_SetValue(&v_gamma, old_gamma + 0.01); } // } // fix the leftover Alt from any Alt-Tab or the like that switched us away ClearAllStates (); break; case WM_SYSKEYDOWN: if ( wParam == 13 ) { if ( glw_state.vid_canalttab ) { Cvar_LatchedSetValue( &r_fullscreen, !r_fullscreen.integer ); Cbuf_AddText( "vid_restart\n" ); } return 0; } // fall through case WM_KEYDOWN: #ifdef WITH_KEYMAP IN_TranslateKeyEvent (lParam, wParam, true); #else // WITH_KEYMAP Key_Event (IN_MapKey(lParam), true); #endif // WITH_KEYMAP else break; case WM_KEYUP: case WM_SYSKEYUP: #ifdef WITH_KEYMAP IN_TranslateKeyEvent (lParam, wParam, false); #else // WITH_KEYMAP Key_Event (IN_MapKey(lParam), false); #endif // WITH_KEYMAP else break; case WM_SYSCHAR: // keep Alt-Space from happening break; // this is complicated because Win32 seems to pack multiple mouse events into // one update sometimes, so we always check all states and look for events case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_XBUTTONDOWN: case WM_XBUTTONUP: #ifdef MM_CODE case WM_LBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_XBUTTONDBLCLK: #endif // MM_CODE temp = 0; if (wParam & MK_LBUTTON) temp |= 1; if (wParam & MK_RBUTTON) temp |= 2; if (wParam & MK_MBUTTON) temp |= 4; if (wParam & MK_XBUTTON1) temp |= 8; if (wParam & MK_XBUTTON2) temp |= 16; IN_MouseEvent (temp); break; // JACK: This is the mouse wheel with the Intellimouse // Its delta is either positive or neg, and we generate the proper Event. case WM_MOUSEWHEEL: if (in_mwheeltype != MWHEEL_DINPUT) { in_mwheeltype = MWHEEL_WINDOWMSG; if ((short) HIWORD(wParam) > 0) { Key_Event(K_MWHEELUP, true); Key_Event(K_MWHEELUP, false); } else { Key_Event(K_MWHEELDOWN, true); Key_Event(K_MWHEELDOWN, false); } // when an application processes the WM_MOUSEWHEEL message, it must return zero lRet = 0; } break; case WM_MWHOOK: MW_Hook_Message (lParam); break; case MM_MCINOTIFY: lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); break; default: /* pass all unhandled messages to DefWindowProc */ lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); break; } /* return 1 if handled message, 0 if not */ return lRet; }
/* * IN_GetMouseMovement */ void IN_GetMouseMovement( int *dx, int *dy ) { DIDEVICEOBJECTDATA od; DWORD dwElements; HRESULT hr; *dx = *dy = 0; if( !mouseactive ) { return; } if( rawinput_initialized ) { // probably not the right way... int i; mx = my = 0; for( i = 0; i < rawmicecount; i++ ) { mx += rawmice[i].delta[0]; my += rawmice[i].delta[1]; rawmice[i].delta[0] = rawmice[i].delta[1] = 0; } } else if( dinput_initialized ) { mx = 0; my = 0; for(;; ) { dwElements = 1; hr = IDirectInputDevice_GetDeviceData( g_pMouse, sizeof( DIDEVICEOBJECTDATA ), &od, &dwElements, 0 ); if( ( hr == DIERR_INPUTLOST ) || ( hr == DIERR_NOTACQUIRED ) ) { dinput_acquired = true; IDirectInputDevice_Acquire( g_pMouse ); break; } // unable to read data or no data available if( FAILED( hr ) || dwElements == 0 ) { break; } sys_msg_time = od.dwTimeStamp; // look at the element to see what happened switch( od.dwOfs ) { case DIMOFS_X: mx += (int)od.dwData; break; case DIMOFS_Y: my += (int)od.dwData; break; case DIMOFS_Z: if( mouse_wheel_type != MWHEEL_WM ) { mouse_wheel_type = MWHEEL_DINPUT; if( (int)od.dwData > 0 ) { Key_Event( K_MWHEELUP, true, sys_msg_time ); Key_Event( K_MWHEELUP, false, sys_msg_time ); } else { Key_Event( K_MWHEELDOWN, true, sys_msg_time ); Key_Event( K_MWHEELDOWN, false, sys_msg_time ); } } break; case DIMOFS_BUTTON0: case DIMOFS_BUTTON1: case DIMOFS_BUTTON2: case DIMOFS_BUTTON3: case DIMOFS_BUTTON0 + 4: case DIMOFS_BUTTON0 + 5: case DIMOFS_BUTTON0 + 6: case DIMOFS_BUTTON0 + 7: if( od.dwData & 0x80 ) { mstate_di |= ( 1 << ( od.dwOfs - DIMOFS_BUTTON0 ) ); } else { mstate_di &= ~( 1 << ( od.dwOfs - DIMOFS_BUTTON0 ) ); } break; } } dinput_initialized = false; // FIXME... IN_MouseEvent( mstate_di ); dinput_initialized = true; } else { // find mouse movement if( !GetCursorPos( ¤t_pos ) ) { return; } mx = current_pos.x - window_center_x; my = current_pos.y - window_center_y; // force the mouse to the center, so there's room to move if( mx || my ) { SetCursorPos( window_center_x, window_center_y ); } } *dx = mx; *dy = my; }