Skip to content
This repository was archived by the owner on Aug 2, 2025. It is now read-only.

Commit 5c66015

Browse files
committed
Added keyboard handlers to panda3d example.
Updated VirtualKey codes, added new keys and descriptions.
1 parent a0fec9a commit 5c66015

File tree

2 files changed

+288
-176
lines changed

2 files changed

+288
-176
lines changed

cefpython/cef1/windows/binaries/panda3d_.py

Lines changed: 102 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
else:
3131
raise Exception("Unsupported python version: %s" % sys.version)
3232

33+
from pandac.PandaModules import loadPrcFileData
34+
loadPrcFileData("", "Panda3D example")
35+
loadPrcFileData("", "fullscreen 0")
36+
loadPrcFileData("", "win-size 1024 768")
37+
3338
import direct.directbase.DirectStart
3439
from panda3d.core import *
3540
from direct.showbase.DirectObject import DirectObject
@@ -43,12 +48,11 @@ class World(DirectObject):
4348
texture = None
4449
nodePath = None
4550
lastMouseMove = (-1, -1)
51+
translateKeys = None
52+
keyModifiers = 0
53+
modifierKeys = None
4654

4755
def __init__(self):
48-
wp = WindowProperties()
49-
wp.setTitle('Panda3D example')
50-
base.win.requestProperties(wp)
51-
5256
environ = loader.loadModel("models/environment")
5357
environ.reparentTo(render)
5458
environ.setScale(0.25,0.25,0.25)
@@ -83,14 +87,11 @@ def __init__(self):
8387
# SetFocus needs to be called after browser creation.
8488
if platform.system() == "Windows":
8589
ctypes.windll.user32.SetFocus(windowHandle)
90+
self.browser.SendFocusEvent(True)
8691

8792
self.setBrowserSize()
8893
self.accept("window-event", self.setBrowserSize)
8994

90-
# Browser methods for sending mouse/keyboard/focus events:
91-
# SendKeyEvent(), SendMouseClickEvent(), SendMouseMoveEvent(),
92-
# SendMouseWheelEvent(), SendFocusEvent(), SendCaptureLostEvent().
93-
9495
self.initMouseHandlers()
9596
self.initKeyboardHandlers()
9697

@@ -104,14 +105,97 @@ def setBrowserSize(self, window=None):
104105
self.browser.SetSize(cefpython.PET_VIEW, width, height)
105106

106107
def initMouseHandlers(self):
108+
# Browser methods for sending mouse/keyboard/focus events:
109+
# SendKeyEvent(), SendMouseClickEvent(), SendMouseMoveEvent(),
110+
# SendMouseWheelEvent(), SendFocusEvent(), SendCaptureLostEvent().
111+
107112
taskMgr.add(self.onMouseMove, "onMouseMove")
108113
self.accept("mouse1", self.onMouseDown)
109114
self.accept("mouse1-up", self.onMouseUp)
110115
self.accept("wheel_up", self.onMouseWheelUp)
111116
self.accept("wheel_down", self.onMouseWheelDown)
112117

