1
0
Fork 0

Add and document KeyMapper reloading

This is accomplished by clearing all the binds on the events, and
then re-parsing the file.

This allows batch scripts to change keybindings, and is useful for DOS
game menus, who can now change the mappings per-game.
ie: config -set sdl mapperfile=~/.dosbox/mario-and-luigi.map
or: config -r -conf ~/.dosbox/mario-and-luigi.conf
(with a mapperfile=mario-and-luigi.map line in mario-and-luigi.conf)

Warning: Because internal changes don't have access to the
current_config_path, paths set with config -set are relative to the
CWD. Relevant source lines are src/misc/setup.cpp lines 349 and 917

I'm unsure if this interacts well with the CAPS and NUMLOCK code at the
bottom of MAPPER_Init, as those now get run every time the mapper
reloads. If it does misbehave, those if statements can probably be
moved to the MAPPER_StartUp function, although it is called a bit earlier
than MAPPER_Init.

A natural extension of this would be to add the ability to change the
mapperfile from within the MAPPER UI.
This commit is contained in:
Nopey Nope 2020-01-30 10:27:03 -08:00 committed by Patryk Obara
parent 2363ef9178
commit 7dbf5cece4
2 changed files with 38 additions and 10 deletions

18
README
View file

@ -712,23 +712,25 @@ CONFIG -get "section property"
config -set "cpu cycles=10000"
3. To turn EMS memory emulation off:
config -set "dos ems=false"
4. To check which cpu core is being used.
4. To change the key mappings
config -set "sdl mapperfile=/path/to/mapper-file.map"
5. To check which cpu core is being used.
config -get "cpu core"
5. To view the list of possible cpu cores:
6. To view the list of possible cpu cores:
config -help cpu core
6. To change the machine type and restart:
7. To change the machine type and restart:
config -set "machine cga"
config -wc -r
7. To configure the autoexec section to auto-mount a directory at start:
8. To configure the autoexec section to auto-mount a directory at start:
config -axadd "mount c c:\dosgames" "c:"
config -wc
8. To create a specific config file in the config directory:
9. To create a specific config file in the config directory:
config -set "dos ems=false"
config -set "cpu cycles=10000"
config -set "core dynamic"
config -axadd "mount c c:\dosgames" "c:" "cd my_game" "my_game"
config -wc my_config.conf
9. To restart DOSBox from a specific config file in the config directory:
10. To restart DOSBox from a specific config file in the config directory:
config -r -conf my_config.conf
LOADFIX [-size] [program] [program-parameters]
@ -1207,6 +1209,10 @@ the configuration file (the mapperfile= entry). At startup, DOSBox will load
your mapperfile, if it is present in the DOSBox configuration file.
Additionally, the mapperfile configuration entry can by changed with the CONFIG
program, and will take effect immediately.
config -set "sdl mapperfile=/path/to/mapper-file.map"
===================
8. Keyboard Layout:

View file

@ -112,6 +112,7 @@ public:
virtual ~CEvent() = default;
void AddBind(CBind * bind);
void ClearBinds();
virtual void Active(bool yesno)=0;
virtual void ActivateEvent(bool ev_trigger,bool skip_action)=0;
virtual void DeActivateEvent(bool ev_trigger)=0;
@ -282,6 +283,12 @@ void CEvent::AddBind(CBind * bind) {
bindlist.push_front(bind);
bind->event=this;
}
void CEvent::ClearBinds() {
for (CBind *bind : bindlist) {
delete bind;
}
bindlist.clear();
}
void CEvent::DeActivateAll(void) {
for (CBindList_it bit=bindlist.begin();bit!=bindlist.end();bit++) {
(*bit)->DeActivateBind(true);
@ -2137,7 +2144,14 @@ static struct {
{0, SDL_SCANCODE_UNKNOWN}
};
static void ClearAllBinds(void) {
for (CEvent *event : events) {
event->ClearBinds();
}
}
static void CreateDefaultBinds(void) {
ClearAllBinds();
char buffer[512];
Bitu i=0;
while (DefaultKeys[i].eventend) {
@ -2230,6 +2244,7 @@ static void MAPPER_SaveBinds(void) {
static bool MAPPER_LoadBinds(void) {
FILE * loadfile=fopen(mapper.filename.c_str(),"rt");
if (!loadfile) return false;
ClearAllBinds();
char linein[512];
while (fgets(linein,512,loadfile)) {
CreateStringBind(linein);
@ -2537,8 +2552,8 @@ void MAPPER_RunInternal() {
void MAPPER_Init(void) {
InitializeJoysticks();
CreateLayout();
CreateBindGroups();
if (buttons.empty()) CreateLayout();
if (bindgroups.empty()) CreateBindGroups();
if (!MAPPER_LoadBinds()) CreateDefaultBinds();
for (CButton_it but_it = buttons.begin();but_it!=buttons.end();but_it++) {
(*but_it)->BindColor();
@ -2557,12 +2572,19 @@ void MAPPER_Init(void) {
}
}
static void ReloadMapper(Section *sec) {
Section_prop const *const section=static_cast<Section_prop *>(sec);
Prop_path const *const pp = section->Get_path("mapperfile");
mapper.filename = pp->realpath;
GFX_LosingFocus(); //Release any keys pressed, or else they'll get stuck.
MAPPER_Init();
}
void MAPPER_StartUp(Section * sec) {
Section_prop * section=static_cast<Section_prop *>(sec);
section->AddInitFunction(&ReloadMapper, true); //runs immediately after this function ends
mapper.sticks.num=0;
mapper.sticks.num_groups=0;
memset(&virtual_joysticks,0,sizeof(virtual_joysticks));
Prop_path* pp = section->Get_path("mapperfile");
mapper.filename = pp->realpath;
MAPPER_AddHandler(&MAPPER_Run,MK_f1,MMOD1,"mapper","Mapper");
}