Skip to content

Commit 152edfb

Browse files
committed
Added keyboard support
1 parent a782987 commit 152edfb

File tree

1 file changed

+134
-5
lines changed

1 file changed

+134
-5
lines changed

examples/pysdl2.py

Lines changed: 134 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
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

2829
import 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

125244
class 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

Comments
 (0)