/* Manages update of all the active function mappings */ void keyProcessMappings(bool bExclude) { /* Bomb out if there are none */ if (keyMappings.empty()) { return; } /* Jump out if we've got a new mapping */ (void) checkQwertyKeys(); /* Check for the meta keys */ bool bMetaKeyDown = keyDown(KEY_LCTRL) || keyDown(KEY_RCTRL) || keyDown(KEY_LALT) || keyDown(KEY_RALT) || keyDown(KEY_LSHIFT) || keyDown(KEY_RSHIFT) || keyDown(KEY_LMETA) || keyDown(KEY_RMETA); /* Run through all our mappings */ for (auto keyToProcess = keyMappings.begin(); keyToProcess != keyMappings.end(); ++keyToProcess) { /* Skip inappropriate ones when necessary */ if (bExclude && keyToProcess->status != KEYMAP_ALWAYS_PROCESS) { break; } if (keyToProcess->subKeyCode == (KEY_CODE)KEY_MAXSCAN) { continue; } if (keyToProcess->function == nullptr) { continue; } if (keyToProcess->metaKeyCode == KEY_IGNORE && !bMetaKeyDown && !(keyToProcess->status == KEYMAP__DEBUG && !getDebugMappingStatus())) { switch (keyToProcess->action) { case KEYMAP_PRESSED: /* Were the right keys pressed? */ if (keyPressed(keyToProcess->subKeyCode)) { lastSubKey = keyToProcess->subKeyCode; /* Jump to the associated function call */ keyToProcess->function(); } break; case KEYMAP_DOWN: /* Is the key Down? */ if (keyDown(keyToProcess->subKeyCode)) { lastSubKey = keyToProcess->subKeyCode; /* Jump to the associated function call */ keyToProcess->function(); } break; case KEYMAP_RELEASED: /* Has the key been released? */ if (keyReleased(keyToProcess->subKeyCode)) { lastSubKey = keyToProcess->subKeyCode; /* Jump to the associated function call */ keyToProcess->function(); } break; default: debug(LOG_FATAL, "Unknown key action (action code %u) while processing keymap.", (unsigned int)keyToProcess->action); abort(); break; } } /* Process the combi ones */ if ((keyToProcess->metaKeyCode != KEY_IGNORE && bMetaKeyDown) && !(keyToProcess->status == KEYMAP__DEBUG && !getDebugMappingStatus())) { /* It's a combo keypress - one held down and the other pressed */ if (keyDown(keyToProcess->metaKeyCode) && keyPressed(keyToProcess->subKeyCode)) { lastMetaKey = keyToProcess->metaKeyCode; lastSubKey = keyToProcess->subKeyCode; keyToProcess->function(); } else if (keyToProcess->altMetaKeyCode != KEY_IGNORE) { if (keyDown(keyToProcess->altMetaKeyCode) && keyPressed(keyToProcess->subKeyCode)) { lastMetaKey = keyToProcess->metaKeyCode; lastSubKey = keyToProcess->subKeyCode; keyToProcess->function(); } } } } /* Script callback - find out what meta key was pressed */ int pressedMetaKey = KEY_IGNORE; /* getLastMetaKey() can't be used here, have to do manually */ if (keyDown(KEY_LCTRL)) { pressedMetaKey = KEY_LCTRL; } else if (keyDown(KEY_RCTRL)) { pressedMetaKey = KEY_RCTRL; } else if (keyDown(KEY_LALT)) { pressedMetaKey = KEY_LALT; } else if (keyDown(KEY_RALT)) { pressedMetaKey = KEY_RALT; } else if (keyDown(KEY_LSHIFT)) { pressedMetaKey = KEY_LSHIFT; } else if (keyDown(KEY_RSHIFT)) { pressedMetaKey = KEY_RSHIFT; } else if (keyDown(KEY_LMETA)) { pressedMetaKey = KEY_LMETA; } else if (keyDown(KEY_RMETA)) { pressedMetaKey = KEY_RMETA; } /* Find out what keys were pressed */ for (int i = 0; i < KEY_MAXSCAN; i++) { /* Skip meta keys */ switch (i) { case KEY_LCTRL: case KEY_RCTRL: case KEY_LALT: case KEY_RALT: case KEY_LSHIFT: case KEY_RSHIFT: case KEY_LMETA: case KEY_RMETA: continue; break; } /* Let scripts process this key if it's pressed */ if (keyPressed((KEY_CODE)i)) { triggerEventKeyPressed(pressedMetaKey, i); } } }
/* Manages update of all the active function mappings */ void keyProcessMappings(bool bExclude) { KEY_MAPPING *keyToProcess; bool bMetaKeyDown; SDWORD i; /* Bomb out if there are none */ if (!keyMappings || !numActiveMappings || !bKeyProcessing) { return; } /* Jump out if we've got a new mapping */ (void) checkQwertyKeys(); /* Check for the meta keys */ if (keyDown(KEY_LCTRL) || keyDown(KEY_RCTRL) || keyDown(KEY_LALT) || keyDown(KEY_RALT) || keyDown(KEY_LSHIFT) || keyDown(KEY_RSHIFT) || keyDown(KEY_LMETA) || keyDown(KEY_RMETA)) { bMetaKeyDown = true; } else { bMetaKeyDown = false; } /* Run through all our mappings */ for (keyToProcess = keyMappings; keyToProcess != NULL; keyToProcess = keyToProcess->psNext) { /* We haven't acted upon it */ if (!keyToProcess->active) { /* Get out if it's inactive */ break; } /* Skip innappropriate ones when necessary */ if (bExclude && keyToProcess->status != KEYMAP_ALWAYS_PROCESS) { break; } if (keyToProcess->subKeyCode == (KEY_CODE)KEY_MAXSCAN) { continue; } if (keyToProcess->function == NULL) { continue; } if (keyToProcess->metaKeyCode == KEY_IGNORE && !bMetaKeyDown && !(keyToProcess->status == KEYMAP__DEBUG && !getDebugMappingStatus())) { switch (keyToProcess->action) { case KEYMAP_PRESSED: /* Were the right keys pressed? */ if (keyPressed(keyToProcess->subKeyCode)) { lastSubKey = keyToProcess->subKeyCode; /* Jump to the associated function call */ keyToProcess->function(); } break; case KEYMAP_DOWN: /* Is the key Down? */ if (keyDown(keyToProcess->subKeyCode)) { lastSubKey = keyToProcess->subKeyCode; /* Jump to the associated function call */ keyToProcess->function(); } break; case KEYMAP_RELEASED: /* Has the key been released? */ if (keyReleased(keyToProcess->subKeyCode)) { lastSubKey = keyToProcess->subKeyCode; /* Jump to the associated function call */ keyToProcess->function(); } break; default: debug(LOG_FATAL, "Unknown key action (action code %u) while processing keymap.", (unsigned int)keyToProcess->action); abort(); break; } } /* Process the combi ones */ if ((keyToProcess->metaKeyCode != KEY_IGNORE && bMetaKeyDown) && !(keyToProcess->status == KEYMAP__DEBUG && !getDebugMappingStatus())) { /* It's a combo keypress - one held down and the other pressed */ if (keyDown(keyToProcess->metaKeyCode) && keyPressed(keyToProcess->subKeyCode)) { lastMetaKey = keyToProcess->metaKeyCode; lastSubKey = keyToProcess->subKeyCode; keyToProcess->function(); } else if (keyToProcess->altMetaKeyCode != KEY_IGNORE) { if (keyDown(keyToProcess->altMetaKeyCode) && keyPressed(keyToProcess->subKeyCode)) { lastMetaKey = keyToProcess->metaKeyCode; lastSubKey = keyToProcess->subKeyCode; keyToProcess->function(); } } } } /* Script callback - find out what meta key was pressed */ cbPressedMetaKey = KEY_IGNORE; /* getLastMetaKey() can't be used here, have to do manually */ if (keyDown(KEY_LCTRL)) { cbPressedMetaKey = KEY_LCTRL; } else if (keyDown(KEY_RCTRL)) { cbPressedMetaKey = KEY_RCTRL; } else if (keyDown(KEY_LALT)) { cbPressedMetaKey = KEY_LALT; } else if (keyDown(KEY_RALT)) { cbPressedMetaKey = KEY_RALT; } else if (keyDown(KEY_LSHIFT)) { cbPressedMetaKey = KEY_LSHIFT; } else if (keyDown(KEY_RSHIFT)) { cbPressedMetaKey = KEY_RSHIFT; } else if (keyDown(KEY_LMETA)) { cbPressedMetaKey = KEY_LMETA; } else if (keyDown(KEY_RMETA)) { cbPressedMetaKey = KEY_RMETA; } /* Find out what keys were pressed */ for (i = 0; i < KEY_MAXSCAN; i++) { /* Skip meta keys */ switch (i) { case KEY_LCTRL: case KEY_RCTRL: case KEY_LALT: case KEY_RALT: case KEY_LSHIFT: case KEY_RSHIFT: case KEY_LMETA: case KEY_RMETA: continue; break; } /* Let scripts process this key if it's pressed */ if (keyPressed((KEY_CODE)i)) { cbPressedKey = i; eventFireCallbackTrigger((TRIGGER_TYPE)CALL_KEY_PRESSED); } } }