/* ================= UI_Draw ================= */ void UI_Draw (void) { if (cls.key_dest != key_menu) return; // scaled menu stuff //SCR_InitScreenScale(); // repaint everything next frame SCR_DirtyScreen (); // dim everything behind it down if (cl.cinematictime > 0 || cls.state == ca_disconnected) { //bc removing this background!!! /* if (R_DrawFindPic("/gfx/menu_background.pcx")) { R_DrawStretchPic (0, 0, viddef.width, viddef.height, "/gfx/menu_background.pcx", 1.0); //R_DrawFadeScreen (); } else*/ R_DrawFill2 (0,0,viddef.width, viddef.height, 0,0,0,255); } // ingame menu uses alpha //else if (R_DrawFindPic("/gfx/menu_background.pcx")) // R_DrawStretchPic (0, 0, viddef.width, viddef.height, "/gfx/menu_background.pcx", menu_alpha->value); else R_DrawFadeScreen (); // Knigthmare- added Psychospaz's mouse support UI_RefreshCursorMenu(); m_drawfunc (); // delay playing the enter sound until after the // menu has been drawn, to avoid delay while // caching images if (m_entersound) { S_StartLocalSound( menu_in_sound ); m_entersound = false; } // Knigthmare- added Psychospaz's mouse support //menu cursor for mouse usage :) UI_Draw_Cursor(); }
/* ============== SCR_TileClear Clear any parts of the tiled background that were drawn on last frame ============== */ void SCR_TileClear (void) { int i; int top, bottom, left, right; dirty_t clear; if (scr_drawall->value) SCR_DirtyScreen (); // for power vr or broken page flippers... if (scr_con_current == 1.0) return; // full screen console if (scr_viewsize->value == 100) return; // full screen rendering if (cl.cinematictime > 0) return; // full screen cinematic // erase rect will be the union of the past three frames // so tripple buffering works properly clear = scr_dirty; for (i=0 ; i<2 ; i++) { if (scr_old_dirty[i].x1 < clear.x1) clear.x1 = scr_old_dirty[i].x1; if (scr_old_dirty[i].x2 > clear.x2) clear.x2 = scr_old_dirty[i].x2; if (scr_old_dirty[i].y1 < clear.y1) clear.y1 = scr_old_dirty[i].y1; if (scr_old_dirty[i].y2 > clear.y2) clear.y2 = scr_old_dirty[i].y2; } scr_old_dirty[1] = scr_old_dirty[0]; scr_old_dirty[0] = scr_dirty; scr_dirty.x1 = 9999; scr_dirty.x2 = -9999; scr_dirty.y1 = 9999; scr_dirty.y2 = -9999; // don't bother with anything convered by the console) top = scr_con_current*viddef.height; if (top >= clear.y1) clear.y1 = top; if (clear.y2 <= clear.y1) return; // nothing disturbed top = scr_vrect.y; bottom = top + scr_vrect.height-1; left = scr_vrect.x; right = left + scr_vrect.width-1; if (clear.y1 < top) { // clear above view screen i = clear.y2 < top-1 ? clear.y2 : top-1; re.DrawTileClear (clear.x1 , clear.y1, clear.x2 - clear.x1 + 1, i - clear.y1+1, "backtile"); clear.y1 = top; } if (clear.y2 > bottom) { // clear below view screen i = clear.y1 > bottom+1 ? clear.y1 : bottom+1; re.DrawTileClear (clear.x1, i, clear.x2-clear.x1+1, clear.y2-i+1, "backtile"); clear.y2 = bottom; } if (clear.x1 < left) { // clear left of view screen i = clear.x2 < left-1 ? clear.x2 : left-1; re.DrawTileClear (clear.x1, clear.y1, i-clear.x1+1, clear.y2 - clear.y1 + 1, "backtile"); clear.x1 = left; } if (clear.x2 > right) { // clear left of view screen i = clear.x1 > right+1 ? clear.x1 : right+1; re.DrawTileClear (i, clear.y1, clear.x2-i+1, clear.y2 - clear.y1 + 1, "backtile"); clear.x2 = right; } }
void CL_DrawInventory(void) { int i, j; int num, selected_num, item; int index[MAX_ITEMS]; char string[1024]; int x, y; char binding[1024]; char *bind; int selected; int top; selected = cl.frame.playerstate.stats[STAT_SELECTED_ITEM]; num = 0; selected_num = 0; for (i = 0; i < MAX_ITEMS; i++) { if (i == selected) selected_num = num; if (cl.inventory[i]) { index[num] = i; num++; } } /* determine scroll point */ top = selected_num - DISPLAY_ITEMS / 2; if (num - top < DISPLAY_ITEMS) top = num - DISPLAY_ITEMS; if (top < 0) top = 0; x = (viddef.width - 256) / 2; y = (viddef.height - 240) / 2; /* repaint everything next frame */ SCR_DirtyScreen(); re.DrawPic(x, y + 8, "inventory", cl_hudalpha->value); y += 24; x += 24; Inv_DrawString(x, y, "hotkey ### item"); Inv_DrawString(x, y + 8, "------ --- ----"); y += 16; for (i = top; i < num && i < top + DISPLAY_ITEMS; i++) { item = index[i]; /* search for a binding */ Com_sprintf(binding, sizeof(binding), "use %s", cl.configstrings[CS_ITEMS + item]); bind = ""; for (j = 0; j < 256; j++) if (keybindings[j] && !Q_stricmp(keybindings[j], binding)) { bind = Key_KeynumToString(j); break; } Com_sprintf(string, sizeof(string), "%6s %3i %s", bind, cl.inventory[item], cl.configstrings[CS_ITEMS + item]); if (item != selected) SetStringHighBit(string); else { /* draw a blinky cursor by the selected item */ if ((int)(cls.realtime * 10) & 1) re.DrawChar(x - 8, y, 15, 256); } Inv_DrawString(x, y, string); y += 8; } }
/* ==================== 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); }