Author: Lars Wassermann <[email protected]>
Branch:
Changeset: r308:4111579f1cea
Date: 2013-04-22 14:00 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/4111579f1cea/
Log: added interrupt_key primitive (133) refactored mod-keys to also
apply to normal keys beside mouse-klicks
diff --git a/spyvm/display.py b/spyvm/display.py
--- a/spyvm/display.py
+++ b/spyvm/display.py
@@ -9,13 +9,13 @@
MOUSE_BTN_RIGHT = 1
MOUSE_BTN_MIDDLE = 2
MOUSE_BTN_LEFT = 4
-MOD_SHIFT = 8
-MOD_CONTROL = 16
-MOD_ALT = 64
+MOD_SHIFT = 1
+MOD_CONTROL = 2
+MOD_ALT = 16
class SDLDisplay(object):
_attrs_ = ["screen", "width", "height", "depth", "surface", "has_surface",
- "mouse_position", "button", "key"]
+ "mouse_position", "button", "key", "interrupt_key"]
def __init__(self, title):
assert RSDL.Init(RSDL.INIT_VIDEO) >= 0
@@ -77,6 +77,10 @@
if len(chars) == 1:
if c_type == RSDL.KEYDOWN:
self.key = ord(chars[0])
+ interrupt = self.interrupt_key
+ if (interrupt & 0xFF == self.key and
+ interrupt >> 8 ==
self.get_modifier_mask(0)):
+ raise KeyboardInterrupt
else:
pass # XXX: Todo?
elif c_type == RSDL.QUIT:
@@ -85,7 +89,7 @@
finally:
lltype.free(event, flavor='raw')
- def get_modifier_mask(self):
+ def get_modifier_mask(self, shift):
RSDL.PumpEvents()
mod = RSDL.GetModState()
modifier = 0
@@ -95,7 +99,7 @@
modifier |= MOD_SHIFT
if mod & RSDL.KMOD_ALT != 0:
modifier |= MOD_ALT
- return modifier
+ return modifier << shift
def mouse_point(self):
self.get_next_event()
@@ -103,16 +107,19 @@
def mouse_button(self):
self.get_next_event()
- return self.button | self.get_modifier_mask()
+ return self.button | self.get_modifier_mask(3)
def next_keycode(self):
key = self.key
self.key = 0
- return key
+ return key | self.get_modifier_mask(8)
def peek_keycode(self):
self.get_next_event()
- return self.key
+ return self.key | self.get_modifier_mask(8)
+
+ def set_interrupt_key(self, space, encoded_key):
+ self.interrupt_key = encoded_key
class SDLCursorClass(object):
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -834,6 +834,7 @@
SPECIAL_OBJECTS_ARRAY = 129
FULL_GC = 130
INC_GC = 131
+SET_INTERRUPT_KEY = 133
INTERRUPT_SEMAPHORE = 134
@expose_primitive(BECOME, unwrap_spec=[object, object])
@@ -869,6 +870,11 @@
rgc.collect()
return fake_bytes_left(interp)
+@expose_primitive(SET_INTERRUPT_KEY, unwrap_spec=[object, int])
+def func(interp, s_frame, w_rcvr, encoded_key):
+ interp.space.get_display().set_interrupt_key(interp.space, encoded_key)
+ return w_rcvr
+
@expose_primitive(INTERRUPT_SEMAPHORE, unwrap_spec=[object, object])
def func(interp, s_frame, w_rcvr, w_semaphore):
if
w_semaphore.getclass(interp.space).is_same_object(interp.space.w_Semaphore):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit