Author: Tim Felgentreff <[email protected]>
Branch:
Changeset: r267:4e9499c16e75
Date: 2013-04-15 10:26 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/4e9499c16e75/
Log: fix some SDL event handling
diff --git a/spyvm/display.py b/spyvm/display.py
--- a/spyvm/display.py
+++ b/spyvm/display.py
@@ -6,50 +6,26 @@
from rsdl import RSDL, RSDL_helper
-class SDLEventQueue(object):
- def __init__(self, default, maxlen=10):
- assert default
- self.default = default
- self.ary = []
- self.maxlen = 10
-
- def push(self, event):
- if len(self.ary) == self.maxlen:
- self.ary.pop(0)
- self.ary.append(event)
-
- def shift(self):
- if not self.ary:
- self.ary += self.default
- return self.ary.pop(0)
-
- def peek(self):
- if self.ary:
- return self.ary[0]
- else:
- return self.default[0]
-
- def size(self):
- if not self.ary:
- return len(self.default)
- else:
- return len(self.ary)
+MOUSE_BTN_RIGHT = 1
+MOUSE_BTN_MIDDLE = 2
+MOUSE_BTN_LEFT = 4
+MOD_SHIFT = 8
+MOD_CONTROL = 16
+MOD_ALT = 64
class SDLDisplay(object):
_attrs_ = ["screen", "width", "height", "depth", "surface", "has_surface",
- "last_mouse_position", "mouse_downs", "mouse_ups", "key_ups",
"key_downs"]
+ "mouse_position", "button", "key"]
def __init__(self, title):
assert RSDL.Init(RSDL.INIT_VIDEO) >= 0
RSDL.WM_SetCaption(title, "RSqueakVM")
RSDL.EnableUNICODE(1)
self.has_surface = False
- self.last_mouse_position = [0, 0]
- self.mouse_downs = SDLEventQueue([0])
- self.mouse_ups = SDLEventQueue([0])
- self.key_ups = SDLEventQueue([0])
- self.key_downs = SDLEventQueue([0])
+ self.mouse_position = [0, 0]
+ self.button = 0
+ self.key = 0
def set_video_mode(self, w, h, d):
assert w > 0 and h > 0
@@ -77,46 +53,60 @@
if c_type == RSDL.MOUSEBUTTONDOWN or c_type ==
RSDL.MOUSEBUTTONUP:
b = rffi.cast(RSDL.MouseButtonEventPtr, event)
btn = rffi.getintfield(b, 'c_button')
- if btn == RSDL.BUTTON_LEFT:
- btn = 1
+ if btn == RSDL.BUTTON_RIGHT:
+ btn = MOUSE_BTN_RIGHT
elif btn == RSDL.BUTTON_MIDDLE:
- btn = 2
- elif btn == RSDL.BUTTON_RIGHT:
- btn = 4
+ btn = MOUSE_BTN_MIDDLE
+ elif btn == RSDL.BUTTON_LEFT:
+ btn = MOUSE_BTN_LEFT
if c_type == RSDL.MOUSEBUTTONDOWN:
- self.mouse_downs.push(btn)
+ self.button |= btn
else:
- self.mouse_ups.push(btn)
+ self.button &= ~btn
elif c_type == RSDL.MOUSEMOTION:
m = rffi.cast(RSDL.MouseMotionEventPtr, event)
x = rffi.getintfield(m, "c_x")
y = rffi.getintfield(m, "c_y")
- self.last_mouse_position = [x, y]
+ self.mouse_position = [x, y]
elif c_type == RSDL.KEYUP or c_type == RSDL.KEYDOWN:
p = rffi.cast(RSDL.KeyboardEventPtr, event)
char = rffi.getintfield(p.c_keysym, 'c_unicode')
if char != 0:
- for c in unicode_encode_utf_8(unichr(char), 1,
"ignore"):
- if c_type == RSDL.KEYUP:
- self.key_ups.push(ord(c))
+ chars = unicode_encode_utf_8(unichr(char), 1,
"ignore")
+ if len(chars) == 1:
+ if c_type == RSDL.KEYDOWN:
+ self.key = ord(chars[0])
else:
- self.key_downs.push(ord(c))
+ pass # XXX: Todo?
finally:
lltype.free(event, flavor='raw')
+ def get_modifier_mask(self):
+ RSDL.PumpEvents()
+ mod = RSDL.GetModState()
+ modifier = 0
+ if mod & RSDL.KMOD_CTRL != 0:
+ modifier |= MOD_CONTROL
+ if mod & RSDL.KMOD_SHIFT != 0:
+ modifier |= MOD_SHIFT
+ if mod & RSDL.KMOD_ALT != 0:
+ modifier |= MOD_ALT
+ return modifier
+
def mouse_point(self):
self.get_next_event()
- return self.last_mouse_position
+ return self.mouse_position
def mouse_button(self):
self.get_next_event()
- return self.mouse_ups.shift()
+ return self.button | self.get_modifier_mask()
def next_keycode(self):
- self.get_next_event()
- return self.key_downs.shift()
+ key = self.key
+ self.key = 0
+ return key
def peek_keycode(self):
self.get_next_event()
- return self.key_downs.peek()
+ return self.key
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit