void Menu_Options_Key(int key, int unichar) { int handled = CTab_Key(&options_tab, key); options_unichar = unichar; if (!handled && (key == K_ESCAPE || key == K_MOUSE2)) M_Menu_Main_f(); }
// will lead to call of one of the 4 functions above void Menu_Demo_Key(int key, wchar unichar) { extern void M_Menu_Main_f (void); int handled = CTab_Key(&demo_tab, key, unichar); if (!handled) { if (key == K_ESCAPE || key == K_MOUSE2) { M_Menu_Main_f(); } } }
PRIVATE const char *M_Victory_Key( int key ) { if( nvictory ) { M_PopMenu(); M_PushMenu( M_Victory_Text_Draw, M_Victory_Key ); nvictory = 0; page = 0; ClientStatic.state = ca_disconnected; return NULL; } switch( key ) { case K_ESCAPE: nvictory = 1; M_ForceMenuOff(); M_Menu_Main_f(); break; case K_KP_LEFTARROW: case K_LEFTARROW: if( page == 1 ) { page = 0; } break; case K_KP_RIGHTARROW: case K_RIGHTARROW: if( page == 0 ) { page = 1; } break; } return NULL; }
/* =================== Key_Event Called by the system between frames for both key up and key down events Should NOT be called during an interrupt! =================== */ void Key_Event (int key, qboolean down, uint32 time) { char *kb; char cmd[1024]; // hack for modal presses /*if (key_waiting == -1) { if (down) key_waiting = key; return; }*/ //Com_Printf ("%d is %d for %u\n", LOG_GENERAL, key, down, time); // update auto-repeat status if (down) { key_repeats[key]++; if (cls.key_dest != key_console && key != K_BACKSPACE && key != K_DEL && key != K_LEFTARROW && key != K_RIGHTARROW && key != K_PAUSE && key != K_PGUP && key != K_KP_PGUP && key != K_PGDN && key != K_KP_PGDN && key_repeats[key] > 1) return; // ignore most autorepeats if (key >= 200 && !keybindings[key]) Com_Printf ("%s is unbound, hit F4 to set.\n", LOG_CLIENT, Key_KeynumToString (key) ); } else { key_repeats[key] = 0; } //for dinput if (down && keydown[K_ALT]) { if (key == K_ENTER) { Com_Printf ("ALT+Enter, setting fullscreen %d.\n", LOG_CLIENT, !vid_fullscreen->intvalue); Cvar_SetValue( "vid_fullscreen", (float)!vid_fullscreen->intvalue ); return; } else if (key == K_TAB) { //prevent executing action on alt+tab return; } } if (key == K_SHIFT) shift_down = down; // console key is hardcoded, so the user can never unbind it if ((key == '`' || key == '~') && !shift_down) { if (!down) return; Con_ToggleConsole_f (); return; } // any key during the attract mode will bring up the menu /*if (cl.attractloop && cls.key_dest != key_menu && !(key >= K_F1 && key <= K_F12)) key = K_ESCAPE;*/ // menu key is hardcoded, so the user can never unbind it if (key == K_ESCAPE) { if (!down) return; if (cl.frame.playerstate.stats[STAT_LAYOUTS] && cls.key_dest == key_game) { // put away help computer / inventory Cbuf_AddText ("cmd putaway\n"); return; } switch (cls.key_dest) { case key_message: Key_Message (key); break; case key_menu: M_Keydown (key); break; case key_game: case key_console: M_Menu_Main_f (); break; default: Com_Error (ERR_FATAL, "Bad cls.key_dest"); } return; } if (!keydown[key]) key_lastrepeat[key] = curtime + key_repeatdelay; // track if any key is down for BUTTON_ANY keydown[key] = down; if (down) { if (key_repeats[key] == 1) anykeydown++; } else { key_lastrepeat[key] = 0; anykeydown--; if (anykeydown < 0) anykeydown = 0; } // // key up events only generate commands if the game key binding is // a button command (leading + sign). These will occur even in console mode, // to keep the character from continuing an action started before a console // switch. Button commands include the kenum as a parameter, so multiple // downs can be matched with ups // if (!down) { //r1ch: only generate -events if key was down (prevents -binds in menu / messagemode) if (buttondown[key]) { kb = keybindings[key]; if (kb && kb[0] == '+') { Com_sprintf (cmd, sizeof(cmd), "-%s %i %u\n", kb+1, key, time); Cbuf_AddText (cmd); } if (keyshift[key] != key) { kb = keybindings[keyshift[key]]; if (kb && kb[0] == '+') { Com_sprintf (cmd, sizeof(cmd), "-%s %i %u\n", kb+1, key, time); Cbuf_AddText (cmd); } } buttondown[key] = false; } return; } // // if not a consolekey, send to the interpreter no matter what mode is // if ( (cls.key_dest == key_menu && menubound[key]) || (cls.key_dest == key_console && !consolekeys[key]) || (cls.key_dest == key_game && ( cls.state == ca_active || !consolekeys[key] ) ) ) { kb = keybindings[key]; if (kb && kb[0]) { if (kb[0] == '+') { // button commands add keynum and time as a parm if (cls.key_dest != key_game) //r1: don't run buttons in console return; Com_sprintf (cmd, sizeof(cmd), "%s %i %u\n", kb, key, time); Cbuf_AddText (cmd); buttondown[key] = true; } else { Cbuf_AddText (kb); Cbuf_AddText ("\n"); } } return; } //if (!down) // return; // other systems only care about key down events if (shift_down) key = keyshift[key]; switch (cls.key_dest) { case key_message: Key_Message (key); break; case key_menu: M_Keydown (key); break; case key_game: case key_console: Key_Console (key); break; default: Com_Error (ERR_FATAL, "Bad cls.key_dest"); } }
/** * \brief Called by the system between frames for both key up and key down events. * \param[in] key Key mapping * \param[in] down Is key being pressed? * \param[in] time * \note Should NOT be called during an interrupt! */ PUBLIC void Key_Event( int key, _boolean down, unsigned time ) { char *kb; char cmd[ 1024 ]; // hack for modal presses if (key_waiting == -1) { if (down) { key_waiting = key; } return; } // update auto-repeat status if (down) { key_repeats[key]++; if (key != K_BACKSPACE && key != K_PAUSE && key != K_PGUP && key != K_KP_PGUP && key != K_PGDN && key != K_KP_PGDN && key_repeats[key] > 1) { return; // ignore most autorepeats } if (key >= 200 && !keybindings[key]) { Com_Printf ( "%s is unbound, hit F4 to set.\n", Key_KeynumToString (key) ); } } else { key_repeats[ key ] = 0; } if( key == K_SHIFT ) { shift_down = down; } // console key is hardcoded, so the user can never unbind it if( key == '`' || key == '~' ) { if( ! down ) { return; } Con_ToggleConsole_f(); return; } // any key during the attract mode will bring up the menu // if (cl.attractloop && ClientStatic.key_dest != key_menu && // !(key >= K_F1 && key <= K_F12)) // key = K_ESCAPE; // menu key is hardcoded, so the user can never unbind it if( key == K_ESCAPE ) { if( ! down ) { return; } // if (cl.frame.playerstate.stats[STAT_LAYOUTS] && ClientStatic.key_dest == key_game) // { // put away help computer / inventory // Cbuf_AddText ("cmd putaway\n"); // return; // } switch( ClientStatic.key_dest ) { case key_message: Key_Message( key ); break; case KEY_AUTOMAP: automap_keydown( key ); break; case key_menu: M_Keydown( key ); break; case key_game: case key_console: M_Menu_Main_f(); break; default: Com_DPrintf( "Bad ClientStatic.key_dest\n" ); } return; } // track if any key is down for BUTTON_ANY keydown[key] = down; if (down) { if (key_repeats[key] == 1) { anykeydown++; } } else { anykeydown--; if (anykeydown < 0) { anykeydown = 0; } } // // key up events only generate commands if the game key binding is // a button command (leading + sign). These will occur even in console mode, // to keep the character from continuing an action started before a console // switch. Button commands include the kenum as a parameter, so multiple // downs can be matched with ups // if( ! down ) { kb = keybindings[key]; if (kb && kb[0] == '+') { com_snprintf (cmd, sizeof(cmd), "-%s %i %i\n", kb+1, key, time); Cbuf_AddText (cmd); } if (keyshift[key] != key) { kb = keybindings[keyshift[key]]; if (kb && kb[0] == '+') { com_snprintf (cmd, sizeof(cmd), "-%s %i %i\n", kb+1, key, time); Cbuf_AddText (cmd); } } return; } // // if not a consolekey, send to the interpreter no matter what mode is // if ( (ClientStatic.key_dest == key_menu && menubound[key]) || (ClientStatic.key_dest == key_console && !consolekeys[key]) || (ClientStatic.key_dest == key_game ) ) { kb = keybindings[key]; if (kb) { if (kb[0] == '+') { // button commands add keynum and time as a parm com_snprintf (cmd, sizeof(cmd), "%s %i %i\n", kb, key, time); Cbuf_AddText (cmd); } else { Cbuf_AddText (kb); Cbuf_AddText ("\n"); } } return; } if( ! down ) { return; // other systems only care about key down events } if (shift_down) { key = keyshift[ key ]; } switch (ClientStatic.key_dest) { case KEY_AUTOMAP: automap_keydown( key ); break; case key_message: Key_Message (key); break; case key_menu: M_Keydown (key); break; case key_game: case key_console: Key_Console (key); break; default: Com_DPrintf( "Bad ClientStatic.key_dest\n" ); } }