2424 Tested configurations:
2525 - SDL2 2.0.5 with PySDL2 0.9.3 on Fedora 25 (x86_64)
2626 - SDL2 with PySDL2 0.9.5 on Ubuntu 14.04
27+
28+ Event handling:
29+
30+ Where possible SDL2 events are mapped to CEF ones. Not all keyboard
31+ modifiers are handled in this example but these could be
32+ add by the reader (if desired).
33+
34+ Due to SDL2's lack of GUI widgets there are no GUI controls
35+ for the user. However, as an exercise this example could
36+ be extended by create some simple SDL2 widgets. An example of
37+ widgets made using PySDL2 can be found as part of the Pi
38+ Entertainment System at:
39+ https://github.com/neilmunday/pes/blob/master/lib/pes/ui.py
2740"""
2841
2942import os
@@ -55,6 +68,8 @@ def main():
5568 headerHeight = 0
5669 browserHeight = height - headerHeight
5770 browserWidth = width
71+ # Mouse wheel fudge to enhance scrolling
72+ scrollEnhance = 20
5873 # Initialise CEF for offscreen rendering
5974 WindowUtils = cef .WindowUtils ()
6075 sys .excepthook = cef .ExceptHook
@@ -121,9 +136,22 @@ def main():
121136 1
122137 )
123138 elif event .type == sdl2 .SDL_MOUSEMOTION :
124- if event .button .y > headerHeight :
125- # Mouse click triggered in browser region
126- browser .SendMouseMoveEvent (event .button .x , event .button .y - headerHeight , True )
139+ if event .motion .y > headerHeight :
140+ # Mouse move triggered in browser region
141+ browser .SendMouseMoveEvent (event .motion .x , event .motion .y - headerHeight , False )
142+ elif event .type == sdl2 .SDL_MOUSEWHEEL :
143+ # Mouse wheel event
144+ x = event .wheel .x
145+ if x < 0 :
146+ x -= scrollEnhance
147+ else :
148+ x += scrollEnhance
149+ y = event .wheel .y
150+ if y < 0 :
151+ y -= scrollEnhance
152+ else :
153+ y += scrollEnhance
154+ browser .SendMouseWheelEvent (0 , 0 , x , y )
127155 elif event .type == sdl2 .SDL_TEXTINPUT :
128156 # Handle text events to get actual characters typed rather than the key pressed
129157 keycode = ord (event .text .text )
@@ -166,14 +194,15 @@ def main():
166194 sdl2 .SDLK_END
167195 ]:
168196 keycode = getKeyCode (event .key .keysym .sym )
169- key_event = {
170- "type" : cef .KEYEVENT_RAWKEYDOWN ,
171- "windows_key_code" : keycode ,
172- "character" : keycode ,
173- "unmodified_character" : keycode ,
174- "modifiers" : cef .EVENTFLAG_NONE
175- }
176- browser .SendKeyEvent (key_event )
197+ if keycode != None :
198+ key_event = {
199+ "type" : cef .KEYEVENT_RAWKEYDOWN ,
200+ "windows_key_code" : keycode ,
201+ "character" : keycode ,
202+ "unmodified_character" : keycode ,
203+ "modifiers" : cef .EVENTFLAG_NONE
204+ }
205+ browser .SendKeyEvent (key_event )
177206 elif event .type == sdl2 .SDL_KEYUP :
178207 # Handle key up events for non-text keys
179208 if event .key .keysym .sym in [
@@ -188,14 +217,15 @@ def main():
188217 sdl2 .SDLK_END
189218 ]:
190219 keycode = getKeyCode (event .key .keysym .sym )
191- key_event = {
192- "type" : cef .KEYEVENT_KEYUP ,
193- "windows_key_code" : keycode ,
194- "character" : keycode ,
195- "unmodified_character" : keycode ,
196- "modifiers" : cef .EVENTFLAG_NONE
197- }
198- browser .SendKeyEvent (key_event )
220+ if keycode != None :
221+ key_event = {
222+ "type" : cef .KEYEVENT_KEYUP ,
223+ "windows_key_code" : keycode ,
224+ "character" : keycode ,
225+ "unmodified_character" : keycode ,
226+ "modifiers" : cef .EVENTFLAG_NONE
227+ }
228+ browser .SendKeyEvent (key_event )
199229 # Clear the renderer
200230 sdl2 .SDL_SetRenderDrawColor (
201231 renderer ,
@@ -221,25 +251,22 @@ def main():
221251
222252def getKeyCode (key ):
223253 """Helper function to convert SDL2 key codes to cef ones"""
224- if key == sdl2 .SDLK_RETURN :
225- return 13
226- if key == sdl2 .SDLK_DELETE :
227- return 46
228- if key == sdl2 .SDLK_BACKSPACE :
229- return 8
230- if key == sdl2 .SDLK_LEFT :
231- return 37
232- if key == sdl2 .SDLK_RIGHT :
233- return 39
234- if key == sdl2 .SDLK_UP :
235- return 38
236- if key == sdl2 .SDLK_DOWN :
237- return 40
238- if key == sdl2 .SDLK_HOME :
239- return 36
240- if key == sdl2 .SDLK_END :
241- return 35
242- raise Exception ("Invalid key" )
254+ keyMap = {
255+ sdl2 .SDLK_RETURN : 13 ,
256+ sdl2 .SDLK_DELETE : 46 ,
257+ sdl2 .SDLK_BACKSPACE : 8 ,
258+ sdl2 .SDLK_LEFT : 37 ,
259+ sdl2 .SDLK_RIGHT : 39 ,
260+ sdl2 .SDLK_UP : 38 ,
261+ sdl2 .SDLK_DOWN : 40 ,
262+ sdl2 .SDLK_HOME : 36 ,
263+ sdl2 .SDLK_END : 35 ,
264+ }
265+ if key in keyMap :
266+ return keyMap [key ]
267+ # Key not mapped, raise exception
268+ print ("Keyboard mapping incomplete: unsupported SDL key %d. See https://wiki.libsdl.org/SDLKeycodeLookup for mapping." % key )
269+ return None
243270
244271class LoadHandler (object ):
245272 """Simple handler for loading URLs."""
@@ -252,7 +279,6 @@ def OnLoadError(self, browser, frame, error_code, failed_url, **_):
252279 if not frame .IsMain ():
253280 return
254281 print ("Failed to load %s" % failed_url )
255- cef .PostTask (cef .TID_UI , exit_app , browser )
256282
257283class RenderHandler (object ):
258284 """
0 commit comments