Author: Tim Felgentreff <[email protected]>
Branch:
Changeset: r522:83bbb98f8690
Date: 2013-12-13 17:29 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/83bbb98f8690/
Log: fix modifier keys handling and Shift+Character input for miniimage
diff --git a/spyvm/display.py b/spyvm/display.py
--- a/spyvm/display.py
+++ b/spyvm/display.py
@@ -11,7 +11,7 @@
MOUSE_BTN_LEFT = 4
MOD_SHIFT = 1
MOD_CONTROL = 2
-MOD_ALT = 16
+MOD_ALT_CMD = 16 | 8
class SDLDisplay(object):
_attrs_ = ["screen", "width", "height", "depth", "surface", "has_surface",
@@ -71,19 +71,30 @@
y = rffi.getintfield(m, "c_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:
- chars = unicode_encode_utf_8(unichr(char), 1,
"ignore")
- 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?
+ if c_type == RSDL.KEYDOWN: # TODO: create KeyUp events
and KeyRepeat events
+ self.key = 0
+ p = rffi.cast(RSDL.KeyboardEventPtr, event)
+ sym = rffi.getintfield(p.c_keysym, 'c_sym')
+ char = rffi.getintfield(p.c_keysym, 'c_unicode')
+ if sym == RSDL.K_DOWN:
+ self.key = 31
+ elif sym == RSDL.K_LEFT:
+ self.key = 28
+ elif sym == RSDL.K_RIGHT:
+ self.key = 29
+ elif sym == RSDL.K_UP:
+ self.key = 30
+ elif char != 0:
+ chars = unicode_encode_utf_8(unichr(char), 1,
"ignore")
+ if len(chars) == 1:
+ asciivalue = ord(chars[0])
+ if asciivalue >= 32:
+ self.key = asciivalue
+ if self.key == 0 and sym <= 255:
+ self.key = sym
+ interrupt = self.interrupt_key
+ if (interrupt & 0xFF == self.key and interrupt >>
8 == self.get_modifier_mask(0)):
+ raise KeyboardInterrupt
elif c_type == RSDL.QUIT:
from spyvm.error import Exit
raise Exit("Window closed..")
@@ -99,7 +110,7 @@
if mod & RSDL.KMOD_SHIFT != 0:
modifier |= MOD_SHIFT
if mod & RSDL.KMOD_ALT != 0:
- modifier |= MOD_ALT
+ modifier |= MOD_ALT_CMD
return modifier << shift
def mouse_point(self):
@@ -108,16 +119,18 @@
def mouse_button(self):
self.get_next_event()
- return self.button | self.get_modifier_mask(3)
+ mod = self.get_modifier_mask(3)
+ return self.button | mod
def next_keycode(self):
key = self.key
self.key = 0
- return key | self.get_modifier_mask(8)
+ return key
def peek_keycode(self):
self.get_next_event()
- return self.key | self.get_modifier_mask(8)
+ self.key |= self.get_modifier_mask(8)
+ return self.key
def set_interrupt_key(self, space, encoded_key):
self.interrupt_key = encoded_key
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -803,7 +803,7 @@
@expose_primitive(KBD_NEXT, unwrap_spec=[object])
def func(interp, s_frame, w_rcvr):
code = interp.space.get_display().next_keycode()
- if code == 0:
+ if code & 0xFF == 0:
return interp.space.w_nil
else:
return interp.space.wrap_int(code)
@@ -811,7 +811,7 @@
@expose_primitive(KBD_PEEK, unwrap_spec=[object])
def func(interp, s_frame, w_rcvr):
code = interp.space.get_display().peek_keycode()
- if code == 0:
+ if code & 0xFF == 0:
return interp.space.w_nil
else:
return interp.space.wrap_int(code)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit