Skip to content

Commit 1bc4d7f

Browse files
committed
Fixed mouse motion handling and added wheel event handling.
1 parent 152edfb commit 1bc4d7f

File tree

1 file changed

+65
-39
lines changed

1 file changed

+65
-39
lines changed

examples/pysdl2.py

Lines changed: 65 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,19 @@
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

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

222252
def 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

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

257283
class RenderHandler(object):
258284
"""

0 commit comments

Comments
 (0)