forked from sfucmpt105-beta/risk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
event.py
66 lines (55 loc) · 1.83 KB
/
event.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
###############################################################################
## Wrapper module for pygame's event
## linux seems to have issues when two threads pump at the same time but
## windows doesn't properly pump events for some reason =(. However, bad things
## happens when multiple threads pump at once. This module is thread safe.
#
import threading
import pygame
import risk
import risk.logger
import risk.errors.game_master
from risk.errors.input import UserQuitInput
_BLOCK = True
_NO_BLOCK = False
mutex = threading.Semaphore()
###############################################################################
## Critical section functions
#
def wait_for_event():
# this is a bit strange, but pygame will invoke pump internally so there's
# really no reason to call pump when waiting for event
mutex.acquire(_BLOCK)
event = pygame.event.wait()
if event.type == pygame.QUIT:
mutex.release()
raise UserQuitInput()
mutex.release()
return event
def get_events():
mutex.acquire(_BLOCK)
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
mutex.release()
raise UserQuitInput()
mutex.release()
return events
def pump():
# best effort, don't pump if another thread has already done so
acquired = mutex.acquire(_NO_BLOCK)
if acquired:
pygame.event.pump()
mutex.release()
###############################################################################
## Safe functions that don't touch CS
#
def wait_for_event_type(event_type):
event = wait_for_event()
while event.type != event_type:
event = wait_for_event()
return event
def wait_for_mouse_release():
return wait_for_event_type(pygame.MOUSEBUTTONUP)
def wait_for_mouse_click():
return wait_for_event_type(pygame.MOUSEBUTTONDOWN)