Files
FTXUI/zh-CH/screen__interactive_8cpp_source.html
2025-12-13 19:38:34 +00:00

1629 lines
224 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- HTML header for doxygen 1.9.8-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.12.0"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>FTXUI: screen_interactive.cpp 源文件</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="doxygen-awesome-fragment-copy-button.js"></script>
<script type="text/javascript" src="doxygen-awesome-paragraph-link.js"></script>
<script type="text/javascript" src="doxygen-awesome-interactive-toc.js"></script>
<script type="text/javascript" src="doxygen-awesome-tabs.js"></script>
<script type="module">
DoxygenAwesomeFragmentCopyButton.init()
DoxygenAwesomeParagraphLink.init()
DoxygenAwesomeInteractiveToc.init()
DoxygenAwesomeTabs.init()
await new Promise(r => window.addEventListener('DOMContentLoaded', r));
// Remove title when a img[alt='title-img'] is present.
// Find an image with the alt "img-title".
const img = document.querySelector("img[alt='title-img']");
const header = document.querySelector(".headertitle");
if (img && header) {
// Hide the header title progressively.
header.style.display = "none";
// Show progressively the image.
img.style.maxHeight = "40vh";
img.style.maxWidth = "100%";
img.style.objectFit = "contain";
}
// In the "examples.html" page. Turn every link with text
// "examples/<...>
//
// Add a "demo" link toward.
// https://arthursonzogni.github.io/FTXUI/examples/?file=<...>
const examples = document.querySelectorAll("a")
examples.forEach((example) => {
if (!example.textContent.startsWith("examples/")) {
return;
}
// Remove the ".cpp" extension from the example name.
const exampleName = example.textContent.replace("examples/", "").replace(".cpp", "");
const a = document.createElement("a");
a.textContent = "[demo]";
a.href = "https://arthursonzogni.github.io/FTXUI/examples/?file=" + exampleName;
a.style.marginRight= "1em";
a.style.fontWeight = "bold";
example.parentElement.insertBefore(a, example)
});
// If the current URL ends with -example.html, we can add a link to the demo
// as well using the div.title textContent.
const url = new URL(window.location.href);
if (url.pathname.endsWith("-example.html")) {
// Get the title text.
const title = document.querySelector("div.title").textContent;
const example = title.replace("examples/", "").replace(".cpp", "");
// Create a link to the demo.
const a = document.createElement("a");
a.textContent = "[demo]";
a.href = "https://arthursonzogni.github.io/FTXUI/examples/?file=" + example;
a.style.marginLeft = "1em";
a.style.fontWeight = "bold";
a.style.display = "inline-block";
// Insert the link after the title.
const titleDiv = document.querySelector("div.title");
if (titleDiv) {
titleDiv.insertBefore(a, titleDiv.nextSibling);
}
}
</script>
<script type="module">
// Click on the navtree, except for the main page where this is already done
// automatically.
let delay = 0;
while(true) {
const navtree = document.querySelector("div.item.selected");
if (!navtree) {
delay *= 2;
delay += 1;
await new Promise(resolve => setTimeout(resolve, delay));
continue;
}
// Include only selected navtree items.
console.log("navtree.textContent", navtree.textContent);
if (!navtree.textContent.includes("Getting Started") &&
!navtree.textContent.includes("Installation") &&
!navtree.textContent.includes("ftxui / screen") &&
!navtree.textContent.includes("ftxui / dom") &&
!navtree.textContent.includes("ftxui / component") &&
!navtree.textContent.includes("Reference")) {
break;
}
// Find the first link inside the navtree.
const link = navtree.querySelector("a");
if (link) {
// Simulate a click on the link.
link.click();
break;
}
}
</script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">FTXUI<span id="projectnumber">&#160;6.1.9</span>
</div>
<div id="projectbrief">C++ functional terminal UI.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.12.0 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() { codefold.init(0); });
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','搜索',true);
$(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function(){initNavTree('screen__interactive_8cpp_source.html',''); initResizable(true); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">载入中...</div>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">screen_interactive.cpp</div></div>
</div><!--header-->
<div class="contents">
<a href="screen__interactive_8cpp.html">浏览该文件的文档.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// 版权所有 2020 Arthur Sonzogni. 保留所有权利。</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// 本源代码的使用受 MIT 许可证的约束,该许可证可在</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">// LICENSE 文件中找到。</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="preprocessor">#include &quot;<a class="code" href="screen__interactive_8hpp.html">ftxui/component/screen_interactive.hpp</a>&quot;</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for copy, max, min</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#include &lt;array&gt;</span> <span class="comment">// for array</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="preprocessor">#include &lt;atomic&gt;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="preprocessor">#include &lt;chrono&gt;</span> <span class="comment">// for operator-, milliseconds, operator&gt;=, duration, common_type&lt;&gt;::type, time_point</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#include &lt;csignal&gt;</span> <span class="comment">// for signal, SIGTSTP, SIGABRT, SIGWINCH, raise, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM, __sighandler_t, size_t</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#include &lt;cstdint&gt;</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="preprocessor">#include &lt;cstdio&gt;</span> <span class="comment">// for fileno, stdin</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &lt;<a class="code" href="task_8hpp.html">ftxui/component/task.hpp</a>&gt;</span> <span class="comment">// for Task, Closure, AnimationTask</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#include &lt;<a class="code" href="screen_8hpp.html">ftxui/screen/screen.hpp</a>&gt;</span> <span class="comment">// for Pixel, Screen::Cursor, Screen, Screen::Cursor::Hidden</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &lt;functional&gt;</span> <span class="comment">// for function</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;initializer_list&gt;</span> <span class="comment">// for initializer_list</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;iostream&gt;</span> <span class="comment">// for cout, ostream, operator&lt;&lt;, basic_ostream, endl, flush</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;memory&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;stack&gt;</span> <span class="comment">// for stack</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;thread&gt;</span> <span class="comment">// for thread, sleep_for</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &lt;tuple&gt;</span> <span class="comment">// for _Swallow_assign, ignore</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &lt;utility&gt;</span> <span class="comment">// for move, swap</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &lt;variant&gt;</span> <span class="comment">// for visit, variant</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include &lt;vector&gt;</span> <span class="comment">// for vector</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include &quot;<a class="code" href="animation_8hpp.html">ftxui/component/animation.hpp</a>&quot;</span> <span class="comment">// for TimePoint, Clock, Duration, Params, RequestAnimationFrame</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#include &quot;<a class="code" href="captured__mouse_8hpp.html">ftxui/component/captured_mouse.hpp</a>&quot;</span> <span class="comment">// for CapturedMouse, CapturedMouseInterface</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include &quot;<a class="code" href="component__base_8hpp.html">ftxui/component/component_base.hpp</a>&quot;</span> <span class="comment">// for ComponentBase</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include &quot;<a class="code" href="event_8hpp.html">ftxui/component/event.hpp</a>&quot;</span> <span class="comment">// for Event</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#include &quot;<a class="code" href="loop_8hpp.html">ftxui/component/loop.hpp</a>&quot;</span> <span class="comment">// for Loop</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#include &quot;<a class="code" href="task__runner_8hpp.html">ftxui/component/task_runner.hpp</a>&quot;</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#include &quot;<a class="code" href="terminal__input__parser_8hpp.html">ftxui/component/terminal_input_parser.hpp</a>&quot;</span> <span class="comment">// for TerminalInputParser</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include &quot;<a class="code" href="node_8hpp.html">ftxui/dom/node.hpp</a>&quot;</span> <span class="comment">// for Node, Render</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#include &quot;<a class="code" href="terminal_8hpp.html">ftxui/screen/terminal.hpp</a>&quot;</span> <span class="comment">// for Dimensions, Size</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="preprocessor">#include &quot;<a class="code" href="util_8hpp.html">ftxui/screen/util.hpp</a>&quot;</span> <span class="comment">// for util::clamp</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="preprocessor">#include &quot;<a class="code" href="autoreset_8hpp.html">ftxui/util/autoreset.hpp</a>&quot;</span> <span class="comment">// for AutoReset</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> </div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="preprocessor">#if defined(_WIN32)</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#define DEFINE_CONSOLEV2_PROPERTIES</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="preprocessor">#define WIN32_LEAN_AND_MEAN</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="preprocessor">#ifndef NOMINMAX</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="preprocessor">#define NOMINMAX</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="preprocessor">#include &lt;windows.h&gt;</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="preprocessor">#ifndef UNICODE</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="preprocessor">#error Must be compiled in UNICODE mode</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="preprocessor">#include &lt;fcntl.h&gt;</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="preprocessor">#include &lt;sys/select.h&gt;</span> <span class="comment">// for select, FD_ISSET, FD_SET, FD_ZERO, fd_set, timeval</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="preprocessor">#include &lt;termios.h&gt;</span> <span class="comment">// for tcsetattr, termios, tcgetattr, TCSANOW, cc_t, ECHO, ICANON, VMIN, VTIME</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="preprocessor">#include &lt;unistd.h&gt;</span> <span class="comment">// for STDIN_FILENO, read</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="preprocessor">#include &lt;cerrno&gt;</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> </div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="comment">// Quick exit is missing in standard CLang headers</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="preprocessor">#if defined(__clang__) &amp;&amp; defined(__APPLE__)</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span><span class="preprocessor">#define quick_exit(a) exit(a)</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceftxui.html">ftxui</a> {</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="keyword">struct </span>ScreenInteractive::Internal {</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="comment">// Convert char to Event.</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> TerminalInputParser terminal_input_parser;</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> task::TaskRunner task_runner;</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="comment">// The last time a character was received.</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> std::chrono::time_point&lt;std::chrono::steady_clock&gt; last_char_time =</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> std::chrono::steady_clock::now();</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> </div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <span class="keyword">explicit</span> Internal(std::function&lt;<span class="keywordtype">void</span>(Event)&gt; out)</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> : terminal_input_parser(std::move(out)) {}</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span>};</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> </div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceanimation.html">animation</a> {</div>
<div class="foldopen" id="foldopen00077" data-start="{" data-end="}">
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"><a class="line" href="group__component.html#gad94d3d42aba3359550759aae5bcffbe9"> 77</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="group__component.html#gad94d3d42aba3359550759aae5bcffbe9">RequestAnimationFrame</a>() {</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keyword">auto</span>* screen = <a class="code hl_function" href="group__component.html#a9dc30615370889030396a239ceee2a77">ScreenInteractive::Active</a>();</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordflow">if</span> (screen) {</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> screen-&gt;RequestAnimationFrame();</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> }</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span>}</div>
</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span>} <span class="comment">// namespace animation</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> </div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span><span class="keyword">namespace </span>{</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> </div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span>ScreenInteractive* g_active_screen = <span class="keyword">nullptr</span>; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> </div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="keywordtype">void</span> Flush() {</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="comment">// Emscripten doesn&#39;t implement flush. We interpret zero as flush.</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> std::cout &lt;&lt; <span class="charliteral">&#39;\0&#39;</span> &lt;&lt; std::flush;</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span>}</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> </div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span><span class="keyword">constexpr</span> <span class="keywordtype">int</span> timeout_milliseconds = 20;</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span>[[maybe_unused]] <span class="keyword">constexpr</span> <span class="keywordtype">int</span> timeout_microseconds =</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> timeout_milliseconds * 1000;</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span><span class="preprocessor">#if defined(_WIN32)</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> </div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span><span class="preprocessor">#elif defined(__EMSCRIPTEN__)</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span><span class="preprocessor">#include &lt;emscripten.h&gt;</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> </div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span><span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span>EMSCRIPTEN_KEEPALIVE</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span><span class="keywordtype">void</span> ftxui_on_resize(<span class="keywordtype">int</span> columns, <span class="keywordtype">int</span> rows) {</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <a class="code hl_function" href="namespaceftxui_1_1Terminal.html#a765662bcabb59dc93884674ee2fcc9fc">Terminal::SetFallbackSize</a>({</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> columns,</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> rows,</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> });</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> std::raise(SIGWINCH);</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span>}</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span>}</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> </div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span><span class="preprocessor">#else </span><span class="comment">// POSIX (Linux &amp; Mac)</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> </div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span><span class="keywordtype">int</span> CheckStdinReady(<span class="keywordtype">int</span> fd) {</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> timeval tv = {0, 0}; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> fd_set fds;</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> FD_ZERO(&amp;fds); <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> FD_SET(fd, &amp;fds); <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <a class="code hl_function" href="namespaceftxui.html#a9e3e2988ed61a129d82d634ad66f7eb1">select</a>(fd + 1, &amp;fds, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, &amp;tv); <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keywordflow">return</span> FD_ISSET(fd, &amp;fds); <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span>}</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> </div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> </div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span>std::stack&lt;Closure&gt; on_exit_functions; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span><span class="keywordtype">void</span> OnExit() {</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keywordflow">while</span> (!on_exit_functions.empty()) {</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> on_exit_functions.top()();</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> on_exit_functions.pop();</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> }</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span>}</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> </div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span>std::atomic&lt;int&gt; g_signal_exit_count = 0; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span><span class="preprocessor">#if !defined(_WIN32)</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span>std::atomic&lt;int&gt; g_signal_stop_count = 0; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span>std::atomic&lt;int&gt; g_signal_resize_count = 0; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> </div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span><span class="comment">// Async signal safe function</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span><span class="keywordtype">void</span> RecordSignal(<span class="keywordtype">int</span> signal) {</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordflow">switch</span> (signal) {</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keywordflow">case</span> SIGABRT:</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordflow">case</span> SIGFPE:</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">case</span> SIGILL:</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="keywordflow">case</span> SIGINT:</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="keywordflow">case</span> SIGSEGV:</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keywordflow">case</span> SIGTERM:</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> g_signal_exit_count++;</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> </div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span><span class="preprocessor">#if !defined(_WIN32)</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <span class="keywordflow">case</span> SIGTSTP: <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> g_signal_stop_count++;</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> </div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keywordflow">case</span> SIGWINCH: <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> g_signal_resize_count++;</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> </div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keywordflow">default</span>:</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> }</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span>}</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> </div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span><span class="keywordtype">void</span> ExecuteSignalHandlers() {</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="keywordtype">int</span> signal_exit_count = g_signal_exit_count.exchange(0);</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keywordflow">while</span> (signal_exit_count--) {</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <a class="code hl_function" href="classftxui_1_1ScreenInteractive_1_1Private.html#aa831d3b9234cd15d4bcb5a42dec43943">ScreenInteractive::Private::Signal</a>(*g_active_screen, SIGABRT);</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> }</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> </div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span><span class="preprocessor">#if !defined(_WIN32)</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <span class="keywordtype">int</span> signal_stop_count = g_signal_stop_count.exchange(0);</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> <span class="keywordflow">while</span> (signal_stop_count--) {</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <a class="code hl_function" href="classftxui_1_1ScreenInteractive_1_1Private.html#aa831d3b9234cd15d4bcb5a42dec43943">ScreenInteractive::Private::Signal</a>(*g_active_screen, SIGTSTP);</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> }</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> </div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="keywordtype">int</span> signal_resize_count = g_signal_resize_count.exchange(0);</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <span class="keywordflow">while</span> (signal_resize_count--) {</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <a class="code hl_function" href="classftxui_1_1ScreenInteractive_1_1Private.html#aa831d3b9234cd15d4bcb5a42dec43943">ScreenInteractive::Private::Signal</a>(*g_active_screen, SIGWINCH);</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> }</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span>}</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> </div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span><span class="keywordtype">void</span> InstallSignalHandler(<span class="keywordtype">int</span> sig) {</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <span class="keyword">auto</span> old_signal_handler = std::signal(sig, RecordSignal);</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> on_exit_functions.emplace(</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> [=] { std::ignore = std::signal(sig, old_signal_handler); });</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span>}</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> </div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span><span class="comment">// CSI: Control Sequence Introducer</span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span><span class="keyword">const</span> std::string CSI = <span class="stringliteral">&quot;\x1b[&quot;</span>; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="comment">//</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span><span class="comment">// DCS: Device Control String</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span><span class="keyword">const</span> std::string DCS = <span class="stringliteral">&quot;\x1bP&quot;</span>; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span><span class="comment">// ST: String Terminator</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span><span class="keyword">const</span> std::string ST = <span class="stringliteral">&quot;\x1b\\&quot;</span>; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> </div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span><span class="comment">// DECRQSS: Request Status String</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span><span class="comment">// DECSCUSR: Set Cursor Style</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span><span class="keyword">const</span> std::string DECRQSS_DECSCUSR = DCS + <span class="stringliteral">&quot;$q q&quot;</span> + ST; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> </div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span><span class="comment">// DEC: Digital Equipment Corporation</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span><span class="keyword">enum class</span> DECMode : std::uint16_t {</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> kLineWrap = 7,</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> kCursor = 25,</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> </div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> kMouseX10 = 9,</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> kMouseVt200 = 1000,</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> kMouseVt200Highlight = 1001,</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> </div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> kMouseBtnEventMouse = 1002,</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> kMouseAnyEvent = 1003,</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> </div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> kMouseUtf8 = 1005,</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> kMouseSgrExtMode = 1006,</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> kMouseUrxvtMode = 1015,</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> kMouseSgrPixelsMode = 1016,</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> kAlternateScreen = 1049,</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span>};</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> </div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span><span class="comment">// Device Status Report (DSR) {</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span><span class="keyword">enum class</span> DSRMode : std::uint8_t {</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> kCursor = 6,</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span>};</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> </div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span>std::string Serialize(<span class="keyword">const</span> std::vector&lt;DECMode&gt;&amp; parameters) {</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> std::string out;</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> DECMode parameter : parameters) {</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> <span class="keywordflow">if</span> (!first) {</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> out += <span class="stringliteral">&quot;;&quot;</span>;</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> }</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> out += std::to_string(<span class="keywordtype">int</span>(parameter));</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> first = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> }</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keywordflow">return</span> out;</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span>}</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> </div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span><span class="comment">// DEC Private Mode Set (DECSET)</span></div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span>std::string Set(<span class="keyword">const</span> std::vector&lt;DECMode&gt;&amp; parameters) {</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <span class="keywordflow">return</span> CSI + <span class="stringliteral">&quot;?&quot;</span> + Serialize(parameters) + <span class="stringliteral">&quot;h&quot;</span>;</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span>}</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> </div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span><span class="comment">// DEC Private Mode Reset (DECRST)</span></div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span>std::string Reset(<span class="keyword">const</span> std::vector&lt;DECMode&gt;&amp; parameters) {</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> <span class="keywordflow">return</span> CSI + <span class="stringliteral">&quot;?&quot;</span> + Serialize(parameters) + <span class="stringliteral">&quot;l&quot;</span>;</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span>}</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> </div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span><span class="comment">// Device Status Report (DSR)</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span>std::string DeviceStatusReport(DSRMode ps) {</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keywordflow">return</span> CSI + std::to_string(<span class="keywordtype">int</span>(ps)) + <span class="stringliteral">&quot;n&quot;</span>;</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span>}</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> </div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span><span class="keyword">class </span>CapturedMouseImpl : <span class="keyword">public</span> CapturedMouseInterface {</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keyword">explicit</span> CapturedMouseImpl(std::function&lt;<span class="keywordtype">void</span>(<span class="keywordtype">void</span>)&gt; callback)</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> : callback_(std::move(callback)) {}</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> ~CapturedMouseImpl()<span class="keyword"> override </span>{ callback_(); }</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> CapturedMouseImpl(<span class="keyword">const</span> CapturedMouseImpl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> CapturedMouseImpl(CapturedMouseImpl&amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> CapturedMouseImpl&amp; operator=(<span class="keyword">const</span> CapturedMouseImpl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> CapturedMouseImpl&amp; operator=(CapturedMouseImpl&amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> </div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <span class="keyword">private</span>:</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> std::function&lt;void(<span class="keywordtype">void</span>)&gt; callback_;</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span>};</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> </div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span>} <span class="comment">// namespace</span></div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> </div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span>ScreenInteractive::ScreenInteractive(<a class="code hl_namespace" href="namespaceDimension.html">Dimension</a> dimension,</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <span class="keywordtype">int</span> dimx,</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> <span class="keywordtype">int</span> dimy,</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="keywordtype">bool</span> use_alternative_screen)</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> : Screen(dimx, dimy),</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> dimension_(dimension),</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> use_alternative_screen_(use_alternative_screen) {</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> internal_ = std::make_unique&lt;Internal&gt;(</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> [&amp;](Event event) { PostEvent(std::move(event)); });</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span>}</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> </div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00284" data-start="{" data-end="}">
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"><a class="line" href="group__component.html#a267cfc2d693fa96a82ae74029214d02e"> 284</a></span><a class="code hl_class" href="group__component.html#classftxui_1_1ScreenInteractive">ScreenInteractive</a> <a class="code hl_function" href="group__component.html#a267cfc2d693fa96a82ae74029214d02e">ScreenInteractive::FixedSize</a>(<span class="keywordtype">int</span> dimx, <span class="keywordtype">int</span> dimy) {</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keywordflow">return</span> {</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> Dimension::Fixed,</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> <a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a>,</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a>,</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> <span class="comment">/*use_alternative_screen=*/</span><span class="keyword">false</span>,</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> };</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span>}</div>
</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span><span class="comment"></span> </div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span><span class="comment">/// 创建一个占据整个终端大小的 ScreenInteractive。这使用备用屏幕缓冲区</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span><span class="comment">/// 以避免弄乱终端内容。</span></div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span><span class="comment">/// @note 这与 `ScreenInteractive::FullscreenAlternateScreen()` 相同</span></div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00297" data-start="{" data-end="}">
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"><a class="line" href="group__component.html#a53dc5c3030151713857cf1a898d0f897"> 297</a></span><a class="code hl_class" href="group__component.html#classftxui_1_1ScreenInteractive">ScreenInteractive</a> <a class="code hl_function" href="group__component.html#a53dc5c3030151713857cf1a898d0f897">ScreenInteractive::Fullscreen</a>() {</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> <span class="keywordflow">return</span> <a class="code hl_function" href="group__component.html#acad4646ece7569fd39a3a5c847ebb4a8">FullscreenAlternateScreen</a>();</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span>}</div>
</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span><span class="comment"></span> </div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span><span class="comment">/// 创建一个占据整个终端大小的 ScreenInteractive。正在使用主屏幕缓冲区。</span></div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span><span class="comment">/// 这意味着如果终端被调整大小,之前的内容可能会与终端内容混淆。</span></div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00304" data-start="{" data-end="}">
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"><a class="line" href="group__component.html#a6be13532d5bef8f566c12090db2dffba"> 304</a></span><a class="code hl_class" href="group__component.html#classftxui_1_1ScreenInteractive">ScreenInteractive</a> <a class="code hl_function" href="group__component.html#a6be13532d5bef8f566c12090db2dffba">ScreenInteractive::FullscreenPrimaryScreen</a>() {</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> <span class="keyword">auto</span> terminal = <a class="code hl_function" href="group__screen.html#gad890c37601448c82ed0d5051c29e2f0c">Terminal::Size</a>();</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> <span class="keywordflow">return</span> {</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> Dimension::Fullscreen,</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> terminal.dimx,</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> terminal.dimy,</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> <span class="comment">/*use_alternative_screen=*/</span><span class="keyword">false</span>,</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> };</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span>}</div>
</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span><span class="comment"></span> </div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span><span class="comment">/// 创建一个占据整个终端大小的 ScreenInteractive。这使用备用屏幕缓冲区</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span><span class="comment">/// 以避免弄乱终端内容。</span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00317" data-start="{" data-end="}">
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"><a class="line" href="group__component.html#acad4646ece7569fd39a3a5c847ebb4a8"> 317</a></span><a class="code hl_class" href="group__component.html#classftxui_1_1ScreenInteractive">ScreenInteractive</a> <a class="code hl_function" href="group__component.html#acad4646ece7569fd39a3a5c847ebb4a8">ScreenInteractive::FullscreenAlternateScreen</a>() {</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> <span class="keyword">auto</span> terminal = <a class="code hl_function" href="group__screen.html#gad890c37601448c82ed0d5051c29e2f0c">Terminal::Size</a>();</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> <span class="keywordflow">return</span> {</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> Dimension::Fullscreen,</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> terminal.dimx,</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> terminal.dimy,</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="comment">/*use_alternative_screen=*/</span><span class="keyword">true</span>,</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> };</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span>}</div>
</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span><span class="comment"></span> </div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span><span class="comment">/// 创建一个 ScreenInteractive其宽度与终端输出宽度匹配</span></div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span><span class="comment">/// 高度与正在绘制的组件匹配。</span></div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00330" data-start="{" data-end="}">
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"><a class="line" href="group__component.html#a0b7de0467b4e57ce5f337ba8634d8d13"> 330</a></span><a class="code hl_class" href="group__component.html#classftxui_1_1ScreenInteractive">ScreenInteractive</a> <a class="code hl_function" href="group__component.html#a0b7de0467b4e57ce5f337ba8634d8d13">ScreenInteractive::TerminalOutput</a>() {</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="keyword">auto</span> terminal = <a class="code hl_function" href="group__screen.html#gad890c37601448c82ed0d5051c29e2f0c">Terminal::Size</a>();</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <span class="keywordflow">return</span> {</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> Dimension::TerminalOutput,</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> terminal.dimx,</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> terminal.dimy, <span class="comment">// Best guess.</span></div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> <span class="comment">/*use_alternative_screen=*/</span><span class="keyword">false</span>,</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> };</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span>}</div>
</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> </div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span><a class="code hl_function" href="group__component.html#ae6ab8a002adc9e1303a30fb2632d0778">ScreenInteractive::~ScreenInteractive</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span><span class="comment"></span> </div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span><span class="comment">/// 创建一个 ScreenInteractive其宽度和高度与正在绘制的组件匹配。</span></div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00344" data-start="{" data-end="}">
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"><a class="line" href="group__component.html#a4f458e443ed672c2aea9fdd96531a621"> 344</a></span><a class="code hl_class" href="group__component.html#classftxui_1_1ScreenInteractive">ScreenInteractive</a> <a class="code hl_function" href="group__component.html#a4f458e443ed672c2aea9fdd96531a621">ScreenInteractive::FitComponent</a>() {</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> <span class="keyword">auto</span> terminal = <a class="code hl_function" href="group__screen.html#gad890c37601448c82ed0d5051c29e2f0c">Terminal::Size</a>();</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> <span class="keywordflow">return</span> {</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> Dimension::FitComponent,</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> terminal.dimx, <span class="comment">// Best guess.</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> terminal.dimy, <span class="comment">// Best guess.</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> <span class="keyword">false</span>,</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> };</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span>}</div>
</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span><span class="comment"></span> </div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span><span class="comment">/// @brief 设置是否跟踪鼠标并报告事件。</span></div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span><span class="comment">/// 在主循环之外调用。例如 `ScreenInteractive::Loop(...)`。</span></div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span><span class="comment">/// @param enable 是否启用鼠标事件跟踪。</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span><span class="comment">/// @note 这必须在主循环之外调用。例如在调用 `ScreenInteractive::Loop` 之前。</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span><span class="comment">/// @note 鼠标跟踪默认启用。</span></div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span><span class="comment">/// @note 鼠标跟踪仅在支持的终端上受支持。</span></div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span><span class="comment">///</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span><span class="comment">/// ### 示例</span></div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span><span class="comment">///</span></div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span><span class="comment">/// ```cpp</span></div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span><span class="comment">/// auto screen = ScreenInteractive::TerminalOutput();</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span><span class="comment">/// screen.TrackMouse(false);</span></div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span><span class="comment">/// screen.Loop(component);</span></div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span><span class="comment">/// ```</span></div>
<div class="foldopen" id="foldopen00368" data-start="{" data-end="}">
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"><a class="line" href="group__component.html#ad5961c1d4caf0ba9a030e5675162a164"> 368</a></span><span class="comment"></span><span class="keywordtype">void</span> <a class="code hl_function" href="group__component.html#ad5961c1d4caf0ba9a030e5675162a164">ScreenInteractive::TrackMouse</a>(<span class="keywordtype">bool</span> enable) {</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> track_mouse_ = enable;</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span>}</div>
</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span><span class="comment"></span> </div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span><span class="comment">/// @brief 启用或禁用自动管道输入处理。</span></div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span><span class="comment">/// 启用后FTXUI 将检测管道输入并将 stdin 从 /dev/tty 重定向</span></div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span><span class="comment">/// 以进行键盘输入,从而允许应用程序读取管道数据,同时仍</span></div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span><span class="comment">/// 接收交互式键盘事件。</span></div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span><span class="comment">/// @param enable 是否启用管道输入处理。默认为 true。</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span><span class="comment">/// @note 这必须在 Loop() 之前调用。</span></div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span><span class="comment">/// @note 此功能默认启用。</span></div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span><span class="comment">/// @note 此功能仅在 POSIX 系统Linux/macOS上可用。</span></div>
<div class="foldopen" id="foldopen00380" data-start="{" data-end="}">
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"><a class="line" href="group__component.html#a13d77f11d0631067367d82d380b04ce2"> 380</a></span><span class="comment"></span><span class="keywordtype">void</span> <a class="code hl_function" href="group__component.html#a13d77f11d0631067367d82d380b04ce2">ScreenInteractive::HandlePipedInput</a>(<span class="keywordtype">bool</span> enable) {</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> handle_piped_input_ = enable;</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span>}</div>
</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span><span class="comment"></span> </div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span><span class="comment">/// @brief 向主循环添加一个任务。</span></div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span><span class="comment">/// 它将在所有其他计划任务之后执行。</span></div>
<div class="foldopen" id="foldopen00386" data-start="{" data-end="}">
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"><a class="line" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88"> 386</a></span><span class="comment"></span><span class="keywordtype">void</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">ScreenInteractive::Post</a>(<a class="code hl_typedef" href="namespaceftxui.html#aaa92a82e968c721805c62787cd000534">Task</a> task) {</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> internal_-&gt;task_runner.<a class="code hl_function" href="classftxui_1_1task_1_1TaskRunner.html#a6265a2d99ef09d491365c21a4a703c71">PostTask</a>([<span class="keyword">this</span>, task = std::move(task)]() <span class="keyword">mutable</span> {</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> HandleTask(component_, task);</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> });</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span>}</div>
</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span><span class="comment"></span> </div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span><span class="comment">/// @brief 向主循环添加一个事件。</span></div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span><span class="comment">/// 它将在所有其他计划事件之后执行。</span></div>
<div class="foldopen" id="foldopen00394" data-start="{" data-end="}">
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"><a class="line" href="group__component.html#a29e75bdaa1d5465518787ec014b2c3bf"> 394</a></span><span class="comment"></span><span class="keywordtype">void</span> <a class="code hl_function" href="group__component.html#a29e75bdaa1d5465518787ec014b2c3bf">ScreenInteractive::PostEvent</a>(<a class="code hl_struct" href="group__component.html#structftxui_1_1Event">Event</a> event) {</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">Post</a>(event);</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span>}</div>
</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span><span class="comment"></span> </div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span><span class="comment">/// @brief 添加一个任务以再次绘制屏幕,直到所有动画完成。</span></div>
<div class="foldopen" id="foldopen00399" data-start="{" data-end="}">
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"><a class="line" href="group__component.html#ad94d3d42aba3359550759aae5bcffbe9"> 399</a></span><span class="comment"></span><span class="keywordtype">void</span> <a class="code hl_function" href="group__component.html#ad94d3d42aba3359550759aae5bcffbe9">ScreenInteractive::RequestAnimationFrame</a>() {</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> <span class="keywordflow">if</span> (animation_requested_) {</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> }</div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> animation_requested_ = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> <span class="keyword">auto</span> now = animation::Clock::now();</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> <span class="keyword">const</span> <span class="keyword">auto</span> time_histeresis = std::chrono::milliseconds(33);</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> <span class="keywordflow">if</span> (now - previous_animation_time_ &gt;= time_histeresis) {</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> previous_animation_time_ = now;</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> }</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span>}</div>
</div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span><span class="comment"></span> </div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span><span class="comment">/// @brief 尝试获取能够捕获鼠标的唯一锁。</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span><span class="comment">/// @return 如果鼠标尚未被捕获,则返回一个唯一锁,否则返回空。</span></div>
<div class="foldopen" id="foldopen00413" data-start="{" data-end="}">
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"><a class="line" href="group__component.html#aad61519d291dcc216d2ac618618a45a2"> 413</a></span><span class="comment"></span><a class="code hl_typedef" href="namespaceftxui.html#a24b663cb6b0b262055c94d3a03bdd274">CapturedMouse</a> <a class="code hl_function" href="group__component.html#aad61519d291dcc216d2ac618618a45a2">ScreenInteractive::CaptureMouse</a>() {</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <span class="keywordflow">if</span> (mouse_captured) {</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> }</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> mouse_captured = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> <span class="keywordflow">return</span> std::make_unique&lt;CapturedMouseImpl&gt;(</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> [<span class="keyword">this</span>] { mouse_captured = <span class="keyword">false</span>; });</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span>}</div>
</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span><span class="comment"></span> </div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span><span class="comment">/// @brief 执行主循环。</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span><span class="comment">/// @param component 要绘制的组件。</span></div>
<div class="foldopen" id="foldopen00424" data-start="{" data-end="}">
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"><a class="line" href="group__component.html#a9bd3dbd471fce0038700caaa47dddc1a"> 424</a></span><span class="comment"></span><span class="keywordtype">void</span> <a class="code hl_friend" href="group__component.html#a6f7095d721dd1dbd490d97c028eb676f">ScreenInteractive::Loop</a>(<a class="code hl_typedef" href="namespaceftxui.html#af1479ede01dbf087342534ab4ada11d3">Component</a> component) { <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> <span class="keyword">class </span><a class="code hl_class" href="group__component.html#classftxui_1_1Loop">Loop</a> loop(this, std::move(component));</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> loop.Run();</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span>}</div>
</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span><span class="comment"></span> </div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span><span class="comment">/// @brief 返回主循环是否已退出。</span></div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span><span class="comment"></span>bool ScreenInteractive::HasQuitted() {</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> <span class="keywordflow">return</span> quit_;</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span>}</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> </div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span><span class="comment">// private</span></div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span><span class="keywordtype">void</span> ScreenInteractive::PreMain() {</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> <span class="comment">// Suspend previously active screen:</span></div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> <span class="keywordflow">if</span> (g_active_screen) {</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> std::swap(suspended_screen_, g_active_screen);</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> <span class="comment">// Reset cursor position to the top of the screen and clear the screen.</span></div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> suspended_screen_-&gt;ResetCursorPosition();</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> std::cout &lt;&lt; suspended_screen_-&gt;<a class="code hl_function" href="group__screen.html#a9677c078c4270afdb7451cdc0b0871d4">ResetPosition</a>(<span class="comment">/*clear=*/</span><span class="keyword">true</span>);</div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span> suspended_screen_-&gt;<a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a> = 0;</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> suspended_screen_-&gt;<a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a> = 0;</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span> </div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> <span class="comment">// Reset dimensions to force drawing the screen again next time:</span></div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> suspended_screen_-&gt;Uninstall();</div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> }</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> </div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <span class="comment">// This screen is now active:</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> g_active_screen = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> g_active_screen-&gt;Install();</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> </div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> previous_animation_time_ = animation::Clock::now();</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span>}</div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> </div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span><span class="comment">// private</span></div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span><span class="keywordtype">void</span> ScreenInteractive::PostMain() {</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> <span class="comment">// Put cursor position at the end of the drawing.</span></div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> ResetCursorPosition();</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> </div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> g_active_screen = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> </div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> <span class="comment">// Restore suspended screen.</span></div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <span class="keywordflow">if</span> (suspended_screen_) {</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> <span class="comment">// Clear screen, and put the cursor at the beginning of the drawing.</span></div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> std::cout &lt;&lt; <a class="code hl_function" href="group__screen.html#a9677c078c4270afdb7451cdc0b0871d4">ResetPosition</a>(<span class="comment">/*clear=*/</span><span class="keyword">true</span>);</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> <a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a> = 0;</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> <a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a> = 0;</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> Uninstall();</div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> std::swap(g_active_screen, suspended_screen_);</div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> g_active_screen-&gt;Install();</div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> Uninstall();</div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> </div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> std::cout &lt;&lt; <span class="charliteral">&#39;\r&#39;</span>;</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> <span class="comment">// On final exit, keep the current drawing and reset cursor position one</span></div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> <span class="comment">// line after it.</span></div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <span class="keywordflow">if</span> (!use_alternative_screen_) {</div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> std::cout &lt;&lt; <span class="charliteral">&#39;\n&#39;</span>;</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> std::cout &lt;&lt; std::flush;</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> }</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> }</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span>}</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span><span class="comment"></span> </div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span><span class="comment">/// @brief 装饰一个函数。它以相同的方式执行,但在执行期间,</span></div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span><span class="comment">/// 当前活动屏幕终端的钩子会被暂时卸载。</span></div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span><span class="comment">/// @param fn 要装饰的函数。</span></div>
<div class="foldopen" id="foldopen00488" data-start="{" data-end="}">
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"><a class="line" href="group__component.html#af9df2de690486078fea4a7151b83b089"> 488</a></span><span class="comment"></span><a class="code hl_typedef" href="namespaceftxui.html#adc2f3bfa69ce99c596a1ff1b69b04d33">Closure</a> <a class="code hl_function" href="group__component.html#af9df2de690486078fea4a7151b83b089">ScreenInteractive::WithRestoredIO</a>(<a class="code hl_typedef" href="namespaceftxui.html#adc2f3bfa69ce99c596a1ff1b69b04d33">Closure</a> fn) { <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> <span class="keywordflow">return</span> [<span class="keyword">this</span>, fn] {</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> Uninstall();</div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> fn();</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> Install();</div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> };</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span>}</div>
</div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span><span class="comment"></span> </div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span><span class="comment">/// @brief 强制 FTXUI 处理或不处理 Ctrl-C即使组件</span></div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span><span class="comment">/// 捕获了 Event::CtrlC。</span></div>
<div class="foldopen" id="foldopen00498" data-start="{" data-end="}">
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"><a class="line" href="group__component.html#ae48c11a6c9160dc14cd5504ebe69304b"> 498</a></span><span class="comment"></span><span class="keywordtype">void</span> <a class="code hl_function" href="group__component.html#ae48c11a6c9160dc14cd5504ebe69304b">ScreenInteractive::ForceHandleCtrlC</a>(<span class="keywordtype">bool</span> force) {</div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> force_handle_ctrl_c_ = force;</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span>}</div>
</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span><span class="comment"></span> </div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span><span class="comment">/// @brief 强制 FTXUI 处理或不处理 Ctrl-Z即使组件</span></div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span><span class="comment">/// 捕获了 Event::CtrlZ。</span></div>
<div class="foldopen" id="foldopen00504" data-start="{" data-end="}">
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"><a class="line" href="group__component.html#af1c772ab581e587daad086227435f2ec"> 504</a></span><span class="comment"></span><span class="keywordtype">void</span> <a class="code hl_function" href="group__component.html#af1c772ab581e587daad086227435f2ec">ScreenInteractive::ForceHandleCtrlZ</a>(<span class="keywordtype">bool</span> force) {</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> force_handle_ctrl_z_ = force;</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span>}</div>
</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span><span class="comment"></span> </div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span><span class="comment">/// @brief 返回当前选择的内容</span></div>
<div class="foldopen" id="foldopen00509" data-start="{" data-end="}">
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"><a class="line" href="group__component.html#ac25769e248caa01d336f5eaa79cd6160"> 509</a></span><span class="comment"></span>std::string <a class="code hl_function" href="group__component.html#ac25769e248caa01d336f5eaa79cd6160">ScreenInteractive::GetSelection</a>() {</div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> <span class="keywordflow">if</span> (!selection_) {</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> }</div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> <span class="keywordflow">return</span> selection_-&gt;GetParts();</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span>}</div>
</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> </div>
<div class="foldopen" id="foldopen00516" data-start="{" data-end="}">
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"><a class="line" href="group__component.html#ad6daabb2df61b6be6f0b2a8950ac3281"> 516</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="group__component.html#ad6daabb2df61b6be6f0b2a8950ac3281">ScreenInteractive::SelectionChange</a>(std::function&lt;<span class="keywordtype">void</span>()&gt; callback) {</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> selection_on_change_ = std::move(callback);</div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span>}</div>
</div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span><span class="comment"></span> </div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span><span class="comment">/// @brief 返回当前活动屏幕,如果没有则返回空。</span></div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00522" data-start="{" data-end="}">
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"><a class="line" href="group__component.html#a9dc30615370889030396a239ceee2a77"> 522</a></span><a class="code hl_class" href="group__component.html#classftxui_1_1ScreenInteractive">ScreenInteractive</a>* <a class="code hl_function" href="group__component.html#a9dc30615370889030396a239ceee2a77">ScreenInteractive::Active</a>() {</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> <span class="keywordflow">return</span> g_active_screen;</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span>}</div>
</div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> </div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span><span class="comment">// private</span></div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span><span class="keywordtype">void</span> ScreenInteractive::Install() {</div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> frame_valid_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> </div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> <span class="comment">// Flush the buffer for stdout to ensure whatever the user has printed before</span></div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> <span class="comment">// is fully applied before we start modifying the terminal configuration. This</span></div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> <span class="comment">// is important, because we are using two different channels (stdout vs</span></div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> <span class="comment">// termios/WinAPI) to communicate with the terminal emulator below. See</span></div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> <span class="comment">// https://github.com/ArthurSonzogni/FTXUI/issues/846</span></div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> Flush();</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> </div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> InstallPipedInputHandling();</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> </div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> <span class="comment">// After uninstalling the new configuration, flush it to the terminal to</span></div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> <span class="comment">// ensure it is fully applied:</span></div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> on_exit_functions.emplace([] { Flush(); });</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> </div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> on_exit_functions.emplace([<span class="keyword">this</span>] { <a class="code hl_function" href="group__component.html#ae295157a88e6300609df83769ed885f2">ExitLoopClosure</a>()(); });</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> </div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> <span class="comment">// Request the terminal to report the current cursor shape. We will restore it</span></div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> <span class="comment">// on exit.</span></div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> std::cout &lt;&lt; DECRQSS_DECSCUSR;</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> on_exit_functions.emplace([<span class="keyword">this</span>] {</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> std::cout &lt;&lt; <span class="stringliteral">&quot;\033[?25h&quot;</span>; <span class="comment">// Enable cursor.</span></div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> std::cout &lt;&lt; <span class="stringliteral">&quot;\033[&quot;</span> + std::to_string(cursor_reset_shape_) + <span class="stringliteral">&quot; q&quot;</span>;</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> });</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> </div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> <span class="comment">// Install signal handlers to restore the terminal state on exit. The default</span></div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> <span class="comment">// signal handlers are restored on exit.</span></div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> signal : {SIGTERM, SIGSEGV, SIGINT, SIGILL, SIGABRT, SIGFPE}) {</div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> InstallSignalHandler(signal);</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> }</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> </div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span><span class="comment">// Save the old terminal configuration and restore it on exit.</span></div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span><span class="preprocessor">#if defined(_WIN32)</span></div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> <span class="comment">// Enable VT processing on stdout and stdin</span></div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> <span class="keyword">auto</span> stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> <span class="keyword">auto</span> stdin_handle = GetStdHandle(STD_INPUT_HANDLE);</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> </div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> DWORD out_mode = 0;</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> DWORD in_mode = 0;</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> GetConsoleMode(stdout_handle, &amp;out_mode);</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> GetConsoleMode(stdin_handle, &amp;in_mode);</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> on_exit_functions.push([=] { SetConsoleMode(stdout_handle, out_mode); });</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> on_exit_functions.push([=] { SetConsoleMode(stdin_handle, in_mode); });</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> </div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> <span class="comment">// https://docs.microsoft.com/en-us/windows/console/setconsolemode</span></div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <span class="keyword">const</span> <span class="keywordtype">int</span> enable_virtual_terminal_processing = 0x0004;</div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> <span class="keyword">const</span> <span class="keywordtype">int</span> disable_newline_auto_return = 0x0008;</div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> out_mode |= enable_virtual_terminal_processing;</div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> out_mode |= disable_newline_auto_return;</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> </div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> <span class="comment">// https://docs.microsoft.com/en-us/windows/console/setconsolemode</span></div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> <span class="keyword">const</span> <span class="keywordtype">int</span> enable_line_input = 0x0002;</div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> <span class="keyword">const</span> <span class="keywordtype">int</span> enable_echo_input = 0x0004;</div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> <span class="keyword">const</span> <span class="keywordtype">int</span> enable_virtual_terminal_input = 0x0200;</div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> <span class="keyword">const</span> <span class="keywordtype">int</span> enable_window_input = 0x0008;</div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> in_mode &amp;= ~enable_echo_input;</div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> in_mode &amp;= ~enable_line_input;</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> in_mode |= enable_virtual_terminal_input;</div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> in_mode |= enable_window_input;</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> </div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> SetConsoleMode(stdin_handle, in_mode);</div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> SetConsoleMode(stdout_handle, out_mode);</div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span><span class="preprocessor">#else </span><span class="comment">// POSIX (Linux &amp; Mac)</span></div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> <span class="comment">// #if defined(__EMSCRIPTEN__)</span><span class="comment"></span></div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span><span class="comment"> //// Reading stdin isn&#39;t blocking.</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span><span class="comment"></span> <span class="comment">// int flags = fcntl(0, F_GETFL, 0);</span></div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> <span class="comment">// fcntl(0, F_SETFL, flags | O_NONBLOCK);</span></div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span><span class="comment"></span> </div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span><span class="comment"> //// Restore the terminal configuration on exit.</span></div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span><span class="comment"></span> <span class="comment">// on_exit_functions.emplace([flags] { fcntl(0, F_SETFL, flags); });</span></div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> <span class="comment">// #endif</span></div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> signal : {SIGWINCH, SIGTSTP}) {</div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span> InstallSignalHandler(signal);</div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> }</div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span> </div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span> <span class="keyword">struct </span>termios terminal; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> tcgetattr(tty_fd_, &amp;terminal);</div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> on_exit_functions.emplace([terminal = terminal, tty_fd_ = tty_fd_] {</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> tcsetattr(tty_fd_, TCSANOW, &amp;terminal);</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> });</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> </div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> <span class="comment">// Enabling raw terminal input mode</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> terminal.c_iflag &amp;= ~IGNBRK; <span class="comment">// Disable ignoring break condition</span></div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> terminal.c_iflag &amp;= ~BRKINT; <span class="comment">// Disable break causing input and output to be</span></div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> <span class="comment">// flushed</span></div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> terminal.c_iflag &amp;= ~PARMRK; <span class="comment">// Disable marking parity errors.</span></div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> terminal.c_iflag &amp;= ~ISTRIP; <span class="comment">// Disable striping 8th bit off characters.</span></div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> terminal.c_iflag &amp;= ~INLCR; <span class="comment">// Disable mapping NL to CR.</span></div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> terminal.c_iflag &amp;= ~IGNCR; <span class="comment">// Disable ignoring CR.</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> terminal.c_iflag &amp;= ~ICRNL; <span class="comment">// Disable mapping CR to NL.</span></div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> terminal.c_iflag &amp;= ~IXON; <span class="comment">// Disable XON/XOFF flow control on output</span></div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> </div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> terminal.c_lflag &amp;= ~ECHO; <span class="comment">// Disable echoing input characters.</span></div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> terminal.c_lflag &amp;= ~ECHONL; <span class="comment">// Disable echoing new line characters.</span></div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> terminal.c_lflag &amp;= ~ICANON; <span class="comment">// Disable Canonical mode.</span></div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> terminal.c_lflag &amp;= ~ISIG; <span class="comment">// Disable sending signal when hitting:</span></div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> <span class="comment">// - =&gt; DSUSP</span></div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> <span class="comment">// - C-Z =&gt; SUSP</span></div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> <span class="comment">// - C-C =&gt; INTR</span></div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> <span class="comment">// - C-d =&gt; QUIT</span></div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> terminal.c_lflag &amp;= ~IEXTEN; <span class="comment">// Disable extended input processing</span></div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> terminal.c_cflag |= CS8; <span class="comment">// 8 bits per byte</span></div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> </div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> terminal.c_cc[VMIN] = 0; <span class="comment">// Minimum number of characters for non-canonical</span></div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> <span class="comment">// read.</span></div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> terminal.c_cc[VTIME] = 0; <span class="comment">// Timeout in deciseconds for non-canonical read.</span></div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> </div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> tcsetattr(tty_fd_, TCSANOW, &amp;terminal);</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> </div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> </div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> <span class="keyword">auto</span> enable = [&amp;](<span class="keyword">const</span> std::vector&lt;DECMode&gt;&amp; parameters) {</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> std::cout &lt;&lt; Set(parameters);</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> on_exit_functions.emplace([=] { std::cout &lt;&lt; Reset(parameters); });</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> };</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> </div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> <span class="keyword">auto</span> disable = [&amp;](<span class="keyword">const</span> std::vector&lt;DECMode&gt;&amp; parameters) {</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> std::cout &lt;&lt; Reset(parameters);</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> on_exit_functions.emplace([=] { std::cout &lt;&lt; Set(parameters); });</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> };</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> </div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> <span class="keywordflow">if</span> (use_alternative_screen_) {</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> enable({</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> DECMode::kAlternateScreen,</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> });</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> }</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> </div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> disable({</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> <span class="comment">// DECMode::kCursor,</span></div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> DECMode::kLineWrap,</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> });</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> </div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> <span class="keywordflow">if</span> (track_mouse_) {</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> enable({DECMode::kMouseVt200});</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> enable({DECMode::kMouseAnyEvent});</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> enable({DECMode::kMouseUrxvtMode});</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> enable({DECMode::kMouseSgrExtMode});</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> }</div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> </div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> <span class="comment">// After installing the new configuration, flush it to the terminal to</span></div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> <span class="comment">// ensure it is fully applied:</span></div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> Flush();</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> </div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span> quit_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> </div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> PostAnimationTask();</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span>}</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> </div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span><span class="keywordtype">void</span> ScreenInteractive::InstallPipedInputHandling() {</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span><span class="preprocessor">#if !defined(_WIN32) &amp;&amp; !defined(__EMSCRIPTEN__)</span></div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> tty_fd_ = STDIN_FILENO;</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> <span class="comment">// Handle piped input redirection if explicitly enabled by the application.</span></div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> <span class="comment">// This allows applications to read data from stdin while still receiving</span></div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> <span class="comment">// keyboard input from the terminal for interactive use.</span></div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> <span class="keywordflow">if</span> (!handle_piped_input_) {</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> }</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> </div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <span class="comment">// If stdin is a terminal, we don&#39;t need to open /dev/tty.</span></div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> <span class="keywordflow">if</span> (isatty(STDIN_FILENO)) {</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> }</div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> </div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> <span class="comment">// Open /dev/tty for keyboard input.</span></div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> tty_fd_ = open(<span class="stringliteral">&quot;/dev/tty&quot;</span>, O_RDONLY);</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> <span class="keywordflow">if</span> (tty_fd_ &lt; 0) {</div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> <span class="comment">// Failed to open /dev/tty (containers, headless systems, etc.)</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> tty_fd_ = STDIN_FILENO; <span class="comment">// Fallback to stdin.</span></div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> }</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> </div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> <span class="comment">// Close the /dev/tty file descriptor on exit.</span></div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> on_exit_functions.emplace([<span class="keyword">this</span>] {</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> close(tty_fd_);</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> tty_fd_ = -1;</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> });</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span>}</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> </div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span><span class="comment">// private</span></div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span><span class="keywordtype">void</span> ScreenInteractive::Uninstall() {</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> ExitNow();</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> OnExit();</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span>}</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> </div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span><span class="comment">// private</span></div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span><span class="comment">// NOLINTNEXTLINE</span></div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span><span class="keywordtype">void</span> ScreenInteractive::RunOnceBlocking(<a class="code hl_typedef" href="namespaceftxui.html#af1479ede01dbf087342534ab4ada11d3">Component</a> component) {</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> <span class="comment">// Set FPS to 60 at most.</span></div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> <span class="keyword">const</span> <span class="keyword">auto</span> time_per_frame = std::chrono::microseconds(16666); <span class="comment">// 1s / 60fps</span></div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> </div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> <span class="keyword">auto</span> time = std::chrono::steady_clock::now();</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> <span class="keywordtype">size_t</span> executed_task = internal_-&gt;task_runner.<a class="code hl_function" href="classftxui_1_1task_1_1TaskRunner.html#aab6716a5f504f5985e73fb6d2b0dd677">ExecutedTasks</a>();</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> </div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> <span class="comment">// Wait for at least one task to execute.</span></div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> <span class="keywordflow">while</span> (executed_task == internal_-&gt;task_runner.<a class="code hl_function" href="classftxui_1_1task_1_1TaskRunner.html#aab6716a5f504f5985e73fb6d2b0dd677">ExecutedTasks</a>() &amp;&amp;</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> !HasQuitted()) {</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> RunOnce(component);</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> </div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> <span class="keyword">const</span> <span class="keyword">auto</span> now = std::chrono::steady_clock::now();</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> <span class="keyword">const</span> <span class="keyword">auto</span> delta = now - time;</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> time = now;</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> </div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> <span class="keywordflow">if</span> (delta &lt; time_per_frame) {</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> <span class="keyword">const</span> <span class="keyword">auto</span> sleep_duration = time_per_frame - delta;</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> std::this_thread::sleep_for(sleep_duration);</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> }</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> }</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span>}</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> </div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span><span class="comment">// private</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span><span class="keywordtype">void</span> ScreenInteractive::RunOnce(<a class="code hl_typedef" href="namespaceftxui.html#af1479ede01dbf087342534ab4ada11d3">Component</a> component) {</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> AutoReset set_component(&amp;component_, component);</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> ExecuteSignalHandlers();</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> FetchTerminalEvents();</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> </div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> <span class="comment">// Execute the pending tasks from the queue.</span></div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> executed_task = internal_-&gt;task_runner.<a class="code hl_function" href="classftxui_1_1task_1_1TaskRunner.html#aab6716a5f504f5985e73fb6d2b0dd677">ExecutedTasks</a>();</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> internal_-&gt;task_runner.<a class="code hl_function" href="classftxui_1_1task_1_1TaskRunner.html#a7865ea610276e71d61633de0aab71753">RunUntilIdle</a>();</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> <span class="comment">// If no executed task, we can return early without redrawing the screen.</span></div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> <span class="keywordflow">if</span> (executed_task == internal_-&gt;task_runner.<a class="code hl_function" href="classftxui_1_1task_1_1TaskRunner.html#aab6716a5f504f5985e73fb6d2b0dd677">ExecutedTasks</a>()) {</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> }</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> </div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> ExecuteSignalHandlers();</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> Draw(component);</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> </div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> <span class="keywordflow">if</span> (selection_data_previous_ != selection_data_) {</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> selection_data_previous_ = selection_data_;</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> <span class="keywordflow">if</span> (selection_on_change_) {</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> selection_on_change_();</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">Post</a>(<a class="code hl_variable" href="group__component.html#a699872f2a6d8607d714be174e9435290">Event::Custom</a>);</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> }</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> }</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span>}</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> </div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span><span class="comment">// private</span></div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span><span class="comment">// NOLINTNEXTLINE</span></div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span><span class="keywordtype">void</span> ScreenInteractive::HandleTask(<a class="code hl_typedef" href="namespaceftxui.html#af1479ede01dbf087342534ab4ada11d3">Component</a> component, <a class="code hl_typedef" href="namespaceftxui.html#aaa92a82e968c721805c62787cd000534">Task</a>&amp; task) {</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> std::visit(</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> [&amp;](<span class="keyword">auto</span>&amp;&amp; arg) {</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> <span class="keyword">using </span>T = std::decay_t&lt;<span class="keyword">decltype</span>(arg)&gt;;</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> </div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> <span class="comment">// clang-format off</span></div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> <span class="comment">// Handle Event.</span></div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (std::is_same_v&lt;T, Event&gt;) {</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> </div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> <span class="keywordflow">if</span> (arg.is_cursor_position()) {</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> cursor_x_ = arg.cursor_x();</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> cursor_y_ = arg.cursor_y();</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> }</div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> </div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> <span class="keywordflow">if</span> (arg.is_cursor_shape()) {</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> cursor_reset_shape_= arg.cursor_shape();</div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> }</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> </div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> <span class="keywordflow">if</span> (arg.is_mouse()) {</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> arg.mouse().x -= cursor_x_;</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> arg.mouse().y -= cursor_y_;</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> }</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> </div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> arg.screen_ = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> </div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> <span class="keywordtype">bool</span> handled = component-&gt;OnEvent(arg);</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> </div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> handled = HandleSelection(handled, arg);</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> </div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> <span class="keywordflow">if</span> (arg == <a class="code hl_variable" href="group__component.html#a038a33c469a2e4474d08d637e37f660d">Event::CtrlC</a> &amp;&amp; (!handled || force_handle_ctrl_c_)) {</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> RecordSignal(SIGABRT);</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> }</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> </div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span><span class="preprocessor">#if !defined(_WIN32)</span></div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> <span class="keywordflow">if</span> (arg == <a class="code hl_variable" href="group__component.html#a22ef83103e0443ba82acc19f24f729bc">Event::CtrlZ</a> &amp;&amp; (!handled || force_handle_ctrl_z_)) {</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> RecordSignal(SIGTSTP);</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> }</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> </div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> frame_valid_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> }</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> </div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> <span class="comment">// Handle callback</span></div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (std::is_same_v&lt;T, Closure&gt;) {</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> arg();</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> }</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> </div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> <span class="comment">// Handle Animation</span></div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (std::is_same_v&lt;T, AnimationTask&gt;) {</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> <span class="keywordflow">if</span> (!animation_requested_) {</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> }</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> </div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> animation_requested_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceftxui_1_1animation.html#a97ee0a9619acebafade22a9b7b0de667">animation::TimePoint</a> now = animation::Clock::now();</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceftxui_1_1animation.html#a3c06579c86b609bce4a9a097b23cd739">animation::Duration</a> delta = now - previous_animation_time_;</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> previous_animation_time_ = now;</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> </div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> animation::Params params(delta);</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> component-&gt;OnAnimation(params);</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> frame_valid_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> }</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span> },</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> task);</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> <span class="comment">// clang-format on</span></div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span>}</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> </div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span><span class="comment">// private</span></div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span><span class="keywordtype">bool</span> ScreenInteractive::HandleSelection(<span class="keywordtype">bool</span> handled, Event event) {</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span> <span class="keywordflow">if</span> (handled) {</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> selection_pending_ = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> selection_data_.empty = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> selection_ = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> }</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> </div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> <span class="keywordflow">if</span> (!event.is_mouse()) {</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> }</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> </div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> <span class="keyword">auto</span>&amp; mouse = <span class="keyword">event</span>.mouse();</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> <span class="keywordflow">if</span> (mouse.button != <a class="code hl_enumvalue" href="group__component.html#a03bfec859eac87be20f8952c1eb89de0a9d4d8b0b72fc2659da772d761a3c5ecb">Mouse::Left</a>) {</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> }</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> </div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> <span class="keywordflow">if</span> (mouse.motion == <a class="code hl_enumvalue" href="group__component.html#a099c889d2b948b264c7a665b66e3a9b6a05f4abb2322aa023aba9570c327aff25">Mouse::Pressed</a>) {</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> selection_pending_ = <a class="code hl_function" href="group__component.html#aad61519d291dcc216d2ac618618a45a2">CaptureMouse</a>();</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span> selection_data_.start_x = mouse.x;</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> selection_data_.start_y = mouse.y;</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> selection_data_.end_x = mouse.x;</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> selection_data_.end_y = mouse.y;</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> }</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> </div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> <span class="keywordflow">if</span> (!selection_pending_) {</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> }</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> </div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> <span class="keywordflow">if</span> (mouse.motion == <a class="code hl_enumvalue" href="group__component.html#a099c889d2b948b264c7a665b66e3a9b6a9bf35ab1cecfbb50d8f1d708a4921fc6">Mouse::Moved</a>) {</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> <span class="keywordflow">if</span> ((mouse.x != selection_data_.end_x) ||</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> (mouse.y != selection_data_.end_y)) {</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> selection_data_.end_x = mouse.x;</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> selection_data_.end_y = mouse.y;</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> selection_data_.empty = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> }</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> </div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> }</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> </div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> <span class="keywordflow">if</span> (mouse.motion == <a class="code hl_enumvalue" href="group__component.html#a099c889d2b948b264c7a665b66e3a9b6ad9417ac74f0134b9577d1d85cf422c25">Mouse::Released</a>) {</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> selection_pending_ = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> selection_data_.end_x = mouse.x;</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> selection_data_.end_y = mouse.y;</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> selection_data_.empty = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> }</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> </div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span>}</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> </div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span><span class="comment">// private</span></div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span><span class="comment">// NOLINTNEXTLINE</span></div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span><span class="keywordtype">void</span> ScreenInteractive::Draw(<a class="code hl_typedef" href="namespaceftxui.html#af1479ede01dbf087342534ab4ada11d3">Component</a> component) {</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> <span class="keywordflow">if</span> (frame_valid_) {</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</span> }</div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"> 897</span> <span class="keyword">auto</span> document = component-&gt;Render();</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"> 898</span> <span class="keywordtype">int</span> <a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a> = 0;</div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno"> 899</span> <span class="keywordtype">int</span> <a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a> = 0;</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno"> 900</span> <span class="keyword">auto</span> terminal = <a class="code hl_function" href="group__screen.html#gad890c37601448c82ed0d5051c29e2f0c">Terminal::Size</a>();</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno"> 901</span> document-&gt;ComputeRequirement();</div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"> 902</span> <span class="keywordflow">switch</span> (dimension_) {</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"> 903</span> <span class="keywordflow">case</span> Dimension::Fixed:</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno"> 904</span> <a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a> = <a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a>;</div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"> 905</span> <a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a> = <a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a>;</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno"> 906</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno"> 907</span> <span class="keywordflow">case</span> Dimension::TerminalOutput:</div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno"> 908</span> <a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a> = terminal.dimx;</div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno"> 909</span> <a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a> = <a class="code hl_function" href="namespaceftxui_1_1util.html#aab9f0232e41c960b4a09629eac33aef3">util::clamp</a>(document-&gt;requirement().min_y, 0, terminal.dimy);</div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno"> 910</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"> 911</span> <span class="keywordflow">case</span> Dimension::Fullscreen:</div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"> 912</span> <a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a> = terminal.dimx;</div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno"> 913</span> <a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a> = terminal.dimy;</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno"> 914</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno"> 915</span> <span class="keywordflow">case</span> Dimension::FitComponent:</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno"> 916</span> <a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a> = <a class="code hl_function" href="namespaceftxui_1_1util.html#aab9f0232e41c960b4a09629eac33aef3">util::clamp</a>(document-&gt;requirement().min_x, 0, terminal.dimx);</div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno"> 917</span> <a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a> = <a class="code hl_function" href="namespaceftxui_1_1util.html#aab9f0232e41c960b4a09629eac33aef3">util::clamp</a>(document-&gt;requirement().min_y, 0, terminal.dimy);</div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno"> 918</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno"> 919</span> }</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno"> 920</span> </div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno"> 921</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> resized = frame_count_ == 0 || (<a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a> != <a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a>) || (<a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a> != <a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a>);</div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno"> 922</span> ResetCursorPosition();</div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno"> 923</span> std::cout &lt;&lt; <a class="code hl_function" href="group__screen.html#a9677c078c4270afdb7451cdc0b0871d4">ResetPosition</a>(<span class="comment">/*clear=*/</span>resized);</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"> 924</span> </div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno"> 925</span> <span class="comment">// If the terminal width decrease, the terminal emulator will start wrapping</span></div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"> 926</span> <span class="comment">// lines and make the display dirty. We should clear it completely.</span></div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno"> 927</span> <span class="keywordflow">if</span> ((<a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a> &lt; <a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a>) &amp;&amp; !use_alternative_screen_) {</div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno"> 928</span> std::cout &lt;&lt; <span class="stringliteral">&quot;\033[J&quot;</span>; <span class="comment">// clear terminal output</span></div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno"> 929</span> std::cout &lt;&lt; <span class="stringliteral">&quot;\033[H&quot;</span>; <span class="comment">// move cursor to home position</span></div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"> 930</span> }</div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno"> 931</span> </div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"> 932</span> <span class="comment">// Resize the screen if needed.</span></div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"> 933</span> <span class="keywordflow">if</span> (resized) {</div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno"> 934</span> <a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a> = <a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a>;</div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno"> 935</span> <a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a> = <a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a>;</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"> 936</span> <a class="code hl_variable" href="group__screen.html#aeab8c1788b3f2c7403749c3be95a68ae">pixels_</a> = std::vector&lt;std::vector&lt;Pixel&gt;&gt;(<a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a>, std::vector&lt;Pixel&gt;(<a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a>));</div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno"> 937</span> <a class="code hl_variable" href="group__screen.html#a9df9d1ae7ed66857ca987963b2365904">cursor_</a>.<a class="code hl_variable" href="structftxui_1_1Screen_1_1Cursor.html#a6150e0515f7202e2fb518f7206ed97dc">x</a> = <a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a> - 1;</div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"> 938</span> <a class="code hl_variable" href="group__screen.html#a9df9d1ae7ed66857ca987963b2365904">cursor_</a>.<a class="code hl_variable" href="structftxui_1_1Screen_1_1Cursor.html#a0a2f84ed7838f07779ae24c5a9086d33">y</a> = <a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a> - 1;</div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno"> 939</span> }</div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno"> 940</span> </div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno"> 941</span> <span class="comment">// Periodically request the terminal emulator the frame position relative to</span></div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno"> 942</span> <span class="comment">// the screen. This is useful for converting mouse position reported in</span></div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno"> 943</span> <span class="comment">// screen&#39;s coordinates to frame&#39;s coordinates.</span></div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"> 944</span><span class="preprocessor">#if defined(FTXUI_MICROSOFT_TERMINAL_FALLBACK)</span></div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno"> 945</span> <span class="comment">// Microsoft&#39;s terminal suffers from a [bug]. When reporting the cursor</span></div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno"> 946</span> <span class="comment">// position, several output sequences are mixed together into garbage.</span></div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno"> 947</span> <span class="comment">// This causes FTXUI user to see some &quot;1;1;R&quot; sequences into the Input</span></div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno"> 948</span> <span class="comment">// component. See [issue]. Solution is to request cursor position less</span></div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno"> 949</span> <span class="comment">// often. [bug]: https://github.com/microsoft/terminal/pull/7583 [issue]:</span></div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno"> 950</span> <span class="comment">// https://github.com/ArthurSonzogni/FTXUI/issues/136</span></div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"> 951</span> <span class="keyword">static</span> <span class="keywordtype">int</span> i = -3;</div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"> 952</span> ++i;</div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"> 953</span> <span class="keywordflow">if</span> (!use_alternative_screen_ &amp;&amp; (i % 150 == 0)) { <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno"> 954</span> std::cout &lt;&lt; DeviceStatusReport(DSRMode::kCursor);</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno"> 955</span> }</div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno"> 956</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno"> 957</span> <span class="keyword">static</span> <span class="keywordtype">int</span> i = -3;</div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno"> 958</span> ++i;</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno"> 959</span> <span class="keywordflow">if</span> (!use_alternative_screen_ &amp;&amp;</div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno"> 960</span> (previous_frame_resized_ || i % 40 == 0)) { <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno"> 961</span> std::cout &lt;&lt; DeviceStatusReport(DSRMode::kCursor);</div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno"> 962</span> }</div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"> 963</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno"> 964</span> previous_frame_resized_ = resized;</div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno"> 965</span> </div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno"> 966</span> selection_ = selection_data_.empty</div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno"> 967</span> ? std::make_unique&lt;Selection&gt;()</div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno"> 968</span> : std::make_unique&lt;Selection&gt;(</div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno"> 969</span> selection_data_.start_x, selection_data_.start_y, <span class="comment">//</span></div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno"> 970</span> selection_data_.end_x, selection_data_.end_y);</div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno"> 971</span> <a class="code hl_function" href="group__dom.html#gad4b8aa9392f56ba41e2b421e046a7d83">Render</a>(*<span class="keyword">this</span>, document.get(), *selection_);</div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno"> 972</span> </div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno"> 973</span> <span class="comment">// Set cursor position for user using tools to insert CJK characters.</span></div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno"> 974</span> {</div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno"> 975</span> <span class="keyword">const</span> <span class="keywordtype">int</span> dx = <a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a> - 1 - <a class="code hl_variable" href="group__screen.html#a9df9d1ae7ed66857ca987963b2365904">cursor_</a>.<a class="code hl_variable" href="structftxui_1_1Screen_1_1Cursor.html#a6150e0515f7202e2fb518f7206ed97dc">x</a> + int(<a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a> != terminal.dimx);</div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno"> 976</span> <span class="keyword">const</span> <span class="keywordtype">int</span> dy = <a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a> - 1 - <a class="code hl_variable" href="group__screen.html#a9df9d1ae7ed66857ca987963b2365904">cursor_</a>.<a class="code hl_variable" href="structftxui_1_1Screen_1_1Cursor.html#a0a2f84ed7838f07779ae24c5a9086d33">y</a>;</div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"> 977</span> </div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno"> 978</span> set_cursor_position.clear();</div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"> 979</span> reset_cursor_position.clear();</div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno"> 980</span> </div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno"> 981</span> <span class="keywordflow">if</span> (dy != 0) {</div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno"> 982</span> set_cursor_position += <span class="stringliteral">&quot;\x1B[&quot;</span> + std::to_string(dy) + <span class="stringliteral">&quot;A&quot;</span>;</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno"> 983</span> reset_cursor_position += <span class="stringliteral">&quot;\x1B[&quot;</span> + std::to_string(dy) + <span class="stringliteral">&quot;B&quot;</span>;</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno"> 984</span> }</div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno"> 985</span> </div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno"> 986</span> <span class="keywordflow">if</span> (dx != 0) {</div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"> 987</span> set_cursor_position += <span class="stringliteral">&quot;\x1B[&quot;</span> + std::to_string(dx) + <span class="stringliteral">&quot;D&quot;</span>;</div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"> 988</span> reset_cursor_position += <span class="stringliteral">&quot;\x1B[&quot;</span> + std::to_string(dx) + <span class="stringliteral">&quot;C&quot;</span>;</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno"> 989</span> }</div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno"> 990</span> </div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno"> 991</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="group__screen.html#a9df9d1ae7ed66857ca987963b2365904">cursor_</a>.<a class="code hl_variable" href="structftxui_1_1Screen_1_1Cursor.html#a8b9f7758a8bd2bef680aeecc40bcfe04">shape</a> == Cursor::Hidden) {</div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno"> 992</span> set_cursor_position += <span class="stringliteral">&quot;\033[?25l&quot;</span>;</div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno"> 993</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno"> 994</span> set_cursor_position += <span class="stringliteral">&quot;\033[?25h&quot;</span>;</div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno"> 995</span> set_cursor_position +=</div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno"> 996</span> <span class="stringliteral">&quot;\033[&quot;</span> + std::to_string(<span class="keywordtype">int</span>(<a class="code hl_variable" href="group__screen.html#a9df9d1ae7ed66857ca987963b2365904">cursor_</a>.<a class="code hl_variable" href="structftxui_1_1Screen_1_1Cursor.html#a8b9f7758a8bd2bef680aeecc40bcfe04">shape</a>)) + <span class="stringliteral">&quot; q&quot;</span>;</div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno"> 997</span> }</div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno"> 998</span> }</div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno"> 999</span> </div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span> std::cout &lt;&lt; <a class="code hl_function" href="group__screen.html#a19c380b03cea21d7ac7325136a131ff0">ToString</a>() &lt;&lt; set_cursor_position;</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span> Flush();</div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span> <a class="code hl_function" href="group__screen.html#aa71d36872f416feaa853788a7a7a7ef8">Clear</a>();</div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span> frame_valid_ = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span> frame_count_++;</div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span>}</div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span> </div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span><span class="comment">// private</span></div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span><span class="keywordtype">void</span> ScreenInteractive::ResetCursorPosition() {</div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span> std::cout &lt;&lt; reset_cursor_position;</div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span> reset_cursor_position = <span class="stringliteral">&quot;&quot;</span>;</div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span>}</div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span><span class="comment"></span> </div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span><span class="comment">/// @brief 返回一个退出主循环的函数。</span></div>
<div class="foldopen" id="foldopen01014" data-start="{" data-end="}">
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"><a class="line" href="group__component.html#ae295157a88e6300609df83769ed885f2"> 1014</a></span><span class="comment"></span><a class="code hl_typedef" href="namespaceftxui.html#adc2f3bfa69ce99c596a1ff1b69b04d33">Closure</a> <a class="code hl_function" href="group__component.html#ae295157a88e6300609df83769ed885f2">ScreenInteractive::ExitLoopClosure</a>() {</div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span> <span class="keywordflow">return</span> [<span class="keyword">this</span>] { <a class="code hl_function" href="group__component.html#a1a6a7739e9cc01ba888b57d1f9457f4c">Exit</a>(); };</div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span>}</div>
</div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span><span class="comment"></span> </div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span><span class="comment">/// @brief 退出主循环。</span></div>
<div class="foldopen" id="foldopen01019" data-start="{" data-end="}">
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"><a class="line" href="group__component.html#a1a6a7739e9cc01ba888b57d1f9457f4c"> 1019</a></span><span class="comment"></span><span class="keywordtype">void</span> <a class="code hl_function" href="group__component.html#a1a6a7739e9cc01ba888b57d1f9457f4c">ScreenInteractive::Exit</a>() {</div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">Post</a>([<span class="keyword">this</span>] { ExitNow(); });</div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span>}</div>
</div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> </div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span><span class="comment">// private:</span></div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span><span class="keywordtype">void</span> ScreenInteractive::ExitNow() {</div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span> quit_ = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span>}</div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span> </div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span><span class="comment">// private:</span></div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span><span class="keywordtype">void</span> ScreenInteractive::Signal(<span class="keywordtype">int</span> signal) {</div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span> <span class="keywordflow">if</span> (signal == SIGABRT) {</div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span> <a class="code hl_function" href="group__component.html#a1a6a7739e9cc01ba888b57d1f9457f4c">Exit</a>();</div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span> }</div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span> </div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span><span class="comment">// Windows do no support SIGTSTP / SIGWINCH</span></div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span><span class="preprocessor">#if !defined(_WIN32)</span></div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span> <span class="keywordflow">if</span> (signal == SIGTSTP) {</div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">Post</a>([&amp;] {</div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span> ResetCursorPosition();</div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span> std::cout &lt;&lt; <a class="code hl_function" href="group__screen.html#a9677c078c4270afdb7451cdc0b0871d4">ResetPosition</a>(<span class="comment">/*clear*/</span> <span class="keyword">true</span>); <span class="comment">// Cursor to the beginning</span></div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span> Uninstall();</div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span> <a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a> = 0;</div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span> <a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a> = 0;</div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> Flush();</div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span> std::ignore = std::raise(SIGTSTP);</div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span> Install();</div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span> });</div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span> }</div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span> </div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span> <span class="keywordflow">if</span> (signal == SIGWINCH) {</div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">Post</a>(<a class="code hl_function" href="group__component.html#afe901de476c29382cc358333f10e5ee7">Event::Special</a>({0}));</div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span> }</div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span>}</div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span> </div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span><span class="keywordtype">void</span> ScreenInteractive::FetchTerminalEvents() {</div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span><span class="preprocessor">#if defined(_WIN32)</span></div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span> <span class="keyword">auto</span> get_input_records = [&amp;]() -&gt; std::vector&lt;INPUT_RECORD&gt; {</div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span> <span class="comment">// Check if there is input in the console.</span></div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span> <span class="keyword">auto</span> console = GetStdHandle(STD_INPUT_HANDLE);</div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span> DWORD number_of_events = 0;</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> <span class="keywordflow">if</span> (!GetNumberOfConsoleInputEvents(console, &amp;number_of_events)) {</div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span> <span class="keywordflow">return</span> std::vector&lt;INPUT_RECORD&gt;();</div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span> }</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span> <span class="keywordflow">if</span> (number_of_events &lt;= 0) {</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span> <span class="comment">// No input, return.</span></div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span> <span class="keywordflow">return</span> std::vector&lt;INPUT_RECORD&gt;();</div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span> }</div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span> <span class="comment">// Read the input events.</span></div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span> std::vector&lt;INPUT_RECORD&gt; records(number_of_events);</div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> DWORD number_of_events_read = 0;</div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> <span class="keywordflow">if</span> (!ReadConsoleInput(console, records.data(), (DWORD)records.size(),</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> &amp;number_of_events_read)) {</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> <span class="keywordflow">return</span> std::vector&lt;INPUT_RECORD&gt;();</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> }</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> records.resize(number_of_events_read);</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span> <span class="keywordflow">return</span> records;</div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> };</div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> </div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> <span class="keyword">auto</span> records = get_input_records();</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> <span class="keywordflow">if</span> (records.size() == 0) {</div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> <span class="keyword">const</span> <span class="keyword">auto</span> timeout =</div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> std::chrono::steady_clock::now() - internal_-&gt;last_char_time;</div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> timeout_microseconds =</div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(timeout).count();</div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> internal_-&gt;terminal_input_parser.<a class="code hl_function" href="classftxui_1_1TerminalInputParser.html#a9e4aeeff8f55e0b1c7a8f9c282a77823">Timeout</a>(timeout_microseconds);</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> }</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> internal_-&gt;last_char_time = std::chrono::steady_clock::now();</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> </div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span> <span class="comment">// Convert the input events to FTXUI events.</span></div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> <span class="comment">// For each event, we call the terminal input parser to convert it to</span></div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> <span class="comment">// Event.</span></div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; r : records) {</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> <span class="keywordflow">switch</span> (r.EventType) {</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> <span class="keywordflow">case</span> KEY_EVENT: {</div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> <span class="keyword">auto</span> key_event = r.Event.KeyEvent;</div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> <span class="comment">// ignore UP key events</span></div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> <span class="keywordflow">if</span> (key_event.bKeyDown == FALSE) {</div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> }</div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span> std::wstring wstring;</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> wstring += key_event.uChar.UnicodeChar;</div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> it : <a class="code hl_function" href="namespaceftxui.html#a757b345f73bb6cde5165a4d7f0c0a298">to_string</a>(wstring)) {</div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> internal_-&gt;terminal_input_parser.<a class="code hl_function" href="classftxui_1_1TerminalInputParser.html#a4b2f1e271dd6ebbf5bad2418d960832a">Add</a>(it);</div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span> }</div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span> } <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> <span class="keywordflow">case</span> WINDOW_BUFFER_SIZE_EVENT:</div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">Post</a>(<a class="code hl_function" href="group__component.html#afe901de476c29382cc358333f10e5ee7">Event::Special</a>({0}));</div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span> <span class="keywordflow">case</span> MENU_EVENT:</div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span> <span class="keywordflow">case</span> FOCUS_EVENT:</div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span> <span class="keywordflow">case</span> MOUSE_EVENT:</div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span> <span class="comment">// TODO(mauve): Implement later.</span></div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span> }</div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span> }</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span><span class="preprocessor">#elif defined(__EMSCRIPTEN__)</span></div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span> <span class="comment">// Read chars from the terminal.</span></div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span> <span class="comment">// We configured it to be non blocking.</span></div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> std::array&lt;char, 128&gt; out{};</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> <span class="keywordtype">size_t</span> l = read(STDIN_FILENO, out.data(), out.size());</div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span> <span class="keywordflow">if</span> (l == 0) {</div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> <span class="keyword">const</span> <span class="keyword">auto</span> timeout =</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span> std::chrono::steady_clock::now() - internal_-&gt;last_char_time;</div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> timeout_microseconds =</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span> std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(timeout).count();</div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> internal_-&gt;terminal_input_parser.<a class="code hl_function" href="classftxui_1_1TerminalInputParser.html#a9e4aeeff8f55e0b1c7a8f9c282a77823">Timeout</a>(timeout_microseconds);</div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span> }</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> internal_-&gt;last_char_time = std::chrono::steady_clock::now();</div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span> </div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span> <span class="comment">// Convert the chars to events.</span></div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; l; ++i) {</div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span> internal_-&gt;terminal_input_parser.<a class="code hl_function" href="classftxui_1_1TerminalInputParser.html#a4b2f1e271dd6ebbf5bad2418d960832a">Add</a>(out[i]);</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span> }</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span><span class="preprocessor">#else </span><span class="comment">// POSIX (Linux &amp; Mac)</span></div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span> <span class="keywordflow">if</span> (!CheckStdinReady(tty_fd_)) {</div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> <span class="keyword">const</span> <span class="keyword">auto</span> timeout =</div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span> std::chrono::steady_clock::now() - internal_-&gt;last_char_time;</div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> timeout_ms =</div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(timeout).count();</div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span> internal_-&gt;terminal_input_parser.<a class="code hl_function" href="classftxui_1_1TerminalInputParser.html#a9e4aeeff8f55e0b1c7a8f9c282a77823">Timeout</a>(timeout_ms);</div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span> }</div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span> internal_-&gt;last_char_time = std::chrono::steady_clock::now();</div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span> </div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span> <span class="comment">// Read chars from the terminal.</span></div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> std::array&lt;char, 128&gt; out{};</div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span> <span class="keywordtype">size_t</span> l = read(tty_fd_, out.data(), out.size());</div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span> </div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> <span class="comment">// Convert the chars to events.</span></div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; l; ++i) {</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> internal_-&gt;terminal_input_parser.<a class="code hl_function" href="classftxui_1_1TerminalInputParser.html#a4b2f1e271dd6ebbf5bad2418d960832a">Add</a>(out[i]);</div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span> }</div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span>}</div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span> </div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span><span class="keywordtype">void</span> ScreenInteractive::PostAnimationTask() {</div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">Post</a>(AnimationTask());</div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span> </div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span> <span class="comment">// Repeat the animation task every 15ms. This correspond to a frame rate</span></div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span> <span class="comment">// of around 66fps.</span></div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span> internal_-&gt;task_runner.<a class="code hl_function" href="classftxui_1_1task_1_1TaskRunner.html#a9ed72fa10b2d44bb1af7bd8af64dd28b">PostDelayedTask</a>([<span class="keyword">this</span>] { PostAnimationTask(); },</div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span> std::chrono::milliseconds(15));</div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span>}</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> </div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span><span class="keywordtype">bool</span> ScreenInteractive::SelectionData::operator==(</div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span> <span class="keyword">const</span> ScreenInteractive::SelectionData&amp; other)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span> <span class="keywordflow">if</span> (empty &amp;&amp; other.empty) {</div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span> }</div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span> <span class="keywordflow">if</span> (empty || other.empty) {</div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span> }</div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span> <span class="keywordflow">return</span> start_x == other.start_x &amp;&amp; start_y == other.start_y &amp;&amp;</div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span> end_x == other.end_x &amp;&amp; end_y == other.end_y;</div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span>}</div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span> </div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span><span class="keywordtype">bool</span> ScreenInteractive::SelectionData::operator!=(</div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span> <span class="keyword">const</span> ScreenInteractive::SelectionData&amp; other)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span> <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == other);</div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span>}</div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span> </div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span>} <span class="comment">// namespace ftxui.</span></div>
<div class="ttc" id="aanimation_8hpp_html"><div class="ttname"><a href="animation_8hpp.html">animation.hpp</a></div></div>
<div class="ttc" id="aautoreset_8hpp_html"><div class="ttname"><a href="autoreset_8hpp.html">autoreset.hpp</a></div></div>
<div class="ttc" id="acaptured__mouse_8hpp_html"><div class="ttname"><a href="captured__mouse_8hpp.html">captured_mouse.hpp</a></div></div>
<div class="ttc" id="aclassftxui_1_1ScreenInteractive_1_1Private_html_aa831d3b9234cd15d4bcb5a42dec43943"><div class="ttname"><a href="classftxui_1_1ScreenInteractive_1_1Private.html#aa831d3b9234cd15d4bcb5a42dec43943">ftxui::ScreenInteractive::Private::Signal</a></div><div class="ttdeci">static void Signal(ScreenInteractive &amp;s, int signal)</div><div class="ttdef"><b>定义</b> <a href="screen__interactive_8hpp_source.html#l00174">screen_interactive.hpp:174</a></div></div>
<div class="ttc" id="aclassftxui_1_1TerminalInputParser_html_a4b2f1e271dd6ebbf5bad2418d960832a"><div class="ttname"><a href="classftxui_1_1TerminalInputParser.html#a4b2f1e271dd6ebbf5bad2418d960832a">ftxui::TerminalInputParser::Add</a></div><div class="ttdeci">void Add(char c)</div><div class="ttdef"><b>定义</b> <a href="terminal__input__parser_8cpp_source.html#l00107">terminal_input_parser.cpp:107</a></div></div>
<div class="ttc" id="aclassftxui_1_1TerminalInputParser_html_a9e4aeeff8f55e0b1c7a8f9c282a77823"><div class="ttname"><a href="classftxui_1_1TerminalInputParser.html#a9e4aeeff8f55e0b1c7a8f9c282a77823">ftxui::TerminalInputParser::Timeout</a></div><div class="ttdeci">void Timeout(int time)</div><div class="ttdef"><b>定义</b> <a href="terminal__input__parser_8cpp_source.html#l00095">terminal_input_parser.cpp:95</a></div></div>
<div class="ttc" id="aclassftxui_1_1task_1_1TaskRunner_html_a6265a2d99ef09d491365c21a4a703c71"><div class="ttname"><a href="classftxui_1_1task_1_1TaskRunner.html#a6265a2d99ef09d491365c21a4a703c71">ftxui::task::TaskRunner::PostTask</a></div><div class="ttdeci">auto PostTask(Task task) -&gt; void</div><div class="ttdoc">安排一个任务立即执行。</div><div class="ttdef"><b>定义</b> <a href="task__runner_8cpp_source.html#l00029">task_runner.cpp:29</a></div></div>
<div class="ttc" id="aclassftxui_1_1task_1_1TaskRunner_html_a7865ea610276e71d61633de0aab71753"><div class="ttname"><a href="classftxui_1_1task_1_1TaskRunner.html#a7865ea610276e71d61633de0aab71753">ftxui::task::TaskRunner::RunUntilIdle</a></div><div class="ttdeci">auto RunUntilIdle() -&gt; std::optional&lt; std::chrono::steady_clock::duration &gt;</div><div class="ttdoc">运行队列中的任务,返回下一个延迟任务可以执行的延迟时间。</div><div class="ttdef"><b>定义</b> <a href="task__runner_8cpp_source.html#l00040">task_runner.cpp:40</a></div></div>
<div class="ttc" id="aclassftxui_1_1task_1_1TaskRunner_html_a9ed72fa10b2d44bb1af7bd8af64dd28b"><div class="ttname"><a href="classftxui_1_1task_1_1TaskRunner.html#a9ed72fa10b2d44bb1af7bd8af64dd28b">ftxui::task::TaskRunner::PostDelayedTask</a></div><div class="ttdeci">auto PostDelayedTask(Task task, std::chrono::steady_clock::duration duration) -&gt; void</div><div class="ttdoc">安排一个任务在指定持续时间后执行。</div><div class="ttdef"><b>定义</b> <a href="task__runner_8cpp_source.html#l00033">task_runner.cpp:33</a></div></div>
<div class="ttc" id="aclassftxui_1_1task_1_1TaskRunner_html_aab6716a5f504f5985e73fb6d2b0dd677"><div class="ttname"><a href="classftxui_1_1task_1_1TaskRunner.html#aab6716a5f504f5985e73fb6d2b0dd677">ftxui::task::TaskRunner::ExecutedTasks</a></div><div class="ttdeci">size_t ExecutedTasks() const</div><div class="ttdef"><b>定义</b> <a href="task__runner_8hpp_source.html#l00035">task_runner.hpp:35</a></div></div>
<div class="ttc" id="acomponent__base_8hpp_html"><div class="ttname"><a href="component__base_8hpp.html">component_base.hpp</a></div></div>
<div class="ttc" id="aevent_8hpp_html"><div class="ttname"><a href="event_8hpp.html">event.hpp</a></div></div>
<div class="ttc" id="agroup__component_html_a038a33c469a2e4474d08d637e37f660d"><div class="ttname"><a href="group__component.html#a038a33c469a2e4474d08d637e37f660d">ftxui::Event::CtrlC</a></div><div class="ttdeci">static const Event CtrlC</div><div class="ttdef"><b>定义</b> <a href="event_8hpp_source.html#l00070">event.hpp:70</a></div></div>
<div class="ttc" id="agroup__component_html_a03bfec859eac87be20f8952c1eb89de0a9d4d8b0b72fc2659da772d761a3c5ecb"><div class="ttname"><a href="group__component.html#a03bfec859eac87be20f8952c1eb89de0a9d4d8b0b72fc2659da772d761a3c5ecb">ftxui::Mouse::Left</a></div><div class="ttdeci">@ Left</div><div class="ttdef"><b>定义</b> <a href="mouse_8hpp_source.html#l00012">mouse.hpp:12</a></div></div>
<div class="ttc" id="agroup__component_html_a099c889d2b948b264c7a665b66e3a9b6a05f4abb2322aa023aba9570c327aff25"><div class="ttname"><a href="group__component.html#a099c889d2b948b264c7a665b66e3a9b6a05f4abb2322aa023aba9570c327aff25">ftxui::Mouse::Pressed</a></div><div class="ttdeci">@ Pressed</div><div class="ttdef"><b>定义</b> <a href="mouse_8hpp_source.html#l00024">mouse.hpp:24</a></div></div>
<div class="ttc" id="agroup__component_html_a099c889d2b948b264c7a665b66e3a9b6a9bf35ab1cecfbb50d8f1d708a4921fc6"><div class="ttname"><a href="group__component.html#a099c889d2b948b264c7a665b66e3a9b6a9bf35ab1cecfbb50d8f1d708a4921fc6">ftxui::Mouse::Moved</a></div><div class="ttdeci">@ Moved</div><div class="ttdef"><b>定义</b> <a href="mouse_8hpp_source.html#l00025">mouse.hpp:25</a></div></div>
<div class="ttc" id="agroup__component_html_a099c889d2b948b264c7a665b66e3a9b6ad9417ac74f0134b9577d1d85cf422c25"><div class="ttname"><a href="group__component.html#a099c889d2b948b264c7a665b66e3a9b6ad9417ac74f0134b9577d1d85cf422c25">ftxui::Mouse::Released</a></div><div class="ttdeci">@ Released</div><div class="ttdef"><b>定义</b> <a href="mouse_8hpp_source.html#l00023">mouse.hpp:23</a></div></div>
<div class="ttc" id="agroup__component_html_a0b7de0467b4e57ce5f337ba8634d8d13"><div class="ttname"><a href="group__component.html#a0b7de0467b4e57ce5f337ba8634d8d13">ftxui::ScreenInteractive::TerminalOutput</a></div><div class="ttdeci">static ScreenInteractive TerminalOutput()</div><div class="ttdef"><b>定义</b> <a href="#l00330">screen_interactive.cpp:330</a></div></div>
<div class="ttc" id="agroup__component_html_a13d77f11d0631067367d82d380b04ce2"><div class="ttname"><a href="group__component.html#a13d77f11d0631067367d82d380b04ce2">ftxui::ScreenInteractive::HandlePipedInput</a></div><div class="ttdeci">void HandlePipedInput(bool enable=true)</div><div class="ttdoc">启用或禁用自动管道输入处理。 启用后FTXUI 将检测管道输入并将 stdin 从 /dev/tty 重定向 以进行键盘输入,从而允许应用程序读取管道数据,同时仍 接收交互式键盘事件。</div><div class="ttdef"><b>定义</b> <a href="#l00380">screen_interactive.cpp:380</a></div></div>
<div class="ttc" id="agroup__component_html_a1a6a7739e9cc01ba888b57d1f9457f4c"><div class="ttname"><a href="group__component.html#a1a6a7739e9cc01ba888b57d1f9457f4c">ftxui::ScreenInteractive::Exit</a></div><div class="ttdeci">void Exit()</div><div class="ttdoc">退出主循环。</div><div class="ttdef"><b>定义</b> <a href="#l01019">screen_interactive.cpp:1019</a></div></div>
<div class="ttc" id="agroup__component_html_a22ef83103e0443ba82acc19f24f729bc"><div class="ttname"><a href="group__component.html#a22ef83103e0443ba82acc19f24f729bc">ftxui::Event::CtrlZ</a></div><div class="ttdeci">static const Event CtrlZ</div><div class="ttdef"><b>定义</b> <a href="event_8hpp_source.html#l00093">event.hpp:93</a></div></div>
<div class="ttc" id="agroup__component_html_a267cfc2d693fa96a82ae74029214d02e"><div class="ttname"><a href="group__component.html#a267cfc2d693fa96a82ae74029214d02e">ftxui::ScreenInteractive::FixedSize</a></div><div class="ttdeci">static ScreenInteractive FixedSize(int dimx, int dimy)</div><div class="ttdef"><b>定义</b> <a href="#l00284">screen_interactive.cpp:284</a></div></div>
<div class="ttc" id="agroup__component_html_a29e75bdaa1d5465518787ec014b2c3bf"><div class="ttname"><a href="group__component.html#a29e75bdaa1d5465518787ec014b2c3bf">ftxui::ScreenInteractive::PostEvent</a></div><div class="ttdeci">void PostEvent(Event event)</div><div class="ttdoc">向主循环添加一个事件。 它将在所有其他计划事件之后执行。</div><div class="ttdef"><b>定义</b> <a href="#l00394">screen_interactive.cpp:394</a></div></div>
<div class="ttc" id="agroup__component_html_a49209b09dcf8bc540f79e2bfd0a7ee88"><div class="ttname"><a href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">ftxui::ScreenInteractive::Post</a></div><div class="ttdeci">void Post(Task task)</div><div class="ttdoc">向主循环添加一个任务。 它将在所有其他计划任务之后执行。</div><div class="ttdef"><b>定义</b> <a href="#l00386">screen_interactive.cpp:386</a></div></div>
<div class="ttc" id="agroup__component_html_a4f458e443ed672c2aea9fdd96531a621"><div class="ttname"><a href="group__component.html#a4f458e443ed672c2aea9fdd96531a621">ftxui::ScreenInteractive::FitComponent</a></div><div class="ttdeci">static ScreenInteractive FitComponent()</div><div class="ttdoc">创建一个 ScreenInteractive其宽度和高度与正在绘制的组件匹配。</div><div class="ttdef"><b>定义</b> <a href="#l00344">screen_interactive.cpp:344</a></div></div>
<div class="ttc" id="agroup__component_html_a53dc5c3030151713857cf1a898d0f897"><div class="ttname"><a href="group__component.html#a53dc5c3030151713857cf1a898d0f897">ftxui::ScreenInteractive::Fullscreen</a></div><div class="ttdeci">static ScreenInteractive Fullscreen()</div><div class="ttdef"><b>定义</b> <a href="#l00297">screen_interactive.cpp:297</a></div></div>
<div class="ttc" id="agroup__component_html_a699872f2a6d8607d714be174e9435290"><div class="ttname"><a href="group__component.html#a699872f2a6d8607d714be174e9435290">ftxui::Event::Custom</a></div><div class="ttdeci">static const Event Custom</div><div class="ttdef"><b>定义</b> <a href="event_8hpp_source.html#l00096">event.hpp:96</a></div></div>
<div class="ttc" id="agroup__component_html_a6be13532d5bef8f566c12090db2dffba"><div class="ttname"><a href="group__component.html#a6be13532d5bef8f566c12090db2dffba">ftxui::ScreenInteractive::FullscreenPrimaryScreen</a></div><div class="ttdeci">static ScreenInteractive FullscreenPrimaryScreen()</div><div class="ttdef"><b>定义</b> <a href="#l00304">screen_interactive.cpp:304</a></div></div>
<div class="ttc" id="agroup__component_html_a6f7095d721dd1dbd490d97c028eb676f"><div class="ttname"><a href="group__component.html#a6f7095d721dd1dbd490d97c028eb676f">ftxui::ScreenInteractive::Loop</a></div><div class="ttdeci">friend class Loop</div><div class="ttdef"><b>定义</b> <a href="screen__interactive_8hpp_source.html#l00167">screen_interactive.hpp:167</a></div></div>
<div class="ttc" id="agroup__component_html_a9dc30615370889030396a239ceee2a77"><div class="ttname"><a href="group__component.html#a9dc30615370889030396a239ceee2a77">ftxui::ScreenInteractive::Active</a></div><div class="ttdeci">static ScreenInteractive * Active()</div><div class="ttdoc">返回当前活动屏幕,如果没有则返回空。</div><div class="ttdef"><b>定义</b> <a href="#l00522">screen_interactive.cpp:522</a></div></div>
<div class="ttc" id="agroup__component_html_aad61519d291dcc216d2ac618618a45a2"><div class="ttname"><a href="group__component.html#aad61519d291dcc216d2ac618618a45a2">ftxui::ScreenInteractive::CaptureMouse</a></div><div class="ttdeci">CapturedMouse CaptureMouse()</div><div class="ttdoc">尝试获取能够捕获鼠标的唯一锁。</div><div class="ttdef"><b>定义</b> <a href="#l00413">screen_interactive.cpp:413</a></div></div>
<div class="ttc" id="agroup__component_html_ac25769e248caa01d336f5eaa79cd6160"><div class="ttname"><a href="group__component.html#ac25769e248caa01d336f5eaa79cd6160">ftxui::ScreenInteractive::GetSelection</a></div><div class="ttdeci">std::string GetSelection()</div><div class="ttdoc">返回当前选择的内容</div><div class="ttdef"><b>定义</b> <a href="#l00509">screen_interactive.cpp:509</a></div></div>
<div class="ttc" id="agroup__component_html_acad4646ece7569fd39a3a5c847ebb4a8"><div class="ttname"><a href="group__component.html#acad4646ece7569fd39a3a5c847ebb4a8">ftxui::ScreenInteractive::FullscreenAlternateScreen</a></div><div class="ttdeci">static ScreenInteractive FullscreenAlternateScreen()</div><div class="ttdef"><b>定义</b> <a href="#l00317">screen_interactive.cpp:317</a></div></div>
<div class="ttc" id="agroup__component_html_ad5961c1d4caf0ba9a030e5675162a164"><div class="ttname"><a href="group__component.html#ad5961c1d4caf0ba9a030e5675162a164">ftxui::ScreenInteractive::TrackMouse</a></div><div class="ttdeci">void TrackMouse(bool enable=true)</div><div class="ttdoc">设置是否跟踪鼠标并报告事件。 在主循环之外调用。例如 ScreenInteractive::Loop(...)。</div><div class="ttdef"><b>定义</b> <a href="#l00368">screen_interactive.cpp:368</a></div></div>
<div class="ttc" id="agroup__component_html_ad6daabb2df61b6be6f0b2a8950ac3281"><div class="ttname"><a href="group__component.html#ad6daabb2df61b6be6f0b2a8950ac3281">ftxui::ScreenInteractive::SelectionChange</a></div><div class="ttdeci">void SelectionChange(std::function&lt; void()&gt; callback)</div><div class="ttdef"><b>定义</b> <a href="#l00516">screen_interactive.cpp:516</a></div></div>
<div class="ttc" id="agroup__component_html_ad94d3d42aba3359550759aae5bcffbe9"><div class="ttname"><a href="group__component.html#ad94d3d42aba3359550759aae5bcffbe9">ftxui::ScreenInteractive::RequestAnimationFrame</a></div><div class="ttdeci">void RequestAnimationFrame()</div><div class="ttdoc">添加一个任务以再次绘制屏幕,直到所有动画完成。</div><div class="ttdef"><b>定义</b> <a href="#l00399">screen_interactive.cpp:399</a></div></div>
<div class="ttc" id="agroup__component_html_ae295157a88e6300609df83769ed885f2"><div class="ttname"><a href="group__component.html#ae295157a88e6300609df83769ed885f2">ftxui::ScreenInteractive::ExitLoopClosure</a></div><div class="ttdeci">Closure ExitLoopClosure()</div><div class="ttdoc">返回一个退出主循环的函数。</div><div class="ttdef"><b>定义</b> <a href="#l01014">screen_interactive.cpp:1014</a></div></div>
<div class="ttc" id="agroup__component_html_ae48c11a6c9160dc14cd5504ebe69304b"><div class="ttname"><a href="group__component.html#ae48c11a6c9160dc14cd5504ebe69304b">ftxui::ScreenInteractive::ForceHandleCtrlC</a></div><div class="ttdeci">void ForceHandleCtrlC(bool force)</div><div class="ttdoc">强制 FTXUI 处理或不处理 Ctrl-C即使组件 捕获了 Event::CtrlC。</div><div class="ttdef"><b>定义</b> <a href="#l00498">screen_interactive.cpp:498</a></div></div>
<div class="ttc" id="agroup__component_html_ae6ab8a002adc9e1303a30fb2632d0778"><div class="ttname"><a href="group__component.html#ae6ab8a002adc9e1303a30fb2632d0778">ftxui::ScreenInteractive::~ScreenInteractive</a></div><div class="ttdeci">~ScreenInteractive() override</div></div>
<div class="ttc" id="agroup__component_html_af1c772ab581e587daad086227435f2ec"><div class="ttname"><a href="group__component.html#af1c772ab581e587daad086227435f2ec">ftxui::ScreenInteractive::ForceHandleCtrlZ</a></div><div class="ttdeci">void ForceHandleCtrlZ(bool force)</div><div class="ttdoc">强制 FTXUI 处理或不处理 Ctrl-Z即使组件 捕获了 Event::CtrlZ。</div><div class="ttdef"><b>定义</b> <a href="#l00504">screen_interactive.cpp:504</a></div></div>
<div class="ttc" id="agroup__component_html_af9df2de690486078fea4a7151b83b089"><div class="ttname"><a href="group__component.html#af9df2de690486078fea4a7151b83b089">ftxui::ScreenInteractive::WithRestoredIO</a></div><div class="ttdeci">Closure WithRestoredIO(Closure)</div><div class="ttdoc">装饰一个函数。它以相同的方式执行,但在执行期间, 当前活动屏幕终端的钩子会被暂时卸载。</div><div class="ttdef"><b>定义</b> <a href="#l00488">screen_interactive.cpp:488</a></div></div>
<div class="ttc" id="agroup__component_html_afe901de476c29382cc358333f10e5ee7"><div class="ttname"><a href="group__component.html#afe901de476c29382cc358333f10e5ee7">ftxui::Event::Special</a></div><div class="ttdeci">static Event Special(std::string)</div><div class="ttdoc">一个自定义事件,其含义由库用户定义。</div><div class="ttdef"><b>定义</b> <a href="event_8cpp_source.html#l00072">event.cpp:72</a></div></div>
<div class="ttc" id="agroup__component_html_classftxui_1_1Loop"><div class="ttname"><a href="group__component.html#classftxui_1_1Loop">ftxui::Loop</a></div><div class="ttdoc">Loop 是一个管理组件事件循环的类。</div><div class="ttdef"><b>定义</b> <a href="loop_8hpp_source.html#l00055">loop.hpp:55</a></div></div>
<div class="ttc" id="agroup__component_html_classftxui_1_1ScreenInteractive"><div class="ttname"><a href="group__component.html#classftxui_1_1ScreenInteractive">ftxui::ScreenInteractive</a></div><div class="ttdoc">ScreenInteractive 是一个可以处理事件、运行主循环和管理组件的 Screen。</div><div class="ttdef"><b>定义</b> <a href="screen__interactive_8hpp_source.html#l00033">screen_interactive.hpp:33</a></div></div>
<div class="ttc" id="agroup__component_html_gad94d3d42aba3359550759aae5bcffbe9"><div class="ttname"><a href="group__component.html#gad94d3d42aba3359550759aae5bcffbe9">ftxui::animation::RequestAnimationFrame</a></div><div class="ttdeci">void RequestAnimationFrame()</div><div class="ttdoc">RequestAnimationFrame 是一个请求在下一个动画周期中绘制新帧的函数。</div><div class="ttdef"><b>定义</b> <a href="#l00077">screen_interactive.cpp:77</a></div></div>
<div class="ttc" id="agroup__component_html_structftxui_1_1Event"><div class="ttname"><a href="group__component.html#structftxui_1_1Event">ftxui::Event</a></div><div class="ttdoc">代表一个事件。它可以是按键事件、终端大小调整等等...</div><div class="ttdef"><b>定义</b> <a href="event_8hpp_source.html#l00028">event.hpp:28</a></div></div>
<div class="ttc" id="agroup__dom_html_gad4b8aa9392f56ba41e2b421e046a7d83"><div class="ttname"><a href="group__dom.html#gad4b8aa9392f56ba41e2b421e046a7d83">ftxui::Render</a></div><div class="ttdeci">void Render(Screen &amp;screen, const Element &amp;element)</div><div class="ttdoc">在 ftxui::Screen 上显示元素。</div><div class="ttdef"><b>定义</b> <a href="node_8cpp_source.html#l00084">node.cpp:84</a></div></div>
<div class="ttc" id="agroup__screen_html_a0d283cfb1ec16b3fc13d344ebfea93d4"><div class="ttname"><a href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">ftxui::Image::dimy</a></div><div class="ttdeci">int dimy() const</div><div class="ttdef"><b>定义</b> <a href="image_8hpp_source.html#l00035">image.hpp:35</a></div></div>
<div class="ttc" id="agroup__screen_html_a19c380b03cea21d7ac7325136a131ff0"><div class="ttname"><a href="group__screen.html#a19c380b03cea21d7ac7325136a131ff0">ftxui::Screen::ToString</a></div><div class="ttdeci">std::string ToString() const</div><div class="ttdef"><b>定义</b> <a href="screen_8cpp_source.html#l00413">screen.cpp:413</a></div></div>
<div class="ttc" id="agroup__screen_html_a1b254c3faacd432c325efff4268ca683"><div class="ttname"><a href="group__screen.html#a1b254c3faacd432c325efff4268ca683">ftxui::Image::dimx_</a></div><div class="ttdeci">int dimx_</div><div class="ttdef"><b>定义</b> <a href="image_8hpp_source.html#l00043">image.hpp:43</a></div></div>
<div class="ttc" id="agroup__screen_html_a9677c078c4270afdb7451cdc0b0871d4"><div class="ttname"><a href="group__screen.html#a9677c078c4270afdb7451cdc0b0871d4">ftxui::Screen::ResetPosition</a></div><div class="ttdeci">std::string ResetPosition(bool clear=false) const</div><div class="ttdoc">返回一个字符串,用于将光标位置重置到屏幕开头。</div><div class="ttdef"><b>定义</b> <a href="screen_8cpp_source.html#l00471">screen.cpp:471</a></div></div>
<div class="ttc" id="agroup__screen_html_a9df9d1ae7ed66857ca987963b2365904"><div class="ttname"><a href="group__screen.html#a9df9d1ae7ed66857ca987963b2365904">ftxui::Screen::cursor_</a></div><div class="ttdeci">Cursor cursor_</div><div class="ttdef"><b>定义</b> <a href="screen_8hpp_source.html#l00079">screen.hpp:79</a></div></div>
<div class="ttc" id="agroup__screen_html_a9e9d5df4b41aaa5eca27cdcaca6d4574"><div class="ttname"><a href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">ftxui::Image::dimy_</a></div><div class="ttdeci">int dimy_</div><div class="ttdef"><b>定义</b> <a href="image_8hpp_source.html#l00044">image.hpp:44</a></div></div>
<div class="ttc" id="agroup__screen_html_aa71d36872f416feaa853788a7a7a7ef8"><div class="ttname"><a href="group__screen.html#aa71d36872f416feaa853788a7a7a7ef8">ftxui::Screen::Clear</a></div><div class="ttdeci">void Clear()</div><div class="ttdoc">清除屏幕上的所有像素。</div><div class="ttdef"><b>定义</b> <a href="screen_8cpp_source.html#l00490">screen.cpp:490</a></div></div>
<div class="ttc" id="agroup__screen_html_ae7a460c9dacd70ed81b1adfea46b492e"><div class="ttname"><a href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">ftxui::Image::dimx</a></div><div class="ttdeci">int dimx() const</div><div class="ttdef"><b>定义</b> <a href="image_8hpp_source.html#l00034">image.hpp:34</a></div></div>
<div class="ttc" id="agroup__screen_html_aeab8c1788b3f2c7403749c3be95a68ae"><div class="ttname"><a href="group__screen.html#aeab8c1788b3f2c7403749c3be95a68ae">ftxui::Image::pixels_</a></div><div class="ttdeci">std::vector&lt; std::vector&lt; Pixel &gt; &gt; pixels_</div><div class="ttdef"><b>定义</b> <a href="image_8hpp_source.html#l00045">image.hpp:45</a></div></div>
<div class="ttc" id="agroup__screen_html_gad890c37601448c82ed0d5051c29e2f0c"><div class="ttname"><a href="group__screen.html#gad890c37601448c82ed0d5051c29e2f0c">ftxui::Terminal::Size</a></div><div class="ttdeci">Dimensions Size()</div><div class="ttdoc">获取终端尺寸。</div><div class="ttdef"><b>定义</b> <a href="terminal_8cpp_source.html#l00089">terminal.cpp:89</a></div></div>
<div class="ttc" id="aloop_8hpp_html"><div class="ttname"><a href="loop_8hpp.html">loop.hpp</a></div></div>
<div class="ttc" id="anamespaceDimension_html"><div class="ttname"><a href="namespaceDimension.html">Dimension</a></div><div class="ttdoc">FTXUI ftxui::Dimension:: 命名空间</div></div>
<div class="ttc" id="anamespaceanimation_html"><div class="ttname"><a href="namespaceanimation.html">animation</a></div><div class="ttdoc">FTXUI ftxui::animation:: 命名空间</div></div>
<div class="ttc" id="anamespaceftxui_1_1Terminal_html_a765662bcabb59dc93884674ee2fcc9fc"><div class="ttname"><a href="namespaceftxui_1_1Terminal.html#a765662bcabb59dc93884674ee2fcc9fc">ftxui::Terminal::SetFallbackSize</a></div><div class="ttdeci">void SetFallbackSize(const Dimensions &amp;fallbackSize)</div><div class="ttdoc">在自动检测失败时覆盖终端尺寸</div><div class="ttdef"><b>定义</b> <a href="terminal_8cpp_source.html#l00117">terminal.cpp:117</a></div></div>
<div class="ttc" id="anamespaceftxui_1_1animation_html_a3c06579c86b609bce4a9a097b23cd739"><div class="ttname"><a href="namespaceftxui_1_1animation.html#a3c06579c86b609bce4a9a097b23cd739">ftxui::animation::Duration</a></div><div class="ttdeci">std::chrono::duration&lt; float &gt; Duration</div><div class="ttdef"><b>定义</b> <a href="animation_8hpp_source.html#l00023">animation.hpp:23</a></div></div>
<div class="ttc" id="anamespaceftxui_1_1animation_html_a97ee0a9619acebafade22a9b7b0de667"><div class="ttname"><a href="namespaceftxui_1_1animation.html#a97ee0a9619acebafade22a9b7b0de667">ftxui::animation::TimePoint</a></div><div class="ttdeci">std::chrono::time_point&lt; Clock &gt; TimePoint</div><div class="ttdef"><b>定义</b> <a href="animation_8hpp_source.html#l00022">animation.hpp:22</a></div></div>
<div class="ttc" id="anamespaceftxui_1_1util_html_aab9f0232e41c960b4a09629eac33aef3"><div class="ttname"><a href="namespaceftxui_1_1util.html#aab9f0232e41c960b4a09629eac33aef3">ftxui::util::clamp</a></div><div class="ttdeci">constexpr const T &amp; clamp(const T &amp;v, const T &amp;lo, const T &amp;hi)</div><div class="ttdef"><b>定义</b> <a href="util_8hpp_source.html#l00011">util.hpp:11</a></div></div>
<div class="ttc" id="anamespaceftxui_html"><div class="ttname"><a href="namespaceftxui.html">ftxui</a></div><div class="ttdoc">#include &quot;ftxui/component/component_base.hpp&quot; // 用于 ComponentBase</div><div class="ttdef"><b>定义</b> <a href="animation_8hpp_source.html#l00009">animation.hpp:9</a></div></div>
<div class="ttc" id="anamespaceftxui_html_a24b663cb6b0b262055c94d3a03bdd274"><div class="ttname"><a href="namespaceftxui.html#a24b663cb6b0b262055c94d3a03bdd274">ftxui::CapturedMouse</a></div><div class="ttdeci">std::unique_ptr&lt; CapturedMouseInterface &gt; CapturedMouse</div><div class="ttdef"><b>定义</b> <a href="captured__mouse_8hpp_source.html#l00020">captured_mouse.hpp:20</a></div></div>
<div class="ttc" id="anamespaceftxui_html_a757b345f73bb6cde5165a4d7f0c0a298"><div class="ttname"><a href="namespaceftxui.html#a757b345f73bb6cde5165a4d7f0c0a298">ftxui::to_string</a></div><div class="ttdeci">std::string to_string(const std::wstring &amp;s)</div><div class="ttdoc">将 std::wstring 转换为 UTF8 std::string。</div><div class="ttdef"><b>定义</b> <a href="string_8cpp_source.html#l01563">string.cpp:1563</a></div></div>
<div class="ttc" id="anamespaceftxui_html_a9e3e2988ed61a129d82d634ad66f7eb1"><div class="ttname"><a href="namespaceftxui.html#a9e3e2988ed61a129d82d634ad66f7eb1">ftxui::select</a></div><div class="ttdeci">Element select(Element e)</div><div class="ttdoc">将 child 设置为其同级元素中获得焦点的元素。</div><div class="ttdef"><b>定义</b> <a href="frame_8cpp_source.html#l00107">frame.cpp:107</a></div></div>
<div class="ttc" id="anamespaceftxui_html_aaa92a82e968c721805c62787cd000534"><div class="ttname"><a href="namespaceftxui.html#aaa92a82e968c721805c62787cd000534">ftxui::Task</a></div><div class="ttdeci">std::variant&lt; Event, Closure, AnimationTask &gt; Task</div><div class="ttdef"><b>定义</b> <a href="task_8hpp_source.html#l00013">task.hpp:13</a></div></div>
<div class="ttc" id="anamespaceftxui_html_adc2f3bfa69ce99c596a1ff1b69b04d33"><div class="ttname"><a href="namespaceftxui.html#adc2f3bfa69ce99c596a1ff1b69b04d33">ftxui::Closure</a></div><div class="ttdeci">std::function&lt; void()&gt; Closure</div><div class="ttdef"><b>定义</b> <a href="task_8hpp_source.html#l00012">task.hpp:12</a></div></div>
<div class="ttc" id="anamespaceftxui_html_af1479ede01dbf087342534ab4ada11d3"><div class="ttname"><a href="namespaceftxui.html#af1479ede01dbf087342534ab4ada11d3">ftxui::Component</a></div><div class="ttdeci">std::shared_ptr&lt; ComponentBase &gt; Component</div><div class="ttdef"><b>定义</b> <a href="component__base_8hpp_source.html#l00023">component_base.hpp:23</a></div></div>
<div class="ttc" id="anode_8hpp_html"><div class="ttname"><a href="node_8hpp.html">node.hpp</a></div></div>
<div class="ttc" id="ascreen_8hpp_html"><div class="ttname"><a href="screen_8hpp.html">screen.hpp</a></div></div>
<div class="ttc" id="ascreen__interactive_8hpp_html"><div class="ttname"><a href="screen__interactive_8hpp.html">screen_interactive.hpp</a></div></div>
<div class="ttc" id="astructftxui_1_1Screen_1_1Cursor_html_a0a2f84ed7838f07779ae24c5a9086d33"><div class="ttname"><a href="structftxui_1_1Screen_1_1Cursor.html#a0a2f84ed7838f07779ae24c5a9086d33">ftxui::Screen::Cursor::y</a></div><div class="ttdeci">int y</div><div class="ttdef"><b>定义</b> <a href="screen_8hpp_source.html#l00052">screen.hpp:52</a></div></div>
<div class="ttc" id="astructftxui_1_1Screen_1_1Cursor_html_a6150e0515f7202e2fb518f7206ed97dc"><div class="ttname"><a href="structftxui_1_1Screen_1_1Cursor.html#a6150e0515f7202e2fb518f7206ed97dc">ftxui::Screen::Cursor::x</a></div><div class="ttdeci">int x</div><div class="ttdef"><b>定义</b> <a href="screen_8hpp_source.html#l00051">screen.hpp:51</a></div></div>
<div class="ttc" id="astructftxui_1_1Screen_1_1Cursor_html_a8b9f7758a8bd2bef680aeecc40bcfe04"><div class="ttname"><a href="structftxui_1_1Screen_1_1Cursor.html#a8b9f7758a8bd2bef680aeecc40bcfe04">ftxui::Screen::Cursor::shape</a></div><div class="ttdeci">Shape shape</div><div class="ttdef"><b>定义</b> <a href="screen_8hpp_source.html#l00063">screen.hpp:63</a></div></div>
<div class="ttc" id="atask_8hpp_html"><div class="ttname"><a href="task_8hpp.html">task.hpp</a></div></div>
<div class="ttc" id="atask__runner_8hpp_html"><div class="ttname"><a href="task__runner_8hpp.html">task_runner.hpp</a></div></div>
<div class="ttc" id="aterminal_8hpp_html"><div class="ttname"><a href="terminal_8hpp.html">terminal.hpp</a></div></div>
<div class="ttc" id="aterminal__input__parser_8hpp_html"><div class="ttname"><a href="terminal__input__parser_8hpp.html">terminal_input_parser.hpp</a></div></div>
<div class="ttc" id="autil_8hpp_html"><div class="ttname"><a href="util_8hpp.html">util.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.9.8-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const projectNumber = document.getElementById('projectname');
if (!projectNumber) {
console.warn('Doxygen element with ID "projectnumber" not found. Cannot add version switcher.');
return;
}
const langs = ["en", "es", "fr", "ja", "zh-CH", "zh-TW"];
const lang_paths = {"en": "../index.html", "es": "../es/index.html", "fr": "../fr/index.html", "ja": "../ja/index.html", "zh-CH": "index.html", "zh-TW": "../zh-TW/index.html"};
const lang_display = {"en": "English", "es": "Espa\u00f1ol", "fr": "Fran\u00e7ais", "ja": "\u65e5\u672c\u8a9e", "zh-CH": "\u4e2d\u6587 (\u7b80\u4f53)", "zh-TW": "\u4e2d\u6587 (\u7e41\u9ad4)"};
const versions = ["main"];
const version_paths = {"main": "index.html"};
const currentLang = "zh-CH";
const currentVersion = "main";
// Helper function to create a styled select element
const createSelect = (options, current, paths, label, displayMap = null) => {
const select = document.createElement('select');
select.title = label;
select.onchange = function() {
const selectedValue = this.value;
if (selectedValue in paths) {
window.location.href = paths[selectedValue];
}
};
// Sort versions: 'main' first, then others numerically descending.
options.sort((a, b) => {
if (a === 'main') return -1;
if (b === 'main') return 1;
return b.localeCompare(a, undefined, { numeric: true, sensitivity: 'base' });
});
options.forEach(v => {
const option = document.createElement('option');
option.value = v;
// Use the displayMap if provided, otherwise default to the value (v)
option.textContent = displayMap ? displayMap[v] : v;
if (v === current) {
option.selected = true;
}
select.appendChild(option);
});
// Apply some styling to make it look good.
Object.assign(select.style, {
backgroundColor: 'rgba(0, 0, 0, 0.8)',
color: 'white',
border: '1px solid rgba(255, 255, 255, 0.2)',
padding: '5px',
borderRadius: '5px',
fontSize: '14px',
fontFamily: 'inherit',
margin: '0 5px 0 0',
cursor: 'pointer'
});
return select;
};
// 1. Create Language Switcher, passing the language display names map
const langSelect = createSelect(langs, currentLang, lang_paths, 'Select Language', lang_display);
// 2. Create Version Switcher
const versionSelect = createSelect(versions, currentVersion, version_paths, 'Select Version');
// 3. Create FTXUI title.
const ftxuiTitle = document.createElement('span');
ftxuiTitle.textContent = 'FTXUI: ';
Object.assign(ftxuiTitle.style, {
color: 'white',
fontSize: '20px',
fontWeight: 'bold',
marginRight: '10px'
});
// 3. Create a container to hold both selectors
const container = document.createElement('div');
container.id = 'version-lang-switchers';
Object.assign(container.style, {
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end',
width: 'auto'
});
container.appendChild(ftxuiTitle);
container.appendChild(langSelect);
container.appendChild(versionSelect);
Object.assign(container.style, {
backgroundColor: 'rgba(0, 0, 0, 0.5)',
padding: '5px 10px',
borderRadius: '8px'
});
// Replace the Doxygen project number element with our container.
projectNumber.replaceWith(container);
// Clean up the original Doxygen project number text if it still exists nearby
const parent = container.parentElement;
if (parent) {
const textNode = Array.from(parent.childNodes).find(n => n.nodeType === 3 && n.textContent.trim() !== '');
if (textNode) {
textNode.remove();
}
}
});
</script>
</body>
</html>