X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=keys.c;h=5339881f2070001662c561932dc0fad544bcdeda;hb=5e21891aa2b1d2f7bfebd3d1b7cc27a8f1556ec4;hp=8c4aeff847ae7ca5caf6df07c081eecce5ae2da3;hpb=9b4696df9959f0c951ce4ab7a26323b41d0cc4a2;p=xonotic%2Fdarkplaces.git diff --git a/keys.c b/keys.c index 8c4aeff8..5339881f 100644 --- a/keys.c +++ b/keys.c @@ -712,7 +712,7 @@ Key_Console (int key, int unicode) else if(keydown[K_SHIFT]) // move cursor to the previous character ignoring colors { int pos; - size_t inchar; + size_t inchar = 0; pos = u8_prevbyte(key_line, key_linepos); while (pos) if(pos-1 > 0 && key_line[pos-1] == STRING_COLOR_TAG && isdigit(key_line[pos])) @@ -921,7 +921,7 @@ Key_Console (int key, int unicode) if (key == K_HOME || key == K_KP_HOME) { if (keydown[K_CTRL]) - con_backscroll = INT_MAX; + con_backscroll = CON_TEXTSIZE; else key_linepos = 1; return; @@ -1405,6 +1405,44 @@ Should NOT be called during an interrupt! static char tbl_keyascii[MAX_KEYS]; static keydest_t tbl_keydest[MAX_KEYS]; +typedef struct eventqueueitem_s +{ + int key; + int ascii; + qboolean down; +} +eventqueueitem_t; +static int events_blocked = 0; +static eventqueueitem_t eventqueue[32]; +static unsigned eventqueue_idx = 0; + +static void Key_EventQueue_Add(int key, int ascii, qboolean down) +{ + if(eventqueue_idx < sizeof(eventqueue) / sizeof(*eventqueue)) + { + eventqueue[eventqueue_idx].key = key; + eventqueue[eventqueue_idx].ascii = ascii; + eventqueue[eventqueue_idx].down = down; + ++eventqueue_idx; + } +} + +void Key_EventQueue_Block(void) +{ + // block key events until call to Unblock + events_blocked = true; +} + +void Key_EventQueue_Unblock(void) +{ + // unblocks key events again + unsigned i; + events_blocked = false; + for(i = 0; i < eventqueue_idx; ++i) + Key_Event(eventqueue[i].key, eventqueue[i].ascii, eventqueue[i].down); + eventqueue_idx = 0; +} + void Key_Event (int key, int ascii, qboolean down) { @@ -1415,13 +1453,19 @@ Key_Event (int key, int ascii, qboolean down) if (key < 0 || key >= MAX_KEYS) return; + if(events_blocked) + { + Key_EventQueue_Add(key, ascii, down); + return; + } + // get key binding bind = keybindings[key_bmap][key]; if (!bind) bind = keybindings[key_bmap2][key]; - if (developer.integer >= 1000) - Con_Printf("Key_Event(%i, '%c', %s) keydown %i bind \"%s\"\n", key, ascii ? ascii : '?', down ? "down" : "up", keydown[key], bind ? bind : ""); + if (developer_insane.integer) + Con_DPrintf("Key_Event(%i, '%c', %s) keydown %i bind \"%s\"\n", key, ascii ? ascii : '?', down ? "down" : "up", keydown[key], bind ? bind : ""); if(key_consoleactive) keydest = key_console; @@ -1492,7 +1536,7 @@ Key_Event (int key, int ascii, qboolean down) if(key_consoleactive & KEY_CONSOLEACTIVE_FORCED) { key_consoleactive &= ~KEY_CONSOLEACTIVE_USER; - MR_ToggleMenu_f (); + MR_ToggleMenu(1); } else Con_ToggleConsole_f(); @@ -1513,7 +1557,7 @@ Key_Event (int key, int ascii, qboolean down) // 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); if (!q && down) - MR_ToggleMenu_f (); + MR_ToggleMenu(1); break; default: @@ -1523,8 +1567,9 @@ Key_Event (int key, int ascii, qboolean down) } // send function keydowns to interpreter no matter what mode is (unless the menu has specifically grabbed the keyboard, for rebinding keys) + // VorteX: Omnicide does bind F* keys if (keydest != key_menu_grabbed) - if (key >= K_F1 && key <= K_F12) + if (key >= K_F1 && key <= K_F12 && gamemode != GAME_BLOODOMNICIDE) { if (bind) {