]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - keys.c
remove some Blood Omnicide related hacks, fixed video stippling on ATI (always draw...
[xonotic/darkplaces.git] / keys.c
diff --git a/keys.c b/keys.c
index eb57276cfb31ce49f0bde004d31d1ba12a929a25..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)
@@ -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)
                {