Author: ArcRiley
Date: 2007-12-30 19:26:41 +0000 (Sun, 30 Dec 2007)
New Revision: 637

Modified:
   trunk/pysoy/src/controllers/Keyboard.pxi
Log:
Finishing #897


Modified: trunk/pysoy/src/controllers/Keyboard.pxi
===================================================================
--- trunk/pysoy/src/controllers/Keyboard.pxi    2007-12-30 18:29:52 UTC (rev 
636)
+++ trunk/pysoy/src/controllers/Keyboard.pxi    2007-12-30 19:26:41 UTC (rev 
637)
@@ -21,8 +21,19 @@
   '''PySoy controllers.Keyboard
 
      This controller responds to selected keyboard input from a soy.Window.
+
+     This controller can be programmed with both keycodes and symbols.  This 
+     allows you to program for either physical keys, such as when using 
+     letters as arrow keys, or the keymapped keys for typing.
+
+     Keycodes are set as type int, symbols are single-character strings.
+     Keycode actions are given priority in the case of overlap.  When 
+     overlap is possible between keycodes and keymapped symbols it's
+     recommended to use two separate controllers.
+
+     See soy.controllers.Controller for how to program controllers.  
   '''
-  def __cinit__(self, window=None) :
+  def __cinit__(self, window, *args, **kw) :
     if not isinstance(window, soy._core.Window) :
       raise TypeError('first argument must be of type soy.Window')
     self._window = window
@@ -32,17 +43,30 @@
 
   def __dealloc__(self) :
     cdef int _i
+    if not self._window :
+      return
     self._window._controllers.lock()
     self._window._controllers.remove(<void *>self)
     self._window._controllers.unlock()
-    for i from 0 <= i < 256 :
-      if self._acts_keycde[i] :
-        py.Py_DECREF(<soy.actions.Action> self._acts_keycde[i])
-      if self._acts_keysym[i] :
-        py.Py_DECREF(<soy.actions.Action> self._acts_keysym[i])
+    for _i from 0 <= _i < 256 :
+      if self._acts_keycde[_i] :
+        py.Py_DECREF(<object> self._acts_keycde[_i])
+      if self._acts_keysym[_i] :
+        py.Py_DECREF(<object> self._acts_keysym[_i])
 
+  def __str__(self) :
+    cdef int _i
+    ret = {}
+    for _i from 0 <= _i < 256 :
+      if self._acts_keycde[_i] :
+        ret[_i] = <object> self._acts_keycde[_i]    
+    for _i from 0 <= _i < 256 :
+      if self._acts_keysym[_i] :
+        ret[chr(_i)] = <object> self._acts_keysym[_i]    
+    return ret.__str__()
+
   def __repr__(self) :
-    return '<Keyboard>'
+    return self.__str__()
 
   def __getitem__(self, key) :
     if type(key) == str and len(key)==1 :
@@ -51,8 +75,8 @@
       else :
         return None
     elif type(key) == int and key>=0 and key<256 :
-      if self._acts_keycde[ord(key)] :
-        return <soy.actions.Action> self._acts_keycde[ord(key)]
+      if self._acts_keycde[key] :
+        return <soy.actions.Action> self._acts_keycde[key]
       else :
         return None
     else :
@@ -66,7 +90,13 @@
         py.Py_DECREF(<soy.actions.Action> self._acts_keysym[ord(key)])
       self._acts_keysym[ord(key)] = <void *> value
       py.Py_INCREF(<soy.actions.Action> self._acts_keysym[ord(key)])
+    elif type(key) == int and key>=0 and key<256 :
+      if self._acts_keycde[key] :
+        py.Py_DECREF(<soy.actions.Action> self._acts_keycde[key])
+      self._acts_keycde[key] = <void *> value
+      py.Py_INCREF(<soy.actions.Action> self._acts_keycde[key])
 
+
   cdef void _eventKeyDown(self, unsigned char _cde, unsigned char _sym) :
     if self._acts_keycde[_cde] :
       (<soy.actions.Action> self._acts_keycde[_cde])._perform(1)
@@ -75,5 +105,4 @@
 
 
   cdef void _eventKeyUp(self, unsigned char _cde, unsigned char _sym) :
-    #stdio.printf('%c up\n', _sym)
     return

_______________________________________________
PySoy-SVN mailing list
PySoy-SVN@pysoy.org
http://www.pysoy.org/mailman/listinfo/pysoy-svn

Reply via email to