/* ================= UI_ForceMenuOff ================= */ void UI_ForceMenuOff (void) { // Knightmare- added Psychospaz's mouse support UI_RefreshCursorLink(); m_drawfunc = 0; m_keyfunc = 0; cls.key_dest = key_game; m_menudepth = 0; Key_ClearStates (); if (!cls.consoleActive && Cvar_VariableValue ("maxclients") == 1 && Com_ServerState()) // Knightmare added Cvar_Set ("paused", "0"); }
/* * ================= * UI_PushMenu * ================= */ void UI_PushMenu(void (*draw)(void), const char *(*key)(int k)) { int i; if ((Cvar_VariableValue("maxclients") == 1) && Com_ServerState() && !cls.consoleActive) // Knightmare added { Cvar_Set("paused", "1"); } // Knightmare- if just opened menu, and ingame and not DM, grab screen first if ((cls.key_dest != key_menu) && !Cvar_VariableValue("deathmatch") && (Com_ServerState() == 2)) //ss_game { //&& !cl.cinematictime && Com_ServerState()) R_GrabScreen(); } // if this menu is already present, drop back to that level // to avoid stacking menus by hotkeys for (i = 0; i < m_menudepth; i++) { if ((m_layers[i].draw == draw) && (m_layers[i].key == key)) { m_menudepth = i; } } if (i == m_menudepth) { if (m_menudepth >= MAX_MENU_DEPTH) { Com_Error(ERR_FATAL, "UI_PushMenu: MAX_MENU_DEPTH"); } m_layers[m_menudepth].draw = m_drawfunc; m_layers[m_menudepth].key = m_keyfunc; m_menudepth++; } m_drawfunc = draw; m_keyfunc = key; m_entersound = true; // Knightmare- added Psychospaz's mouse support UI_RefreshCursorLink(); UI_RefreshCursorButtons(); cls.key_dest = key_menu; }
/* ================= UI_PopMenu ================= */ void UI_PopMenu (void) { S_StartLocalSound( menu_out_sound ); if (m_menudepth < 1) Com_Error (ERR_FATAL, "UI_PopMenu: depth < 1"); m_menudepth--; m_drawfunc = m_layers[m_menudepth].draw; m_keyfunc = m_layers[m_menudepth].key; // Knightmare- added Psychospaz's mouse support UI_RefreshCursorLink(); UI_RefreshCursorButtons(); if (!m_menudepth) UI_ForceMenuOff (); }
void IN_Init (void) { in_mouse = Cvar_Get ("in_mouse", "1", CVAR_ARCHIVE); in_joystick = Cvar_Get ("in_joystick", "0", CVAR_ARCHIVE); m_filter = Cvar_Get ("m_filter", "0", 0); in_dgamouse = Cvar_Get ("in_dgamouse", "1", CVAR_ARCHIVE); in_menumouse = Cvar_Get ("in_menumouse", "0", CVAR_ARCHIVE); Cmd_AddCommand ("+mlook", IN_MLookDown); Cmd_AddCommand ("-mlook", IN_MLookUp); Cmd_AddCommand ("force_centerview", Force_CenterView_f); mx = my = 0.0; if (in_mouse->value) mouse_avail = true; else mouse_avail = false; // Knightmare- added Psychospaz's menu mouse support UI_RefreshCursorMenu(); UI_RefreshCursorLink(); }
/* * ================= * Default_MenuKey * ================= */ const char *Default_MenuKey(menuframework_s *m, int key) { const char *sound = NULL; menucommon_s *item; if (m) { if ((item = Menu_ItemAtCursor(m)) != 0) { if (item->type == MTYPE_FIELD) { if (Field_Key(( menufield_s * )item, key)) { return NULL; } } } } switch (key) { case K_ESCAPE: UI_PopMenu(); return menu_out_sound; case K_KP_UPARROW: case K_UPARROW: if (m) { m->cursor--; // Knightmare- added Psychospaz's mouse support UI_RefreshCursorLink(); Menu_AdjustCursor(m, -1); sound = menu_move_sound; } break; case K_TAB: case K_KP_DOWNARROW: case K_DOWNARROW: if (m) { m->cursor++; // Knightmare- added Psychospaz's mouse support UI_RefreshCursorLink(); Menu_AdjustCursor(m, 1); sound = menu_move_sound; } break; case K_KP_LEFTARROW: case K_LEFTARROW: if (m) { Menu_SlideItem(m, -1); sound = menu_move_sound; } break; case K_KP_RIGHTARROW: case K_RIGHTARROW: if (m) { Menu_SlideItem(m, 1); sound = menu_move_sound; } break; /*case K_MOUSE1: * case K_MOUSE2: * case K_MOUSE3: * //Knightmare 12/22/2001 * case K_MOUSE4: * case K_MOUSE5:*/ //end Knightmare case K_JOY1: case K_JOY2: case K_JOY3: case K_JOY4: case K_AUX1: case K_AUX2: case K_AUX3: case K_AUX4: case K_AUX5: case K_AUX6: case K_AUX7: case K_AUX8: case K_AUX9: case K_AUX10: case K_AUX11: case K_AUX12: case K_AUX13: case K_AUX14: case K_AUX15: case K_AUX16: case K_AUX17: case K_AUX18: case K_AUX19: case K_AUX20: case K_AUX21: case K_AUX22: case K_AUX23: case K_AUX24: case K_AUX25: case K_AUX26: case K_AUX27: case K_AUX28: case K_AUX29: case K_AUX30: case K_AUX31: case K_AUX32: case K_KP_ENTER: case K_ENTER: if (m) { Menu_SelectItem(m); } sound = menu_move_sound; break; } return sound; }
/* ========================== Menu_Draw ========================== */ void Menu_Draw (menuframework_s *menu) { int i; menucommon_s *item; // // draw contents // for (i = 0; i < menu->nitems; i++) { // skip hidden items if ( ((menucommon_s *)menu->items[i])->flags & QMF_HIDDEN ) continue; switch ( ((menucommon_s *)menu->items[i])->type ) { case MTYPE_FIELD: Field_Draw( ( menufield_s * )menu->items[i] ); break; case MTYPE_SLIDER: Slider_Draw( (menuslider_s *)menu->items[i] ); break; case MTYPE_LIST: MenuList_Draw( (menulist_s *)menu->items[i] ); break; case MTYPE_SPINCONTROL: SpinControl_Draw( (menulist_s *)menu->items[i] ); break; case MTYPE_ACTION: Action_Draw( (menuaction_s *)menu->items[i] ); break; case MTYPE_SEPARATOR: Separator_Draw( (menuseparator_s *)menu->items[i] ); break; } } // added Psychspaz's mouse support // // now check mouseovers - psychospaz // cursor.menu = menu; if (cursor.mouseaction) { menucommon_s *lastitem = cursor.menuitem; UI_RefreshCursorLink(); for (i = menu->nitems; i >= 0 ; i--) { int type, len; int min[2], max[2]; float x1, y1, w1, h1; item = ((menucommon_s * )menu->items[i]); if (!item || item->type == MTYPE_SEPARATOR) continue; x1 = menu->x + item->x + RCOLUMN_OFFSET; // + 2 chars for space + cursor y1 = menu->y + item->y; w1 = 0; h1 = MENU_FONT_SIZE; SCR_AdjustFrom640 (&x1, &y1, &w1, &h1, ALIGN_CENTER); min[0] = x1; max[0] = x1+w1; min[1] = y1; max[1] = y1+h1; // max[0] = min[0] = SCR_ScaledVideo(menu->x + item->x + RCOLUMN_OFFSET); //+ 2 chars for space + cursor // max[1] = min[1] = SCR_ScaledVideo(menu->y + item->y); // max[1] += SCR_ScaledVideo(MENU_FONT_SIZE); switch (item->type) { case MTYPE_ACTION: { len = strlen(item->name); if (item->flags & QMF_LEFT_JUSTIFY) { min[0] += SCR_ScaledVideo(LCOLUMN_OFFSET*2); max[0] = min[0] + SCR_ScaledVideo(len*MENU_FONT_SIZE); } else min[0] -= SCR_ScaledVideo(len*MENU_FONT_SIZE + MENU_FONT_SIZE*3); type = MENUITEM_ACTION; } break; case MTYPE_SLIDER: { if (item->name) { len = strlen(item->name); min[0] -= SCR_ScaledVideo(len*MENU_FONT_SIZE - LCOLUMN_OFFSET*2); } else min[0] -= SCR_ScaledVideo(16); max[0] += SCR_ScaledVideo((SLIDER_RANGE + 4)*MENU_FONT_SIZE); type = MENUITEM_SLIDER; } break; case MTYPE_LIST: case MTYPE_SPINCONTROL: { int len; menulist_s *spin = menu->items[i]; if (item->name) { len = strlen(item->name); min[0] -= SCR_ScaledVideo(len*MENU_FONT_SIZE - LCOLUMN_OFFSET*2); } len = strlen(spin->itemnames[spin->curvalue]); max[0] += SCR_ScaledVideo(len*MENU_FONT_SIZE); type = MENUITEM_ROTATE; } break; case MTYPE_FIELD: { menufield_s *text = menu->items[i]; len = text->visible_length + 2; max[0] += SCR_ScaledVideo(len*MENU_FONT_SIZE); type = MENUITEM_TEXT; } break; default: continue; } if (cursor.x>=min[0] && cursor.x<=max[0] && cursor.y>=min[1] && cursor.y<=max[1]) { // new item if (lastitem!=item) { int j; for (j=0; j<MENU_CURSOR_BUTTON_MAX; j++) { cursor.buttonclicks[j] = 0; cursor.buttontime[j] = 0; } } cursor.menuitem = item; cursor.menuitemtype = type; menu->cursor = i; break; } } } cursor.mouseaction = false; // end mouseover code item = Menu_ItemAtCursor(menu); if (item && item->cursordraw) { item->cursordraw(item); } else if (menu->cursordraw) { menu->cursordraw(menu); } else if (item && item->type != MTYPE_FIELD) { if (item->flags & QMF_LEFT_JUSTIFY) { SCR_DrawChar (menu->x+item->x+item->cursor_offset-24, menu->y+item->y, ALIGN_CENTER, 12+((int)(Sys_Milliseconds()/250)&1), 255,255,255,255, false, true); } else { SCR_DrawChar (menu->x+item->cursor_offset, menu->y+item->y, ALIGN_CENTER, 12+((int)(Sys_Milliseconds()/250)&1), 255,255,255,255, false, true); } } if (item) { if (item->statusbarfunc) item->statusbarfunc ( (void *)item ); else if (item->statusbar) Menu_DrawStatusBar (item->statusbar); else Menu_DrawStatusBar (menu->statusbar); } else Menu_DrawStatusBar( menu->statusbar ); }