123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- <!DOCTYPE html>
- <!--[if IE]><![endif]-->
- <html>
-
- <head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- <title>Keyboard Event Processing </title>
- <meta name="viewport" content="width=device-width">
- <meta name="title" content="Keyboard Event Processing ">
- <meta name="generator" content="docfx 2.59.4.0">
-
- <link rel="shortcut icon" href="../favicon.ico">
- <link rel="stylesheet" href="../styles/docfx.vendor.css">
- <link rel="stylesheet" href="../styles/docfx.css">
- <link rel="stylesheet" href="../styles/main.css">
- <link href="https://fonts.googleapis.com/css?family=Source Sans Pro" rel="stylesheet">
- <link href="https://fonts.googleapis.com/css?family=Source Code Pro" rel="stylesheet">
- <meta property="docfx:navrel" content="../toc.html">
- <meta property="docfx:tocrel" content="../toc.html">
-
- <meta property="docfx:rel" content="../">
-
- </head> <body data-spy="scroll" data-target="#affix" data-offset="120">
- <div id="wrapper">
- <header>
-
- <nav id="autocollapse" class="navbar navbar-inverse ng-scope" role="navigation">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
-
- <a class="navbar-brand" href="../index.html">
- <img id="logo" class="svg" src="../images/logo48.png" alt="">
- </a>
- </div>
- <div class="collapse navbar-collapse" id="navbar">
- <form class="navbar-form navbar-right" role="search" id="search">
- <div class="form-group">
- <input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
- </div>
- </form>
- </div>
- </div>
- </nav>
-
- <div class="subnav navbar navbar-default">
- <div class="container hide-when-search" id="breadcrumb">
- <ul class="breadcrumb">
- <li></li>
- </ul>
- </div>
- </div>
- </header>
- <div class="container body-content">
-
- <div id="search-results">
- <div class="search-list">Search Results for <span></span></div>
- <div class="sr-items">
- <p><i class="glyphicon glyphicon-refresh index-loading"></i></p>
- </div>
- <ul id="pagination" data-first="First" data-prev="Previous" data-next="Next" data-last="Last"></ul>
- </div>
- </div>
- <div role="main" class="container body-content hide-when-search">
- <div class="article row grid">
- <div class="col-md-10">
- <article class="content wrap" id="_content" data-uid="">
- <h1 id="keyboard-event-processing">Keyboard Event Processing</h1>
- <p><strong>Terminal.Gui</strong> respects common Linux, Mac, and Windows keyboard idioms. For example, clipboard operations use the familiar <code>Control/Command-C, X, V</code> model. <code>CTRL-Q</code> is used for exiting views (and apps).</p>
- <p>The input handling of <strong>Terminal.Gui</strong> is similar in some ways to Emacs and the Midnight Commander, so you can expect some of the special key combinations to be active.</p>
- <p>The key <code>ESC</code> can act as an Alt modifier (or Meta in Emacs parlance), to allow input on terminals that do not have an alt key. So to produce the sequence <code>Alt-F</code>, you can press either <code>Alt-F</code>, or <code>ESC</code> followed by the key <code>F</code>.</p>
- <p>To enter the key <code>ESC</code>, you can either press <code>ESC</code> and wait 100 milliseconds, or you can press <code>ESC</code> twice.</p>
- <p><code>ESC-0</code>, and <code>ESC-1</code> through <code>ESC-9</code> have a special meaning, they map to <code>F10</code>, and <code>F1</code> to <code>F9</code> respectively.</p>
- <p>Apps can change key bindings using the <code>AddKeyBinding</code> API. </p>
- <p>Keyboard events are sent by the <a href="mainloop.html">Main Loop</a> to the
- Application class for processing. The keyboard events are sent
- exclusively to the current <code>Toplevel</code>, this being either the default
- that is created when you call <code>Application.Init</code>, or one that you
- created an passed to <code>Application.Run(Toplevel)</code>. </p>
- <h2 id="flow">Flow</h2>
- <p>Keystrokes are first processes as hotkeys, then as regular keys, and
- there is a final cold post-processing event that is invoked if no view
- processed the key.</p>
- <h2 id="hotkey-processing">HotKey Processing</h2>
- <p>Events are first send to all views as a "HotKey", this means that the
- <code>View.ProcessHotKey</code> method is invoked on the current toplevel, which
- in turns propagates this to all the views in the hierarchy. If any
- view decides to process the event, no further processing takes place.</p>
- <p>This is how hotkeys for buttons are implemented. For example, the
- keystroke "Alt-A" is handled by Buttons that have a hot-letter "A" to
- activate the button.</p>
- <h2 id="regular-processing">Regular Processing</h2>
- <p>Unlike the hotkey processing, the regular processing is only sent to
- the currently focused view in the focus chain.</p>
- <p>The regular key processing is only invoked if no hotkey was caught.</p>
- <h2 id="cold-key-processing">Cold-key Processing</h2>
- <p>This stage only is executed if the focused view did not process the
- event, and is broadcast to all the views in the Toplevel.</p>
- <p>This method can be overwritten by views that want to provide
- accelerator functionality (Alt-key for example), but without
- interfering with normal ProcessKey behavior.</p>
- <h2 id="key-bindings">Key Bindings</h2>
- <p><strong>Terminal.Gui</strong> supports rebinding keys. For example the default key
- for activating a button is Enter. You can change this using the
- <code>ClearKeybinding</code> and <code>AddKeybinding</code> methods:</p>
- <pre><code class="lang-csharp">var btn = new Button ("Press Me");
- btn.ClearKeybinding (Command.Accept);
- btn.AddKeyBinding (Key.b, Command.Accept);
- </code></pre><p>The <code>Command</code> enum lists generic operations that are implemented by views.
- For example <code>Command.Accept</code> in a Button results in the <code>Clicked</code> event
- firing while in <code>TableView</code> it is bound to <code>CellActivated</code>. Not all commands
- are implemented by all views (e.g. you cannot scroll in a Button). To see
- which commands are implemented by a View you can use the <code>GetSupportedCommands()</code>
- method.</p>
- <p>Not all controls have the same key bound for a given command, for example
- <code>Command.Accept</code> defaults to <code>Key.Enter</code> in a <code>Button</code> but defaults to <code>Key.Space</code>
- in <code>RadioGroup</code>.</p>
- <h2 id="global-key-handler">Global Key Handler</h2>
- <p>Sometimes you may want to define global key handling logic for your entire
- application that is invoked regardless of what Window/View has focus. This can
- be achieved by using the <code>Application.RootKeyEvent</code> event.</p>
- </article>
- </div>
-
- <div class="hidden-sm col-md-2" role="complementary">
- <div class="sideaffix">
- <div class="contribution">
- <ul class="nav">
- <li>
- <a href="https://github.com/gui-cs/Terminal.Gui/blob/develop/docfx/articles/keyboard.md/#L1" class="contribution-link">Improve this Doc</a>
- </li>
- </ul>
- </div>
- <nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
- <h5>In This Article</h5>
- <div></div>
- </nav>
- </div>
- </div>
- </div>
- </div>
-
- <footer>
- <div class="grad-bottom"></div>
- <div class="footer">
- <div class="container">
- <span class="pull-right">
- <a href="#top">Back to top</a>
- </span>
-
- <span>Generated by <strong>DocFX</strong></span>
- </div>
- </div>
- </footer>
- </div>
-
- <script type="text/javascript" src="../styles/docfx.vendor.js"></script>
- <script type="text/javascript" src="../styles/docfx.js"></script>
- <script type="text/javascript" src="../styles/main.js"></script>
- </body>
- </html>
|