// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'actions.dart'; import 'framework.dart'; import 'shortcuts.dart'; import 'text_editing_intents.dart'; /// A [Shortcuts] widget with the shortcuts used for the default text editing /// behavior. /// /// This default behavior can be overridden by placing a [Shortcuts] widget /// lower in the widget tree than this. See [DefaultTextEditingActions] for an example /// of remapping a text editing [Intent] to a custom [Action]. /// /// {@tool snippet} /// /// This example shows how to use an additional [Shortcuts] widget to override /// some default text editing keyboard shortcuts to have new behavior. Instead /// of moving the cursor, alt + up/down will change the focused widget. /// /// ```dart /// @override /// Widget build(BuildContext context) { /// // If using WidgetsApp or its descendents MaterialApp or CupertinoApp, /// // then DefaultTextEditingShortcuts is already being inserted into the /// // widget tree. /// return DefaultTextEditingShortcuts( /// child: Center( /// child: Shortcuts( /// shortcuts: const <ShortcutActivator, Intent>{ /// SingleActivator(LogicalKeyboardKey.arrowDown, alt: true): NextFocusIntent(), /// SingleActivator(LogicalKeyboardKey.arrowUp, alt: true): PreviousFocusIntent(), /// }, /// child: Column( /// children: const <Widget>[ /// TextField( /// decoration: InputDecoration( /// hintText: 'alt + down moves to the next field.', /// ), /// ), /// TextField( /// decoration: InputDecoration( /// hintText: 'And alt + up moves to the previous.', /// ), /// ), /// ], /// ), /// ), /// ), /// ); /// } /// ``` /// {@end-tool} /// /// {@tool snippet} /// /// This example shows how to use an additional [Shortcuts] widget to override /// default text editing shortcuts to have completely custom behavior defined by /// a custom Intent and Action. Here, the up/down arrow keys increment/decrement /// a counter instead of moving the cursor. /// /// ```dart /// class IncrementCounterIntent extends Intent {} /// class DecrementCounterIntent extends Intent {} /// /// class MyWidget extends StatefulWidget { /// const MyWidget({ Key? key }) : super(key: key); /// /// @override /// MyWidgetState createState() => MyWidgetState(); /// } /// /// class MyWidgetState extends State<MyWidget> { /// /// int _counter = 0; /// /// @override /// Widget build(BuildContext context) { /// // If using WidgetsApp or its descendents MaterialApp or CupertinoApp, /// // then DefaultTextEditingShortcuts is already being inserted into the /// // widget tree. /// return DefaultTextEditingShortcuts( /// child: Center( /// child: Column( /// mainAxisAlignment: MainAxisAlignment.center, /// children: <Widget>[ /// const Text( /// 'You have pushed the button this many times:', /// ), /// Text( /// '$_counter', /// style: Theme.of(context).textTheme.headline4, /// ), /// Shortcuts( /// shortcuts: <ShortcutActivator, Intent>{ /// const SingleActivator(LogicalKeyboardKey.arrowUp): IncrementCounterIntent(), /// const SingleActivator(LogicalKeyboardKey.arrowDown): DecrementCounterIntent(), /// }, /// child: Actions( /// actions: <Type, Action<Intent>>{ /// IncrementCounterIntent: CallbackAction<IncrementCounterIntent>( /// onInvoke: (IncrementCounterIntent intent) { /// setState(() { /// _counter++; /// }); /// }, /// ), /// DecrementCounterIntent: CallbackAction<DecrementCounterIntent>( /// onInvoke: (DecrementCounterIntent intent) { /// setState(() { /// _counter--; /// }); /// }, /// ), /// }, /// child: const TextField( /// maxLines: 2, /// decoration: InputDecoration( /// hintText: 'Up/down increment/decrement here.', /// ), /// ), /// ), /// ), /// const TextField( /// maxLines: 2, /// decoration: InputDecoration( /// hintText: 'Up/down behave normally here.', /// ), /// ), /// ], /// ), /// ), /// ); /// } /// } /// ``` /// {@end-tool} /// /// See also: /// /// * [DefaultTextEditingActions], which contains all of the [Action]s that /// respond to the [Intent]s in these shortcuts with the default text editing /// behavior. /// * [WidgetsApp], which creates a DefaultTextEditingShortcuts. class DefaultTextEditingShortcuts extends Shortcuts { /// Creates a [Shortcuts] widget that provides the default text editing /// shortcuts on the current platform. DefaultTextEditingShortcuts({ Key? key, required Widget child, }) : super( key: key, debugLabel: '<Default Text Editing Shortcuts>', shortcuts: _shortcuts, child: child, ); static const Map<ShortcutActivator, Intent> _androidShortcuts = <ShortcutActivator, Intent>{ SingleActivator(LogicalKeyboardKey.backspace): DeleteTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, control: true): DeleteByWordTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, alt: true): DeleteByLineTextIntent(), SingleActivator(LogicalKeyboardKey.delete): DeleteForwardTextIntent(), SingleActivator(LogicalKeyboardKey.delete, control: true): DeleteForwardByWordTextIntent(), SingleActivator(LogicalKeyboardKey.delete, alt: true): DeleteForwardByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, alt: true): MoveSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, alt: true): MoveSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, alt: true): MoveSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, alt: true): MoveSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): ExpandSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, alt: true): ExpandSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, alt: true): ExpandSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): ExpandSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown): MoveSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft): MoveSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight): MoveSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp): MoveSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, control: true): MoveSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, control: true): MoveSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, control: true): ExtendSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, control: true): ExtendSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true): ExtendSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true): ExtendSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true): ExtendSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true): ExtendSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.keyX, control: true): CutSelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyC, control: true): CopySelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyV, control: true): PasteTextIntent(), SingleActivator(LogicalKeyboardKey.keyA, control: true): SelectAllTextIntent(), // The following key combinations have no effect on text editing on this // platform: // * End // * Home // * Meta + X // * Meta + C // * Meta + V // * Meta + A // * Meta + arrow down // * Meta + arrow left // * Meta + arrow right // * Meta + arrow up // * Meta + shift + arrow down // * Meta + shift + arrow left // * Meta + shift + arrow right // * Meta + shift + arrow up // * Shift + end // * Shift + home // * Meta + delete // * Meta + backspace }; static const Map<ShortcutActivator, Intent> _fuchsiaShortcuts = <ShortcutActivator, Intent>{ SingleActivator(LogicalKeyboardKey.backspace): DeleteTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, control: true): DeleteByWordTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, alt: true): DeleteByLineTextIntent(), SingleActivator(LogicalKeyboardKey.delete): DeleteForwardTextIntent(), SingleActivator(LogicalKeyboardKey.delete, control: true): DeleteForwardByWordTextIntent(), SingleActivator(LogicalKeyboardKey.delete, alt: true): DeleteForwardByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, alt: true): MoveSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, alt: true): MoveSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, alt: true): MoveSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, alt: true): MoveSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): ExpandSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, alt: true): ExpandSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, alt: true): ExpandSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): ExpandSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown): MoveSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft): MoveSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight): MoveSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp): MoveSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, control: true): MoveSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, control: true): MoveSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, control: true): ExtendSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, control: true): ExtendSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true): ExtendSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true): ExtendSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true): ExtendSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true): ExtendSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.keyX, control: true): CutSelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyC, control: true): CopySelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyV, control: true): PasteTextIntent(), SingleActivator(LogicalKeyboardKey.keyA, control: true): SelectAllTextIntent(), // The following key combinations have no effect on text editing on this // platform: // * End // * Home // * Meta + X // * Meta + C // * Meta + V // * Meta + A // * Meta + arrow down // * Meta + arrow left // * Meta + arrow right // * Meta + arrow up // * Meta + shift + arrow down // * Meta + shift + arrow left // * Meta + shift + arrow right // * Meta + shift + arrow up // * Shift + end // * Shift + home // * Meta + delete // * Meta + backspace }; static const Map<ShortcutActivator, Intent> _iOSShortcuts = <ShortcutActivator, Intent>{ SingleActivator(LogicalKeyboardKey.backspace): DeleteTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, control: true): DeleteByWordTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, alt: true): DeleteByLineTextIntent(), SingleActivator(LogicalKeyboardKey.delete): DeleteForwardTextIntent(), SingleActivator(LogicalKeyboardKey.delete, control: true): DeleteForwardByWordTextIntent(), SingleActivator(LogicalKeyboardKey.delete, alt: true): DeleteForwardByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, alt: true): MoveSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, alt: true): MoveSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, alt: true): MoveSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, alt: true): MoveSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): ExpandSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, alt: true): ExpandSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, alt: true): ExpandSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): ExpandSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown): MoveSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft): MoveSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight): MoveSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp): MoveSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, control: true): MoveSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, control: true): MoveSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, control: true): ExtendSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, control: true): ExtendSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true): ExtendSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true): ExtendSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true): ExtendSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true): ExtendSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.keyX, control: true): CutSelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyC, control: true): CopySelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyV, control: true): PasteTextIntent(), SingleActivator(LogicalKeyboardKey.keyA, control: true): SelectAllTextIntent(), // The following key combinations have no effect on text editing on this // platform: // * End // * Home // * Meta + X // * Meta + C // * Meta + V // * Meta + A // * Meta + arrow down // * Meta + arrow left // * Meta + arrow right // * Meta + arrow up // * Meta + shift + arrow down // * Meta + shift + arrow left // * Meta + shift + arrow right // * Meta + shift + arrow up // * Shift + end // * Shift + home // * Meta + delete // * Meta + backspace }; static const Map<ShortcutActivator, Intent> _linuxShortcuts = <ShortcutActivator, Intent>{ SingleActivator(LogicalKeyboardKey.backspace): DeleteTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, control: true): DeleteByWordTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, alt: true): DeleteByLineTextIntent(), SingleActivator(LogicalKeyboardKey.delete): DeleteForwardTextIntent(), SingleActivator(LogicalKeyboardKey.delete, control: true): DeleteForwardByWordTextIntent(), SingleActivator(LogicalKeyboardKey.delete, alt: true): DeleteForwardByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, alt: true): MoveSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, alt: true): MoveSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, alt: true): MoveSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, alt: true): MoveSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): ExpandSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, alt: true): ExpandSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, alt: true): ExpandSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): ExpandSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown): MoveSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft): MoveSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight): MoveSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp): MoveSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, control: true): MoveSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, control: true): MoveSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, control: true): ExtendSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, control: true): ExtendSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true): ExtendSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true): ExtendSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true): ExtendSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true): ExtendSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.end): MoveSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.home): MoveSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.end, shift: true): ExtendSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.home, shift: true): ExtendSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.keyX, control: true): CutSelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyC, control: true): CopySelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyV, control: true): PasteTextIntent(), SingleActivator(LogicalKeyboardKey.keyA, control: true): SelectAllTextIntent(), // The following key combinations have no effect on text editing on this // platform: // * Meta + X // * Meta + C // * Meta + V // * Meta + A // * Meta + arrow down // * Meta + arrow left // * Meta + arrow right // * Meta + arrow up // * Meta + shift + arrow down // * Meta + shift + arrow left // * Meta + shift + arrow right // * Meta + shift + arrow up // * Meta + delete // * Meta + backspace }; static const Map<ShortcutActivator, Intent> _macShortcuts = <ShortcutActivator, Intent>{ SingleActivator(LogicalKeyboardKey.backspace): DeleteTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, alt: true): DeleteByWordTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, meta: true): DeleteByLineTextIntent(), SingleActivator(LogicalKeyboardKey.delete): DeleteForwardTextIntent(), SingleActivator(LogicalKeyboardKey.delete, alt: true): DeleteForwardByWordTextIntent(), SingleActivator(LogicalKeyboardKey.delete, meta: true): DeleteForwardByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, alt: true): MoveSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, alt: true): MoveSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, alt: true): MoveSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, alt: true): MoveSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): ExtendSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, alt: true): ExtendSelectionLeftByWordAndStopAtReversalTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, alt: true): ExtendSelectionRightByWordAndStopAtReversalTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): ExtendSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown): MoveSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft): MoveSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight): MoveSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp): MoveSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, meta: true): MoveSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, meta: true): MoveSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, meta: true): MoveSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, meta: true): MoveSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, meta: true): ExpandSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, meta: true): ExpandSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, meta: true): ExpandSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, meta: true): ExpandSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true): ExtendSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true): ExtendSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true): ExtendSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true): ExtendSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.end, shift: true): ExpandSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.home, shift: true): ExpandSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.keyX, meta: true): CutSelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyC, meta: true): CopySelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyV, meta: true): PasteTextIntent(), SingleActivator(LogicalKeyboardKey.keyA, meta: true): SelectAllTextIntent(), // The following key combinations have no effect on text editing on this // platform: // * Control + X // * Control + C // * Control + V // * Control + A // * Control + arrow left // * Control + arrow right // * Control + shift + arrow left // * Control + shift + arrow right // * End // * Home // * Control + delete // * Control + backspace }; static const Map<ShortcutActivator, Intent> _windowsShortcuts = <ShortcutActivator, Intent>{ SingleActivator(LogicalKeyboardKey.backspace): DeleteTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, control: true): DeleteByWordTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, alt: true): DeleteByLineTextIntent(), SingleActivator(LogicalKeyboardKey.delete): DeleteForwardTextIntent(), SingleActivator(LogicalKeyboardKey.delete, control: true): DeleteForwardByWordTextIntent(), SingleActivator(LogicalKeyboardKey.delete, alt: true): DeleteForwardByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, alt: true): MoveSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, alt: true): MoveSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, alt: true): MoveSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, alt: true): MoveSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): ExpandSelectionToEndTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, alt: true): ExpandSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, alt: true): ExpandSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): ExpandSelectionToStartTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown): MoveSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft): MoveSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight): MoveSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp): MoveSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, control: true): MoveSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, control: true): MoveSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, control: true): ExtendSelectionLeftByWordTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, control: true): ExtendSelectionRightByWordTextIntent(), SingleActivator(LogicalKeyboardKey.end): MoveSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.home): MoveSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true): ExtendSelectionDownTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true): ExtendSelectionLeftTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true): ExtendSelectionRightTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true): ExtendSelectionUpTextIntent(), SingleActivator(LogicalKeyboardKey.end, shift: true): ExtendSelectionRightByLineTextIntent(), SingleActivator(LogicalKeyboardKey.home, shift: true): ExtendSelectionLeftByLineTextIntent(), SingleActivator(LogicalKeyboardKey.keyX, control: true): CutSelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyC, control: true): CopySelectionTextIntent(), SingleActivator(LogicalKeyboardKey.keyV, control: true): PasteTextIntent(), SingleActivator(LogicalKeyboardKey.keyA, control: true): SelectAllTextIntent(), // The following key combinations have no effect on text editing on this // platform: // * Meta + X // * Meta + C // * Meta + V // * Meta + A // * Meta + arrow down // * Meta + arrow left // * Meta + arrow right // * Meta + arrow up // * Meta + shift + arrow down // * Meta + shift + arrow left // * Meta + shift + arrow right // * Meta + shift + arrow up // * Meta + delete // * Meta + backspace }; // Web handles its text selection natively and doesn't use any of these // shortcuts in Flutter. static const Map<ShortcutActivator, Intent> _webShortcuts = <ShortcutActivator, Intent>{ SingleActivator(LogicalKeyboardKey.backspace): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.delete): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, alt: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.delete, alt: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, control: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.delete, control: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.backspace, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.delete, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, alt: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, alt: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, alt: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, alt: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, control: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, control: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, control: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, control: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.end): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.home): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowDown, shift: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowLeft, shift: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowRight, shift: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.arrowUp, shift: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.end, shift: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.home, shift: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.space): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.keyX, control: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.keyX, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.keyC, control: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.keyC, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.keyV, control: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.keyV, meta: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.keyA, control: true): DoNothingAndStopPropagationTextIntent(), SingleActivator(LogicalKeyboardKey.keyA, meta: true): DoNothingAndStopPropagationTextIntent(), }; static Map<ShortcutActivator, Intent> get _shortcuts { if (kIsWeb) { return _webShortcuts; } switch (defaultTargetPlatform) { case TargetPlatform.android: return _androidShortcuts; case TargetPlatform.fuchsia: return _fuchsiaShortcuts; case TargetPlatform.iOS: return _iOSShortcuts; case TargetPlatform.linux: return _linuxShortcuts; case TargetPlatform.macOS: return _macShortcuts; case TargetPlatform.windows: return _windowsShortcuts; } } }