static eEventAction GetActionForEvent(nsIDOMEvent* aEvent) { WidgetKeyboardEvent* keyEvent = aEvent->GetInternalNSEvent()->AsKeyboardEvent(); if (!keyEvent) { return eEventAction_Suppress; } if (keyEvent->mFlags.mInSystemGroup) { NS_ASSERTION(keyEvent->message == NS_KEY_DOWN, "Assuming we're listening only keydown event in system group"); return eEventAction_StopPropagation; } if (keyEvent->IsAlt() || keyEvent->IsControl() || keyEvent->IsMeta()) { // Don't consume keydown event because following keypress event may be // handled as access key or shortcut key. return (keyEvent->message == NS_KEY_DOWN) ? eEventAction_StopPropagation : eEventAction_Suppress; } static const uint32_t kOKKeyCodes[] = { nsIDOMKeyEvent::DOM_VK_PAGE_UP, nsIDOMKeyEvent::DOM_VK_PAGE_DOWN, nsIDOMKeyEvent::DOM_VK_UP, nsIDOMKeyEvent::DOM_VK_DOWN, nsIDOMKeyEvent::DOM_VK_HOME, nsIDOMKeyEvent::DOM_VK_END }; if (keyEvent->keyCode == nsIDOMKeyEvent::DOM_VK_TAB) { return keyEvent->IsShift() ? eEventAction_ShiftTab : eEventAction_Tab; } if (keyEvent->charCode == ' ' || keyEvent->keyCode == NS_VK_SPACE) { return eEventAction_Propagate; } if (keyEvent->IsShift()) { return eEventAction_Suppress; } for (uint32_t i = 0; i < ArrayLength(kOKKeyCodes); ++i) { if (keyEvent->keyCode == kOKKeyCodes[i]) { return eEventAction_Propagate; } } return eEventAction_Suppress; }
bool NativeKeyBindings::Execute(const WidgetKeyboardEvent& aEvent, DoCommandCallback aCallback, void* aCallbackData) { // If the native key event is set, it must be synthesized for tests. // We just ignore such events because this behavior depends on system // settings. if (!aEvent.mNativeKeyEvent) { // It must be synthesized event or dispatched DOM event from chrome. return false; } guint keyval; if (aEvent.mCharCode) { keyval = gdk_unicode_to_keyval(aEvent.mCharCode); } else { keyval = static_cast<GdkEventKey*>(aEvent.mNativeKeyEvent)->keyval; } if (ExecuteInternal(aEvent, aCallback, aCallbackData, keyval)) { return true; } for (uint32_t i = 0; i < aEvent.mAlternativeCharCodes.Length(); ++i) { uint32_t ch = aEvent.IsShift() ? aEvent.mAlternativeCharCodes[i].mShiftedCharCode : aEvent.mAlternativeCharCodes[i].mUnshiftedCharCode; if (ch && ch != aEvent.mCharCode) { keyval = gdk_unicode_to_keyval(ch); if (ExecuteInternal(aEvent, aCallback, aCallbackData, keyval)) { return true; } } } /* gtk_bindings_activate_event is preferable, but it has unresolved bug: http://bugzilla.gnome.org/show_bug.cgi?id=162726 The bug was already marked as FIXED. However, somebody reports that the bug still exists. Also gtk_bindings_activate may work with some non-shortcuts operations (todo: check it). See bug 411005 and bug 406407. Code, which should be used after fixing GNOME bug 162726: gtk_bindings_activate_event(GTK_OBJECT(mNativeTarget), static_cast<GdkEventKey*>(aEvent.mNativeKeyEvent)); */ return false; }