summaryrefslogtreecommitdiff
path: root/widget/cocoa/NativeKeyBindings.mm
diff options
context:
space:
mode:
Diffstat (limited to 'widget/cocoa/NativeKeyBindings.mm')
-rw-r--r--widget/cocoa/NativeKeyBindings.mm292
1 files changed, 0 insertions, 292 deletions
diff --git a/widget/cocoa/NativeKeyBindings.mm b/widget/cocoa/NativeKeyBindings.mm
deleted file mode 100644
index 2f4ecadff0..0000000000
--- a/widget/cocoa/NativeKeyBindings.mm
+++ /dev/null
@@ -1,292 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "NativeKeyBindings.h"
-
-#include "nsTArray.h"
-#include "nsCocoaUtils.h"
-#include "mozilla/Logging.h"
-#include "mozilla/TextEvents.h"
-
-namespace mozilla {
-namespace widget {
-
-PRLogModuleInfo* gNativeKeyBindingsLog = nullptr;
-
-NativeKeyBindings* NativeKeyBindings::sInstanceForSingleLineEditor = nullptr;
-NativeKeyBindings* NativeKeyBindings::sInstanceForMultiLineEditor = nullptr;
-
-// static
-NativeKeyBindings*
-NativeKeyBindings::GetInstance(NativeKeyBindingsType aType)
-{
- switch (aType) {
- case nsIWidget::NativeKeyBindingsForSingleLineEditor:
- if (!sInstanceForSingleLineEditor) {
- sInstanceForSingleLineEditor = new NativeKeyBindings();
- sInstanceForSingleLineEditor->Init(aType);
- }
- return sInstanceForSingleLineEditor;
- case nsIWidget::NativeKeyBindingsForMultiLineEditor:
- case nsIWidget::NativeKeyBindingsForRichTextEditor:
- if (!sInstanceForMultiLineEditor) {
- sInstanceForMultiLineEditor = new NativeKeyBindings();
- sInstanceForMultiLineEditor->Init(aType);
- }
- return sInstanceForMultiLineEditor;
- default:
- MOZ_CRASH("Not implemented");
- return nullptr;
- }
-}
-
-// static
-void
-NativeKeyBindings::Shutdown()
-{
- delete sInstanceForSingleLineEditor;
- sInstanceForSingleLineEditor = nullptr;
- delete sInstanceForMultiLineEditor;
- sInstanceForMultiLineEditor = nullptr;
-}
-
-NativeKeyBindings::NativeKeyBindings()
-{
-}
-
-#define SEL_TO_COMMAND(aSel, aCommand) \
- mSelectorToCommand.Put( \
- reinterpret_cast<struct objc_selector *>(@selector(aSel)), aCommand)
-
-void
-NativeKeyBindings::Init(NativeKeyBindingsType aType)
-{
- if (!gNativeKeyBindingsLog) {
- gNativeKeyBindingsLog = PR_NewLogModule("NativeKeyBindings");
- }
-
- MOZ_LOG(gNativeKeyBindingsLog, LogLevel::Info,
- ("%p NativeKeyBindings::Init", this));
-
- // Many selectors have a one-to-one mapping to a Gecko command. Those mappings
- // are registered in mSelectorToCommand.
-
- // Selectors from NSResponder's "Responding to Action Messages" section and
- // from NSText's "Action Methods for Editing" section
-
- // TODO: Improves correctness of left / right meaning
- // TODO: Add real paragraph motions
-
- // SEL_TO_COMMAND(cancelOperation:, );
- // SEL_TO_COMMAND(capitalizeWord:, );
- // SEL_TO_COMMAND(centerSelectionInVisibleArea:, );
- // SEL_TO_COMMAND(changeCaseOfLetter:, );
- // SEL_TO_COMMAND(complete:, );
- SEL_TO_COMMAND(copy:, CommandCopy);
- // SEL_TO_COMMAND(copyFont:, );
- // SEL_TO_COMMAND(copyRuler:, );
- SEL_TO_COMMAND(cut:, CommandCut);
- SEL_TO_COMMAND(delete:, CommandDelete);
- SEL_TO_COMMAND(deleteBackward:, CommandDeleteCharBackward);
- // SEL_TO_COMMAND(deleteBackwardByDecomposingPreviousCharacter:, );
- SEL_TO_COMMAND(deleteForward:, CommandDeleteCharForward);
-
- // TODO: deleteTo* selectors are also supposed to add text to a kill buffer
- SEL_TO_COMMAND(deleteToBeginningOfLine:, CommandDeleteToBeginningOfLine);
- SEL_TO_COMMAND(deleteToBeginningOfParagraph:, CommandDeleteToBeginningOfLine);
- SEL_TO_COMMAND(deleteToEndOfLine:, CommandDeleteToEndOfLine);
- SEL_TO_COMMAND(deleteToEndOfParagraph:, CommandDeleteToEndOfLine);
- // SEL_TO_COMMAND(deleteToMark:, );
-
- SEL_TO_COMMAND(deleteWordBackward:, CommandDeleteWordBackward);
- SEL_TO_COMMAND(deleteWordForward:, CommandDeleteWordForward);
- // SEL_TO_COMMAND(indent:, );
- // SEL_TO_COMMAND(insertBacktab:, );
- // SEL_TO_COMMAND(insertContainerBreak:, );
- // SEL_TO_COMMAND(insertLineBreak:, );
- // SEL_TO_COMMAND(insertNewline:, );
- // SEL_TO_COMMAND(insertNewlineIgnoringFieldEditor:, );
- // SEL_TO_COMMAND(insertParagraphSeparator:, );
- // SEL_TO_COMMAND(insertTab:, );
- // SEL_TO_COMMAND(insertTabIgnoringFieldEditor:, );
- // SEL_TO_COMMAND(insertDoubleQuoteIgnoringSubstitution:, );
- // SEL_TO_COMMAND(insertSingleQuoteIgnoringSubstitution:, );
- // SEL_TO_COMMAND(lowercaseWord:, );
- SEL_TO_COMMAND(moveBackward:, CommandCharPrevious);
- SEL_TO_COMMAND(moveBackwardAndModifySelection:, CommandSelectCharPrevious);
- if (aType == nsIWidget::NativeKeyBindingsForSingleLineEditor) {
- SEL_TO_COMMAND(moveDown:, CommandEndLine);
- } else {
- SEL_TO_COMMAND(moveDown:, CommandLineNext);
- }
- SEL_TO_COMMAND(moveDownAndModifySelection:, CommandSelectLineNext);
- SEL_TO_COMMAND(moveForward:, CommandCharNext);
- SEL_TO_COMMAND(moveForwardAndModifySelection:, CommandSelectCharNext);
- SEL_TO_COMMAND(moveLeft:, CommandCharPrevious);
- SEL_TO_COMMAND(moveLeftAndModifySelection:, CommandSelectCharPrevious);
- SEL_TO_COMMAND(moveParagraphBackwardAndModifySelection:,
- CommandSelectBeginLine);
- SEL_TO_COMMAND(moveParagraphForwardAndModifySelection:, CommandSelectEndLine);
- SEL_TO_COMMAND(moveRight:, CommandCharNext);
- SEL_TO_COMMAND(moveRightAndModifySelection:, CommandSelectCharNext);
- SEL_TO_COMMAND(moveToBeginningOfDocument:, CommandMoveTop);
- SEL_TO_COMMAND(moveToBeginningOfDocumentAndModifySelection:,
- CommandSelectTop);
- SEL_TO_COMMAND(moveToBeginningOfLine:, CommandBeginLine);
- SEL_TO_COMMAND(moveToBeginningOfLineAndModifySelection:,
- CommandSelectBeginLine);
- SEL_TO_COMMAND(moveToBeginningOfParagraph:, CommandBeginLine);
- SEL_TO_COMMAND(moveToBeginningOfParagraphAndModifySelection:,
- CommandSelectBeginLine);
- SEL_TO_COMMAND(moveToEndOfDocument:, CommandMoveBottom);
- SEL_TO_COMMAND(moveToEndOfDocumentAndModifySelection:, CommandSelectBottom);
- SEL_TO_COMMAND(moveToEndOfLine:, CommandEndLine);
- SEL_TO_COMMAND(moveToEndOfLineAndModifySelection:, CommandSelectEndLine);
- SEL_TO_COMMAND(moveToEndOfParagraph:, CommandEndLine);
- SEL_TO_COMMAND(moveToEndOfParagraphAndModifySelection:, CommandSelectEndLine);
- SEL_TO_COMMAND(moveToLeftEndOfLine:, CommandBeginLine);
- SEL_TO_COMMAND(moveToLeftEndOfLineAndModifySelection:,
- CommandSelectBeginLine);
- SEL_TO_COMMAND(moveToRightEndOfLine:, CommandEndLine);
- SEL_TO_COMMAND(moveToRightEndOfLineAndModifySelection:, CommandSelectEndLine);
- if (aType == nsIWidget::NativeKeyBindingsForSingleLineEditor) {
- SEL_TO_COMMAND(moveUp:, CommandBeginLine);
- } else {
- SEL_TO_COMMAND(moveUp:, CommandLinePrevious);
- }
- SEL_TO_COMMAND(moveUpAndModifySelection:, CommandSelectLinePrevious);
- SEL_TO_COMMAND(moveWordBackward:, CommandWordPrevious);
- SEL_TO_COMMAND(moveWordBackwardAndModifySelection:,
- CommandSelectWordPrevious);
- SEL_TO_COMMAND(moveWordForward:, CommandWordNext);
- SEL_TO_COMMAND(moveWordForwardAndModifySelection:, CommandSelectWordNext);
- SEL_TO_COMMAND(moveWordLeft:, CommandWordPrevious);
- SEL_TO_COMMAND(moveWordLeftAndModifySelection:, CommandSelectWordPrevious);
- SEL_TO_COMMAND(moveWordRight:, CommandWordNext);
- SEL_TO_COMMAND(moveWordRightAndModifySelection:, CommandSelectWordNext);
- SEL_TO_COMMAND(pageDown:, CommandMovePageDown);
- SEL_TO_COMMAND(pageDownAndModifySelection:, CommandSelectPageDown);
- SEL_TO_COMMAND(pageUp:, CommandMovePageUp);
- SEL_TO_COMMAND(pageUpAndModifySelection:, CommandSelectPageUp);
- SEL_TO_COMMAND(paste:, CommandPaste);
- // SEL_TO_COMMAND(pasteFont:, );
- // SEL_TO_COMMAND(pasteRuler:, );
- SEL_TO_COMMAND(scrollLineDown:, CommandScrollLineDown);
- SEL_TO_COMMAND(scrollLineUp:, CommandScrollLineUp);
- SEL_TO_COMMAND(scrollPageDown:, CommandScrollPageDown);
- SEL_TO_COMMAND(scrollPageUp:, CommandScrollPageUp);
- SEL_TO_COMMAND(scrollToBeginningOfDocument:, CommandScrollTop);
- SEL_TO_COMMAND(scrollToEndOfDocument:, CommandScrollBottom);
- SEL_TO_COMMAND(selectAll:, CommandSelectAll);
- // selectLine: is complex, see KeyDown
- if (aType == nsIWidget::NativeKeyBindingsForSingleLineEditor) {
- SEL_TO_COMMAND(selectParagraph:, CommandSelectAll);
- }
- // SEL_TO_COMMAND(selectToMark:, );
- // selectWord: is complex, see KeyDown
- // SEL_TO_COMMAND(setMark:, );
- // SEL_TO_COMMAND(showContextHelp:, );
- // SEL_TO_COMMAND(supplementalTargetForAction:sender:, );
- // SEL_TO_COMMAND(swapWithMark:, );
- // SEL_TO_COMMAND(transpose:, );
- // SEL_TO_COMMAND(transposeWords:, );
- // SEL_TO_COMMAND(uppercaseWord:, );
- // SEL_TO_COMMAND(yank:, );
-}
-
-#undef SEL_TO_COMMAND
-
-bool
-NativeKeyBindings::Execute(const WidgetKeyboardEvent& aEvent,
- DoCommandCallback aCallback,
- void* aCallbackData)
-{
- MOZ_LOG(gNativeKeyBindingsLog, LogLevel::Info,
- ("%p NativeKeyBindings::KeyPress", this));
-
- // Recover the current event, which should always be the key down we are
- // responding to.
-
- NSEvent* cocoaEvent = reinterpret_cast<NSEvent*>(aEvent.mNativeKeyEvent);
-
- if (!cocoaEvent || [cocoaEvent type] != NSKeyDown) {
- MOZ_LOG(gNativeKeyBindingsLog, LogLevel::Info,
- ("%p NativeKeyBindings::KeyPress, no Cocoa key down event", this));
-
- return false;
- }
-
- MOZ_LOG(gNativeKeyBindingsLog, LogLevel::Info,
- ("%p NativeKeyBindings::KeyPress, interpreting", this));
-
- AutoTArray<KeyBindingsCommand, 2> bindingCommands;
- nsCocoaUtils::GetCommandsFromKeyEvent(cocoaEvent, bindingCommands);
-
- MOZ_LOG(gNativeKeyBindingsLog, LogLevel::Info,
- ("%p NativeKeyBindings::KeyPress, bindingCommands=%u",
- this, bindingCommands.Length()));
-
- AutoTArray<Command, 4> geckoCommands;
-
- for (uint32_t i = 0; i < bindingCommands.Length(); i++) {
- SEL selector = bindingCommands[i].selector;
-
- if (MOZ_LOG_TEST(gNativeKeyBindingsLog, LogLevel::Info)) {
- NSString* selectorString = NSStringFromSelector(selector);
- nsAutoString nsSelectorString;
- nsCocoaUtils::GetStringForNSString(selectorString, nsSelectorString);
-
- MOZ_LOG(gNativeKeyBindingsLog, LogLevel::Info,
- ("%p NativeKeyBindings::KeyPress, selector=%s",
- this, NS_LossyConvertUTF16toASCII(nsSelectorString).get()));
- }
-
- // Try to find a simple mapping in the hashtable
- Command geckoCommand = static_cast<Command>(mSelectorToCommand.Get(
- reinterpret_cast<struct objc_selector*>(selector)));
-
- if (geckoCommand) {
- geckoCommands.AppendElement(geckoCommand);
- } else if (selector == @selector(selectLine:)) {
- // This is functional, but Cocoa's version is direction-less in that
- // selection direction is not determined until some future directed action
- // is taken. See bug 282097, comment 79 for more details.
- geckoCommands.AppendElement(CommandBeginLine);
- geckoCommands.AppendElement(CommandSelectEndLine);
- } else if (selector == @selector(selectWord:)) {
- // This is functional, but Cocoa's version is direction-less in that
- // selection direction is not determined until some future directed action
- // is taken. See bug 282097, comment 79 for more details.
- geckoCommands.AppendElement(CommandWordPrevious);
- geckoCommands.AppendElement(CommandSelectWordNext);
- }
- }
-
- if (geckoCommands.IsEmpty()) {
- MOZ_LOG(gNativeKeyBindingsLog, LogLevel::Info,
- ("%p NativeKeyBindings::KeyPress, handled=false", this));
-
- return false;
- }
-
- for (uint32_t i = 0; i < geckoCommands.Length(); i++) {
- Command geckoCommand = geckoCommands[i];
-
- MOZ_LOG(gNativeKeyBindingsLog, LogLevel::Info,
- ("%p NativeKeyBindings::KeyPress, command=%s",
- this, WidgetKeyboardEvent::GetCommandStr(geckoCommand)));
-
- // Execute the Gecko command
- aCallback(geckoCommand, aCallbackData);
- }
-
- MOZ_LOG(gNativeKeyBindingsLog, LogLevel::Info,
- ("%p NativeKeyBindings::KeyPress, handled=true", this));
-
- return true;
-}
-
-} // namespace widget
-} // namespace mozilla