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

Reply via email to