X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=keys.c;h=f88ea5a4553394bf681b30679e934a96ee61cf0c;hb=acc9d81f927d5a3d272538462dd521968834da30;hp=d182291c1958b8abdacb0ac12afbb57f4757d156;hpb=e2ca60e84ef1525d1b097548534e6ab1c96885b2;p=xonotic%2Fdarkplaces.git diff --git a/keys.c b/keys.c index d182291c..f88ea5a4 100644 --- a/keys.c +++ b/keys.c @@ -24,7 +24,7 @@ #include "cl_video.h" #include "utf8lib.h" -cvar_t con_closeontoggleconsole = {CVAR_SAVE, "con_closeontoggleconsole","1", "allows toggleconsole binds to close the console as well"}; +cvar_t con_closeontoggleconsole = {CVAR_SAVE, "con_closeontoggleconsole","1", "allows toggleconsole binds to close the console as well; when set to 2, this even works when not at the start of the line in console input; when set to 3, this works even if the toggleconsole key is the color tag"}; /* key up events are sent even if in console mode @@ -473,6 +473,36 @@ static const keyname_t keynames[] = { {"AUX31", K_AUX31}, {"AUX32", K_AUX32}, + {"X360_DPAD_UP", K_X360_DPAD_UP}, + {"X360_DPAD_DOWN", K_X360_DPAD_DOWN}, + {"X360_DPAD_LEFT", K_X360_DPAD_LEFT}, + {"X360_DPAD_RIGHT", K_X360_DPAD_RIGHT}, + {"X360_START", K_X360_START}, + {"X360_BACK", K_X360_BACK}, + {"X360_LEFT_THUMB", K_X360_LEFT_THUMB}, + {"X360_RIGHT_THUMB", K_X360_RIGHT_THUMB}, + {"X360_LEFT_SHOULDER", K_X360_LEFT_SHOULDER}, + {"X360_RIGHT_SHOULDER", K_X360_RIGHT_SHOULDER}, + {"X360_A", K_X360_A}, + {"X360_B", K_X360_B}, + {"X360_X", K_X360_X}, + {"X360_Y", K_X360_Y}, + {"X360_LEFT_TRIGGER", K_X360_LEFT_TRIGGER}, + {"X360_RIGHT_TRIGGER", K_X360_RIGHT_TRIGGER}, + {"X360_LEFT_THUMB_UP", K_X360_LEFT_THUMB_UP}, + {"X360_LEFT_THUMB_DOWN", K_X360_LEFT_THUMB_DOWN}, + {"X360_LEFT_THUMB_LEFT", K_X360_LEFT_THUMB_LEFT}, + {"X360_LEFT_THUMB_RIGHT", K_X360_LEFT_THUMB_RIGHT}, + {"X360_RIGHT_THUMB_UP", K_X360_RIGHT_THUMB_UP}, + {"X360_RIGHT_THUMB_DOWN", K_X360_RIGHT_THUMB_DOWN}, + {"X360_RIGHT_THUMB_LEFT", K_X360_RIGHT_THUMB_LEFT}, + {"X360_RIGHT_THUMB_RIGHT", K_X360_RIGHT_THUMB_RIGHT}, + + {"JOY_UP", K_JOY_UP}, + {"JOY_DOWN", K_JOY_DOWN}, + {"JOY_LEFT", K_JOY_LEFT}, + {"JOY_RIGHT", K_JOY_RIGHT}, + {"SEMICOLON", ';'}, // because a raw semicolon separates commands {"TILDE", '~'}, {"BACKQUOTE", '`'}, @@ -1203,7 +1233,7 @@ Key_Message (int key, int ascii) } // ctrl+key generates an ascii value < 32 and shows a char from the charmap - if (ascii < 32 && utf8_enable.integer) + if (ascii > 0 && ascii < 32 && utf8_enable.integer) ascii = 0xE000 + ascii; if (chat_bufferlen == sizeof (chat_buffer) - 1) @@ -1472,7 +1502,7 @@ Key_PrintBindList(int j) p = keybindings[j][i]; if (p) { - Cmd_QuoteString(bindbuf, sizeof(bindbuf), p, "\"\\"); + Cmd_QuoteString(bindbuf, sizeof(bindbuf), p, "\"\\", false); if (j == 0) Con_Printf("^2%s ^7= \"%s\"\n", Key_KeynumToString (i), bindbuf); else @@ -1565,7 +1595,7 @@ Key_WriteBindings (qfile_t *f) p = keybindings[j][i]; if (p) { - Cmd_QuoteString(bindbuf, sizeof(bindbuf), p, "\"\\"); // don't need to escape $ because cvars are not expanded inside bind + Cmd_QuoteString(bindbuf, sizeof(bindbuf), p, "\"\\", false); // don't need to escape $ because cvars are not expanded inside bind if (j == 0) FS_Printf(f, "bind %s \"%s\"\n", Key_KeynumToString (i), bindbuf); else @@ -1656,7 +1686,7 @@ void Key_FindKeysForCommand (const char *command, int *keys, int numkeys, int bi } } -qboolean CL_VM_InputEvent (qboolean down, int key, int ascii); +extern qboolean CL_VM_InputEvent (int eventtype, int x, int y); /* =================== @@ -1822,7 +1852,7 @@ Key_Event (int key, int ascii, qboolean down) case key_game: // csqc has priority over toggle menu if it wants to (e.g. handling escape for UI stuff in-game.. :sick:) - q = CL_VM_InputEvent(down, key, ascii); + q = CL_VM_InputEvent(down ? 0 : 1, key, ascii); if (!q && down) MR_ToggleMenu(1); break; @@ -1864,11 +1894,15 @@ Key_Event (int key, int ascii, qboolean down) // con_closeontoggleconsole enables toggleconsole keys to close the // console, as long as they are not the color prefix character // (special exemption for german keyboard layouts) - if (con_closeontoggleconsole.integer && bind && !strncmp(bind, "toggleconsole", strlen("toggleconsole")) && (key_consoleactive & KEY_CONSOLEACTIVE_USER) && ascii != STRING_COLOR_TAG) + if (con_closeontoggleconsole.integer && bind && !strncmp(bind, "toggleconsole", strlen("toggleconsole")) && (key_consoleactive & KEY_CONSOLEACTIVE_USER) && (con_closeontoggleconsole.integer >= ((ascii != STRING_COLOR_TAG) ? 2 : 3) || key_linepos == 1)) { Con_ToggleConsole_f (); return; } + + if (COM_CheckParm ("-noconsole")) + return; // only allow the key bind to turn off console + Key_Console (key, ascii); return; } @@ -1887,7 +1921,10 @@ Key_Event (int key, int ascii, qboolean down) // ignore binds while a video is played, let the video system handle the key event if (cl_videoplaying) { - CL_Video_KeyEvent (key, ascii, keydown[key] != 0); + if (gamemode == GAME_BLOODOMNICIDE) // menu controls key events + MR_KeyEvent(key, ascii, down); + else + CL_Video_KeyEvent (key, ascii, keydown[key] != 0); return; } @@ -1903,7 +1940,7 @@ Key_Event (int key, int ascii, qboolean down) MR_KeyEvent (key, ascii, down); break; case key_game: - q = CL_VM_InputEvent(down, key, ascii); + q = CL_VM_InputEvent(down ? 0 : 1, key, ascii); // ignore key repeats on binds and only send the bind if the event hasnt been already processed by csqc if (!q && bind) { @@ -1926,6 +1963,21 @@ Key_Event (int key, int ascii, qboolean down) } } +// a helper to simulate release of ALL keys +void +Key_ReleaseAll (void) +{ + int key; + // clear the event queue first + eventqueue_idx = 0; + // then send all down events (possibly into the event queue) + for(key = 0; key < MAX_KEYS; ++key) + if(keydown[key]) + Key_Event(key, 0, false); + // now all keys are guaranteed down (once the event queue is unblocked) + // and only future events count +} + /* =================== Key_ClearStates