/* 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 in Prozent C=55 H=100 G=80
¤ Dauer der Verarbeitung: 0.20 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland