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