diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-07-27 11:08:33 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-07-27 11:08:33 +0200 |
commit | ab08c97e6010309d4ea0df26815d074b1f5d1a4b (patch) | |
tree | eb492d37eb82d113c431a9d098d95d156c631ada /sys | |
parent | 98b9c4eb1ef0907ee596cc2ddd19beb03427a062 (diff) |
doom: make sure not to drop keyup/keydown events
Diffstat (limited to 'sys')
-rw-r--r-- | sys/src/games/doom/d_main.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/sys/src/games/doom/d_main.c b/sys/src/games/doom/d_main.c index 490b659bc..2f6c87e06 100644 --- a/sys/src/games/doom/d_main.c +++ b/sys/src/games/doom/d_main.c @@ -130,6 +130,7 @@ void D_DoAdvanceDemo (void); event_t events[MAXEVENTS]; int eventhead; int eventtail; +QLock eventlock; // @@ -138,8 +139,21 @@ int eventtail; // void D_PostEvent (event_t* ev) { + int next; + +retry: + qlock(&eventlock); + next = (eventhead+1)&(MAXEVENTS-1); + if(next == eventtail){ + qunlock(&eventlock); + if(ev->type != ev_keydown && ev->type != ev_keyup) + return; + sleep(1); + goto retry; + } events[eventhead] = *ev; - eventhead = (++eventhead)&(MAXEVENTS-1); + eventhead = next; + qunlock(&eventlock); } @@ -156,7 +170,7 @@ void D_ProcessEvents (void) && (W_CheckNumForName("map01")<0) ) return; - for ( ; eventtail != eventhead ; eventtail = (++eventtail)&(MAXEVENTS-1) ) + for ( ; eventtail != eventhead ; eventtail = (eventtail+1)&(MAXEVENTS-1)) { ev = &events[eventtail]; if (M_Responder (ev)) |