/* 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 "ShortcutKeys.h"
#if !
defined (XP_WIN) && !
defined (MOZ_WIDGET_COCOA) && \
!
defined (MOZ_WIDGET_GTK) && !
defined (MOZ_WIDGET_ANDROID)
# define USE_EMACS_KEY_BINDINGS
#endif
/**
* This file defines shortcut keys for <input>, <textarea>, page navigation
* and HTML editor. You must write each mapping in one line and append inline
* comment on which platform it's mapped since this style helps you to looking
* for the defintion with searchfox, etc.
* Be aware, the commands defined in this file may not work because editor or
* other keyboard event listeners may handle before.
* Note: When you change key mappings, you need to change
* `test/gtest/TestShortcutKeyDefinitions.cpp` too.
*
* The latest version of the original files are:
*
* Windows:
* https://searchfox.org/mozilla-central/rev/fd853f4aea89186efdb368e759a71b7a90c2b89c/dom/events/win/ShortcutKeyDefinitions.cpp
* macOS:
* https://searchfox.org/mozilla-central/rev/fd853f4aea89186efdb368e759a71b7a90c2b89c/dom/events/mac/ShortcutKeyDefinitions.cpp
* Linux:
* https://searchfox.org/mozilla-central/rev/fd853f4aea89186efdb368e759a71b7a90c2b89c/dom/events/unix/ShortcutKeyDefinitions.cpp
* Android:
* https://searchfox.org/mozilla-central/rev/fd853f4aea89186efdb368e759a71b7a90c2b89c/dom/events/android/ShortcutKeyDefinitions.cpp
* Emacs:
* https://searchfox.org/mozilla-central/rev/fd853f4aea89186efdb368e759a71b7a90c2b89c/dom/events/emacs/ShortcutKeyDefinitions.cpp
*
* And common definitions except macOS:
* https://searchfox.org/mozilla-central/rev/fd853f4aea89186efdb368e759a71b7a90c2b89c/dom/events/ShortcutKeyDefinitionsForInputCommon.h
* https://searchfox.org/mozilla-central/rev/fd853f4aea89186efdb368e759a71b7a90c2b89c/dom/events/ShortcutKeyDefinitionsForTextAreaCommon.h
* https://searchfox.org/mozilla-central/rev/fd853f4aea89186efdb368e759a71b7a90c2b89c/dom/events/ShortcutKeyDefinitionsForEditorCommon.h
*
* And common definitions for page navigation on all platforms:
* https://searchfox.org/mozilla-central/rev/fd853f4aea89186efdb368e759a71b7a90c2b89c/dom/events/ShortcutKeyDefinitionsForBrowserCommon.h
*
* If you don't see shortcut key definitions here, but you see shortcut keys
* work on Linux or macOS, it probably comes from NativeKeyBindings under
* widget.
*/
namespace mozilla {
ShortcutKeyData ShortcutKeys::sInputHandlers[] = {
// clang-format off
/**************************************************************************
* Arrow keys to move caret in <input>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) || \
defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, nullptr, u
"cmd_moveLeft" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, nullptr, u
"cmd_moveRight" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_UP" , nullptr, nullptr, u
"cmd_moveUp" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_DOWN" , nullptr, nullptr, u
"cmd_moveDown" },
// Win, Linux, Android, Emacs
#endif // Except MOZ_WIDGET_COCOA
/**************************************************************************
* Arrow keys to select a char/line in <input>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) || \
defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift" , u
"cmd_selectLeft" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift" , u
"cmd_selectRight" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift" , u
"cmd_selectUp" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift" , u
"cmd_selectDown" },
// Win, Linux, Android, Emacs
#endif // Except MOZ_WIDGET_COCOA
/**************************************************************************
* Arrow keys per word in <input>.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"control" , u
"cmd_wordPrevious" },
// Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"control" , u
"cmd_wordNext" },
// Android, Emacs
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift,control" , u
"cmd_selectWordPrevious" },
// Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift,control" , u
"cmd_selectWordNext" },
// Android, Emacs
#endif // MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"control" , u
"cmd_moveLeft2" },
// Win
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"control" , u
"cmd_moveRight2" },
// Win
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift,control" , u
"cmd_selectLeft2" },
// Win
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift,control" , u
"cmd_selectRight2" },
// Win
#endif // XP_WIN
/**************************************************************************
* Arrow keys per block in <input>.
**************************************************************************/
#if defined (XP_WIN)
{u
"keypress" , u
"VK_UP" , nullptr, u
"control" , u
"cmd_moveUp2" },
// Win
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"control" , u
"cmd_moveDown2" },
// Win
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift,control" , u
"cmd_selectUp2" },
// Win
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift,control" , u
"cmd_selectDown2" },
// Win
#endif // XP_WIN
/**************************************************************************
* Arrow keys to begin/end of a line in <input>.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"alt" , u
"cmd_beginLine" },
// Android
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"alt" , u
"cmd_endLine" },
// Android
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift,alt" , u
"cmd_selectBeginLine" },
// Android
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift,alt" , u
"cmd_selectEndLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* Home/End keys in <input>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_HOME" , nullptr, nullptr, u
"cmd_beginLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, nullptr, u
"cmd_endLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"shift" , u
"cmd_selectBeginLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"shift" , u
"cmd_selectEndLine" },
// Win, Android, Emacs
#endif // XP_WIN || MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_HOME" , nullptr, u
"control" , u
"cmd_beginLine" },
// Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"control" , u
"cmd_endLine" },
// Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"control,shift" , u
"cmd_selectBeginLine" },
// Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"control,shift" , u
"cmd_selectEndLine" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN)
{u
"keypress" , u
"VK_HOME" , nullptr, u
"control" , u
"cmd_moveTop" },
// Win
{u
"keypress" , u
"VK_END" , nullptr, u
"control" , u
"cmd_moveBottom" },
// Win
{u
"keypress" , u
"VK_HOME" , nullptr, u
"shift,control" , u
"cmd_selectTop" },
// Win
{u
"keypress" , u
"VK_END" , nullptr, u
"shift,control" , u
"cmd_selectBottom" },
// Win
#endif // XP_WIN
/**************************************************************************
* Insert key in <input>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_INSERT" , nullptr, u
"control" , u
"cmd_copy" },
// Win, Emacs
{u
"keypress" , u
"VK_INSERT" , nullptr, u
"shift" , u
"cmd_paste" },
// Win, Emacs
#endif // XP_WIN || USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Delete key in <input>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"shift" , u
"cmd_cutOrDelete" },
// Win, Emacs
#endif // XP_WIN || USE_EMACS_KEY_BINDINGS
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"control" , u
"cmd_copyOrDelete" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"control" , u
"cmd_deleteWordForward" },
// Win, Android
#endif // XP_WIN
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"alt" , u
"cmd_deleteToEndOfLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* Backspace key in <input>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_BACK" , nullptr, u
"control" , u
"cmd_deleteWordBackward" },
// Win, Android, Emacs
#endif // XP_WIN || MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_BACK" , nullptr, u
"alt" , u
"cmd_deleteToBeginningOfLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
#if defined (XP_WIN)
{u
"keypress" , u
"VK_BACK" , nullptr, u
"alt" , u
"cmd_undo" },
// Win
{u
"keypress" , u
"VK_BACK" , nullptr, u
"alt,shift" , u
"cmd_redo" },
// Win
#endif // XP_WIN
/**************************************************************************
* Common editor commands in <input>.
**************************************************************************/
{u
"keypress" , nullptr, u
"c" , u
"accel" , u
"cmd_copy" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"x" , u
"accel" , u
"cmd_cut" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"v" , u
"accel" , u
"cmd_paste" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"z" , u
"accel" , u
"cmd_undo" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"z" , u
"accel,shift" , u
"cmd_redo" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"v" , u
"accel,shift" , u
"cmd_paste" },
// Win, macOS, Linux, Android, Emacs
// Mac uses Option+Shift+Command+V for Paste and Match Style
#if defined (MOZ_WIDGET_COCOA)
{u
"keypress" , nullptr, u
"v" , u
"accel,alt,shift" , u
"cmd_paste" },
// macOS
#endif // MOZ_WIDGET_COCOA
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , nullptr, u
"y" , u
"accel" , u
"cmd_redo" },
// Win, Linux, Emacs
#endif // XP_WIN || MOZ_WIDGET_GTK || USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_COCOA) ||
defined (MOZ_WIDGET_GTK) ||\
defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , nullptr, u
"a" , u
"accel" , u
"cmd_selectAll" },
// Win, macOS, Linux, Android
#endif // XP_WIN || MOZ_WIDGET_COCOA || MOZ_WIDGET_GTK || MOZ_WIDGET_ANDROID
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , nullptr, u
"a" , u
"alt" , u
"cmd_selectAll" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Emacs specific shortcut keys in <input>.
**************************************************************************/
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , nullptr, u
"a" , u
"control" , u
"cmd_beginLine" },
// Emacs
{u
"keypress" , nullptr, u
"e" , u
"control" , u
"cmd_endLine" },
// Emacs
{u
"keypress" , nullptr, u
"b" , u
"control" , u
"cmd_charPrevious" },
// Emacs
{u
"keypress" , nullptr, u
"f" , u
"control" , u
"cmd_charNext" },
// Emacs
{u
"keypress" , nullptr, u
"h" , u
"control" , u
"cmd_deleteCharBackward" },
// Emacs
{u
"keypress" , nullptr, u
"d" , u
"control" , u
"cmd_deleteCharForward" },
// Emacs
{u
"keypress" , nullptr, u
"w" , u
"control" , u
"cmd_deleteWordBackward" },
// Emacs
{u
"keypress" , nullptr, u
"u" , u
"control" , u
"cmd_deleteToBeginningOfLine" },
// Emacs
{u
"keypress" , nullptr, u
"k" , u
"control" , u
"cmd_deleteToEndOfLine" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
// clang-format on
{nullptr, nullptr, nullptr, nullptr, nullptr}};
ShortcutKeyData ShortcutKeys::sTextAreaHandlers[] = {
// clang-format off
/**************************************************************************
* Arrow keys to move caret in <textarea>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) || \
defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, nullptr, u
"cmd_moveLeft" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, nullptr, u
"cmd_moveRight" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_UP" , nullptr, nullptr, u
"cmd_moveUp" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_DOWN" , nullptr, nullptr, u
"cmd_moveDown" },
// Win, Linux, Android, Emacs
#endif // Except MOZ_WIDGET_COCOA
/**************************************************************************
* Arrow keys to select a char/line in <textarea>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) || \
defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift" , u
"cmd_selectLeft" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift" , u
"cmd_selectRight" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift" , u
"cmd_selectUp" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift" , u
"cmd_selectDown" },
// Win, Linux, Android, Emacs
#endif // Except MOZ_WIDGET_COCOA
/**************************************************************************
* Arrow keys per word in <textarea>.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"control" , u
"cmd_wordPrevious" },
// Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"control" , u
"cmd_wordNext" },
// Android, Emacs
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift,control" , u
"cmd_selectWordPrevious" },
// Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift,control" , u
"cmd_selectWordNext" },
// Android, Emacs
#endif // MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"control" , u
"cmd_moveLeft2" },
// Win
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"control" , u
"cmd_moveRight2" },
// Win
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift,control" , u
"cmd_selectLeft2" },
// Win
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift,control" , u
"cmd_selectRight2" },
// Win
#endif // XP_WIN
/**************************************************************************
* Arrow keys per block in <textarea>.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_UP" , nullptr, u
"alt" , u
"cmd_moveTop" },
// Android
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"alt" , u
"cmd_moveBottom" },
// Android
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift,alt" , u
"cmd_selectTop" },
// Android
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift,alt" , u
"cmd_selectBottom" },
// Android
#endif // MOZ_WIDGET_ANDROID
#if defined (XP_WIN)
{u
"keypress" , u
"VK_UP" , nullptr, u
"control" , u
"cmd_moveUp2" },
// Win
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"control" , u
"cmd_moveDown2" },
// Win
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift,control" , u
"cmd_selectUp2" },
// Win
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift,control" , u
"cmd_selectDown2" },
// Win
#endif // XP_WIN
/**************************************************************************
* Arrow keys to begin/end of a line in <textarea>.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"alt" , u
"cmd_beginLine" },
// Android
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"alt" , u
"cmd_endLine" },
// Android
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift,alt" , u
"cmd_selectBeginLine" },
// Android
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift,alt" , u
"cmd_selectEndLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* PageUp/PageDown keys in <textarea>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, nullptr, u
"cmd_movePageUp" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, nullptr, u
"cmd_movePageDown" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, u
"shift" , u
"cmd_selectPageUp" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, u
"shift" , u
"cmd_selectPageDown" },
// Win, Android, Emacs
#endif // XP_WIN || MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, u
"alt" , u
"cmd_moveTop" },
// Android
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, u
"alt" , u
"cmd_moveBottom" },
// Android
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, u
"shift,alt" , u
"cmd_selectTop" },
// Android
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, u
"shift,alt" , u
"cmd_selectBottom" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* Home/End keys in <textarea>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_HOME" , nullptr, nullptr, u
"cmd_beginLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, nullptr, u
"cmd_endLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"shift" , u
"cmd_selectBeginLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"shift" , u
"cmd_selectEndLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"control" , u
"cmd_moveTop" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"control" , u
"cmd_moveBottom" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"shift,control" , u
"cmd_selectTop" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"shift,control" , u
"cmd_selectBottom" },
// Win, Android, Emacs
#endif // XP_WIN || MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Insert key in <textarea>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_INSERT" , nullptr, u
"control" , u
"cmd_copy" },
// Win, Emacs
{u
"keypress" , u
"VK_INSERT" , nullptr, u
"shift" , u
"cmd_paste" },
// Win, Emacs
#endif // XP_WIN || USE_EMACS_KEY_BINDINGS
{u
"keypress" , nullptr, u
"v" , u
"accel,shift" , u
"cmd_paste" },
// Win, macOS, Linux, Android, Emacs
// Mac uses Option+Shift+Command+V for Paste and Match Style
#if defined (MOZ_WIDGET_COCOA)
{u
"keypress" , nullptr, u
"v" , u
"accel,alt,shift" , u
"cmd_paste" },
// macOS
#endif // MOZ_WIDGET_COCOA
/**************************************************************************
* Delete key in <textarea>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"shift" , u
"cmd_cutOrDelete" },
// Win, Emacs
#endif // XP_WIN || USE_EMACS_KEY_BINDINGS
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"control" , u
"cmd_copyOrDelete" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"control" , u
"cmd_deleteWordForward" },
// Win, Android
#endif // XP_WIN || MOZ_WIDGET_ANDROID
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"alt" , u
"cmd_deleteToEndOfLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* Backspace key in <textarea>.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_BACK" , nullptr, u
"control" , u
"cmd_deleteWordBackward" },
// Win, Android, Emacs
#endif // XP_WIN || MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_BACK" , nullptr, u
"alt" , u
"cmd_deleteToBeginningOfLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
#if defined (XP_WIN)
{u
"keypress" , u
"VK_BACK" , nullptr, u
"alt" , u
"cmd_undo" },
// Win
{u
"keypress" , u
"VK_BACK" , nullptr, u
"alt,shift" , u
"cmd_redo" },
// Win
#endif // XP_WIN
/**************************************************************************
* Common editor commands in <textarea>.
**************************************************************************/
{u
"keypress" , nullptr, u
"c" , u
"accel" , u
"cmd_copy" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"x" , u
"accel" , u
"cmd_cut" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"v" , u
"accel" , u
"cmd_paste" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"z" , u
"accel" , u
"cmd_undo" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"z" , u
"accel,shift" , u
"cmd_redo" },
// Win, macOS, Linux, Android, Emacs
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , nullptr, u
"y" , u
"accel" , u
"cmd_redo" },
// Win, Linux, Emacs
#endif // XP_WIN || MOZ_WIDGET_GTK || USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_COCOA) ||
defined (MOZ_WIDGET_GTK) ||\
defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , nullptr, u
"a" , u
"accel" , u
"cmd_selectAll" },
// Win, macOS, Linux, Android
#endif // XP_WIN || MOZ_WIDGET_COCOA || MOZ_WIDGET_GTK || MOZ_WIDGET_ANDROID
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , nullptr, u
"a" , u
"alt" , u
"cmd_selectAll" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Emacs specific shortcut keys in <textarea>.
**************************************************************************/
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , nullptr, u
"a" , u
"control" , u
"cmd_beginLine" },
// Emacs
{u
"keypress" , nullptr, u
"e" , u
"control" , u
"cmd_endLine" },
// Emacs
{u
"keypress" , nullptr, u
"b" , u
"control" , u
"cmd_charPrevious" },
// Emacs
{u
"keypress" , nullptr, u
"f" , u
"control" , u
"cmd_charNext" },
// Emacs
{u
"keypress" , nullptr, u
"h" , u
"control" , u
"cmd_deleteCharBackward" },
// Emacs
{u
"keypress" , nullptr, u
"d" , u
"control" , u
"cmd_deleteCharForward" },
// Emacs
{u
"keypress" , nullptr, u
"w" , u
"control" , u
"cmd_deleteWordBackward" },
// Emacs
{u
"keypress" , nullptr, u
"u" , u
"control" , u
"cmd_deleteToBeginningOfLine" },
// Emacs
{u
"keypress" , nullptr, u
"k" , u
"control" , u
"cmd_deleteToEndOfLine" },
// Emacs
{u
"keypress" , nullptr, u
"n" , u
"control" , u
"cmd_lineNext" },
// Emacs
{u
"keypress" , nullptr, u
"p" , u
"control" , u
"cmd_linePrevious" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
// clang-format on
{nullptr, nullptr, nullptr, nullptr, nullptr}};
ShortcutKeyData ShortcutKeys::sBrowserHandlers[] = {
// clang-format off
/**************************************************************************
* Arrow keys to move caret in non-editable element.
**************************************************************************/
{u
"keypress" , u
"VK_LEFT" , nullptr, nullptr, u
"cmd_moveLeft" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, nullptr, u
"cmd_moveRight" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , u
"VK_UP" , nullptr, nullptr, u
"cmd_moveUp" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , u
"VK_DOWN" , nullptr, nullptr, u
"cmd_moveDown" },
// Win, macOS, Linux, Android, Emacs
/**************************************************************************
* Arrow keys to select a char/line in non-editable element.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_COCOA) ||
defined (MOZ_WIDGET_GTK)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift" , u
"cmd_selectLeft" },
// Win, macOS, Linux
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift" , u
"cmd_selectRight" },
// Win, macOS, Linux
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift" , u
"cmd_selectUp" },
// Win, macOS, Linux
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift" , u
"cmd_selectDown" },
// Win, macOS, Linux
#endif // XP_WIN || MOZ_WIDGET_COCOA || MOZ_WIDGET_GTK
#if defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift" , u
"cmd_selectCharPrevious" },
// Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift" , u
"cmd_selectCharNext" },
// Android, Emacs
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift" , u
"cmd_selectLinePrevious" },
// Android, Emacs
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift" , u
"cmd_selectLineNext" },
// Android, Emacs
#endif // MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Arrow keys per word in non-editable element.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"control" , u
"cmd_wordPrevious" },
// Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"control" , u
"cmd_wordNext" },
// Android, Emacs
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"control,shift" , u
"cmd_selectWordPrevious" },
// Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"control,shift" , u
"cmd_selectWordNext" },
// Android, Emacs
#endif // MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"control" , u
"cmd_moveLeft2" },
// Win, Linux
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"control" , u
"cmd_moveRight2" },
// Win, Linux
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"control,shift" , u
"cmd_selectLeft2" },
// Win, Linux
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"control,shift" , u
"cmd_selectRight2" },
// Win, Linux
#endif // XP_WIN || MOZ_WIDGET_GTK
#if defined (MOZ_WIDGET_COCOA)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"alt" , u
"cmd_moveLeft2" },
// macOS
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"alt" , u
"cmd_moveRight2" },
// macOS
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"alt,shift" , u
"cmd_selectLeft2" },
// macOS
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"alt,shift" , u
"cmd_selectRight2" },
// macOS
#endif // MOZ_WIDGET_COCOA
/**************************************************************************
* Arrow keys per block in non-editable element.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK)
{u
"keypress" , u
"VK_UP" , nullptr, u
"control" , u
"cmd_moveUp2" },
// Win, Linux
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"control" , u
"cmd_moveDown2" },
// Win, Linux
{u
"keypress" , u
"VK_UP" , nullptr, u
"control,shift" , u
"cmd_selectUp2" },
// Win, Linux
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"control,shift" , u
"cmd_selectDown2" },
// Win, Linux
#endif // XP_WIN || MOZ_WIDGET_GTK
#if defined (MOZ_WIDGET_COCOA)
{u
"keypress" , u
"VK_UP" , nullptr, u
"accel" , u
"cmd_moveUp2" },
// macOS
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"accel" , u
"cmd_moveDown2" },
// macOS
{u
"keypress" , u
"VK_UP" , nullptr, u
"alt,shift" , u
"cmd_selectUp2" },
// macOS
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"alt,shift" , u
"cmd_selectDown2" },
// macOS
#endif // MOZ_WIDGET_COCOA
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_UP" , nullptr, u
"alt" , u
"cmd_moveTop" },
// Android
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"alt" , u
"cmd_moveBottom" },
// Android
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift,alt" , u
"cmd_selectTop" },
// Android
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift,alt" , u
"cmd_selectBottom" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* Arrow keys to begin/end of a line in non-editable element.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"alt" , u
"cmd_beginLine" },
// Android
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"alt" , u
"cmd_endLine" },
// Android
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift,alt" , u
"cmd_selectBeginLine" },
// Android
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift,alt" , u
"cmd_selectEndLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* PageUp/PageDown keys in non-editable element.
**************************************************************************/
#if defined (MOZ_WIDGET_COCOA)
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, nullptr, u
"cmd_scrollPageUp" },
// macOS
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, nullptr, u
"cmd_scrollPageDown" },
// macOS
#endif // MOZ_WIDGET_COCOA
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) ||\
defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, nullptr, u
"cmd_movePageUp" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, nullptr, u
"cmd_movePageDown" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, u
"shift" , u
"cmd_selectPageUp" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, u
"shift" , u
"cmd_selectPageDown" },
// Win, Linux, Android, Emacs
#endif // XP_WIN || MOZ_WIDGET_GTK || MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, u
"alt" , u
"cmd_moveTop" },
// Android
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, u
"alt" , u
"cmd_moveBottom" },
// Android
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, u
"shift,alt" , u
"cmd_selectTop" },
// Android
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, u
"shift,alt" , u
"cmd_selectBottom" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* Home/End keys in non-editable element.
**************************************************************************/
#if defined (MOZ_WIDGET_COCOA)
{u
"keypress" , u
"VK_HOME" , nullptr, nullptr, u
"cmd_scrollTop" },
// macOS
{u
"keypress" , u
"VK_END" , nullptr, nullptr, u
"cmd_scrollBottom" },
// macOS
#endif // MOZ_WIDGET_COCOA
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) ||\
defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_HOME" , nullptr, nullptr, u
"cmd_beginLine" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, nullptr, u
"cmd_endLine" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"shift" , u
"cmd_selectBeginLine" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"shift" , u
"cmd_selectEndLine" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"control" , u
"cmd_moveTop" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"control" , u
"cmd_moveBottom" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"shift,control" , u
"cmd_selectTop" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"shift,control" , u
"cmd_selectBottom" },
// Win, Linux, Android, Emacs
#endif // XP_WIN || MOZ_WIDGET_GTK || MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Insert key in non-editable element.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_INSERT" , nullptr, u
"control" , u
"cmd_copy" },
// Win, Linux, Emacs
#endif // XP_WIN || MOZ_WIDGET_GTK || USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Delete key in non-editable element.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"shift" , u
"cmd_cut" },
// Win, Linux, Emacs
#endif // XP_WIN || MOZ_WIDGET_GTK || USE_EMACS_KEY_BINDINGS
#if defined (MOZ_WIDGET_GTK) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"control" , u
"cmd_copy" },
// Linux, Emacs
#endif // MOZ_WIDGET_GTK || USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"control" , u
"cmd_deleteWordForward" },
// Win, Android
#endif // XP_WIN || MOZ_WIDGET_ANDROID
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"alt" , u
"cmd_deleteToEndOfLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* Backspace key in non-editable element.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_BACK" , nullptr, u
"alt" , u
"cmd_deleteToBeginningOfLine" },
// Android
{u
"keypress" , u
"VK_BACK" , nullptr, u
"control" , u
"cmd_deleteWordBackward" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* Common editor commands in non-editable element.
**************************************************************************/
{u
"keypress" , nullptr, u
"c" , u
"accel" , u
"cmd_copy" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"x" , u
"accel" , u
"cmd_cut" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"v" , u
"accel" , u
"cmd_paste" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"v" , u
"accel,shift" , u
"cmd_pasteNoFormatting" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"z" , u
"accel" , u
"cmd_undo" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"z" , u
"accel,shift" , u
"cmd_redo" },
// Win, macOS, Linux, Android, Emacs
// Mac uses Option+Shift+Command+V for Paste and Match Style
#if defined (MOZ_WIDGET_COCOA)
{u
"keypress" , nullptr, u
"v" , u
"accel,alt,shift" , u
"cmd_pasteNoFormatting" },
// macOS
#endif // MOZ_WIDGET_COCOA
#if defined (XP_WIN)
{u
"keypress" , nullptr, u
"y" , u
"accel" , u
"cmd_redo" },
// Win
#endif // XP_WIN
{u
"keypress" , nullptr, u
"a" , u
"accel" , u
"cmd_selectAll" },
// Win, macOS, Linux, Android, Emacs
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , nullptr, u
"a" , u
"alt" , u
"cmd_selectAll" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Space key in non-editable element.
**************************************************************************/
{u
"keypress" , nullptr, u
" " , nullptr, u
"cmd_scrollPageDown" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
" " , u
"shift" , u
"cmd_scrollPageUp" },
// Win, macOS, Linux, Android, Emacs
{nullptr, nullptr, nullptr, nullptr, nullptr}};
ShortcutKeyData ShortcutKeys::sEditorHandlers[] = {
// clang-format off
/**************************************************************************
* Arrow keys to move caret in HTMLEditor.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) || \
defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, nullptr, u
"cmd_moveLeft" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, nullptr, u
"cmd_moveRight" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_UP" , nullptr, nullptr, u
"cmd_moveUp" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_DOWN" , nullptr, nullptr, u
"cmd_moveDown" },
// Win, Linux, Android, Emacs
#endif // Except MOZ_WIDGET_COCOA
/**************************************************************************
* Arrow keys to select a char/line in HTMLEditor.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) || \
defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift" , u
"cmd_selectLeft" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift" , u
"cmd_selectRight" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift" , u
"cmd_selectUp" },
// Win, Linux, Android, Emacs
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift" , u
"cmd_selectDown" },
// Win, Linux, Android, Emacs
#endif // Except MOZ_WIDGET_COCOA
/**************************************************************************
* Arrow keys per word in HTMLEditor.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"control" , u
"cmd_wordPrevious" },
// Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"control" , u
"cmd_wordNext" },
// Android, Emacs
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift,control" , u
"cmd_selectWordPrevious" },
// Android, Emacs
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift,control" , u
"cmd_selectWordNext" },
// Android, Emacs
#endif // MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"accel" , u
"cmd_moveLeft2" },
// Win
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"accel" , u
"cmd_moveRight2" },
// Win
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift,accel" , u
"cmd_selectLeft2" },
// Win
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift,accel" , u
"cmd_selectRight2" },
// Win
#endif // XP_WIN
/**************************************************************************
* Arrow keys per block in HTMLEditor.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_UP" , nullptr, u
"alt" , u
"cmd_moveTop" },
// Android
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"alt" , u
"cmd_moveBottom" },
// Android
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift,alt" , u
"cmd_selectTop" },
// Android
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift,alt" , u
"cmd_selectBottom" },
// Android
#endif // MOZ_WIDGET_ANDROID
#if defined (XP_WIN)
{u
"keypress" , u
"VK_UP" , nullptr, u
"accel" , u
"cmd_moveUp2" },
// Win
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"accel" , u
"cmd_moveDown2" },
// Win
{u
"keypress" , u
"VK_UP" , nullptr, u
"shift,accel" , u
"cmd_selectUp2" },
// Win
{u
"keypress" , u
"VK_DOWN" , nullptr, u
"shift,accel" , u
"cmd_selectDown2" },
// Win
#endif // XP_WIN
/**************************************************************************
* Arrow keys to begin/end of a line in HTMLEditor.
**************************************************************************/
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"alt" , u
"cmd_beginLine" },
// Android
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"alt" , u
"cmd_endLine" },
// Android
{u
"keypress" , u
"VK_LEFT" , nullptr, u
"shift,alt" , u
"cmd_selectBeginLine" },
// Android
{u
"keypress" , u
"VK_RIGHT" , nullptr, u
"shift,alt" , u
"cmd_selectEndLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* PageUp/PageDown keys in HTMLEditor.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, nullptr, u
"cmd_movePageUp" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, nullptr, u
"cmd_movePageDown" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, u
"shift" , u
"cmd_selectPageUp" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, u
"shift" , u
"cmd_selectPageDown" },
// Win, Android, Emacs
#endif // XP_WIN || MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, u
"alt" , u
"cmd_moveTop" },
// Android
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, u
"alt" , u
"cmd_moveBottom" },
// Android
{u
"keypress" , u
"VK_PAGE_UP" , nullptr, u
"shift,alt" , u
"cmd_selectTop" },
// Android
{u
"keypress" , u
"VK_PAGE_DOWN" , nullptr, u
"shift,alt" , u
"cmd_selectBottom" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* Home/End keys in HTMLEditor.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_HOME" , nullptr, nullptr, u
"cmd_beginLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, nullptr, u
"cmd_endLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"shift" , u
"cmd_selectBeginLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"shift" , u
"cmd_selectEndLine" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"control" , u
"cmd_moveTop" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"control" , u
"cmd_moveBottom" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_HOME" , nullptr, u
"shift,control" , u
"cmd_selectTop" },
// Win, Android, Emacs
{u
"keypress" , u
"VK_END" , nullptr, u
"shift,control" , u
"cmd_selectBottom" },
// Win, Android, Emacs
#endif // XP_WIN || MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Insert key in HTMLEditor.
**************************************************************************/
#if defined (XP_WIN) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_INSERT" , nullptr, u
"control" , u
"cmd_copy" },
// Win, Emacs
{u
"keypress" , u
"VK_INSERT" , nullptr, u
"shift" , u
"cmd_paste" },
// Win, Emacs
#endif // XP_WIN || USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Delete key in HTMLEditor.
**************************************************************************/
#if defined (XP_WIN) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"shift" , u
"cmd_cutOrDelete" },
// Win, Emacs
#endif // XP_WIN || USE_EMACS_KEY_BINDINGS
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"control" , u
"cmd_copyOrDelete" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"control" , u
"cmd_deleteWordForward" },
// Win, Android
#endif // XP_WIN || MOZ_WIDGET_ANDROID
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_DELETE" , nullptr, u
"alt" , u
"cmd_deleteToEndOfLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
/**************************************************************************
* Backspace key in HTMLEditor.
**************************************************************************/
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_ANDROID) ||
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , u
"VK_BACK" , nullptr, u
"control" , u
"cmd_deleteWordBackward" },
// Win, Android, Emacs
#endif // XP_WIN || MOZ_WIDGET_ANDROID || USE_EMACS_KEY_BINDINGS
#if defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , u
"VK_BACK" , nullptr, u
"alt" , u
"cmd_deleteToBeginningOfLine" },
// Android
#endif // MOZ_WIDGET_ANDROID
#if defined (XP_WIN)
{u
"keypress" , u
"VK_BACK" , nullptr, u
"alt" , u
"cmd_undo" },
// Win
{u
"keypress" , u
"VK_BACK" , nullptr, u
"alt,shift" , u
"cmd_redo" },
// Win
#endif // XP_WIN
/**************************************************************************
* Common editor commands in HTMLEditor.
**************************************************************************/
{u
"keypress" , nullptr, u
"c" , u
"accel" , u
"cmd_copy" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"x" , u
"accel" , u
"cmd_cut" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"v" , u
"accel" , u
"cmd_paste" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"v" , u
"accel,shift" , u
"cmd_pasteNoFormatting" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"z" , u
"accel" , u
"cmd_undo" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
"z" , u
"accel,shift" , u
"cmd_redo" },
// Win, macOS, Linux, Android, Emacs
// Mac uses Option+Shift+Command+V for Paste and Match Style
#if defined (MOZ_WIDGET_COCOA)
{u
"keypress" , nullptr, u
"v" , u
"accel,alt,shift" , u
"cmd_pasteNoFormatting" },
// macOS
#endif // MOZ_WIDGET_COCOA
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_GTK) ||\
defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , nullptr, u
"y" , u
"accel" , u
"cmd_redo" },
// Emacs
#endif // XP_WIN || MOZ_WIDGET_GTK || USE_EMACS_KEY_BINDINGS
#if defined (XP_WIN) ||
defined (MOZ_WIDGET_COCOA) ||
defined (MOZ_WIDGET_GTK) ||\
defined (MOZ_WIDGET_ANDROID)
{u
"keypress" , nullptr, u
"a" , u
"accel" , u
"cmd_selectAll" },
// Win, macOS, Linux, Android
#endif // XP_WIN || MOZ_WIDGET_COCOA || MOZ_WIDGET_GTK || MOZ_WIDGET_ANDROID
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , nullptr, u
"a" , u
"alt" , u
"cmd_selectAll" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
/**************************************************************************
* Space key in HTMLEditor.
**************************************************************************/
{u
"keypress" , nullptr, u
" " , nullptr, u
"cmd_scrollPageDown" },
// Win, macOS, Linux, Android, Emacs
{u
"keypress" , nullptr, u
" " , u
"shift" , u
"cmd_scrollPageUp" },
// Win, macOS, Linux, Android, Emacs
/**************************************************************************
* Emacs specific shortcut keys in HTMLEditor.
**************************************************************************/
#if defined (USE_EMACS_KEY_BINDINGS)
{u
"keypress" , nullptr, u
"h" , u
"control" , u
"cmd_deleteCharBackward" },
// Emacs
{u
"keypress" , nullptr, u
"d" , u
"control" , u
"cmd_deleteCharForward" },
// Emacs
{u
"keypress" , nullptr, u
"k" , u
"control" , u
"cmd_deleteToEndOfLine" },
// Emacs
{u
"keypress" , nullptr, u
"u" , u
"control" , u
"cmd_deleteToBeginningOfLine" },
// Emacs
{u
"keypress" , nullptr, u
"a" , u
"control" , u
"cmd_beginLine" },
// Emacs
{u
"keypress" , nullptr, u
"e" , u
"control" , u
"cmd_endLine" },
// Emacs
{u
"keypress" , nullptr, u
"b" , u
"control" , u
"cmd_charPrevious" },
// Emacs
{u
"keypress" , nullptr, u
"f" , u
"control" , u
"cmd_charNext" },
// Emacs
{u
"keypress" , nullptr, u
"p" , u
"control" , u
"cmd_linePrevious" },
// Emacs
{u
"keypress" , nullptr, u
"n" , u
"control" , u
"cmd_lineNext" },
// Emacs
#endif // USE_EMACS_KEY_BINDINGS
// clang-format on
{nullptr, nullptr, nullptr, nullptr, nullptr}};
}
// namespace mozilla
#undef USE_EMACS_KEY_BINDINGS
Messung V0.5 C=47 H=100 G=78
¤ Dauer der Verarbeitung: 0.21 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland