events\!
This commit is contained in:
parent
2d0b5e8181
commit
4f31fc0ddc
6
TODO
6
TODO
@ -1,9 +1,4 @@
|
|||||||
Soon
|
|
||||||
* flesh out Window
|
|
||||||
* flesh out Renderer
|
|
||||||
|
|
||||||
Someday
|
Someday
|
||||||
* Point/Rect
|
|
||||||
* Event Support
|
* Event Support
|
||||||
* have Window pass-through to Renderer
|
* have Window pass-through to Renderer
|
||||||
|
|
||||||
@ -15,7 +10,6 @@ Maybe
|
|||||||
* Haptic
|
* Haptic
|
||||||
* Audio
|
* Audio
|
||||||
* Timers
|
* Timers
|
||||||
* SDL_GetPlatform, CPU detection, Byte Order, SDL_GetPowerInfo
|
|
||||||
|
|
||||||
Probably Not
|
Probably Not
|
||||||
* Threads
|
* Threads
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import ctypes
|
import ctypes
|
||||||
from .internal import _SDL, errcheck
|
from .internal import _SDL, errcheck, Version
|
||||||
|
|
||||||
# Constants
|
# Constants
|
||||||
class INIT(object):
|
class INIT(object):
|
||||||
@ -42,19 +42,6 @@ def quit():
|
|||||||
|
|
||||||
##### Version Info
|
##### Version Info
|
||||||
|
|
||||||
class Version(ctypes.Structure):
|
|
||||||
_fields_ = (
|
|
||||||
("major", ctypes.c_uint8),
|
|
||||||
("minor", ctypes.c_uint8),
|
|
||||||
("patch", ctypes.c_uint8)
|
|
||||||
)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return '{0}.{1}.{2}'.format(self.major, self.minor, self.patch)
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return 'Version({0},{1},{2})'.format(self.major, self.minor,
|
|
||||||
self.patch)
|
|
||||||
|
|
||||||
def get_version():
|
def get_version():
|
||||||
v = Version()
|
v = Version()
|
||||||
|
311
csdl/events.py
311
csdl/events.py
@ -1,7 +1,7 @@
|
|||||||
import ctypes
|
import ctypes
|
||||||
from .internal import _SDL
|
from .internal import _SDL, Version
|
||||||
|
|
||||||
class Event(object):
|
class EventType(int):
|
||||||
FIRSTEVENT = 0
|
FIRSTEVENT = 0
|
||||||
|
|
||||||
QUIT = 0x100
|
QUIT = 0x100
|
||||||
@ -47,4 +47,311 @@ class Event(object):
|
|||||||
USEREVENT = 0x8000
|
USEREVENT = 0x8000
|
||||||
LASTEVENT = 0xFFFF
|
LASTEVENT = 0xFFFF
|
||||||
|
|
||||||
|
# a few typedefs
|
||||||
|
Keycode = ctypes.c_int32
|
||||||
|
Scancode = ctypes.c_int32 # enum, not sure about this one
|
||||||
|
GestureID = ctypes.c_int64
|
||||||
|
TouchID = ctypes.c_int64
|
||||||
|
FingerID = ctypes.c_int64
|
||||||
|
|
||||||
|
class SysWMType(int):
|
||||||
|
UNKNOWN = 0
|
||||||
|
WINDOWS = 1
|
||||||
|
X11 = 2
|
||||||
|
DIRECTFB = 2
|
||||||
|
COCOA = 3
|
||||||
|
UIKIT = 4
|
||||||
|
|
||||||
|
# TODO: see what can be done to make SysWMmsg work
|
||||||
|
class _SysWMUnion(ctypes.Union):
|
||||||
|
_fields_ = (
|
||||||
|
('dummy', ctypes.c_int),
|
||||||
|
)
|
||||||
|
|
||||||
|
class SysWMmsg(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('version', Version),
|
||||||
|
('subsystem', ctypes.c_int),
|
||||||
|
('msg', _SysWMUnion),
|
||||||
|
)
|
||||||
|
|
||||||
|
class Keysym(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('scancode', Scancode),
|
||||||
|
('keycode', Keycode),
|
||||||
|
('mod', ctypes.c_uint16),
|
||||||
|
('unicode', ctypes.c_uint32),
|
||||||
|
)
|
||||||
|
|
||||||
|
class WindowEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('event', ctypes.c_uint8),
|
||||||
|
('_padding1', ctypes.c_uint8),
|
||||||
|
('_padding2', ctypes.c_uint8),
|
||||||
|
('_padding3', ctypes.c_uint8),
|
||||||
|
('data1', ctypes.c_int),
|
||||||
|
('data2', ctypes.c_int),
|
||||||
|
)
|
||||||
|
|
||||||
|
class KeyboardEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('state', ctypes.c_uint8),
|
||||||
|
('repeat', ctypes.c_uint8),
|
||||||
|
('_padding2', ctypes.c_uint8),
|
||||||
|
('_padding3', ctypes.c_uint8),
|
||||||
|
('keysym', Keysym),
|
||||||
|
)
|
||||||
|
|
||||||
|
class TextEditingEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('text', ctypes.c_char*32),
|
||||||
|
('start', ctypes.c_int),
|
||||||
|
('length', ctypes.c_int),
|
||||||
|
)
|
||||||
|
|
||||||
|
class TextInputEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('text', ctypes.c_char*32),
|
||||||
|
)
|
||||||
|
|
||||||
|
class MouseMotionEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('state', ctypes.c_uint8),
|
||||||
|
('_padding1', ctypes.c_uint8),
|
||||||
|
('_padding2', ctypes.c_uint8),
|
||||||
|
('_padding3', ctypes.c_uint8),
|
||||||
|
('x', ctypes.c_int),
|
||||||
|
('y', ctypes.c_int),
|
||||||
|
('x_rel', ctypes.c_int),
|
||||||
|
('y_rel', ctypes.c_int),
|
||||||
|
)
|
||||||
|
|
||||||
|
class MouseButtonEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('button', ctypes.c_uint8),
|
||||||
|
('istate', ctypes.c_uint8),
|
||||||
|
('_padding1', ctypes.c_uint8),
|
||||||
|
('_padding2', ctypes.c_uint8),
|
||||||
|
('x', ctypes.c_int),
|
||||||
|
('y', ctypes.c_int),
|
||||||
|
)
|
||||||
|
|
||||||
|
class MouseWheelEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('x', ctypes.c_int),
|
||||||
|
('y', ctypes.c_int),
|
||||||
|
)
|
||||||
|
|
||||||
|
class JoyAxisEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('which', ctypes.c_uint8),
|
||||||
|
('axis', ctypes.c_uint8),
|
||||||
|
('_padding1', ctypes.c_uint8),
|
||||||
|
('_padding2', ctypes.c_uint8),
|
||||||
|
('value', ctypes.c_int),
|
||||||
|
)
|
||||||
|
|
||||||
|
class JoyBallEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('which', ctypes.c_uint8),
|
||||||
|
('ball', ctypes.c_uint8),
|
||||||
|
('_padding1', ctypes.c_uint8),
|
||||||
|
('_padding2', ctypes.c_uint8),
|
||||||
|
('xrel', ctypes.c_int),
|
||||||
|
('yrel', ctypes.c_int),
|
||||||
|
)
|
||||||
|
|
||||||
|
class JoyHatEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('which', ctypes.c_uint8),
|
||||||
|
('hat', ctypes.c_uint8),
|
||||||
|
('value', ctypes.c_uint8),
|
||||||
|
('_padding1', ctypes.c_uint8),
|
||||||
|
)
|
||||||
|
|
||||||
|
class JoyButtonEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('which', ctypes.c_uint8),
|
||||||
|
('button', ctypes.c_uint8),
|
||||||
|
('state', ctypes.c_uint8),
|
||||||
|
('_padding1', ctypes.c_uint8),
|
||||||
|
)
|
||||||
|
|
||||||
|
class TouchFingerEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('touch_id', TouchID),
|
||||||
|
('finger_id', FingerID),
|
||||||
|
('state', ctypes.c_uint8),
|
||||||
|
('_padding1', ctypes.c_uint8),
|
||||||
|
('_padding2', ctypes.c_uint8),
|
||||||
|
('_padding3', ctypes.c_uint8),
|
||||||
|
('x', ctypes.c_uint16),
|
||||||
|
('y', ctypes.c_uint16),
|
||||||
|
('dx', ctypes.c_int16),
|
||||||
|
('dy', ctypes.c_int16),
|
||||||
|
('pressure', ctypes.c_uint16),
|
||||||
|
)
|
||||||
|
|
||||||
|
class TouchFingerEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('touch_id', TouchID),
|
||||||
|
('state', ctypes.c_uint8),
|
||||||
|
('button', ctypes.c_uint8),
|
||||||
|
('_padding1', ctypes.c_uint8),
|
||||||
|
('_padding2', ctypes.c_uint8),
|
||||||
|
)
|
||||||
|
|
||||||
|
class MultiGestureEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('touch_id', TouchID),
|
||||||
|
('d_theta', ctypes.c_float),
|
||||||
|
('d_dist', ctypes.c_float),
|
||||||
|
('x', ctypes.c_float),
|
||||||
|
('y', ctypes.c_float),
|
||||||
|
('num_fingers', ctypes.c_uint16),
|
||||||
|
('padding', ctypes.c_uint16),
|
||||||
|
)
|
||||||
|
|
||||||
|
class DollarGestureEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('touch_id', TouchID),
|
||||||
|
('gesture_id', GestureID),
|
||||||
|
('num_fingers', ctypes.c_uint32),
|
||||||
|
('error', ctypes.c_float),
|
||||||
|
# these are commented out in the header, maybe coming soon
|
||||||
|
#('x', ctypes.c_float),
|
||||||
|
#('y', ctypes.c_float),
|
||||||
|
)
|
||||||
|
|
||||||
|
class QuitEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
)
|
||||||
|
|
||||||
|
class UserEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window_id', ctypes.c_uint32),
|
||||||
|
('code', ctypes.c_int),
|
||||||
|
('data1', ctypes.c_void_p),
|
||||||
|
('data2', ctypes.c_void_p),
|
||||||
|
)
|
||||||
|
|
||||||
|
class SysWMEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('msg', ctypes.POINTER(SysWMmsg)),
|
||||||
|
)
|
||||||
|
|
||||||
|
class ActiveEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('gain', ctypes.c_uint8),
|
||||||
|
('state', ctypes.c_uint8),
|
||||||
|
)
|
||||||
|
|
||||||
|
class ResizeEvent(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
('types', ctypes.c_uint32),
|
||||||
|
('w', ctypes.c_int),
|
||||||
|
('h', ctypes.c_int),
|
||||||
|
)
|
||||||
|
|
||||||
|
class Event(ctypes.Union):
|
||||||
|
_fields_ = (
|
||||||
|
('type', ctypes.c_uint32),
|
||||||
|
('window', WindowEvent),
|
||||||
|
('key', KeyboardEvent),
|
||||||
|
('edit', TextEditingEvent),
|
||||||
|
('text', TextInputEvent),
|
||||||
|
('motion', MouseMotionEvent),
|
||||||
|
('button', MouseButtonEvent),
|
||||||
|
('wheel', MouseWheelEvent),
|
||||||
|
('jaxis', JoyAxisEvent),
|
||||||
|
('jball', JoyBallEvent),
|
||||||
|
('jbutton', JoyButtonEvent),
|
||||||
|
('quit', QuitEvent),
|
||||||
|
('user', UserEvent),
|
||||||
|
('syswm', SysWMEvent),
|
||||||
|
('tfinger', TouchFingerEvent),
|
||||||
|
#('tbutton', TouchButtonEvent),
|
||||||
|
('mgesture', MultiGestureEvent),
|
||||||
|
('dgesture', DollarGestureEvent),
|
||||||
|
('active', ActiveEvent),
|
||||||
|
('resize', ResizeEvent),
|
||||||
|
)
|
||||||
|
|
||||||
|
# not implemented:
|
||||||
|
# SDL_AddEventWatch,SDL_DelEventWatch - void*
|
||||||
|
# SDL_FilterEvents,SDL_SetEventFilter,SDL_GetEventFilter - void*
|
||||||
|
|
||||||
|
def pump_events():
|
||||||
|
_SDL.SDL_PumpEvents()
|
||||||
|
|
||||||
|
def peep_events(events, num_events, action, min_type, max_type):
|
||||||
|
return errcheck(_SDL>SDL_PeepEvents(events, numevents, action,
|
||||||
|
min_type, max_type))
|
||||||
|
|
||||||
|
def has_event(type):
|
||||||
|
return _SDL.SDL_HasEvent(type) == 1
|
||||||
|
|
||||||
|
def has_events(min_type, max_type):
|
||||||
|
return _SDL.SDL_HasEvents(min_type, max_type) == 1
|
||||||
|
|
||||||
|
def flush_event(type):
|
||||||
|
_SDL.SDL_FlushEvent(type)
|
||||||
|
|
||||||
|
def flush_events(min_type, max_type):
|
||||||
|
_SDL.SDL_FlushEvents(min_type, max_type)
|
||||||
|
|
||||||
|
def poll_event():
|
||||||
|
event = Event()
|
||||||
|
retval = _SDL.SDL_PollEvent(ctypes.byref(event))
|
||||||
|
if retval:
|
||||||
|
return event
|
||||||
|
|
||||||
|
def wait_event(timeout=0):
|
||||||
|
event = Event()
|
||||||
|
|
||||||
|
if timeout:
|
||||||
|
retval = _SDL.SDL_WaitEvent(ctypes.byref(event))
|
||||||
|
else:
|
||||||
|
retval = _SDL.SDL_WaitEventTimeout(ctypes.byref(event), timeout)
|
||||||
|
|
||||||
|
if retval:
|
||||||
|
return event
|
||||||
|
|
||||||
|
def push_event(event):
|
||||||
|
return errcheck(_SDL.SDL_PushEvent(ctypes.byref(event)))
|
||||||
|
|
||||||
|
def event_state(type, state):
|
||||||
|
errcheck(_SDL.SDL_EventState(type, state))
|
||||||
|
|
||||||
|
def register_events(num_events):
|
||||||
|
return _SDL.SDL_RegisterEvents(num_events)
|
||||||
|
@ -11,3 +11,17 @@ def errcheck(result):
|
|||||||
raise SDLError(msg)
|
raise SDLError(msg)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
# moved here so events.SysWMmsg can get at it
|
||||||
|
class Version(ctypes.Structure):
|
||||||
|
_fields_ = (
|
||||||
|
("major", ctypes.c_uint8),
|
||||||
|
("minor", ctypes.c_uint8),
|
||||||
|
("patch", ctypes.c_uint8)
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return '{0}.{1}.{2}'.format(self.major, self.minor, self.patch)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return 'Version({0},{1},{2})'.format(self.major, self.minor,
|
||||||
|
self.patch)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
from csdl import init, INIT
|
from csdl import init, INIT
|
||||||
from csdl.video import Window, Rect
|
from csdl.video import Window, Rect
|
||||||
|
from csdl.events import EventType, poll_event
|
||||||
import random
|
import random
|
||||||
import time
|
import time
|
||||||
|
|
||||||
@ -8,6 +9,13 @@ def main():
|
|||||||
window = Window('test', 100, 100, 512, 512, 0)
|
window = Window('test', 100, 100, 512, 512, 0)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
while True:
|
||||||
|
event = poll_event()
|
||||||
|
if not event:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print event.type
|
||||||
|
|
||||||
window.renderer.set_draw_color(0,0,0,255)
|
window.renderer.set_draw_color(0,0,0,255)
|
||||||
window.renderer.clear()
|
window.renderer.clear()
|
||||||
window.renderer.set_draw_color(255,0,0,255)
|
window.renderer.set_draw_color(255,0,0,255)
|
||||||
|
Loading…
Reference in New Issue
Block a user