void UK2Node_InputKey::CreateInputKeyEvent(FKismetCompilerContext& CompilerContext, UEdGraph* SourceGraph, UEdGraphPin* InputKeyPin, const EInputEvent KeyEvent) { if (InputKeyPin->LinkedTo.Num() > 0) { UK2Node_InputKeyEvent* InputKeyEvent = CompilerContext.SpawnIntermediateNode<UK2Node_InputKeyEvent>(this, SourceGraph); const FName ModifierName = GetModifierName(); if ( ModifierName != NAME_None ) { InputKeyEvent->CustomFunctionName = FName( *FString::Printf(TEXT("InpActEvt_%s_%s_%s"), *ModifierName.ToString(), *InputKey.ToString(), *InputKeyEvent->GetName())); } else { InputKeyEvent->CustomFunctionName = FName( *FString::Printf(TEXT("InpActEvt_%s_%s"), *InputKey.ToString(), *InputKeyEvent->GetName())); } InputKeyEvent->InputChord.Key = InputKey; InputKeyEvent->InputChord.bCtrl = bControl; InputKeyEvent->InputChord.bAlt = bAlt; InputKeyEvent->InputChord.bShift = bShift; InputKeyEvent->InputChord.bCmd = bCommand; InputKeyEvent->bConsumeInput = bConsumeInput; InputKeyEvent->bExecuteWhenPaused = bExecuteWhenPaused; InputKeyEvent->bOverrideParentBinding = bOverrideParentBinding; InputKeyEvent->InputKeyEvent = KeyEvent; InputKeyEvent->EventReference.SetExternalDelegateMember(FName(TEXT("InputActionHandlerDynamicSignature__DelegateSignature"))); InputKeyEvent->bInternalEvent = true; InputKeyEvent->AllocateDefaultPins(); // Move any exec links from the InputActionNode pin to the InputActionEvent node UEdGraphPin* EventOutput = CompilerContext.GetSchema()->FindExecutionPin(*InputKeyEvent, EGPD_Output); if(EventOutput != NULL) { CompilerContext.MovePinLinksToIntermediate(*InputKeyPin, *EventOutput); } } }
void KeymapWrapper::InitBySystemSettings() { PR_LOG(gKeymapWrapperLog, PR_LOG_ALWAYS, ("KeymapWrapper(%p): InitBySystemSettings, mGdkKeymap=%p", this, mGdkKeymap)); Display* display = gdk_x11_display_get_xdisplay(gdk_display_get_default()); int min_keycode = 0; int max_keycode = 0; XDisplayKeycodes(display, &min_keycode, &max_keycode); int keysyms_per_keycode = 0; KeySym* xkeymap = XGetKeyboardMapping(display, min_keycode, max_keycode - min_keycode + 1, &keysyms_per_keycode); if (!xkeymap) { PR_LOG(gKeymapWrapperLog, PR_LOG_ALWAYS, ("KeymapWrapper(%p): InitBySystemSettings, " "Failed due to null xkeymap", this)); return; } XModifierKeymap* xmodmap = XGetModifierMapping(display); if (!xmodmap) { PR_LOG(gKeymapWrapperLog, PR_LOG_ALWAYS, ("KeymapWrapper(%p): InitBySystemSettings, " "Failed due to null xmodmap", this)); XFree(xkeymap); return; } PR_LOG(gKeymapWrapperLog, PR_LOG_ALWAYS, ("KeymapWrapper(%p): InitBySystemSettings, min_keycode=%d, " "max_keycode=%d, keysyms_per_keycode=%d, max_keypermod=%d", this, min_keycode, max_keycode, keysyms_per_keycode, xmodmap->max_keypermod)); // The modifiermap member of the XModifierKeymap structure contains 8 sets // of max_keypermod KeyCodes, one for each modifier in the order Shift, // Lock, Control, Mod1, Mod2, Mod3, Mod4, and Mod5. // Only nonzero KeyCodes have meaning in each set, and zero KeyCodes are // ignored. // Note that two or more modifiers may use one modifier flag. E.g., // on Ubuntu 10.10, Alt and Meta share the Mod1 in default settings. // And also Super and Hyper share the Mod4. In such cases, we need to // decide which modifier flag means one of DOM modifiers. // mod[0] is Modifier introduced by Mod1. Modifier mod[5]; int32_t foundLevel[5]; for (uint32_t i = 0; i < ArrayLength(mod); i++) { mod[i] = NOT_MODIFIER; foundLevel[i] = INT32_MAX; } const uint32_t map_size = 8 * xmodmap->max_keypermod; for (uint32_t i = 0; i < map_size; i++) { KeyCode keycode = xmodmap->modifiermap[i]; PR_LOG(gKeymapWrapperLog, PR_LOG_ALWAYS, ("KeymapWrapper(%p): InitBySystemSettings, " " i=%d, keycode=0x%08X", this, i, keycode)); if (!keycode || keycode < min_keycode || keycode > max_keycode) { continue; } ModifierKey* modifierKey = GetModifierKey(keycode); if (!modifierKey) { modifierKey = mModifierKeys.AppendElement(ModifierKey(keycode)); } const KeySym* syms = xkeymap + (keycode - min_keycode) * keysyms_per_keycode; const uint32_t bit = i / xmodmap->max_keypermod; modifierKey->mMask |= 1 << bit; // We need to know the meaning of Mod1, Mod2, Mod3, Mod4 and Mod5. // Let's skip if current map is for others. if (bit < 3) { continue; } const int32_t modIndex = bit - 3; for (int32_t j = 0; j < keysyms_per_keycode; j++) { Modifier modifier = GetModifierForGDKKeyval(syms[j]); PR_LOG(gKeymapWrapperLog, PR_LOG_ALWAYS, ("KeymapWrapper(%p): InitBySystemSettings, " " Mod%d, j=%d, syms[j]=%s(0x%X), modifier=%s", this, modIndex + 1, j, gdk_keyval_name(syms[j]), syms[j], GetModifierName(modifier))); switch (modifier) { case NOT_MODIFIER: // Don't overwrite the stored information with // NOT_MODIFIER. break; case CAPS_LOCK: case SHIFT: case CTRL: // Ignore the modifiers defined in GDK spec. They shouldn't // be mapped to Mod1-5 because they must not work on native // GTK applications. break; default: // If new modifier is found in higher level than stored // value, we don't need to overwrite it. if (j > foundLevel[modIndex]) { break; } // If new modifier is more important than stored value, // we should overwrite it with new modifier. if (j == foundLevel[modIndex]) { mod[modIndex] = std::min(modifier, mod[modIndex]); break; } foundLevel[modIndex] = j; mod[modIndex] = modifier; break; } } } for (uint32_t i = 0; i < COUNT_OF_MODIFIER_INDEX; i++) { Modifier modifier; switch (i) { case INDEX_NUM_LOCK: modifier = NUM_LOCK; break; case INDEX_SCROLL_LOCK: modifier = SCROLL_LOCK; break; case INDEX_ALT: modifier = ALT; break; case INDEX_META: modifier = META; break; case INDEX_SUPER: modifier = SUPER; break; case INDEX_HYPER: modifier = HYPER; break; case INDEX_LEVEL3: modifier = LEVEL3; break; case INDEX_LEVEL5: modifier = LEVEL5; break; default: MOZ_CRASH("All indexes must be handled here"); } for (uint32_t j = 0; j < ArrayLength(mod); j++) { if (modifier == mod[j]) { mModifierMasks[i] |= 1 << (j + 3); } } } XFreeModifiermap(xmodmap); XFree(xkeymap); }