2323
2424 Tested configurations:
2525 - SDL2 2.0.5 with PySDL2 0.9.3 on Fedora 25 (x86_64)
26+ - SDL2 with PySDL2 0.9.5 on Ubuntu 14.04
2627"""
2728
2829import os
@@ -88,6 +89,7 @@ def main():
8889 browser .SendFocusEvent (True )
8990 browser .WasResized ()
9091 # Begin the main rendering loop
92+ shiftDown = False
9193 running = True
9294 while running :
9395 # Convert SDL2 events into CEF events (where appropriate)
@@ -100,27 +102,144 @@ def main():
100102 if event .button .button == sdl2 .SDL_BUTTON_LEFT :
101103 if event .button .y > headerHeight :
102104 # Mouse click triggered in browser region
103- browser .SendMouseClickEvent (event .button .x , event .button .y - headerHeight , cef .MOUSEBUTTON_LEFT , False , 1 )
105+ browser .SendMouseClickEvent (
106+ event .button .x ,
107+ event .button .y - headerHeight ,
108+ cef .MOUSEBUTTON_LEFT ,
109+ False ,
110+ 1
111+ )
104112 elif event .type == sdl2 .SDL_MOUSEBUTTONUP :
105113 if event .button .button == sdl2 .SDL_BUTTON_LEFT :
106114 if event .button .y > headerHeight :
107115 # Mouse click triggered in browser region
108- browser .SendMouseClickEvent (event .button .x , event .button .y - headerHeight , cef .MOUSEBUTTON_LEFT , True , 1 )
116+ browser .SendMouseClickEvent (
117+ event .button .x ,
118+ event .button .y - headerHeight ,
119+ cef .MOUSEBUTTON_LEFT ,
120+ True ,
121+ 1
122+ )
109123 elif event .type == sdl2 .SDL_MOUSEMOTION :
110124 if event .button .y > headerHeight :
111125 # Mouse click triggered in browser region
112126 browser .SendMouseMoveEvent (event .button .x , event .button .y - headerHeight , True )
127+ elif event .type == sdl2 .SDL_TEXTINPUT :
128+ # Handle text events to get actual characters typed rather than the key pressed
129+ keycode = ord (event .text .text )
130+ key_event = {
131+ "type" : cef .KEYEVENT_CHAR ,
132+ "windows_key_code" : keycode ,
133+ "character" : keycode ,
134+ "unmodified_character" : keycode ,
135+ "modifiers" : cef .EVENTFLAG_NONE
136+ }
137+ browser .SendKeyEvent (key_event )
138+ key_event = {
139+ "type" : cef .KEYEVENT_KEYUP ,
140+ "windows_key_code" : keycode ,
141+ "character" : keycode ,
142+ "unmodified_character" : keycode ,
143+ "modifiers" : cef .EVENTFLAG_NONE
144+ }
145+ browser .SendKeyEvent (key_event )
146+ elif event .type == sdl2 .SDL_KEYDOWN :
147+ # Handle key down events for non-text keys
148+ if event .key .keysym .sym == sdl2 .SDLK_RETURN :
149+ keycode = event .key .keysym .sym
150+ key_event = {
151+ "type" : cef .KEYEVENT_CHAR ,
152+ "windows_key_code" : keycode ,
153+ "character" : keycode ,
154+ "unmodified_character" : keycode ,
155+ "modifiers" : cef .EVENTFLAG_NONE
156+ }
157+ browser .SendKeyEvent (key_event )
158+ elif event .key .keysym .sym in [
159+ sdl2 .SDLK_BACKSPACE ,
160+ sdl2 .SDLK_DELETE ,
161+ sdl2 .SDLK_LEFT ,
162+ sdl2 .SDLK_RIGHT ,
163+ sdl2 .SDLK_UP ,
164+ sdl2 .SDLK_DOWN ,
165+ sdl2 .SDLK_HOME ,
166+ sdl2 .SDLK_END
167+ ]:
168+ 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 )
177+ elif event .type == sdl2 .SDL_KEYUP :
178+ # Handle key up events for non-text keys
179+ if event .key .keysym .sym in [
180+ sdl2 .SDLK_RETURN ,
181+ sdl2 .SDLK_BACKSPACE ,
182+ sdl2 .SDLK_DELETE ,
183+ sdl2 .SDLK_LEFT ,
184+ sdl2 .SDLK_RIGHT ,
185+ sdl2 .SDLK_UP ,
186+ sdl2 .SDLK_DOWN ,
187+ sdl2 .SDLK_HOME ,
188+ sdl2 .SDLK_END
189+ ]:
190+ 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 )
113199 # Clear the renderer
114- sdl2 .SDL_SetRenderDrawColor (renderer , backgroundColour .r , backgroundColour .g , backgroundColour .b , 255 )
200+ sdl2 .SDL_SetRenderDrawColor (
201+ renderer ,
202+ backgroundColour .r ,
203+ backgroundColour .g ,
204+ backgroundColour .b ,
205+ 255
206+ )
115207 sdl2 .SDL_RenderClear (renderer )
116208 # Tell CEF to update which will trigger the OnPaint
117209 # method of the RenderHandler instance
118210 cef .MessageLoopWork ()
119211 # Update display
120- sdl2 .SDL_RenderCopy (renderer , renderHandler .texture , None , sdl2 .SDL_Rect (0 , headerHeight , browserWidth , browserHeight ))
212+ sdl2 .SDL_RenderCopy (
213+ renderer ,
214+ renderHandler .texture ,
215+ None ,
216+ sdl2 .SDL_Rect (0 , headerHeight , browserWidth , browserHeight )
217+ )
121218 sdl2 .SDL_RenderPresent (renderer )
122219 # User exited
123220 exit_app ()
221+
222+ def getKeyCode (key ):
223+ """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" )
124243
125244class LoadHandler (object ):
126245 """Simple handler for loading URLs."""
@@ -207,7 +326,17 @@ def OnPaint(self, browser, element_type, paint_buffer, **_):
207326
208327 pxbuf = image .tobytes ()
209328 # Create surface
210- surface = sdl2 .SDL_CreateRGBSurfaceFrom (pxbuf , self .__width , self .__height , depth , pitch , rmask , gmask , bmask , amask )
329+ surface = sdl2 .SDL_CreateRGBSurfaceFrom (
330+ pxbuf ,
331+ self .__width ,
332+ self .__height ,
333+ depth ,
334+ pitch ,
335+ rmask ,
336+ gmask ,
337+ bmask ,
338+ amask
339+ )
211340 if self .texture :
212341 # free memory used by previous texture
213342 sdl2 .SDL_DestroyTexture (self .texture )
0 commit comments