]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - keys.c
screenshot: get rid of the 3*w*h+18 TGA buffer; instead however always capture as...
[xonotic/darkplaces.git] / keys.c
diff --git a/keys.c b/keys.c
index c7342593b6065a103d4e35ce20f2808f1b981834..5339881f2070001662c561932dc0fad544bcdeda 100644 (file)
--- a/keys.c
+++ b/keys.c
@@ -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,6 +1453,12 @@ 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)
@@ -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)
                {