Assistance needed testing keyboard input code on OSX 10.9

I am trying to debug a problem reported with our game on OSX 10.9 (Mavericks). I can’t reproduce the problem, this may be because I am using a PC keyboard and not a Mac keyboard. I’ve separated out a minimal code snippet which hopefully is enough to bring out the problem.

All it does is print out when keys are pressed and released in the console. Wondering if anyone would be kind enough to give it a test? Mostly just try pressing some keys like WASD, maybe also try while holding some modifier keys like shift. If the problem shows itself, you should see that a message is displayed when a key is pressed, but not when it is released. In any case if you could post the output from mashing a few keys it would be a great help to me.

Thanks.

from direct.showbase.ShowBase import ShowBase


class Game(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        self.keys = {}
        button_node = self.buttonThrowers[0].node()
        button_node.setButtonDownEvent('buttonDown')
        button_node.setButtonUpEvent('buttonUp')
        button_node.setKeystrokeEvent('keystroke')
        self.accept('buttonDown', self.key_down)
        self.accept('buttonUp', self.key_up)
        self.accept('keystroke', self.typekey)

    def pushkey(self, key, value):
        if not key in self.keys:
            self.keys[key] = 0
        if (not value and not self.keys[key]) or (value and self.keys[key]):
            # Key is already recorded as being in that state.
            return
        self.keys[key] = value
        print 'storing %s=%s' % (key, value)

    def key_down(self, value):
        print '%s pressed' % value
        if len(value) > 1 and '-' in value:
            value = value.split('-')[1]
        self.pushkey(value, 1)

    def key_up(self, value):
        print '%s released' % value
        if len(value) > 1 and '-' in value:
            value = value.split('-')[1]
        self.pushkey(value, 0)

    def typekey(self, key):
        pass


Game().run()

Does it require a build with Cocoa support or Carbon support? They use two different input systems. The old 1.8 releases are limited to Carbon.
Fwiw, this is a link to a recent build with Cocoa support:
rdb.name/Panda3D-1.9.0.dmg

Yep, this is on a cocoa build. Honestly, it could be a problem on carbon too, we never shipped a carbon build for testing.

I was able to produce a similar issue with Panda3D 1.8.1 on OSX 10.9.2 with want-tk set to t in Config.prc (note: I was not able to get any keyboard at all capture with want-tk set to f). The issue I saw was that key press events would fire late, or sporadically, or not at all, and I saw several instances where the key press event was fired but the release event was not.

I upgraded to the 1.9.0 build rdb posted and after I got it running, your code snippet looked a lot better. Here is some output from a run where I smacked a few keys and most of the modifiers:

Known pipe types:
  CocoaGraphicsPipe
(all display modules loaded.)
mouse1 pressed
storing mouse1=1
mouse1 released
storing mouse1=0
a pressed
storing a=1
s pressed
storing s=1
d pressed
storing d=1
f pressed
storing f=1
a released
storing a=0
s released
storing s=0
d released
storing d=0
f released
storing f=0
f pressed
storing f=1
a pressed
storing a=1
s pressed
storing s=1
f released
storing f=0
d pressed
storing d=1
a released
storing a=0
f pressed
storing f=1
s released
storing s=0
d released
storing d=0
f released
storing f=0
f pressed
storing f=1
a pressed
storing a=1
s pressed
storing s=1
f released
storing f=0
d pressed
storing d=1
a released
storing a=0
d released
storing d=0
s released
storing s=0
s pressed
storing s=1
d pressed
storing d=1
f pressed
storing f=1
s released
storing s=0
d released
storing d=0
f released
storing f=0
s pressed
storing s=1
f pressed
storing f=1
d pressed
storing d=1
s released
storing s=0
d released
storing d=0
f released
storing f=0
g pressed
storing g=1
g released
storing g=0
control pressed
storing control=1
lcontrol pressed
storing lcontrol=1
control-s pressed
storing s=1
control-d pressed
storing d=1
control-f pressed
storing f=1
s released
storing s=0
control-g pressed
storing g=1
d released
storing d=0
control-s pressed
storing s=1
s released
storing s=0
control-d pressed
storing d=1
g released
storing g=0
f released
storing f=0
d released
storing d=0
control-s pressed
storing s=1
control-g pressed
storing g=1
control-f pressed
storing f=1
s released
storing s=0
control-d pressed
storing d=1
g released
storing g=0
d released
storing d=0
f released
storing f=0
control released
storing control=0
lcontrol released
storing lcontrol=0
alt pressed
storing alt=1
lalt pressed
storing lalt=1
alt-s pressed
storing s=1
alt-d pressed
storing d=1
alt-f pressed
storing f=1
s released
storing s=0
alt-g pressed
storing g=1
d released
storing d=0
alt-s pressed
storing s=1
g released
storing g=0
f released
storing f=0
alt-f pressed
storing f=1
s released
storing s=0
alt-g pressed
storing g=1
alt-d pressed
storing d=1
g released
storing g=0
alt-s pressed
storing s=1
f released
storing f=0
d released
storing d=0
s released
storing s=0
alt released
storing alt=0
lalt released
storing lalt=0
meta pressed
storing meta=1
lmeta pressed
storing lmeta=1
meta-s pressed
storing s=1
meta-d pressed
storing d=1
meta-f pressed
storing f=1
s released
storing s=0
meta-g pressed
storing g=1
d released
storing d=0
meta-s pressed
storing s=1
f released
storing f=0
g released
storing g=0
meta-f pressed
storing f=1
s released
storing s=0
meta-g pressed
storing g=1
meta-d pressed
storing d=1
meta-s pressed
storing s=1
g released
storing g=0
f released
storing f=0
d released
storing d=0
s released
storing s=0
meta released
storing meta=0
lmeta released
storing lmeta=0
shift pressed
storing shift=1
lshift pressed
storing lshift=1
shift-s pressed
storing s=1
shift-d pressed
storing d=1
shift-f pressed
storing f=1
s released
storing s=0
shift-g pressed
storing g=1
d released
storing d=0
f released
storing f=0
shift-s pressed
storing s=1
g released
storing g=0
shift-d pressed
storing d=1
shift-f pressed
storing f=1
shift-g pressed
storing g=1
s released
storing s=0
d released
storing d=0
g released
storing g=0
f released
storing f=0
shift released
storing shift=0
lshift released
storing lshift=0
shift pressed
storing shift=1
lshift pressed
storing lshift=1
control pressed
storing control=1
lcontrol pressed
storing lcontrol=1
shift-control-s pressed
shift-control-d pressed
shift-control-g pressed
shift-control-f pressed
s released
g released
f released
shift-control-s pressed
d released
shift-control-g pressed
shift-control-f pressed
s released
shift-control-d pressed
shift-control-s pressed
g released
f released
d released
s released
shift released
storing shift=0
lshift released
storing lshift=0
control released
storing control=0
lcontrol released
storing lcontrol=0

Hope this helps!

Thank you for testing! I’ll have to put some time into updating my Panda build and give it another go.