113118
def initKeyboardHandlers(self):
114-
pass
119+
self.translateKeys = {
120+
"f1": cefpython.VK_F1, "f2": cefpython.VK_F2,
121+
"f3": cefpython.VK_F3, "f4": cefpython.VK_F4,
122+
"f5": cefpython.VK_F5, "f6": cefpython.VK_F6,
123+
"f7": cefpython.VK_F7, "f8": cefpython.VK_F8,
124+
"f9": cefpython.VK_F9, "f10": cefpython.VK_F10,
125+
"f11": cefpython.VK_F11, "f12": cefpython.VK_F12,
126+
127+
"arrow_left": cefpython.VK_LEFT,
128+
"arrow_up": cefpython.VK_UP,
129+
"arrow_down": cefpython.VK_DOWN,
130+
"arrow_right": cefpython.VK_RIGHT,
131+
132+
"enter": cefpython.VK_RETURN,
133+
"tab": cefpython.VK_TAB,
134+
"space": cefpython.VK_SPACE,
135+
"escape": cefpython.VK_ESCAPE,
136+
"backspace": cefpython.VK_BACK,
137+
"insert": cefpython.VK_INSERT,
138+
"delete": cefpython.VK_DELETE,
139+
"home": cefpython.VK_HOME,
140+
"end": cefpython.VK_END,
141+
"page_up": cefpython.VK_PAGEUP,
142+
"page_down": cefpython.VK_PAGEDOWN,
143+
144+
"num_lock": cefpython.VK_NUMLOCK,
145+
"caps_lock": cefpython.VK_CAPITAL,
146+
"scroll_lock": cefpython.VK_SCROLL,
147+
148+
"lshift": cefpython.VK_LSHIFT,
149+
"rshift": cefpython.VK_RSHIFT,
150+
"lcontrol": cefpython.VK_LCONTROL,
151+
"rcontrol": cefpython.VK_RCONTROL,
152+
"lalt": cefpython.VK_LMENU,
153+
"ralt": cefpython.VK_RMENU,
154+
}
155+
156+
base.buttonThrowers[0].node().setKeystrokeEvent('keystroke')
157+
base.buttonThrowers[0].node().setButtonDownEvent('button-down')
158+
base.buttonThrowers[0].node().setButtonUpEvent('button-up')
159+
base.buttonThrowers[0].node().setButtonRepeatEvent('button-repeat')
160+
161+
self.accept("keystroke", self.onKeystroke)
162+
self.accept("button-down", self.onButtonDown)
163+
self.accept("button-up", self.onButtonUp)
164+
self.accept("button-repeat", self.onButtonDown)
165+
166+
self.keyModifiers = 0
167+
self.modifierKeys = {
168+
"shift": cefpython.KEY_SHIFT,
169+
"ctrl": cefpython.KEY_CTRL,
170+
"alt": cefpython.KEY_ALT
171+
}
172+
173+
def keyInfo(self, key):
174+
if platform.system() == "Windows":
175+
return (key, 0, 0)
176+
elif platform.system() == "Darwin":
177+
return (key, 0, 0)
178+
elif platform.system() == "Linux":
179+
return (key,)
180+
181+
def onKeystroke(self, key):
182+
self.browser.SendKeyEvent(cefpython.KEYTYPE_CHAR,
183+
self.keyInfo(ord(key)), 0)
184+
185+
def onButtonDownOrUp(self, keyType, key):
186+
if self.modifierKeys.has_key(key):
187+
self.keyModifiers |= self.modifierKeys[key]
188+
else:
189+
if self.translateKeys.has_key(key):
190+
self.browser.SendKeyEvent(keyType,
191+
self.keyInfo(self.translateKeys[key]),
192+
self.keyModifiers)
193+
194+
def onButtonDown(self, key):
195+
self.onButtonDownOrUp(cefpython.KEYTYPE_KEYDOWN, key)
196+
197+
def onButtonUp(self, key):
198+
self.onButtonDownOrUp(cefpython.KEYTYPE_KEYUP, key)
115199

116200
def isMouseInsideBrowser(self, mouse):
117201
if mouse.getX() >= -0.75 and mouse.getX() <= 0.75 and (
@@ -208,6 +292,15 @@ def OnPaint(self, browser, paintElementType, dirtyRects, buffer):
208292
img = self.texture.modifyRamImage()
209293
img.setData(buffer.GetString(mode="bgra", origin="bottom-left"))
210294

295+
def GetViewRect(self, browser, rect):
296+
print("GetViewRect()")
297+
298+
def GetScreenRect(self, browser, rect):
299+
print("GetScreenRect()")
300+
301+
def GetScreenPoint(self, browser, viewX, viewY, screenCoordinates):
302+
print("GetScreenPoint()")
303+
211304
def OnLoadEnd(self, browser, frame, httpStatusCode):
212305
return
213306
self._saveImage()

0 commit comments

Comments
 (0)