[rlx] Key event data issues with SDL and RLX
David O'Toole
dto at gnu.org
Thu Mar 26 14:28:45 UTC 2009
Hello. Last night began some alpha testing of my new roguelike called
Invader, which uses LISPBUILDER-SDL. See also
http://dto.github.com/notebook/invader.html
I told everyone to use the latest svn of lispbuilder-sdl. But some
people have trouble controlling the game because modifiers are not
recognized properly. Indeed we seem to each be getting very different
data out of SDL. I added print statements to print out 1. the raw key
symbol and modifier data coming in from the SDL:WITH-EVENTS loop, and
2. the rlx-internal format these get translated into.
On my machine (debian lenny), pressing L, Control L, H, Alt H, gives this:
-----------------------------------
SDL KEY AND MODS: (SDL-KEY-L SDL-KEY-MOD-NONE)
TRANSLATED EVENT: (L)
SDL KEY AND MODS: (SDL-KEY-LCTRL SDL-KEY-MOD-NONE)
TRANSLATED EVENT: (LCTRL)
SDL KEY AND MODS: (SDL-KEY-L SDL-KEY-MOD-LCTRL)
TRANSLATED EVENT: (L CONTROL)
SDL KEY AND MODS: (SDL-KEY-H SDL-KEY-MOD-NONE)
TRANSLATED EVENT: (H)
SDL KEY AND MODS: (SDL-KEY-LALT SDL-KEY-MOD-NONE)
TRANSLATED EVENT: (LALT)
SDL KEY AND MODS: (SDL-KEY-H SDL-KEY-MOD-LALT)
TRANSLATED EVENT: (H ALT)
------------------------------------
Whereas on other machines things like this happen when you try to press
Alt-H:
SDL KEY AND MODS: (SDL-KEY-LALT 0)
TRANSLATED EVENT: (LALT)
SDL KEY AND MODS: (SDL-KEY-H 256)
TRANSLATED EVENT: (H)
SDL KEY AND MODS: (SDL-KEY-LCTRL 0)
TRANSLATED EVENT: (LCTRL)
-----------
Or Alt-F on yet another machine:
SDL KEY AND MODS: (SDL-KEY-F 0)
TRANSLATED EVENT: (F)
SDL KEY AND MODS: (SDL-KEY-LMETA 0)
TRANSLATED EVENT: (LMETA)
SDL KEY AND MODS: (SDL-KEY-F 1024)
TRANSLATED EVENT: (F)
------------
It appears that I am always expecting a symbol or list of symbols for
the :mod argument of :key-down-event in WITH-EVENTS. But on other
machines people are getting numbers there.
But according to the LISPBUILDER-SDL documentation you should always get
symbols to represent the modifiers:
> MOD is current state of the keyboard modifiers as explained in
> SDL_GetModState. One or more of :SDL-KEY-MOD-NONE,
> :SDL-KEY-MOD-LSHIFT, :SDL-KEY-MOD-RSHIFT, :SDL-KEY-MOD-LCTRL,
> :SDL-KEY-MOD-RCTRL, :SDL-KEY-MOD-LALT, :SDL-KEY-MOD-RALT,
> :SDL-KEY-MOD-LMETA, :SDL-KEY-MOD-RMETA, :SDL-KEY-MOD-NUM,
> :SDL-KEY-MOD-CAPS, :SDL-KEY-MOD-MODE or :SDL-KEY-MOD-RESERVED.
BTW All the relevant translation code is in one file, console.lisp:
http://github.com/dto/rlx/raw/d93976f46ac0c8579b44882b49a6a82c1ada17f1/console.lisp
In case you would like to inspect further.
--
David O'Toole dto at gnu.org
More information about the Rlx
mailing list