[Scummvm-devel] RFC: Flexible keymapping via new EVENT_ (post 0.10)
Max Horn
max at quendi.de
Mon Jun 4 23:38:31 CEST 2007
Hi folks,
recently a new event was added: EVENT_PREDICTIVE_DIALOG; Kostas
already informed us via an explanatory email about its purpose. Short
version of the story, this event can be used to tell the frontend
(i.e. the game engine) to show a special dialog, if desired/required.
However, I think this event is rather to special and to narrow in
scope. So I was thinking about this, and I came up with the following
idea, and I hope I'll get some helpful comments from you guys.
In short, I'd propose to replace EVENT_PREDICTIVE_DIALOG with a new
more generic event, by letting a frontend specify an arbitrary list
of actions which the backend should map to a button or hotkey. This
list would contain structs similar to this:
struct UserAction {
UserActionType type; // an enum type, see below
String description; // Human readable description, for a GUI
keymapping config dialog
KeyDesc defaultKey; // an (optional) default key combo to be
assigned to this; includes modifier state
// ... your idea goes here
};
The UserActionType might look like this:
enum UserActionType {
kQuitUserAction, // *maybe* could replace EVENT_QUIT
kPredictiveDialogUserAction,
kOptionsDialogUserAction,
kSaveLoadDialogUserAction,
kPauseUserAction,
...
kGenericUserAction
};
The backend then would use this information to map triggers to
actions; either by using the provided defaultKeys; or by using custom
hard mappings (based on the UserType, or on the currently running
game/engine); or by letting the user configure this via a trigger/
hotkey mapping dialog (that's what the "description" field is for); etc.
Then, whenever such a trigger occurs, instead of sending a regular
keyboard event, the backend generates the appropriate useraction
event (might be named EVENT_USERACTION). The goal here is to replace
EVENT_PREDICTIVE_DIALOG (and maybe EVENT_QUIT) with a more generic
and powerful setup. Oh, also hacks like "KEY_ALL_SKIP" could be
subsumed under this. And hopefully many other similar hacks, which
currently backends with few keys have to use to map their few input
triggers in a sensible way to the various actions our many engines
provide.
How to implement this, w/o too much effort? Well, the mapping code
would go into the EventManager. The default event manager would
simply use the specified defaultKey verbatim. Backend which want
enhanced mapping capabilities (e.g. to map PDA buttons to actions)
would have to use a custom event manager, but that shouldn't be a
major problem.
Over time, we could adapt our engines to register their standard
hotkeys/actions via the new API. E.g. in the SCUMM engine, at least
F5 (save/load) and space (pause) come immediately to mind, but many
more certainly would be desirable.
My hope is that by breaking this down into sensible small pieces, it
should be possible to implement this gradually and w/o too much
effort, w/o requiring backend authors to add extra code, unless they
want to; and finally, with minimal impact on engines (maybe the
handling of EVENT_QUIT has to be changed, but that'd be a no-
brainer). The gain would initial not be too big. Over time we'd
convert more and more engines to use it. My hope is that on the long
run it will allow us to get rid of many engine-specific hacks in
backends, will make user friendly key mapping dialog(s) possible, and
simply make it easier for us to add certain new features.
So, what do you think? Am I too ambitious? Is this overdesigned?
Better ideas? Improvements? Statements why we don't need this anyway?
Your input is highly welcome (although I don't really expect much, as
usual).
Cheers,
Max
More information about the Scummvm-devel
mailing list