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

1599 lines
226 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="en-US">
<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 Source File</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 -->
<!-- Generated by 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','Search',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">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</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">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// Copyright 2020 Arthur Sonzogni. All rights reserved.</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// このソースコードの使用は、LICENSE ファイルにあるMITライセンスによって管理されています。</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</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="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for copy, max, min</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="preprocessor">#include &lt;array&gt;</span> <span class="comment">// for array</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#include &lt;atomic&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</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="l00008" name="l00008"></a><span class="lineno"> 8</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="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#include &lt;cstdint&gt;</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#include &lt;cstdio&gt;</span> <span class="comment">// for fileno, stdin</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</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="l00012" name="l00012"></a><span class="lineno"> 12</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="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#include &lt;functional&gt;</span> <span class="comment">// for function</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &lt;initializer_list&gt;</span> <span class="comment">// for initializer_list</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</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="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;memory&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;stack&gt;</span> <span class="comment">// for stack</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;thread&gt;</span> <span class="comment">// for thread, sleep_for</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;tuple&gt;</span> <span class="comment">// for _Swallow_assign, ignore</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &lt;utility&gt;</span> <span class="comment">// for move, swap</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &lt;variant&gt;</span> <span class="comment">// for visit, variant</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &lt;vector&gt;</span> <span class="comment">// for vector</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</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="l00025" name="l00025"></a><span class="lineno"> 25</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="l00026" name="l00026"></a><span class="lineno"> 26</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="l00027" name="l00027"></a><span class="lineno"> 27</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="l00028" name="l00028"></a><span class="lineno"> 28</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="l00029" name="l00029"></a><span class="lineno"> 29</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="l00030" name="l00030"></a><span class="lineno"> 30</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="l00031" name="l00031"></a><span class="lineno"> 31</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="l00032" name="l00032"></a><span class="lineno"> 32</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="l00033" name="l00033"></a><span class="lineno"> 33</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="l00034" name="l00034"></a><span class="lineno"> 34</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="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="preprocessor">#if defined(_WIN32)</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="preprocessor">#define DEFINE_CONSOLEV2_PROPERTIES</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#define WIN32_LEAN_AND_MEAN</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="preprocessor">#ifndef NOMINMAX</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="preprocessor">#define NOMINMAX</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="preprocessor">#include &lt;windows.h&gt;</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="preprocessor">#ifndef UNICODE</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="preprocessor">#error Must be compiled in UNICODE mode</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="preprocessor">#include &lt;fcntl.h&gt;</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</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="l00049" name="l00049"></a><span class="lineno"> 49</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="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="preprocessor">#include &lt;unistd.h&gt;</span> <span class="comment">// for STDIN_FILENO, read</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="preprocessor">#include &lt;cerrno&gt;</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> </div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="comment">// Quick exit is missing in standard CLang headers</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="preprocessor">#if defined(__clang__) &amp;&amp; defined(__APPLE__)</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="preprocessor">#define quick_exit(a) exit(a)</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> </div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceftxui.html">ftxui</a> {</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="keyword">struct </span>ScreenInteractive::Internal {</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="comment">// 文字をイベントに変換します。</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> TerminalInputParser terminal_input_parser;</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> </div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> task::TaskRunner task_runner;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> </div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="comment">// 文字が最後に受信された時刻。</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> std::chrono::time_point&lt;std::chrono::steady_clock&gt; last_char_time =</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> std::chrono::steady_clock::now();</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> </div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keyword">explicit</span> Internal(std::function&lt;<span class="keywordtype">void</span>(Event)&gt; out)</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> : terminal_input_parser(std::move(out)) {}</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span>};</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><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceanimation.html">animation</a> {</div>
<div class="foldopen" id="foldopen00076" data-start="{" data-end="}">
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"><a class="line" href="group__component.html#gad94d3d42aba3359550759aae5bcffbe9"> 76</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="l00077" name="l00077"></a><span class="lineno"> 77</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="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordflow">if</span> (screen) {</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> screen-&gt;RequestAnimationFrame();</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> }</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span>}</div>
</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span>} <span class="comment">// namespace animation</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> </div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span><span class="keyword">namespace </span>{</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> </div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span>ScreenInteractive* g_active_screen = <span class="keyword">nullptr</span>; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span><span class="keywordtype">void</span> Flush() {</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="comment">// Emscripten doesn&#39;t implement flush. We interpret zero as flush.</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> std::cout &lt;&lt; <span class="charliteral">&#39;\0&#39;</span> &lt;&lt; std::flush;</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span>}</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><span class="keyword">constexpr</span> <span class="keywordtype">int</span> timeout_milliseconds = 20;</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span>[[maybe_unused]] <span class="keyword">constexpr</span> <span class="keywordtype">int</span> timeout_microseconds =</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> timeout_milliseconds * 1000;</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span><span class="preprocessor">#if defined(_WIN32)</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> </div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span><span class="preprocessor">#elif defined(__EMSCRIPTEN__)</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span><span class="preprocessor">#include &lt;emscripten.h&gt;</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> </div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span><span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span>EMSCRIPTEN_KEEPALIVE</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</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="l00104" name="l00104"></a><span class="lineno"> 104</span> <a class="code hl_function" href="namespaceftxui_1_1Terminal.html#a765662bcabb59dc93884674ee2fcc9fc">Terminal::SetFallbackSize</a>({</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> columns,</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> rows,</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> });</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> std::raise(SIGWINCH);</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span>}</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><span class="preprocessor">#else </span><span class="comment">// POSIX (Linux &amp; Mac)</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> </div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span><span class="keywordtype">int</span> CheckStdinReady(<span class="keywordtype">int</span> fd) {</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> timeval tv = {0, 0}; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> fd_set fds;</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> FD_ZERO(&amp;fds); <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> FD_SET(fd, &amp;fds); <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</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="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="keywordflow">return</span> FD_ISSET(fd, &amp;fds); <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</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><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> </div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span>std::stack&lt;Closure&gt; on_exit_functions; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span><span class="keywordtype">void</span> OnExit() {</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keywordflow">while</span> (!on_exit_functions.empty()) {</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> on_exit_functions.top()();</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> on_exit_functions.pop();</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> }</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>std::atomic&lt;int&gt; g_signal_exit_count = 0; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span><span class="preprocessor">#if !defined(_WIN32)</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span>std::atomic&lt;int&gt; g_signal_stop_count = 0; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span>std::atomic&lt;int&gt; g_signal_resize_count = 0; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> </div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span><span class="comment">// Async signal safe function</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span><span class="keywordtype">void</span> RecordSignal(<span class="keywordtype">int</span> signal) {</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keywordflow">switch</span> (signal) {</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordflow">case</span> SIGABRT:</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keywordflow">case</span> SIGFPE:</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordflow">case</span> SIGILL:</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">case</span> SIGINT:</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="keywordflow">case</span> SIGSEGV:</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="keywordflow">case</span> SIGTERM:</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> g_signal_exit_count++;</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> </div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span><span class="preprocessor">#if !defined(_WIN32)</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keywordflow">case</span> SIGTSTP: <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> g_signal_stop_count++;</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keywordflow">case</span> SIGWINCH: <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> g_signal_resize_count++;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> </div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="keywordflow">default</span>:</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</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><span class="keywordtype">void</span> ExecuteSignalHandlers() {</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="keywordtype">int</span> signal_exit_count = g_signal_exit_count.exchange(0);</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="keywordflow">while</span> (signal_exit_count--) {</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</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="l00170" name="l00170"></a><span class="lineno"> 170</span> }</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><span class="preprocessor">#if !defined(_WIN32)</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <span class="keywordtype">int</span> signal_stop_count = g_signal_stop_count.exchange(0);</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <span class="keywordflow">while</span> (signal_stop_count--) {</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</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="l00176" name="l00176"></a><span class="lineno"> 176</span> }</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> <span class="keywordtype">int</span> signal_resize_count = g_signal_resize_count.exchange(0);</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="keywordflow">while</span> (signal_resize_count--) {</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</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="l00181" name="l00181"></a><span class="lineno"> 181</span> }</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</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><span class="keywordtype">void</span> InstallSignalHandler(<span class="keywordtype">int</span> sig) {</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> <span class="keyword">auto</span> old_signal_handler = std::signal(sig, RecordSignal);</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> on_exit_functions.emplace(</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> [=] { std::ignore = std::signal(sig, old_signal_handler); });</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span>}</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><span class="comment">// CSI: Control Sequence Introducer</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</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="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="comment">//</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span><span class="comment">// DCS: Device Control String</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</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="l00196" name="l00196"></a><span class="lineno"> 196</span><span class="comment">// ST: String Terminator</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</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="l00198" name="l00198"></a><span class="lineno"> 198</span> </div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span><span class="comment">// DECRQSS: Request Status String</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span><span class="comment">// DECSCUSR: Set Cursor Style</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</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="l00202" name="l00202"></a><span class="lineno"> 202</span> </div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span><span class="comment">// DEC: Digital Equipment Corporation</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span><span class="keyword">enum class</span> DECMode : std::uint16_t {</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> kLineWrap = 7,</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> kCursor = 25,</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> </div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> kMouseX10 = 9,</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> kMouseVt200 = 1000,</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> kMouseVt200Highlight = 1001,</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> </div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> kMouseBtnEventMouse = 1002,</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> kMouseAnyEvent = 1003,</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> </div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> kMouseUtf8 = 1005,</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> kMouseSgrExtMode = 1006,</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> kMouseUrxvtMode = 1015,</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> kMouseSgrPixelsMode = 1016,</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> kAlternateScreen = 1049,</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span>};</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><span class="comment">// Device Status Report (DSR) {</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span><span class="keyword">enum class</span> DSRMode : std::uint8_t {</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> kCursor = 6,</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span>};</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>std::string Serialize(<span class="keyword">const</span> std::vector&lt;DECMode&gt;&amp; parameters) {</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> std::string out;</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> DECMode parameter : parameters) {</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="keywordflow">if</span> (!first) {</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> out += <span class="stringliteral">&quot;;&quot;</span>;</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> }</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> out += std::to_string(<span class="keywordtype">int</span>(parameter));</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> first = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> }</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="keywordflow">return</span> out;</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span>}</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><span class="comment">// DEC Private Mode Set (DECSET)</span></div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span>std::string Set(<span class="keyword">const</span> std::vector&lt;DECMode&gt;&amp; parameters) {</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</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="l00243" name="l00243"></a><span class="lineno"> 243</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><span class="comment">// DEC Private Mode Reset (DECRST)</span></div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span>std::string Reset(<span class="keyword">const</span> std::vector&lt;DECMode&gt;&amp; parameters) {</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</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="l00248" name="l00248"></a><span class="lineno"> 248</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><span class="comment">// Device Status Report (DSR)</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span>std::string DeviceStatusReport(DSRMode ps) {</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</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="l00253" name="l00253"></a><span class="lineno"> 253</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><span class="keyword">class </span>CapturedMouseImpl : <span class="keyword">public</span> CapturedMouseInterface {</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</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="l00258" name="l00258"></a><span class="lineno"> 258</span> : callback_(std::move(callback)) {}</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> ~CapturedMouseImpl()<span class="keyword"> override </span>{ callback_(); }</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> CapturedMouseImpl(<span class="keyword">const</span> CapturedMouseImpl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> CapturedMouseImpl(CapturedMouseImpl&amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> CapturedMouseImpl&amp; operator=(<span class="keyword">const</span> CapturedMouseImpl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> CapturedMouseImpl&amp; operator=(CapturedMouseImpl&amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> </div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> <span class="keyword">private</span>:</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> std::function&lt;void(<span class="keywordtype">void</span>)&gt; callback_;</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span>};</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>} <span class="comment">// namespace</span></div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> </div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span>ScreenInteractive::ScreenInteractive(<a class="code hl_namespace" href="namespaceDimension.html">Dimension</a> dimension,</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> <span class="keywordtype">int</span> dimx,</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <span class="keywordtype">int</span> dimy,</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> <span class="keywordtype">bool</span> use_alternative_screen)</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> : Screen(dimx, dimy),</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> dimension_(dimension),</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> use_alternative_screen_(use_alternative_screen) {</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> internal_ = std::make_unique&lt;Internal&gt;(</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> [&amp;](Event event) { PostEvent(std::move(event)); });</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span>}</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><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00283" data-start="{" data-end="}">
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"><a class="line" href="group__component.html#a267cfc2d693fa96a82ae74029214d02e"> 283</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="l00284" name="l00284"></a><span class="lineno"> 284</span> <span class="keywordflow">return</span> {</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> Dimension::Fixed,</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> <a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a>,</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> <a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a>,</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <span class="comment">/*use_alternative_screen=*/</span><span class="keyword">false</span>,</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> };</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span>}</div>
</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span><span class="comment"></span> </div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span><span class="comment">/// ターミナルサイズの全体を使用するScreenInteractiveを作成します。これは、ターミナルコンテンツを乱すことを避けるために、代替スクリーンバッファを使用します。</span></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span><span class="comment">/// @note これは`ScreenInteractive::FullscreenAlternateScreen()`と同じです。</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00295" data-start="{" data-end="}">
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"><a class="line" href="group__component.html#a53dc5c3030151713857cf1a898d0f897"> 295</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="l00296" name="l00296"></a><span class="lineno"> 296</span> <span class="keywordflow">return</span> <a class="code hl_function" href="group__component.html#acad4646ece7569fd39a3a5c847ebb4a8">FullscreenAlternateScreen</a>();</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span>}</div>
</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span><span class="comment"></span> </div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span><span class="comment">/// ターミナルサイズの全体を使用するScreenInteractiveを作成します。プライマリスクリーンバッファが使用されます。これは、ターミナルがリサイズされた場合、以前のコンテンツがターミナルコンテンツを乱す可能性があることを意味します。</span></div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00301" data-start="{" data-end="}">
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"><a class="line" href="group__component.html#a6be13532d5bef8f566c12090db2dffba"> 301</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="l00302" name="l00302"></a><span class="lineno"> 302</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="l00303" name="l00303"></a><span class="lineno"> 303</span> <span class="keywordflow">return</span> {</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> Dimension::Fullscreen,</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> terminal.dimx,</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> terminal.dimy,</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> <span class="comment">/*use_alternative_screen=*/</span><span class="keyword">false</span>,</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> };</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span>}</div>
</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span><span class="comment"></span> </div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span><span class="comment">/// ターミナルサイズの全体を使用するScreenInteractiveを作成します。これは、ターミナルコンテンツを乱すことを避けるために、代替スクリーンバッファを使用します。</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00313" data-start="{" data-end="}">
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"><a class="line" href="group__component.html#acad4646ece7569fd39a3a5c847ebb4a8"> 313</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="l00314" name="l00314"></a><span class="lineno"> 314</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="l00315" name="l00315"></a><span class="lineno"> 315</span> <span class="keywordflow">return</span> {</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> Dimension::Fullscreen,</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> terminal.dimx,</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> terminal.dimy,</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> <span class="comment">/*use_alternative_screen=*/</span><span class="keyword">true</span>,</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> };</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span>}</div>
</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span><span class="comment"></span> </div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span><span class="comment">/// ターミナル出力の幅に一致し、描画されるコンポーネントの高さに一致するScreenInteractiveを作成します。</span></div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00325" data-start="{" data-end="}">
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"><a class="line" href="group__component.html#a0b7de0467b4e57ce5f337ba8634d8d13"> 325</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="l00326" name="l00326"></a><span class="lineno"> 326</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="l00327" name="l00327"></a><span class="lineno"> 327</span> <span class="keywordflow">return</span> {</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> Dimension::TerminalOutput,</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> terminal.dimx,</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> terminal.dimy, <span class="comment">// Best guess.</span></div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="comment">/*use_alternative_screen=*/</span><span class="keyword">false</span>,</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> };</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span>}</div>
</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> </div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</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="l00336" name="l00336"></a><span class="lineno"> 336</span><span class="comment"></span> </div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span><span class="comment">/// 描画されるコンポーネントの幅と高さに一致するScreenInteractiveを作成します。</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00339" data-start="{" data-end="}">
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"><a class="line" href="group__component.html#a4f458e443ed672c2aea9fdd96531a621"> 339</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="l00340" name="l00340"></a><span class="lineno"> 340</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="l00341" name="l00341"></a><span class="lineno"> 341</span> <span class="keywordflow">return</span> {</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> Dimension::FitComponent,</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> terminal.dimx, <span class="comment">// Best guess.</span></div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> terminal.dimy, <span class="comment">// Best guess.</span></div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> <span class="keyword">false</span>,</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> };</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span>}</div>
</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span><span class="comment"></span> </div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span><span class="comment">/// @brief マウスが追跡され、イベントが報告されるかどうかを設定します。</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span><span class="comment">/// メインループの外側で呼び出されます。例: `ScreenInteractive::Loop(...)`。</span></div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span><span class="comment">/// @param enable マウスイベントの追跡を有効にするかどうか。</span></div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span><span class="comment">/// @note これはメインループの外側で呼び出す必要があります。例: `ScreenInteractive::Loop`を呼び出す前。</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span><span class="comment">/// @note マウストラッキングはデフォルトで有効になっています。</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span><span class="comment">/// @note マウストラッキングは、それをサポートする端末でのみサポートされています。</span></div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span><span class="comment">///</span></div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span><span class="comment">/// ### 例</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span><span class="comment">///</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span><span class="comment">/// ```cpp</span></div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span><span class="comment">/// auto screen = ScreenInteractive::TerminalOutput();</span></div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span><span class="comment">/// screen.TrackMouse(false);</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span><span class="comment">/// screen.Loop(component);</span></div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span><span class="comment">/// ```</span></div>
<div class="foldopen" id="foldopen00363" data-start="{" data-end="}">
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"><a class="line" href="group__component.html#ad5961c1d4caf0ba9a030e5675162a164"> 363</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="l00364" name="l00364"></a><span class="lineno"> 364</span> track_mouse_ = enable;</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span>}</div>
</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span><span class="comment"></span> </div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span><span class="comment">/// @brief 自動パイプ入力処理を有効または無効にします。</span></div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span><span class="comment">/// 有効にすると、FTXUIはパイプ入力を検出し、キーボード入力のためにstdinを`/dev/tty`からリダイレクトし、アプリケーションがパイプデータを読み取りながら、対話型キーボードイベントを引き続き受信できるようにします。</span></div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span><span class="comment">/// @param enable パイプ入力処理を有効にするかどうか。デフォルトはtrueです。</span></div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span><span class="comment">/// @note これは`Loop()`の前に呼び出す必要があります。</span></div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span><span class="comment">/// @note この機能はデフォルトで有効になっています。</span></div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span><span class="comment">/// @note この機能はPOSIXシステムLinux/macOSでのみ利用可能です。</span></div>
<div class="foldopen" id="foldopen00373" data-start="{" data-end="}">
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"><a class="line" href="group__component.html#a13d77f11d0631067367d82d380b04ce2"> 373</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="l00374" name="l00374"></a><span class="lineno"> 374</span> handle_piped_input_ = enable;</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span>}</div>
</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span><span class="comment"></span> </div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span><span class="comment">/// @brief メインループにタスクを追加します。</span></div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span><span class="comment">/// これは、他のすべてのスケジュールされたタスクの後に実行されます。</span></div>
<div class="foldopen" id="foldopen00379" data-start="{" data-end="}">
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"><a class="line" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88"> 379</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="l00380" name="l00380"></a><span class="lineno"> 380</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="l00381" name="l00381"></a><span class="lineno"> 381</span> HandleTask(component_, task);</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> });</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span>}</div>
</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span><span class="comment"></span> </div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span><span class="comment">/// @brief メインループにイベントを追加します。</span></div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span><span class="comment">/// これは、他のすべてのスケジュールされたイベントの後に実行されます。</span></div>
<div class="foldopen" id="foldopen00387" data-start="{" data-end="}">
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"><a class="line" href="group__component.html#a29e75bdaa1d5465518787ec014b2c3bf"> 387</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="l00388" name="l00388"></a><span class="lineno"> 388</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">Post</a>(event);</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span>}</div>
</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span><span class="comment"></span> </div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span><span class="comment">/// @brief すべてのアニメーションが完了するまで、画面をもう一度描画するタスクを追加します。</span></div>
<div class="foldopen" id="foldopen00392" data-start="{" data-end="}">
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"><a class="line" href="group__component.html#ad94d3d42aba3359550759aae5bcffbe9"> 392</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="l00393" name="l00393"></a><span class="lineno"> 393</span> <span class="keywordflow">if</span> (animation_requested_) {</div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> }</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> animation_requested_ = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> <span class="keyword">auto</span> now = animation::Clock::now();</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> <span class="keyword">const</span> <span class="keyword">auto</span> time_histeresis = std::chrono::milliseconds(33);</div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> <span class="keywordflow">if</span> (now - previous_animation_time_ &gt;= time_histeresis) {</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> previous_animation_time_ = now;</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> }</div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span>}</div>
</div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span><span class="comment"></span> </div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span><span class="comment">/// @brief マウスをキャプチャできることに関するユニークロックを取得しようとします。</span></div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span><span class="comment">/// @return マウスがまだキャプチャされていない場合はユニークロック、それ以外の場合はヌル。</span></div>
<div class="foldopen" id="foldopen00406" data-start="{" data-end="}">
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"><a class="line" href="group__component.html#aad61519d291dcc216d2ac618618a45a2"> 406</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="l00407" name="l00407"></a><span class="lineno"> 407</span> <span class="keywordflow">if</span> (mouse_captured) {</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> }</div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> mouse_captured = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> <span class="keywordflow">return</span> std::make_unique&lt;CapturedMouseImpl&gt;(</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> [<span class="keyword">this</span>] { mouse_captured = <span class="keyword">false</span>; });</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span>}</div>
</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span><span class="comment"></span> </div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span><span class="comment">/// @brief メインループを実行します。</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span><span class="comment">/// @param component 描画するコンポーネント。</span></div>
<div class="foldopen" id="foldopen00417" data-start="{" data-end="}">
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"><a class="line" href="group__component.html#a9bd3dbd471fce0038700caaa47dddc1a"> 417</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="l00418" name="l00418"></a><span class="lineno"> 418</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="l00419" name="l00419"></a><span class="lineno"> 419</span> loop.Run();</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"></span>bool ScreenInteractive::HasQuitted() {</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> <span class="keywordflow">return</span> quit_;</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span>}</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> </div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span><span class="comment">// private</span></div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span><span class="keywordtype">void</span> ScreenInteractive::PreMain() {</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> <span class="comment">// Suspend previously active screen:</span></div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> <span class="keywordflow">if</span> (g_active_screen) {</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> std::swap(suspended_screen_, g_active_screen);</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="comment">// Reset cursor position to the top of the screen and clear the screen.</span></div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> suspended_screen_-&gt;ResetCursorPosition();</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</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="l00435" name="l00435"></a><span class="lineno"> 435</span> suspended_screen_-&gt;<a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a> = 0;</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> suspended_screen_-&gt;<a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a> = 0;</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> </div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> <span class="comment">// Reset dimensions to force drawing the screen again next time:</span></div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> suspended_screen_-&gt;Uninstall();</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> }</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> </div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span> <span class="comment">// This screen is now active:</span></div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> g_active_screen = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span> g_active_screen-&gt;Install();</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> </div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> previous_animation_time_ = animation::Clock::now();</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">// private</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span><span class="keywordtype">void</span> ScreenInteractive::PostMain() {</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> <span class="comment">// Put cursor position at the end of the drawing.</span></div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> ResetCursorPosition();</div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> </div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> g_active_screen = <span class="keyword">nullptr</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">// Restore suspended screen.</span></div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <span class="keywordflow">if</span> (suspended_screen_) {</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> <span class="comment">// Clear screen, and put the cursor at the beginning of the drawing.</span></div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</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="l00460" name="l00460"></a><span class="lineno"> 460</span> <a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a> = 0;</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> <a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a> = 0;</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> Uninstall();</div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> std::swap(g_active_screen, suspended_screen_);</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> g_active_screen-&gt;Install();</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> Uninstall();</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> </div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> std::cout &lt;&lt; <span class="charliteral">&#39;\r&#39;</span>;</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> <span class="comment">// On final exit, keep the current drawing and reset cursor position one</span></div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> <span class="comment">// line after it.</span></div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> <span class="keywordflow">if</span> (!use_alternative_screen_) {</div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> std::cout &lt;&lt; <span class="charliteral">&#39;\n&#39;</span>;</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> std::cout &lt;&lt; std::flush;</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> }</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span>}</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span><span class="comment"></span> </div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span><span class="comment">/// @brief 関数を装飾します。それは同じように実行されますが、実行中に現在アクティブなスクリーンターミナルフックは一時的にアンインストールされます。</span></div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span><span class="comment">/// @param fn 装飾する関数。</span></div>
<div class="foldopen" id="foldopen00480" data-start="{" data-end="}">
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"><a class="line" href="group__component.html#af9df2de690486078fea4a7151b83b089"> 480</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="l00481" name="l00481"></a><span class="lineno"> 481</span> <span class="keywordflow">return</span> [<span class="keyword">this</span>, fn] {</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> Uninstall();</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> fn();</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> Install();</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> };</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span>}</div>
</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span><span class="comment"></span> </div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span><span class="comment">/// @brief コンポーネントが`Event::CtrlC`をキャッチした場合でも、FTXUIにCtrl-Cを処理させるか処理させないかを強制します。</span></div>
<div class="foldopen" id="foldopen00489" data-start="{" data-end="}">
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"><a class="line" href="group__component.html#ae48c11a6c9160dc14cd5504ebe69304b"> 489</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="l00490" name="l00490"></a><span class="lineno"> 490</span> force_handle_ctrl_c_ = force;</div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span>}</div>
</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span><span class="comment"></span> </div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span><span class="comment">/// @brief コンポーネントが`Event::CtrlZ`をキャッチした場合でも、FTXUIにCtrl-Zを処理させるか処理させないかを強制します。</span></div>
<div class="foldopen" id="foldopen00494" data-start="{" data-end="}">
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"><a class="line" href="group__component.html#af1c772ab581e587daad086227435f2ec"> 494</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="l00495" name="l00495"></a><span class="lineno"> 495</span> force_handle_ctrl_z_ = force;</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span>}</div>
</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span><span class="comment"></span> </div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span><span class="comment">/// @brief 現在の選択内容を返します</span></div>
<div class="foldopen" id="foldopen00499" data-start="{" data-end="}">
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"><a class="line" href="group__component.html#ac25769e248caa01d336f5eaa79cd6160"> 499</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="l00500" name="l00500"></a><span class="lineno"> 500</span> <span class="keywordflow">if</span> (!selection_) {</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> }</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> <span class="keywordflow">return</span> selection_-&gt;GetParts();</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span>}</div>
</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> </div>
<div class="foldopen" id="foldopen00506" data-start="{" data-end="}">
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"><a class="line" href="group__component.html#ad6daabb2df61b6be6f0b2a8950ac3281"> 506</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="l00507" name="l00507"></a><span class="lineno"> 507</span> selection_on_change_ = std::move(callback);</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span>}</div>
</div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span><span class="comment"></span> </div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span><span class="comment">/// @brief 現在アクティブな画面を返します。アクティブな画面がない場合はヌルを返します。</span></div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span><span class="comment"></span><span class="comment">// static</span></div>
<div class="foldopen" id="foldopen00512" data-start="{" data-end="}">
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"><a class="line" href="group__component.html#a9dc30615370889030396a239ceee2a77"> 512</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="l00513" name="l00513"></a><span class="lineno"> 513</span> <span class="keywordflow">return</span> g_active_screen;</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="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span><span class="comment">// private</span></div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span><span class="keywordtype">void</span> ScreenInteractive::Install() {</div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> frame_valid_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> </div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> <span class="comment">// ユーザーが以前にプリントした内容が、ターミナル設定を変更する前に完全に適用されるように、stdoutのバッファをフラッシュします。これは、以下のターミナルエミュレータと通信するために2つの異なるチャネルstdoutとtermios/WinAPIを使用しているため重要です。詳細はhttps://github.com/ArthurSonzogni/FTXUI/issues/846を参照してください。</span></div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> Flush();</div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> </div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> InstallPipedInputHandling();</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> </div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> <span class="comment">// 新しい設定をアンインストールした後、それが完全に適用されるようにターミナルにフラッシュします。</span></div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> on_exit_functions.emplace([] { Flush(); });</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> </div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</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="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">// ターミナルに現在のカーソル形状を報告するように要求します。終了時にそれを復元します。</span></div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> std::cout &lt;&lt; DECRQSS_DECSCUSR;</div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> on_exit_functions.emplace([<span class="keyword">this</span>] {</div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</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="l00534" name="l00534"></a><span class="lineno"> 534</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="l00535" name="l00535"></a><span class="lineno"> 535</span> });</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> <span class="comment">// 終了時にターミナル状態を復元するためのシグナルハンドラをインストールします。デフォルトのシグナルハンドラは終了時に復元されます。</span></div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</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="l00539" name="l00539"></a><span class="lineno"> 539</span> InstallSignalHandler(signal);</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> }</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> </div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span><span class="comment">// 古いターミナル設定を保存し、終了時に復元します。</span></div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span><span class="preprocessor">#if defined(_WIN32)</span></div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <span class="comment">// stdout および stdin で VT 処理を有効にする</span></div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> <span class="keyword">auto</span> stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> <span class="keyword">auto</span> stdin_handle = GetStdHandle(STD_INPUT_HANDLE);</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> </div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> DWORD out_mode = 0;</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> DWORD in_mode = 0;</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> GetConsoleMode(stdout_handle, &amp;out_mode);</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> GetConsoleMode(stdin_handle, &amp;in_mode);</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> on_exit_functions.push([=] { SetConsoleMode(stdout_handle, out_mode); });</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> on_exit_functions.push([=] { SetConsoleMode(stdin_handle, in_mode); });</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> </div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> <span class="comment">// https://docs.microsoft.com/ja-jp/windows/console/setconsolemode</span></div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> <span class="keyword">const</span> <span class="keywordtype">int</span> enable_virtual_terminal_processing = 0x0004;</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> <span class="keyword">const</span> <span class="keywordtype">int</span> disable_newline_auto_return = 0x0008;</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> out_mode |= enable_virtual_terminal_processing;</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> out_mode |= disable_newline_auto_return;</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> </div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> <span class="comment">// https://docs.microsoft.com/ja-jp/windows/console/setconsolemode</span></div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> <span class="keyword">const</span> <span class="keywordtype">int</span> enable_line_input = 0x0002;</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> <span class="keyword">const</span> <span class="keywordtype">int</span> enable_echo_input = 0x0004;</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> <span class="keyword">const</span> <span class="keywordtype">int</span> enable_virtual_terminal_input = 0x0200;</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> <span class="keyword">const</span> <span class="keywordtype">int</span> enable_window_input = 0x0008;</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> in_mode &amp;= ~enable_echo_input;</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> in_mode &amp;= ~enable_line_input;</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> in_mode |= enable_virtual_terminal_input;</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> in_mode |= enable_window_input;</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> </div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> SetConsoleMode(stdin_handle, in_mode);</div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> SetConsoleMode(stdout_handle, out_mode);</div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span><span class="preprocessor">#else </span><span class="comment">// POSIX (Linux &amp; Mac)</span></div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> <span class="comment">// #if defined(__EMSCRIPTEN__)</span><span class="comment"></span></div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span><span class="comment"> //// Reading stdin isn&#39;t blocking.</span></div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span><span class="comment"></span> <span class="comment">// int flags = fcntl(0, F_GETFL, 0);</span></div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> <span class="comment">// fcntl(0, F_SETFL, flags | O_NONBLOCK);</span></div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span><span class="comment"></span> </div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span><span class="comment"> //// Restore the terminal configuration on exit.</span></div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</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="l00581" name="l00581"></a><span class="lineno"> 581</span> <span class="comment">// #endif</span></div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</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="l00583" name="l00583"></a><span class="lineno"> 583</span> InstallSignalHandler(signal);</div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> }</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> </div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> <span class="keyword">struct </span>termios terminal; <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> tcgetattr(tty_fd_, &amp;terminal);</div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> on_exit_functions.emplace([terminal = terminal, tty_fd_ = tty_fd_] {</div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> tcsetattr(tty_fd_, TCSANOW, &amp;terminal);</div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> });</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> </div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span> <span class="comment">// rawターミナル入力モードを有効にする</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span> terminal.c_iflag &amp;= ~IGNBRK; <span class="comment">// ブレーク条件の無視を無効にする</span></div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> terminal.c_iflag &amp;= ~BRKINT; <span class="comment">// 入出力が</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> terminal.c_iflag &amp;= ~PARMRK; <span class="comment">// パリティエラーのマーキングを無効にする。</span></div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span> terminal.c_iflag &amp;= ~ISTRIP; <span class="comment">// 文字から8ビット目をストライピングするのを無効にする。</span></div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> terminal.c_iflag &amp;= ~INLCR; <span class="comment">// NLからCRへのマッピングを無効にする。</span></div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span> terminal.c_iflag &amp;= ~IGNCR; <span class="comment">// CRの無視を無効にする。</span></div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span> terminal.c_iflag &amp;= ~ICRNL; <span class="comment">// CRからNLへのマッピングを無効にする。</span></div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> terminal.c_iflag &amp;= ~IXON; <span class="comment">// 出力でのXON/XOFFフロー制御を無効にする</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> terminal.c_lflag &amp;= ~ECHO; <span class="comment">// 入力文字のエコーを無効にする。</span></div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> terminal.c_lflag &amp;= ~ECHONL; <span class="comment">// 改行文字のエコーを無効にする。</span></div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> terminal.c_lflag &amp;= ~ICANON; <span class="comment">// Canonicalモードを無効にする。</span></div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> terminal.c_lflag &amp;= ~ISIG; <span class="comment">// 以下のキーを押したときにシグナルを送信するのを無効にする:</span></div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> <span class="comment">// - =&gt; DSUSP</span></div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> <span class="comment">// - C-Z =&gt; SUSP</span></div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> <span class="comment">// - C-C =&gt; INTR</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> <span class="comment">// - C-d =&gt; QUIT</span></div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> terminal.c_lflag &amp;= ~IEXTEN; <span class="comment">// 拡張入力処理を無効にする</span></div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> terminal.c_cflag |= CS8; <span class="comment">// バイトあたり8ビット</span></div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> </div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> terminal.c_cc[VMIN] = 0; <span class="comment">// 非canonical</span></div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> <span class="comment">// 読み取りのための最小文字数。</span></div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> terminal.c_cc[VTIME] = 0; <span class="comment">// 非canonical読み取りのためのデシ秒単位のタイムアウト。</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> </div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> tcsetattr(tty_fd_, TCSANOW, &amp;terminal);</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><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> </div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</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="l00623" name="l00623"></a><span class="lineno"> 623</span> std::cout &lt;&lt; Set(parameters);</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> on_exit_functions.emplace([=] { std::cout &lt;&lt; Reset(parameters); });</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> };</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> </div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</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="l00628" name="l00628"></a><span class="lineno"> 628</span> std::cout &lt;&lt; Reset(parameters);</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> on_exit_functions.emplace([=] { std::cout &lt;&lt; Set(parameters); });</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> </div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> <span class="keywordflow">if</span> (use_alternative_screen_) {</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> enable({</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> DECMode::kAlternateScreen,</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> });</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> </div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> disable({</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> <span class="comment">// DECMode::kCursor,</span></div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> DECMode::kLineWrap,</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> });</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> <span class="keywordflow">if</span> (track_mouse_) {</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> enable({DECMode::kMouseVt200});</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> enable({DECMode::kMouseAnyEvent});</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> enable({DECMode::kMouseUrxvtMode});</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> enable({DECMode::kMouseSgrExtMode});</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> </div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> <span class="comment">// 新しい設定をインストールした後、それが完全に適用されるようにターミナルにフラッシュします。</span></div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> Flush();</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> quit_ = <span class="keyword">false</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> PostAnimationTask();</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span>}</div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> </div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span><span class="keywordtype">void</span> ScreenInteractive::InstallPipedInputHandling() {</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span><span class="preprocessor">#if !defined(_WIN32) &amp;&amp; !defined(__EMSCRIPTEN__)</span></div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> tty_fd_ = STDIN_FILENO;</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> <span class="comment">// アプリケーションによって明示的に有効にされている場合、パイプ入力リダイレクトを処理します。</span></div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> <span class="comment">// これにより、アプリケーションはstdinからデータを読み取りながら、対話的に使用するためにターミナルからキーボード入力を引き続き受信できます。</span></div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> <span class="keywordflow">if</span> (!handle_piped_input_) {</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> <span class="keywordflow">return</span>;</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">// stdinがターミナルの場合、`/dev/tty`を開く必要はありません。</span></div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> <span class="keywordflow">if</span> (isatty(STDIN_FILENO)) {</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> <span class="keywordflow">return</span>;</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> </div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> <span class="comment">// キーボード入力のために`/dev/tty`を開きます。</span></div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> tty_fd_ = open(<span class="stringliteral">&quot;/dev/tty&quot;</span>, O_RDONLY);</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> <span class="keywordflow">if</span> (tty_fd_ &lt; 0) {</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> <span class="comment">// `/dev/tty`のオープンに失敗しました(コンテナ、ヘッドレスシステムなど)</span></div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> <span class="comment">// stdinにフォールバックします。 return;</span></div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> }</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> </div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> <span class="comment">// 終了時に`/dev/tty`ファイルディスクリプタを閉じます。</span></div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> on_exit_functions.emplace([<span class="keyword">this</span>] {</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> close(tty_fd_);</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> tty_fd_ = -1;</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> });</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span><span class="preprocessor">#endif</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> </div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span><span class="comment">// private</span></div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span><span class="keywordtype">void</span> ScreenInteractive::Uninstall() {</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> ExitNow();</div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> OnExit();</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span>}</div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> </div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span><span class="comment">// private</span></div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span><span class="comment">// NOLINTNEXTLINE</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</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="l00696" name="l00696"></a><span class="lineno"> 696</span> <span class="comment">// 最大で60FPSに設定します。</span></div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</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="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="keyword">auto</span> time = std::chrono::steady_clock::now();</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</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="l00701" name="l00701"></a><span class="lineno"> 701</span> </div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> <span class="comment">// 少なくとも1つのタスクが実行されるのを待ちます。</span></div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</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="l00704" name="l00704"></a><span class="lineno"> 704</span> !HasQuitted()) {</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> RunOnce(component);</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="keyword">const</span> <span class="keyword">auto</span> now = std::chrono::steady_clock::now();</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> <span class="keyword">const</span> <span class="keyword">auto</span> delta = now - time;</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> time = now;</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> </div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> <span class="keywordflow">if</span> (delta &lt; time_per_frame) {</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> <span class="keyword">const</span> <span class="keyword">auto</span> sleep_duration = time_per_frame - delta;</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> std::this_thread::sleep_for(sleep_duration);</div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> }</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> }</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span>}</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> </div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span><span class="comment">// private</span></div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</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="l00720" name="l00720"></a><span class="lineno"> 720</span> AutoReset set_component(&amp;component_, component);</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> ExecuteSignalHandlers();</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> FetchTerminalEvents();</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> </div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> <span class="comment">// キューから保留中のタスクを実行します。</span></div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</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="l00726" name="l00726"></a><span class="lineno"> 726</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="l00727" name="l00727"></a><span class="lineno"> 727</span> <span class="comment">// 実行されたタスクがない場合、画面を再描画せずに早期にリターンできます。</span></div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</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="l00729" name="l00729"></a><span class="lineno"> 729</span> <span class="keywordflow">return</span>;</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> </div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> ExecuteSignalHandlers();</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> Draw(component);</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> <span class="keywordflow">if</span> (selection_data_previous_ != selection_data_) {</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> selection_data_previous_ = selection_data_;</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <span class="keywordflow">if</span> (selection_on_change_) {</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> selection_on_change_();</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</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="l00740" name="l00740"></a><span class="lineno"> 740</span> }</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> }</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span>}</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">// private</span></div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span><span class="comment">// NOLINTNEXTLINE</span></div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</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="l00747" name="l00747"></a><span class="lineno"> 747</span> std::visit(</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> [&amp;](<span class="keyword">auto</span>&amp;&amp; arg) {</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> <span class="keyword">using </span>T = std::decay_t&lt;<span class="keyword">decltype</span>(arg)&gt;;</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> <span class="comment">// clang-format off</span></div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> <span class="comment">// イベントを処理します。</span></div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</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="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> (arg.is_cursor_position()) {</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> cursor_x_ = arg.cursor_x();</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> cursor_y_ = arg.cursor_y();</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> }</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> <span class="keywordflow">if</span> (arg.is_cursor_shape()) {</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> cursor_reset_shape_= arg.cursor_shape();</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> }</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> </div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> <span class="keywordflow">if</span> (arg.is_mouse()) {</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> arg.mouse().x -= cursor_x_;</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> arg.mouse().y -= cursor_y_;</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> }</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> arg.screen_ = <span class="keyword">this</span>;</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> </div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> <span class="keywordtype">bool</span> handled = component-&gt;OnEvent(arg);</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> handled = HandleSelection(handled, arg);</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> </div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</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="l00778" name="l00778"></a><span class="lineno"> 778</span> RecordSignal(SIGABRT);</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="preprocessor">#if !defined(_WIN32)</span></div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</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="l00783" name="l00783"></a><span class="lineno"> 783</span> RecordSignal(SIGTSTP);</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><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> </div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> frame_valid_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> <span class="keywordflow">return</span>;</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> <span class="comment">// コールバックを処理します</span></div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</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="l00793" name="l00793"></a><span class="lineno"> 793</span> arg();</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> }</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="comment">// アニメーションを処理します</span></div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</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="l00799" name="l00799"></a><span class="lineno"> 799</span> <span class="keywordflow">if</span> (!animation_requested_) {</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> }</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> </div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> animation_requested_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</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="l00805" name="l00805"></a><span class="lineno"> 805</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="l00806" name="l00806"></a><span class="lineno"> 806</span> previous_animation_time_ = now;</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> </div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> animation::Params params(delta);</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> component-&gt;OnAnimation(params);</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> frame_valid_ = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> }</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> },</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> task);</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> <span class="comment">// clang-format on</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> </div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span><span class="comment">// private</span></div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span><span class="keywordtype">bool</span> ScreenInteractive::HandleSelection(<span class="keywordtype">bool</span> handled, Event event) {</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> <span class="keywordflow">if</span> (handled) {</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> selection_pending_ = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> selection_data_.empty = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> selection_ = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> }</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> </div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> <span class="keywordflow">if</span> (!event.is_mouse()) {</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> }</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> </div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> <span class="keyword">auto</span>&amp; mouse = <span class="keyword">event</span>.mouse();</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</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="l00833" name="l00833"></a><span class="lineno"> 833</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> }</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> </div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</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="l00837" name="l00837"></a><span class="lineno"> 837</span> selection_pending_ = <a class="code hl_function" href="group__component.html#aad61519d291dcc216d2ac618618a45a2">CaptureMouse</a>();</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> selection_data_.start_x = mouse.x;</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> selection_data_.start_y = mouse.y;</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span> selection_data_.end_x = mouse.x;</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> selection_data_.end_y = mouse.y;</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> }</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> </div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> <span class="keywordflow">if</span> (!selection_pending_) {</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> }</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> </div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</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="l00850" name="l00850"></a><span class="lineno"> 850</span> <span class="keywordflow">if</span> ((mouse.x != selection_data_.end_x) ||</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> (mouse.y != selection_data_.end_y)) {</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> selection_data_.end_x = mouse.x;</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> selection_data_.end_y = mouse.y;</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> selection_data_.empty = <span class="keyword">false</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> </div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span> }</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> </div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</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="l00861" name="l00861"></a><span class="lineno"> 861</span> selection_pending_ = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> selection_data_.end_x = mouse.x;</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> selection_data_.end_y = mouse.y;</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> selection_data_.empty = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</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> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span>}</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> </div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span><span class="comment">// private</span></div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span><span class="comment">// NOLINTNEXTLINE</span></div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</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="l00874" name="l00874"></a><span class="lineno"> 874</span> <span class="keywordflow">if</span> (frame_valid_) {</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> <span class="keywordflow">return</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="keyword">auto</span> document = component-&gt;Render();</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</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="l00879" name="l00879"></a><span class="lineno"> 879</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="l00880" name="l00880"></a><span class="lineno"> 880</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="l00881" name="l00881"></a><span class="lineno"> 881</span> document-&gt;ComputeRequirement();</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> <span class="keywordflow">switch</span> (dimension_) {</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> <span class="keywordflow">case</span> Dimension::Fixed:</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</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="l00885" name="l00885"></a><span class="lineno"> 885</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="l00886" name="l00886"></a><span class="lineno"> 886</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> <span class="keywordflow">case</span> Dimension::TerminalOutput:</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> <a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a> = terminal.dimx;</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</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="l00890" name="l00890"></a><span class="lineno"> 890</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span> <span class="keywordflow">case</span> Dimension::Fullscreen:</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> <a class="code hl_function" href="group__screen.html#ae7a460c9dacd70ed81b1adfea46b492e">dimx</a> = terminal.dimx;</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span> <a class="code hl_function" href="group__screen.html#a0d283cfb1ec16b3fc13d344ebfea93d4">dimy</a> = terminal.dimy;</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> <span class="keywordflow">case</span> Dimension::FitComponent:</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</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="l00897" name="l00897"></a><span class="lineno"> 897</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="l00898" name="l00898"></a><span class="lineno"> 898</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno"> 899</span> }</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno"> 900</span> </div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno"> 901</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="l00902" name="l00902"></a><span class="lineno"> 902</span> ResetCursorPosition();</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"> 903</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="l00904" name="l00904"></a><span class="lineno"> 904</span> </div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"> 905</span> <span class="comment">// ターミナルの幅が減少すると、ターミナルエミュレータは行を折り返し始め、ディスプレイを汚します。完全にクリアする必要があります。</span></div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno"> 906</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="l00907" name="l00907"></a><span class="lineno"> 907</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="l00908" name="l00908"></a><span class="lineno"> 908</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="l00909" name="l00909"></a><span class="lineno"> 909</span> }</div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno"> 910</span> </div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"> 911</span> <span class="comment">// 必要に応じて画面のサイズを変更します。</span></div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"> 912</span> <span class="keywordflow">if</span> (resized) {</div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno"> 913</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="l00914" name="l00914"></a><span class="lineno"> 914</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="l00915" name="l00915"></a><span class="lineno"> 915</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="l00916" name="l00916"></a><span class="lineno"> 916</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="l00917" name="l00917"></a><span class="lineno"> 917</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="l00918" name="l00918"></a><span class="lineno"> 918</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> <span class="comment">// ターミナルエミュレータに、画面に対するフレームの位置を定期的に要求します。これは、画面座標で報告されたマウス位置をフレーム座標に変換するのに役立ちます。</span></div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno"> 921</span><span class="preprocessor">#if defined(FTXUI_MICROSOFT_TERMINAL_FALLBACK)</span></div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno"> 922</span> <span class="comment">// Microsoftのターミナルには[バグ]があります。カーソル位置を報告する際、複数の出力シーケンスが混在してゴミになります。</span></div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno"> 923</span> <span class="comment">// これにより、FTXUIユーザーはInputコンポーネントに「1;1;R」シーケンスが表示されることになります。詳細は[issue]を参照してください。解決策は、カーソル位置の要求頻度を減らすことです。[bug]: https://github.com/microsoft/terminal/pull/7583 [issue]:</span></div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"> 924</span> <span class="comment">// https://github.com/ArthurSonzogni/FTXUI/issues/136</span></div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno"> 925</span> <span class="keyword">static</span> <span class="keywordtype">int</span> i = -3;</div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"> 926</span> ++i;</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno"> 927</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="l00928" name="l00928"></a><span class="lineno"> 928</span> std::cout &lt;&lt; DeviceStatusReport(DSRMode::kCursor);</div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno"> 929</span> }</div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"> 930</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno"> 931</span> <span class="keyword">static</span> <span class="keywordtype">int</span> i = -3;</div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"> 932</span> ++i;</div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"> 933</span> <span class="keywordflow">if</span> (!use_alternative_screen_ &amp;&amp;</div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno"> 934</span> (previous_frame_resized_ || i % 40 == 0)) { <span class="comment">// NOLINT</span></div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno"> 935</span> std::cout &lt;&lt; DeviceStatusReport(DSRMode::kCursor);</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"> 936</span> }</div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno"> 937</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"> 938</span> previous_frame_resized_ = resized;</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> selection_ = selection_data_.empty</div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno"> 941</span> ? std::make_unique&lt;Selection&gt;()</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno"> 942</span> : std::make_unique&lt;Selection&gt;(</div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno"> 943</span> selection_data_.start_x, selection_data_.start_y, <span class="comment">//</span></div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"> 944</span> selection_data_.end_x, selection_data_.end_y);</div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno"> 945</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="l00946" name="l00946"></a><span class="lineno"> 946</span> </div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno"> 947</span> <span class="comment">// CJK文字を挿入するツールを使用しているユーザーのためにカーソル位置を設定します。</span></div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno"> 948</span> {</div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno"> 949</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="l00950" name="l00950"></a><span class="lineno"> 950</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="l00951" name="l00951"></a><span class="lineno"> 951</span> </div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"> 952</span> set_cursor_position.clear();</div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"> 953</span> reset_cursor_position.clear();</div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno"> 954</span> </div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno"> 955</span> <span class="keywordflow">if</span> (dy != 0) {</div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno"> 956</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="l00957" name="l00957"></a><span class="lineno"> 957</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="l00958" name="l00958"></a><span class="lineno"> 958</span> }</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno"> 959</span> </div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno"> 960</span> <span class="keywordflow">if</span> (dx != 0) {</div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno"> 961</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="l00962" name="l00962"></a><span class="lineno"> 962</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="l00963" name="l00963"></a><span class="lineno"> 963</span> }</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno"> 964</span> </div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno"> 965</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="l00966" name="l00966"></a><span class="lineno"> 966</span> set_cursor_position += <span class="stringliteral">&quot;\033[?25l&quot;</span>;</div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno"> 967</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno"> 968</span> set_cursor_position += <span class="stringliteral">&quot;\033[?25h&quot;</span>;</div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno"> 969</span> set_cursor_position +=</div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno"> 970</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="l00971" name="l00971"></a><span class="lineno"> 971</span> }</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> </div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno"> 974</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="l00975" name="l00975"></a><span class="lineno"> 975</span> Flush();</div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno"> 976</span> <a class="code hl_function" href="group__screen.html#aa71d36872f416feaa853788a7a7a7ef8">Clear</a>();</div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"> 977</span> frame_valid_ = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno"> 978</span> frame_count_++;</div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"> 979</span>}</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="comment">// private</span></div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno"> 982</span><span class="keywordtype">void</span> ScreenInteractive::ResetCursorPosition() {</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno"> 983</span> std::cout &lt;&lt; reset_cursor_position;</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno"> 984</span> reset_cursor_position = <span class="stringliteral">&quot;&quot;</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="comment"></span> </div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"> 987</span><span class="comment">/// @brief メインループを終了する関数を返します。</span></div>
<div class="foldopen" id="foldopen00988" data-start="{" data-end="}">
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"><a class="line" href="group__component.html#ae295157a88e6300609df83769ed885f2"> 988</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="l00989" name="l00989"></a><span class="lineno"> 989</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="l00990" name="l00990"></a><span class="lineno"> 990</span>}</div>
</div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno"> 991</span><span class="comment"></span> </div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno"> 992</span><span class="comment">/// @brief メインループを終了します。</span></div>
<div class="foldopen" id="foldopen00993" data-start="{" data-end="}">
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno"><a class="line" href="group__component.html#a1a6a7739e9cc01ba888b57d1f9457f4c"> 993</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="l00994" name="l00994"></a><span class="lineno"> 994</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="l00995" name="l00995"></a><span class="lineno"> 995</span>}</div>
</div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno"> 996</span> </div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno"> 997</span><span class="comment">// private:</span></div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno"> 998</span><span class="keywordtype">void</span> ScreenInteractive::ExitNow() {</div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno"> 999</span> quit_ = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span>}</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span> </div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span><span class="comment">// private:</span></div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span><span class="keywordtype">void</span> ScreenInteractive::Signal(<span class="keywordtype">int</span> signal) {</div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span> <span class="keywordflow">if</span> (signal == SIGABRT) {</div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span> <a class="code hl_function" href="group__component.html#a1a6a7739e9cc01ba888b57d1f9457f4c">Exit</a>();</div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span> }</div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span> </div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span><span class="comment">// Windows は SIGTSTP / SIGWINCH をサポートしていません</span></div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span><span class="preprocessor">#if !defined(_WIN32)</span></div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span> <span class="keywordflow">if</span> (signal == SIGTSTP) {</div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">Post</a>([&amp;] {</div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span> ResetCursorPosition();</div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</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="l01015" name="l01015"></a><span class="lineno"> 1015</span> Uninstall();</div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span> <a class="code hl_variable" href="group__screen.html#a1b254c3faacd432c325efff4268ca683">dimx_</a> = 0;</div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span> <a class="code hl_variable" href="group__screen.html#a9e9d5df4b41aaa5eca27cdcaca6d4574">dimy_</a> = 0;</div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span> Flush();</div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span> std::ignore = std::raise(SIGTSTP);</div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span> Install();</div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span> });</div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span> }</div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span> </div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span> <span class="keywordflow">if</span> (signal == SIGWINCH) {</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</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="l01027" name="l01027"></a><span class="lineno"> 1027</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> }</div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span>}</div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span> </div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span><span class="keywordtype">void</span> ScreenInteractive::FetchTerminalEvents() {</div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span><span class="preprocessor">#if defined(_WIN32)</span></div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span> <span class="keyword">auto</span> get_input_records = [&amp;]() -&gt; std::vector&lt;INPUT_RECORD&gt; {</div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span> <span class="comment">// コンソールに入力があるか確認します。</span></div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span> <span class="keyword">auto</span> console = GetStdHandle(STD_INPUT_HANDLE);</div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span> DWORD number_of_events = 0;</div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span> <span class="keywordflow">if</span> (!GetNumberOfConsoleInputEvents(console, &amp;number_of_events)) {</div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span> <span class="keywordflow">return</span> std::vector&lt;INPUT_RECORD&gt;();</div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span> }</div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span> <span class="keywordflow">if</span> (number_of_events &lt;= 0) {</div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span> <span class="comment">// 入力がないため、戻ります。</span></div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span> <span class="keywordflow">return</span> std::vector&lt;INPUT_RECORD&gt;();</div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> }</div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span> <span class="comment">// 入力イベントを読み取ります。</span></div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span> std::vector&lt;INPUT_RECORD&gt; records(number_of_events);</div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span> DWORD number_of_events_read = 0;</div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span> <span class="keywordflow">if</span> (!ReadConsoleInput(console, records.data(), (DWORD)records.size(),</div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span> &amp;number_of_events_read)) {</div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span> <span class="keywordflow">return</span> std::vector&lt;INPUT_RECORD&gt;();</div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span> }</div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span> records.resize(number_of_events_read);</div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span> <span class="keywordflow">return</span> records;</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> </div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span> <span class="keyword">auto</span> records = get_input_records();</div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span> <span class="keywordflow">if</span> (records.size() == 0) {</div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span> <span class="keyword">const</span> <span class="keyword">auto</span> timeout =</div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span> std::chrono::steady_clock::now() - internal_-&gt;last_char_time;</div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> timeout_microseconds =</div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span> std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(timeout).count();</div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</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="l01063" name="l01063"></a><span class="lineno"> 1063</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> }</div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span> internal_-&gt;last_char_time = std::chrono::steady_clock::now();</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="comment">// 入力イベントをFTXUIイベントに変換します。</span></div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span> <span class="comment">// 各イベントに対して、ターミナル入力パーサーを呼び出してEventに変換します。</span></div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</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="l01070" name="l01070"></a><span class="lineno"> 1070</span> <span class="keywordflow">switch</span> (r.EventType) {</div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span> <span class="keywordflow">case</span> KEY_EVENT: {</div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span> <span class="keyword">auto</span> key_event = r.Event.KeyEvent;</div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> <span class="comment">// UPキーイベントを無視します</span></div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> <span class="keywordflow">if</span> (key_event.bKeyDown == FALSE) {</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> }</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> std::wstring wstring;</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> wstring += key_event.uChar.UnicodeChar;</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</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="l01080" name="l01080"></a><span class="lineno"> 1080</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="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="keywordflow">break</span>;</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> <span class="keywordflow">case</span> WINDOW_BUFFER_SIZE_EVENT:</div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</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="l01085" name="l01085"></a><span class="lineno"> 1085</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> <span class="keywordflow">case</span> MENU_EVENT:</div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> <span class="keywordflow">case</span> FOCUS_EVENT:</div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> <span class="keywordflow">case</span> MOUSE_EVENT:</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> <span class="comment">// TODO(mauve): 後で実装します。</span></div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> }</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="preprocessor">#elif defined(__EMSCRIPTEN__)</span></div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> <span class="comment">// ターミナルから文字を読み取ります。</span></div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> <span class="comment">// 非ブロッキングになるように設定しました。</span></div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> std::array&lt;char, 128&gt; out{};</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> <span class="keywordtype">size_t</span> l = read(STDIN_FILENO, out.data(), out.size());</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> <span class="keywordflow">if</span> (l == 0) {</div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> <span class="keyword">const</span> <span class="keyword">auto</span> timeout =</div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> std::chrono::steady_clock::now() - internal_-&gt;last_char_time;</div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> timeout_microseconds =</div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(timeout).count();</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</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="l01104" name="l01104"></a><span class="lineno"> 1104</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> }</div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> <span class="comment">// 文字をイベントに変換します。</span></div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; l; ++i) {</div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</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="l01109" name="l01109"></a><span class="lineno"> 1109</span> }</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span><span class="preprocessor">#else </span><span class="comment">// POSIX (Linux &amp; Mac)</span></div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span> <span class="keywordflow">if</span> (!CheckStdinReady(tty_fd_)) {</div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span> <span class="keyword">const</span> <span class="keyword">auto</span> timeout =</div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span> std::chrono::steady_clock::now() - internal_-&gt;last_char_time;</div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> timeout_ms =</div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span> std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(timeout).count();</div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</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="l01117" name="l01117"></a><span class="lineno"> 1117</span> <span class="keywordflow">return</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> internal_-&gt;last_char_time = std::chrono::steady_clock::now();</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span> </div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span> <span class="comment">// ターミナルから文字を読み取ります。</span></div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span> std::array&lt;char, 128&gt; out{};</div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> <span class="keywordtype">size_t</span> l = read(tty_fd_, out.data(), out.size());</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> </div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span> <span class="comment">// 文字をイベントに変換します。</span></div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; l; ++i) {</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</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="l01128" name="l01128"></a><span class="lineno"> 1128</span> }</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span>}</div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span> </div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span><span class="keywordtype">void</span> ScreenInteractive::PostAnimationTask() {</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> <a class="code hl_function" href="group__component.html#a49209b09dcf8bc540f79e2bfd0a7ee88">Post</a>(AnimationTask());</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">// アニメーションタスクを15msごとに繰り返します。これは約66fpsのフレームレートに相当します。</span></div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</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="l01137" name="l01137"></a><span class="lineno"> 1137</span> std::chrono::milliseconds(15));</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> </div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span><span class="keywordtype">bool</span> ScreenInteractive::SelectionData::operator==(</div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> <span class="keyword">const</span> ScreenInteractive::SelectionData&amp; other)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span> <span class="keywordflow">if</span> (empty &amp;&amp; other.empty) {</div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> }</div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span> <span class="keywordflow">if</span> (empty || other.empty) {</div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> <span class="keywordflow">return</span> <span class="keyword">false</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> <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="l01149" name="l01149"></a><span class="lineno"> 1149</span> end_x == other.end_x &amp;&amp; end_y == other.end_y;</div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span>}</div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> </div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span><span class="keywordtype">bool</span> ScreenInteractive::SelectionData::operator!=(</div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span> <span class="keyword">const</span> ScreenInteractive::SelectionData&amp; other)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == other);</div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span>}</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> </div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</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>Definition</b> <a href="screen__interactive_8hpp_source.html#l00180">screen_interactive.hpp:180</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>Definition</b> <a href="terminal__input__parser_8cpp_source.html#l00106">terminal_input_parser.cpp:106</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>Definition</b> <a href="terminal__input__parser_8cpp_source.html#l00094">terminal_input_parser.cpp:94</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>Definition</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>Definition</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>Definition</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>Definition</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>Definition</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>Definition</b> <a href="mouse_8hpp_source.html#l00013">mouse.hpp:13</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>Definition</b> <a href="mouse_8hpp_source.html#l00025">mouse.hpp:25</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>Definition</b> <a href="mouse_8hpp_source.html#l00026">mouse.hpp:26</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>Definition</b> <a href="mouse_8hpp_source.html#l00024">mouse.hpp:24</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="ttdoc">ターミナル出力の幅に一致し、描画されるコンポーネントの高さに一致するScreenInteractiveを作成します。</div><div class="ttdef"><b>Definition</b> <a href="#l00325">screen_interactive.cpp:325</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>Definition</b> <a href="#l00373">screen_interactive.cpp:373</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>Definition</b> <a href="#l00993">screen_interactive.cpp:993</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>Definition</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>Definition</b> <a href="#l00283">screen_interactive.cpp:283</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>Definition</b> <a href="#l00387">screen_interactive.cpp:387</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>Definition</b> <a href="#l00379">screen_interactive.cpp:379</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>Definition</b> <a href="#l00339">screen_interactive.cpp:339</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>Definition</b> <a href="#l00295">screen_interactive.cpp:295</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>Definition</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="ttdoc">ターミナルサイズの全体を使用するScreenInteractiveを作成します。プライマリスクリーンバッファが使用されます。これは、ターミナルがリサイズされた場合、以前のコンテンツがターミナルコンテンツ...</div><div class="ttdef"><b>Definition</b> <a href="#l00301">screen_interactive.cpp:301</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>Definition</b> <a href="screen__interactive_8hpp_source.html#l00173">screen_interactive.hpp:173</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>Definition</b> <a href="#l00512">screen_interactive.cpp:512</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>Definition</b> <a href="#l00406">screen_interactive.cpp:406</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>Definition</b> <a href="#l00499">screen_interactive.cpp:499</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="ttdoc">ターミナルサイズの全体を使用するScreenInteractiveを作成します。これは、ターミナルコンテンツを乱すことを避けるために、代替スクリーンバッファを使用します。</div><div class="ttdef"><b>Definition</b> <a href="#l00313">screen_interactive.cpp:313</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>Definition</b> <a href="#l00363">screen_interactive.cpp:363</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>Definition</b> <a href="#l00506">screen_interactive.cpp:506</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>Definition</b> <a href="#l00392">screen_interactive.cpp:392</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>Definition</b> <a href="#l00988">screen_interactive.cpp:988</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">コンポーネントがEvent::CtrlCをキャッチした場合でも、FTXUIにCtrl-Cを処理させるか処理させないかを強制します。</div><div class="ttdef"><b>Definition</b> <a href="#l00489">screen_interactive.cpp:489</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">コンポーネントがEvent::CtrlZをキャッチした場合でも、FTXUIにCtrl-Zを処理させるか処理させないかを強制します。</div><div class="ttdef"><b>Definition</b> <a href="#l00494">screen_interactive.cpp:494</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>Definition</b> <a href="#l00480">screen_interactive.cpp:480</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>Definition</b> <a href="event_8cpp_source.html#l00073">event.cpp:73</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>Definition</b> <a href="loop_8hpp_source.html#l00053">loop.hpp:53</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>Definition</b> <a href="screen__interactive_8hpp_source.html#l00034">screen_interactive.hpp:34</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>Definition</b> <a href="#l00076">screen_interactive.cpp:76</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>Definition</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>Definition</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>Definition</b> <a href="image_8hpp_source.html#l00036">image.hpp:36</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>Definition</b> <a href="screen_8cpp_source.html#l00410">screen.cpp:410</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>Definition</b> <a href="image_8hpp_source.html#l00044">image.hpp:44</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>Definition</b> <a href="screen_8cpp_source.html#l00468">screen.cpp:468</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>Definition</b> <a href="screen_8hpp_source.html#l00076">screen.hpp:76</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>Definition</b> <a href="image_8hpp_source.html#l00045">image.hpp:45</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>Definition</b> <a href="screen_8cpp_source.html#l00487">screen.cpp:487</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>Definition</b> <a href="image_8hpp_source.html#l00035">image.hpp:35</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>Definition</b> <a href="image_8hpp_source.html#l00046">image.hpp:46</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>Definition</b> <a href="terminal_8cpp_source.html#l00087">terminal.cpp:87</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>Definition</b> <a href="terminal_8cpp_source.html#l00114">terminal.cpp:114</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>Definition</b> <a href="animation_8hpp_source.html#l00024">animation.hpp:24</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>Definition</b> <a href="animation_8hpp_source.html#l00023">animation.hpp:23</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>Definition</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">FTXUI ftxui:: 名前空間</div><div class="ttdef"><b>Definition</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>Definition</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>
<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">子要素を兄弟要素の中でフォーカスされたものとして設定します。</div><div class="ttdef"><b>Definition</b> <a href="frame_8cpp_source.html#l00108">frame.cpp:108</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>Definition</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>Definition</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>Definition</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>Definition</b> <a href="screen_8hpp_source.html#l00050">screen.hpp:50</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>Definition</b> <a href="screen_8hpp_source.html#l00049">screen.hpp:49</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>Definition</b> <a href="screen_8hpp_source.html#l00061">screen.hpp:61</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": "index.html", "zh-CH": "../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 = "ja";
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>