|
|
|
|
@ -0,0 +1,499 @@
|
|
|
|
|
<!DOCTYPE html> |
|
|
|
|
<html class="writer-html5" lang="en" > |
|
|
|
|
<head> |
|
|
|
|
<meta charset="utf-8" /> |
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
|
|
|
|
<title>TermTk.TTkCore.drivers.windows — pyTermTk 0.36.0-a |
|
|
|
|
documentation</title> |
|
|
|
|
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" /> |
|
|
|
|
<link rel="stylesheet" href="../../../../_static/css/theme.css" type="text/css" /> |
|
|
|
|
<link rel="stylesheet" href="../../../../_static/theme_overrides.css" type="text/css" /> |
|
|
|
|
<link rel="stylesheet" href="../../../../_static/ttk.css" type="text/css" /> |
|
|
|
|
<link rel="shortcut icon" href="https://ceccopierangiolieugenio.github.io/pyTermTk/sandbox/www/favicon.ico"/> |
|
|
|
|
<!--[if lt IE 9]> |
|
|
|
|
<script src="../../../../_static/js/html5shiv.min.js"></script> |
|
|
|
|
<![endif]--> |
|
|
|
|
|
|
|
|
|
<script data-url_root="../../../../" id="documentation_options" src="../../../../_static/documentation_options.js"></script> |
|
|
|
|
<script src="../../../../_static/jquery.js"></script> |
|
|
|
|
<script src="../../../../_static/underscore.js"></script> |
|
|
|
|
<script src="../../../../_static/_sphinx_javascript_frameworks_compat.js"></script> |
|
|
|
|
<script src="../../../../_static/doctools.js"></script> |
|
|
|
|
<script src="../../../../_static/js/theme.js"></script> |
|
|
|
|
<link rel="index" title="Index" href="../../../../genindex.html" /> |
|
|
|
|
<link rel="search" title="Search" href="../../../../search.html" /> |
|
|
|
|
</head> |
|
|
|
|
|
|
|
|
|
<body class="wy-body-for-nav"> |
|
|
|
|
<div class="wy-grid-for-nav"> |
|
|
|
|
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> |
|
|
|
|
<div class="wy-side-scroll"> |
|
|
|
|
<div class="wy-side-nav-search" > |
|
|
|
|
<a href="../../../../index.html" class="icon icon-home"> pyTermTk |
|
|
|
|
</a> |
|
|
|
|
<div role="search"> |
|
|
|
|
<form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get"> |
|
|
|
|
<input type="text" name="q" placeholder="Search docs" /> |
|
|
|
|
<input type="hidden" name="check_keywords" value="yes" /> |
|
|
|
|
<input type="hidden" name="area" value="default" /> |
|
|
|
|
</form> |
|
|
|
|
</div> |
|
|
|
|
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
|
|
|
|
<p class="caption" role="heading"><span class="caption-text">Tutorials</span></p> |
|
|
|
|
<ul> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../tutorial/000-examples.html">pyTermTk - < <strong>the Examples</strong> ></a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../tutorial/001-helloworld.html">pyTermTk - Hello World</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../tutorial/002-layout.html">pyTermTk - Layouts</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../tutorial/003-signalslots.html">pyTermTk - Signal & Slots</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../tutorial/004-logging.html">pyTermTk - Logging</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../tutorial/005-calculator.html">pyTermTk - Your first Calculator</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../tutorial/ttkDesigner/textEdit/README.html">ttkDesigner - Your first TextEditor</a></li> |
|
|
|
|
</ul> |
|
|
|
|
<p class="caption" role="heading"><span class="caption-text">Stuff</span></p> |
|
|
|
|
<ul> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../info/features/index.html">Features</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../info/installing.html">Installation</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../info/installing.html#quickstart">Quickstart</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../info/debug.html">Debug</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../info/features/crosscompatible.html">Cross Compatibility</a></li> |
|
|
|
|
</ul> |
|
|
|
|
<p class="caption" role="heading"><span class="caption-text">API Reference</span></p> |
|
|
|
|
<ul> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkAbstract.html">TermTk.TTkAbstract</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkCore.html">TermTk.TTkCore</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkCore.TTkTerm.html">TermTk.TTkCore.TTkTerm</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkGui.html">TermTk.TTkGui</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkLayouts.html">TermTk.TTkLayouts</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkTemplates.html">TermTk.TTkTemplates</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkTestWidgets.html">TermTk.TTkTestWidgets</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkTheme.html">TermTk.TTkTheme</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkTypes.html">TermTk.TTkTypes</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkUiTools.html">TermTk.TTkUiTools</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkWidgets.html">TermTk.TTkWidgets</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkWidgets.TTkModelView.html">TermTk.TTkWidgets.TTkModelView</a></li> |
|
|
|
|
<li class="toctree-l1"><a class="reference internal" href="../../../../autogen.TermTk/TermTk.TTkWidgets.TTkPickers.html">TermTk.TTkWidgets.TTkPickers</a></li> |
|
|
|
|
</ul> |
|
|
|
|
|
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</nav> |
|
|
|
|
|
|
|
|
|
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" > |
|
|
|
|
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
|
|
|
|
<a href="../../../../index.html">pyTermTk</a> |
|
|
|
|
</nav> |
|
|
|
|
|
|
|
|
|
<div class="wy-nav-content"> |
|
|
|
|
<div class="rst-content"> |
|
|
|
|
<div role="navigation" aria-label="Page navigation"> |
|
|
|
|
<ul class="wy-breadcrumbs"> |
|
|
|
|
<li><a href="../../../../index.html" class="icon icon-home"></a> »</li> |
|
|
|
|
<li><a href="../../../index.html">Module code</a> »</li> |
|
|
|
|
<li>TermTk.TTkCore.drivers.windows</li> |
|
|
|
|
<li class="wy-breadcrumbs-aside"> |
|
|
|
|
</li> |
|
|
|
|
</ul> |
|
|
|
|
<hr/> |
|
|
|
|
</div> |
|
|
|
|
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
|
|
|
|
<div itemprop="articleBody"> |
|
|
|
|
|
|
|
|
|
<h1>Source code for TermTk.TTkCore.drivers.windows</h1><div class="highlight"><pre> |
|
|
|
|
<span></span><span class="c1"># MIT License</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># Copyright (c) 2023 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com></span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># Permission is hereby granted, free of charge, to any person obtaining a copy</span> |
|
|
|
|
<span class="c1"># of this software and associated documentation files (the "Software"), to deal</span> |
|
|
|
|
<span class="c1"># in the Software without restriction, including without limitation the rights</span> |
|
|
|
|
<span class="c1"># to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span> |
|
|
|
|
<span class="c1"># copies of the Software, and to permit persons to whom the Software is</span> |
|
|
|
|
<span class="c1"># furnished to do so, subject to the following conditions:</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># The above copyright notice and this permission notice shall be included in all</span> |
|
|
|
|
<span class="c1"># copies or substantial portions of the Software.</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span> |
|
|
|
|
<span class="c1"># IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span> |
|
|
|
|
<span class="c1"># FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span> |
|
|
|
|
<span class="c1"># AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span> |
|
|
|
|
<span class="c1"># LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span> |
|
|
|
|
<span class="c1"># OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</span> |
|
|
|
|
<span class="c1"># SOFTWARE.</span> |
|
|
|
|
|
|
|
|
|
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'TTkSignalDriver'</span><span class="p">,</span><span class="s1">'TTkInputDriver'</span><span class="p">]</span> |
|
|
|
|
|
|
|
|
|
<span class="kn">import</span> <span class="nn">signal</span> |
|
|
|
|
|
|
|
|
|
<span class="kn">from</span> <span class="nn">ctypes</span> <span class="kn">import</span> <span class="n">Structure</span><span class="p">,</span> <span class="n">Union</span><span class="p">,</span> <span class="n">byref</span><span class="p">,</span> <span class="n">wintypes</span><span class="p">,</span> <span class="n">windll</span> |
|
|
|
|
|
|
|
|
|
<span class="kn">from</span> <span class="nn">TermTk.TTkCore.signal</span> <span class="kn">import</span> <span class="n">pyTTkSignal</span><span class="p">,</span> <span class="n">pyTTkSlot</span> |
|
|
|
|
|
|
|
|
|
<span class="kn">from</span> <span class="nn">TermTk.TTkCore.log</span> <span class="kn">import</span> <span class="n">TTkLog</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># Based on the example ported from:</span> |
|
|
|
|
<span class="c1"># https://learn.microsoft.com/en-us/windows/console/reading-input-buffer-events</span> |
|
|
|
|
<span class="c1"># https://github.com/ceccopierangiolieugenio/pyTermTk -> tests/test.input.win.01.py</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># https://learn.microsoft.com/en-us/windows/console/getstdhandle</span> |
|
|
|
|
<span class="n">STD_INPUT_HANDLE</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">)</span> <span class="c1"># The standard input device. Initially, this is the console input buffer, CONIN$.</span> |
|
|
|
|
<span class="n">STD_OUTPUT_HANDLE</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="o">-</span><span class="mi">11</span><span class="p">)</span> <span class="c1"># The standard output device. Initially, this is the active console screen buffer, CONOUT$.</span> |
|
|
|
|
<span class="n">STD_ERROR_HANDLE</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="o">-</span><span class="mi">12</span><span class="p">)</span> <span class="c1"># The standard error device. Initially, this is the active console screen buffer, CONOUT$.</span> |
|
|
|
|
|
|
|
|
|
<span class="n">INVALID_HANDLE_VALUE</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="c1"># WinBase.h</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># https://learn.microsoft.com/en-us/windows/console/SetConsoleMode</span> |
|
|
|
|
<span class="n">ENABLE_ECHO_INPUT</span> <span class="o">=</span> <span class="mh">0x0004</span> <span class="c1"># Characters read by the ReadFile or ReadConsole function are written to the active screen buffer as they are typed into the console. This mode can be used only if the ENABLE_LINE_INPUT mode is also enabled.</span> |
|
|
|
|
<span class="n">ENABLE_INSERT_MODE</span> <span class="o">=</span> <span class="mh">0x0020</span> <span class="c1"># When enabled, text entered in a console window will be inserted at the current cursor location and all text following that location will not be overwritten. When disabled, all following text will be overwritten.</span> |
|
|
|
|
<span class="n">ENABLE_LINE_INPUT</span> <span class="o">=</span> <span class="mh">0x0002</span> <span class="c1"># The ReadFile or ReadConsole function returns only when a carriage return character is read. If this mode is disabled, the functions return when one or more characters are available.</span> |
|
|
|
|
<span class="n">ENABLE_MOUSE_INPUT</span> <span class="o">=</span> <span class="mh">0x0010</span> <span class="c1"># If the mouse pointer is within the borders of the console window and the window has the keyboard focus, mouse events generated by mouse movement and button presses are placed in the input buffer. These events are discarded by ReadFile or ReadConsole, even when this mode is enabled. The ReadConsoleInput function can be used to read MOUSE_EVENT input records from the input buffer.</span> |
|
|
|
|
<span class="n">ENABLE_PROCESSED_INPUT</span> <span class="o">=</span> <span class="mh">0x0001</span> <span class="c1"># CTRL+C is processed by the system and is not placed in the input buffer. If the input buffer is being read by ReadFile or ReadConsole, other control keys are processed by the system and are not returned in the ReadFile or ReadConsole buffer. If the ENABLE_LINE_INPUT mode is also enabled, backspace, carriage return, and line feed characters are handled by the system.</span> |
|
|
|
|
<span class="n">ENABLE_QUICK_EDIT_MODE</span> <span class="o">=</span> <span class="mh">0x0040</span> <span class="c1"># This flag enables the user to use the mouse to select and edit text. To enable this mode, use ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS. To disable this mode, use ENABLE_EXTENDED_FLAGS without this flag.</span> |
|
|
|
|
<span class="n">ENABLE_WINDOW_INPUT</span> <span class="o">=</span> <span class="mh">0x0008</span> <span class="c1"># User interactions that change the size of the console screen buffer are reported in the console's input buffer. Information about these events can be read from the input buffer by applications using the ReadConsoleInput function, but not by those using ReadFile or ReadConsole.</span> |
|
|
|
|
<span class="n">ENABLE_VIRTUAL_TERMINAL_INPUT</span> <span class="o">=</span> <span class="mh">0x0200</span> <span class="c1"># Setting this flag directs the Virtual Terminal processing engine to convert user input received by the console window into Console Virtual Terminal Sequences that can be retrieved by a supporting application through ReadFile or ReadConsole functions.</span> |
|
|
|
|
|
|
|
|
|
<span class="n">ENABLE_PROCESSED_OUTPUT</span> <span class="o">=</span> <span class="mh">0x0001</span> |
|
|
|
|
<span class="n">ENABLE_WRAP_AT_EOL_OUTPUT</span> <span class="o">=</span> <span class="mh">0x0002</span> |
|
|
|
|
<span class="n">ENABLE_VIRTUAL_TERMINAL_PROCESSING</span> <span class="o">=</span> <span class="mh">0x0004</span> |
|
|
|
|
<span class="n">DISABLE_NEWLINE_AUTO_RETURN</span> <span class="o">=</span> <span class="mh">0x0008</span> |
|
|
|
|
<span class="n">ENABLE_LVB_GRID_WORLDWIDE</span> <span class="o">=</span> <span class="mh">0x0010</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># https://learn.microsoft.com/en-us/windows/console/input-record-str</span> |
|
|
|
|
<span class="n">FOCUS_EVENT</span> <span class="o">=</span> <span class="mh">0x0010</span> <span class="c1"># The Event member contains a FOCUS_EVENT_RECORD structure. These events are used internally and should be ignored.</span> |
|
|
|
|
<span class="n">KEY_EVENT</span> <span class="o">=</span> <span class="mh">0x0001</span> <span class="c1"># The Event member contains a KEY_EVENT_RECORD structure with information about a keyboard event.</span> |
|
|
|
|
<span class="n">MENU_EVENT</span> <span class="o">=</span> <span class="mh">0x0008</span> <span class="c1"># The Event member contains a MENU_EVENT_RECORD structure. These events are used internally and should be ignored.</span> |
|
|
|
|
<span class="n">MOUSE_EVENT</span> <span class="o">=</span> <span class="mh">0x0002</span> <span class="c1"># The Event member contains a MOUSE_EVENT_RECORD structure with information about a mouse movement or button press event.</span> |
|
|
|
|
<span class="n">WINDOW_BUFFER_SIZE_EVENT</span> <span class="o">=</span> <span class="mh">0x0004</span> <span class="c1"># The Event member contains a WINDOW_BUFFER_SIZE_RECORD structure with information about the new size of the console screen buffer.</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># https://learn.microsoft.com/en-us/windows/console/mouse-event-record-str</span> |
|
|
|
|
<span class="c1"># dwButtonState</span> |
|
|
|
|
<span class="n">FROM_LEFT_1ST_BUTTON_PRESSED</span> <span class="o">=</span> <span class="mh">0x0001</span> <span class="c1"># The leftmost mouse button.</span> |
|
|
|
|
<span class="n">FROM_LEFT_2ND_BUTTON_PRESSED</span> <span class="o">=</span> <span class="mh">0x0004</span> <span class="c1"># The second button fom the left.</span> |
|
|
|
|
<span class="n">FROM_LEFT_3RD_BUTTON_PRESSED</span> <span class="o">=</span> <span class="mh">0x0008</span> <span class="c1"># The third button from the left.</span> |
|
|
|
|
<span class="n">FROM_LEFT_4TH_BUTTON_PRESSED</span> <span class="o">=</span> <span class="mh">0x0010</span> <span class="c1"># The fourth button from the left.</span> |
|
|
|
|
<span class="n">RIGHTMOST_BUTTON_PRESSED</span> <span class="o">=</span> <span class="mh">0x0002</span> <span class="c1"># The rightmost mouse button.</span> |
|
|
|
|
<span class="c1"># dwControlKeyState</span> |
|
|
|
|
<span class="n">CAPSLOCK_ON</span> <span class="o">=</span> <span class="mh">0x0080</span> <span class="c1"># The CAPS LOCK light is on.</span> |
|
|
|
|
<span class="n">ENHANCED_KEY</span> <span class="o">=</span> <span class="mh">0x0100</span> <span class="c1"># The key is enhanced. See remarks.</span> |
|
|
|
|
<span class="n">LEFT_ALT_PRESSED</span> <span class="o">=</span> <span class="mh">0x0002</span> <span class="c1"># The left ALT key is pressed.</span> |
|
|
|
|
<span class="n">LEFT_CTRL_PRESSED</span> <span class="o">=</span> <span class="mh">0x0008</span> <span class="c1"># The left CTRL key is pressed.</span> |
|
|
|
|
<span class="n">NUMLOCK_ON</span> <span class="o">=</span> <span class="mh">0x0020</span> <span class="c1"># The NUM LOCK light is on.</span> |
|
|
|
|
<span class="n">RIGHT_ALT_PRESSED</span> <span class="o">=</span> <span class="mh">0x0001</span> <span class="c1"># The right ALT key is pressed.</span> |
|
|
|
|
<span class="n">RIGHT_CTRL_PRESSED</span> <span class="o">=</span> <span class="mh">0x0004</span> <span class="c1"># The right CTRL key is pressed.</span> |
|
|
|
|
<span class="n">SCROLLLOCK_ON</span> <span class="o">=</span> <span class="mh">0x0040</span> <span class="c1"># The SCROLL LOCK light is on.</span> |
|
|
|
|
<span class="n">SHIFT_PRESSED</span> <span class="o">=</span> <span class="mh">0x0010</span> <span class="c1"># The SHIFT key is pressed.</span> |
|
|
|
|
<span class="c1"># dwEventFlags</span> |
|
|
|
|
<span class="n">DOUBLE_CLICK</span> <span class="o">=</span> <span class="mh">0x0002</span> <span class="c1"># The second click (button press) of a double-click occurred. The first click is returned as a regular button-press event.</span> |
|
|
|
|
<span class="n">MOUSE_HWHEELED</span> <span class="o">=</span> <span class="mh">0x0008</span> <span class="c1"># The horizontal mouse wheel was moved.</span> |
|
|
|
|
<span class="c1"># If the high word of the dwButtonState member contains a positive value, the wheel was rotated to the right. Otherwise, the wheel was rotated to the left.</span> |
|
|
|
|
<span class="n">MOUSE_MOVED</span> <span class="o">=</span> <span class="mh">0x0001</span> <span class="c1"># A change in mouse position occurred.</span> |
|
|
|
|
<span class="n">MOUSE_WHEELED</span> <span class="o">=</span> <span class="mh">0x0004</span> <span class="c1"># The vertical mouse wheel was moved.</span> |
|
|
|
|
<span class="c1"># If the high word of the dwButtonState member contains a positive value, the wheel was rotated forward, away from the user. Otherwise, the wheel was rotated backward, toward the user.</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># https://docs.microsoft.com/en-us/windows/console/coord-str</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># typedef struct _COORD {</span> |
|
|
|
|
<span class="c1"># SHORT X;</span> |
|
|
|
|
<span class="c1"># SHORT Y;</span> |
|
|
|
|
<span class="c1"># } COORD, *PCOORD;</span> |
|
|
|
|
<div class="viewcode-block" id="COORD"><a class="viewcode-back" href="../../../../autogen.TermTk/TermTk.TTkCore.drivers.windows.html#TermTk.TTkCore.drivers.windows.COORD">[docs]</a><span class="k">class</span> <span class="nc">COORD</span><span class="p">(</span><span class="n">Structure</span><span class="p">):</span> |
|
|
|
|
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"X"</span><span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">SHORT</span><span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"Y"</span><span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">SHORT</span><span class="p">)]</span></div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># https://docs.microsoft.com/en-us/windows/console/key-event-record-str</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># typedef struct _KEY_EVENT_RECORD {</span> |
|
|
|
|
<span class="c1"># BOOL bKeyDown;</span> |
|
|
|
|
<span class="c1"># WORD wRepeatCount;</span> |
|
|
|
|
<span class="c1"># WORD wVirtualKeyCode;</span> |
|
|
|
|
<span class="c1"># WORD wVirtualScanCode;</span> |
|
|
|
|
<span class="c1"># union {</span> |
|
|
|
|
<span class="c1"># WCHAR UnicodeChar;</span> |
|
|
|
|
<span class="c1"># CHAR AsciiChar;</span> |
|
|
|
|
<span class="c1"># } uChar;</span> |
|
|
|
|
<span class="c1"># DWORD dwControlKeyState;</span> |
|
|
|
|
<span class="c1"># } KEY_EVENT_RECORD;</span> |
|
|
|
|
<div class="viewcode-block" id="KEY_EVENT_RECORD"><a class="viewcode-back" href="../../../../autogen.TermTk/TermTk.TTkCore.drivers.windows.html#TermTk.TTkCore.drivers.windows.KEY_EVENT_RECORD">[docs]</a><span class="k">class</span> <span class="nc">KEY_EVENT_RECORD</span><span class="p">(</span><span class="n">Structure</span><span class="p">):</span> |
|
|
|
|
<span class="k">class</span> <span class="nc">_uChar</span><span class="p">(</span><span class="n">Union</span><span class="p">):</span> |
|
|
|
|
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"UnicodeChar"</span><span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">WCHAR</span><span class="p">)</span> <span class="p">,</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"AsciiChar"</span> <span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">CHAR</span> <span class="p">)</span> <span class="p">]</span> |
|
|
|
|
|
|
|
|
|
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"bKeyDown"</span> <span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">BOOL</span> <span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"wRepeatCount"</span> <span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">WORD</span> <span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"wVirtualKeyCode"</span> <span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">WORD</span> <span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"wVirtualScanCode"</span> <span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">WORD</span> <span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"uChar"</span> <span class="p">,</span> <span class="n">_uChar</span> <span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"dwControlKeyState"</span><span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">)]</span></div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># typedef struct _MOUSE_EVENT_RECORD {</span> |
|
|
|
|
<span class="c1"># COORD dwMousePosition;</span> |
|
|
|
|
<span class="c1"># DWORD dwButtonState;</span> |
|
|
|
|
<span class="c1"># DWORD dwControlKeyState;</span> |
|
|
|
|
<span class="c1"># DWORD dwEventFlags;</span> |
|
|
|
|
<span class="c1"># } MOUSE_EVENT_RECORD;</span> |
|
|
|
|
<div class="viewcode-block" id="MOUSE_EVENT_RECORD"><a class="viewcode-back" href="../../../../autogen.TermTk/TermTk.TTkCore.drivers.windows.html#TermTk.TTkCore.drivers.windows.MOUSE_EVENT_RECORD">[docs]</a><span class="k">class</span> <span class="nc">MOUSE_EVENT_RECORD</span><span class="p">(</span><span class="n">Structure</span><span class="p">):</span> |
|
|
|
|
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"dwMousePosition"</span> <span class="p">,</span> <span class="n">COORD</span><span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"dwButtonState"</span> <span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"dwControlKeyState"</span><span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"dwEventFlags"</span> <span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">)]</span></div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># https://docs.microsoft.com/en-us/windows/console/window-buffer-size-record-str</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># typedef struct _WINDOW_BUFFER_SIZE_RECORD {</span> |
|
|
|
|
<span class="c1"># COORD dwSize;</span> |
|
|
|
|
<span class="c1"># } WINDOW_BUFFER_SIZE_RECORD;</span> |
|
|
|
|
<div class="viewcode-block" id="WINDOW_BUFFER_SIZE_RECORD"><a class="viewcode-back" href="../../../../autogen.TermTk/TermTk.TTkCore.drivers.windows.html#TermTk.TTkCore.drivers.windows.WINDOW_BUFFER_SIZE_RECORD">[docs]</a><span class="k">class</span> <span class="nc">WINDOW_BUFFER_SIZE_RECORD</span><span class="p">(</span><span class="n">Structure</span><span class="p">):</span> |
|
|
|
|
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[(</span><span class="s2">"dwSize"</span><span class="p">,</span> <span class="n">COORD</span><span class="p">)]</span></div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># https://docs.microsoft.com/en-us/windows/console/menu-event-record-str</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># typedef struct _MENU_EVENT_RECORD {</span> |
|
|
|
|
<span class="c1"># UINT dwCommandId;</span> |
|
|
|
|
<span class="c1"># } MENU_EVENT_RECORD, *PMENU_EVENT_RECORD;</span> |
|
|
|
|
<div class="viewcode-block" id="MENU_EVENT_RECORD"><a class="viewcode-back" href="../../../../autogen.TermTk/TermTk.TTkCore.drivers.windows.html#TermTk.TTkCore.drivers.windows.MENU_EVENT_RECORD">[docs]</a><span class="k">class</span> <span class="nc">MENU_EVENT_RECORD</span><span class="p">(</span><span class="n">Structure</span><span class="p">):</span> |
|
|
|
|
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[(</span><span class="s2">"dwCommandId"</span><span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">UINT</span><span class="p">)]</span></div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># https://docs.microsoft.com/en-us/windows/console/focus-event-record-str</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># typedef struct _FOCUS_EVENT_RECORD {</span> |
|
|
|
|
<span class="c1"># BOOL bSetFocus;</span> |
|
|
|
|
<span class="c1"># } FOCUS_EVENT_RECORD;</span> |
|
|
|
|
<div class="viewcode-block" id="FOCUS_EVENT_RECORD"><a class="viewcode-back" href="../../../../autogen.TermTk/TermTk.TTkCore.drivers.windows.html#TermTk.TTkCore.drivers.windows.FOCUS_EVENT_RECORD">[docs]</a><span class="k">class</span> <span class="nc">FOCUS_EVENT_RECORD</span><span class="p">(</span><span class="n">Structure</span><span class="p">):</span> |
|
|
|
|
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[(</span><span class="s2">"bSetFocus"</span><span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">BOOL</span><span class="p">)]</span></div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># https://docs.microsoft.com/en-us/windows/console/input-record-str</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># typedef struct _INPUT_RECORD {</span> |
|
|
|
|
<span class="c1"># WORD EventType;</span> |
|
|
|
|
<span class="c1"># union {</span> |
|
|
|
|
<span class="c1"># KEY_EVENT_RECORD KeyEvent;</span> |
|
|
|
|
<span class="c1"># MOUSE_EVENT_RECORD MouseEvent;</span> |
|
|
|
|
<span class="c1"># WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;</span> |
|
|
|
|
<span class="c1"># MENU_EVENT_RECORD MenuEvent;</span> |
|
|
|
|
<span class="c1"># FOCUS_EVENT_RECORD FocusEvent;</span> |
|
|
|
|
<span class="c1"># } Event;</span> |
|
|
|
|
<span class="c1"># } INPUT_RECORD;</span> |
|
|
|
|
<div class="viewcode-block" id="INPUT_RECORD"><a class="viewcode-back" href="../../../../autogen.TermTk/TermTk.TTkCore.drivers.windows.html#TermTk.TTkCore.drivers.windows.INPUT_RECORD">[docs]</a><span class="k">class</span> <span class="nc">INPUT_RECORD</span><span class="p">(</span><span class="n">Structure</span><span class="p">):</span> |
|
|
|
|
<span class="k">class</span> <span class="nc">_Event</span><span class="p">(</span><span class="n">Union</span><span class="p">):</span> |
|
|
|
|
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"KeyEvent"</span> <span class="p">,</span> <span class="n">KEY_EVENT_RECORD</span> <span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"MouseEvent"</span> <span class="p">,</span> <span class="n">MOUSE_EVENT_RECORD</span> <span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"WindowBufferSizeEvent"</span><span class="p">,</span> <span class="n">WINDOW_BUFFER_SIZE_RECORD</span><span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"MenuEvent"</span> <span class="p">,</span> <span class="n">MENU_EVENT_RECORD</span> <span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"FocusEvent"</span> <span class="p">,</span> <span class="n">FOCUS_EVENT_RECORD</span> <span class="p">)]</span> |
|
|
|
|
|
|
|
|
|
<span class="n">_fields_</span> <span class="o">=</span> <span class="p">[</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"EventType"</span><span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">WORD</span><span class="p">),</span> |
|
|
|
|
<span class="p">(</span><span class="s2">"Event"</span> <span class="p">,</span> <span class="n">_Event</span> <span class="p">)]</span></div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">TTkInputDriver</span><span class="p">():</span> |
|
|
|
|
<span class="n">windowResized</span> <span class="o">=</span> <span class="n">pyTTkSignal</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span><span class="nb">int</span><span class="p">)</span> |
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> |
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_run</span> <span class="o">=</span> <span class="kc">True</span> |
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_initTerminal</span><span class="p">()</span> |
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_initTerminal</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> |
|
|
|
|
<span class="c1"># Get the standard input handle.</span> |
|
|
|
|
<span class="c1"># From:</span> |
|
|
|
|
<span class="c1"># https://learn.microsoft.com/en-us/windows/console/getstdhandle</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># HANDLE WINAPI GetStdHandle(</span> |
|
|
|
|
<span class="c1"># _In_ DWORD nStdHandle</span> |
|
|
|
|
<span class="c1"># );</span> |
|
|
|
|
<span class="n">GetStdHandle</span> <span class="o">=</span> <span class="n">windll</span><span class="o">.</span><span class="n">kernel32</span><span class="o">.</span><span class="n">GetStdHandle</span> |
|
|
|
|
<span class="n">GetStdHandle</span><span class="o">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span><span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">]</span> |
|
|
|
|
<span class="n">GetStdHandle</span><span class="o">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">HANDLE</span> |
|
|
|
|
|
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_hStdIn</span> <span class="o">=</span> <span class="n">GetStdHandle</span><span class="p">(</span><span class="n">STD_INPUT_HANDLE</span><span class="p">)</span> |
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hStdIn</span> <span class="o">==</span> <span class="n">INVALID_HANDLE_VALUE</span><span class="p">:</span> |
|
|
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"GetStdHandle"</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_hStdOut</span> <span class="o">=</span> <span class="n">GetStdHandle</span><span class="p">(</span><span class="n">STD_OUTPUT_HANDLE</span><span class="p">)</span> |
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hStdOut</span> <span class="o">==</span> <span class="n">INVALID_HANDLE_VALUE</span><span class="p">:</span> |
|
|
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"GetStdHandle"</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># Save the current input mode, to be restored on exit.</span> |
|
|
|
|
<span class="c1"># From:</span> |
|
|
|
|
<span class="c1"># https://learn.microsoft.com/en-us/windows/console/GetConsoleMode</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># BOOL WINAPI GetConsoleMode(</span> |
|
|
|
|
<span class="c1"># _In_ HANDLE hConsoleHandle,</span> |
|
|
|
|
<span class="c1"># _Out_ LPDWORD lpMode</span> |
|
|
|
|
<span class="c1"># );</span> |
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_GetConsoleMode</span> <span class="o">=</span> <span class="n">windll</span><span class="o">.</span><span class="n">kernel32</span><span class="o">.</span><span class="n">GetConsoleMode</span> |
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_GetConsoleMode</span><span class="o">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span><span class="n">wintypes</span><span class="o">.</span><span class="n">HANDLE</span><span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">LPDWORD</span><span class="p">]</span> |
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_GetConsoleMode</span><span class="o">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">BOOL</span> |
|
|
|
|
|
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_fdwSaveOldModeIn</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span> |
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_GetConsoleMode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hStdIn</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fdwSaveOldModeIn</span><span class="p">)):</span> |
|
|
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"GetConsoleMode"</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_fdwSaveOldModeOut</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">()</span> |
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_GetConsoleMode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hStdOut</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fdwSaveOldModeOut</span><span class="p">)):</span> |
|
|
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"GetConsoleMode"</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># TTkLog.debug(f"{fdwSaveOldModeIn.value=:02x}")</span> |
|
|
|
|
<span class="c1"># TTkLog.debug(f"{fdwSaveOldModeOut.value=:02x}")</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># Enable the window and mouse input events.</span> |
|
|
|
|
<span class="c1"># From:</span> |
|
|
|
|
<span class="c1"># https://learn.microsoft.com/en-us/windows/console/SetConsoleMode</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># BOOL WINAPI SetConsoleMode(</span> |
|
|
|
|
<span class="c1"># _In_ HANDLE hConsoleHandle,</span> |
|
|
|
|
<span class="c1"># _In_ DWORD dwMode</span> |
|
|
|
|
<span class="c1"># );</span> |
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_SetConsoleMode</span> <span class="o">=</span> <span class="n">windll</span><span class="o">.</span><span class="n">kernel32</span><span class="o">.</span><span class="n">SetConsoleMode</span> |
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_SetConsoleMode</span><span class="o">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span><span class="n">wintypes</span><span class="o">.</span><span class="n">HANDLE</span><span class="p">,</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">]</span> |
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_SetConsoleMode</span><span class="o">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">BOOL</span> |
|
|
|
|
|
|
|
|
|
<span class="n">fdwModeIn</span> <span class="o">=</span> <span class="n">ENABLE_VIRTUAL_TERMINAL_INPUT</span> |
|
|
|
|
<span class="c1"># fdwModeIn = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT</span> |
|
|
|
|
<span class="c1"># fdwModeIn = 0x0218</span> |
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_SetConsoleMode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hStdIn</span><span class="p">,</span> <span class="n">fdwModeIn</span><span class="p">):</span> |
|
|
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"SetConsoleMode"</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="n">fdwModeOut</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fdwSaveOldModeOut</span><span class="o">.</span><span class="n">value</span> <span class="o">|</span> <span class="n">ENABLE_VIRTUAL_TERMINAL_PROCESSING</span> |
|
|
|
|
<span class="c1"># fdwModeIn = 0x0218</span> |
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_SetConsoleMode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hStdOut</span><span class="p">,</span> <span class="n">fdwModeOut</span><span class="p">):</span> |
|
|
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"SetConsoleMode"</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># TTkLog.debug(f"{fdwModeIn=:02x}")</span> |
|
|
|
|
<span class="c1"># TTkLog.debug(f"{fdwModeOut=:02x}")</span> |
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> |
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_run</span> <span class="o">=</span> <span class="kc">False</span> |
|
|
|
|
<span class="c1"># Restore input mode on exit.</span> |
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_SetConsoleMode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hStdIn</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fdwSaveOldModeIn</span><span class="p">):</span> |
|
|
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"SetConsoleMode"</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_SetConsoleMode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hStdOut</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fdwSaveOldModeOut</span><span class="p">):</span> |
|
|
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"SetConsoleMode"</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">cont</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> |
|
|
|
|
<span class="k">pass</span> |
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="o">|</span><span class="kc">None</span><span class="p">:</span> |
|
|
|
|
<span class="c1"># From:</span> |
|
|
|
|
<span class="c1"># https://learn.microsoft.com/en-us/windows/console/ReadConsoleInput</span> |
|
|
|
|
<span class="c1">#</span> |
|
|
|
|
<span class="c1"># BOOL WINAPI ReadConsoleInput(</span> |
|
|
|
|
<span class="c1"># _In_ HANDLE hConsoleInput,</span> |
|
|
|
|
<span class="c1"># _Out_ PINPUT_RECORD lpBuffer,</span> |
|
|
|
|
<span class="c1"># _In_ DWORD nLength,</span> |
|
|
|
|
<span class="c1"># _Out_ LPDWORD lpNumberOfEventsRead</span> |
|
|
|
|
<span class="c1"># );</span> |
|
|
|
|
|
|
|
|
|
<span class="n">ReadConsoleInput</span> <span class="o">=</span> <span class="n">windll</span><span class="o">.</span><span class="n">kernel32</span><span class="o">.</span><span class="n">ReadConsoleInputW</span> <span class="c1"># Unicode</span> |
|
|
|
|
<span class="c1"># ReadConsoleInput = windll.kernel32.ReadConsoleInputA # ANSII</span> |
|
|
|
|
<span class="c1"># ReadConsoleInput.argtypes = [wintypes.HANDLE,</span> |
|
|
|
|
<span class="c1"># wintypes.LPINT,</span> |
|
|
|
|
<span class="c1"># wintypes.DWORD,</span> |
|
|
|
|
<span class="c1"># wintypes.LPWORD]</span> |
|
|
|
|
<span class="n">ReadConsoleInput</span><span class="o">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">BOOL</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># DWORD cNumRead;</span> |
|
|
|
|
<span class="c1"># INPUT_RECORD irInBuf[128];</span> |
|
|
|
|
<span class="n">cNumRead</span> <span class="o">=</span> <span class="n">wintypes</span><span class="o">.</span><span class="n">DWORD</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> |
|
|
|
|
<span class="n">irInBuf</span> <span class="o">=</span> <span class="p">(</span><span class="n">INPUT_RECORD</span> <span class="o">*</span> <span class="mi">256</span><span class="p">)()</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># Loop to read and handle the next 100 input events.</span> |
|
|
|
|
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run</span><span class="p">:</span> |
|
|
|
|
<span class="c1"># Wait for the events.</span> |
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">ReadConsoleInput</span><span class="p">(</span> |
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_hStdIn</span><span class="p">,</span> <span class="c1"># input buffer handle</span> |
|
|
|
|
<span class="n">byref</span><span class="p">(</span><span class="n">irInBuf</span><span class="p">),</span> <span class="c1"># buffer to read into</span> |
|
|
|
|
<span class="mi">256</span><span class="p">,</span> <span class="c1"># size of read buffer</span> |
|
|
|
|
<span class="n">byref</span><span class="p">(</span><span class="n">cNumRead</span><span class="p">)):</span> <span class="c1"># number of records read</span> |
|
|
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"ReadConsoleInput"</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># TTkLog.debug(f"{self._hStdIn=} {irInBuf=} {cNumRead=}")</span> |
|
|
|
|
<span class="c1"># TTkLog.debug(f"{cNumRead=}")</span> |
|
|
|
|
|
|
|
|
|
<span class="c1"># Dispatch the events to the appropriate handler.</span> |
|
|
|
|
<span class="n">saveKeys</span> <span class="o">=</span> <span class="p">[]</span> |
|
|
|
|
<span class="k">for</span> <span class="n">bb</span> <span class="ow">in</span> <span class="n">irInBuf</span><span class="p">[:</span><span class="n">cNumRead</span><span class="o">.</span><span class="n">value</span><span class="p">]:</span> |
|
|
|
|
<span class="c1"># if not bb.EventType: continue</span> |
|
|
|
|
<span class="c1"># TTkLog.debug(f"{bb=} {bb.EventType=} {cNumRead.value=}")</span> |
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="n">bb</span><span class="o">.</span><span class="n">EventType</span> <span class="o">==</span> <span class="n">KEY_EVENT</span><span class="p">:</span> |
|
|
|
|
<span class="n">ke</span> <span class="o">=</span> <span class="n">bb</span><span class="o">.</span><span class="n">Event</span><span class="o">.</span><span class="n">KeyEvent</span> |
|
|
|
|
<span class="k">if</span> <span class="p">(</span> <span class="ow">not</span> <span class="n">ke</span><span class="o">.</span><span class="n">bKeyDown</span> <span class="ow">or</span> |
|
|
|
|
<span class="n">ke</span><span class="o">.</span><span class="n">dwControlKeyState</span> <span class="ow">or</span> |
|
|
|
|
<span class="n">ke</span><span class="o">.</span><span class="n">wVirtualKeyCode</span> <span class="p">):</span> |
|
|
|
|
<span class="k">continue</span> |
|
|
|
|
<span class="n">saveKeys</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ke</span><span class="o">.</span><span class="n">uChar</span><span class="o">.</span><span class="n">UnicodeChar</span><span class="p">)</span> |
|
|
|
|
<span class="k">elif</span> <span class="n">bb</span><span class="o">.</span><span class="n">EventType</span> <span class="o">==</span> <span class="n">MOUSE_EVENT</span><span class="p">:</span> |
|
|
|
|
<span class="c1"># It is not supposed to receive Mouse Events</span> |
|
|
|
|
<span class="c1"># due to ENABLE_VIRTUAL_TERMINAL_PROCESSING</span> |
|
|
|
|
<span class="c1"># everything is received as ANSI sequence</span> |
|
|
|
|
<span class="k">pass</span> |
|
|
|
|
<span class="k">elif</span> <span class="n">bb</span><span class="o">.</span><span class="n">EventType</span> <span class="o">==</span> <span class="n">WINDOW_BUFFER_SIZE_EVENT</span><span class="p">:</span> |
|
|
|
|
<span class="c1"># TTkLog.debug(f"{bb.Event.WindowBufferSizeEvent=}")</span> |
|
|
|
|
<span class="c1"># TTkLog.debug(f"{bb.Event.WindowBufferSizeEvent.dwSize.X=}")</span> |
|
|
|
|
<span class="c1"># TTkLog.debug(f"{bb.Event.WindowBufferSizeEvent.dwSize.Y=}")</span> |
|
|
|
|
<span class="n">TTkInputDriver</span><span class="o">.</span><span class="n">windowResized</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="n">bb</span><span class="o">.</span><span class="n">Event</span><span class="o">.</span><span class="n">WindowBufferSizeEvent</span><span class="o">.</span><span class="n">dwSize</span><span class="o">.</span><span class="n">X</span><span class="p">,</span> <span class="n">bb</span><span class="o">.</span><span class="n">Event</span><span class="o">.</span><span class="n">WindowBufferSizeEvent</span><span class="o">.</span><span class="n">dwSize</span><span class="o">.</span><span class="n">Y</span><span class="p">)</span> |
|
|
|
|
<span class="k">if</span> <span class="n">saveKeys</span><span class="p">:</span> |
|
|
|
|
<span class="k">yield</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">saveKeys</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-16"</span><span class="p">,</span> <span class="s2">"surrogatepass"</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-16"</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">TTkSignalDriver</span><span class="p">():</span> |
|
|
|
|
<span class="n">sigStop</span> <span class="o">=</span> <span class="n">pyTTkSignal</span><span class="p">()</span> |
|
|
|
|
<span class="n">sigCont</span> <span class="o">=</span> <span class="n">pyTTkSignal</span><span class="p">()</span> |
|
|
|
|
<span class="n">sigInt</span> <span class="o">=</span> <span class="n">pyTTkSignal</span><span class="p">()</span> |
|
|
|
|
|
|
|
|
|
<span class="nd">@staticmethod</span> |
|
|
|
|
<span class="k">def</span> <span class="nf">init</span><span class="p">():</span> |
|
|
|
|
<span class="c1"># Register events</span> |
|
|
|
|
<span class="c1"># signal.signal(signal.SIGTSTP, TTkSignalDriver._SIGSTOP) # Ctrl-Z</span> |
|
|
|
|
<span class="c1"># signal.signal(signal.SIGCONT, TTkSignalDriver._SIGCONT) # Resume</span> |
|
|
|
|
<span class="n">signal</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGINT</span><span class="p">,</span> <span class="n">TTkSignalDriver</span><span class="o">.</span><span class="n">_SIGINT</span><span class="p">)</span> <span class="c1"># Ctrl-C</span> |
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">exit</span><span class="p">():</span> |
|
|
|
|
<span class="n">signal</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGINT</span><span class="p">,</span> <span class="n">signal</span><span class="o">.</span><span class="n">SIG_DFL</span><span class="p">)</span> |
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_SIGSTOP</span><span class="p">(</span><span class="n">signum</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span> <span class="n">TTkSignalDriver</span><span class="o">.</span><span class="n">sigStop</span><span class="o">.</span><span class="n">emit</span><span class="p">()</span> |
|
|
|
|
<span class="k">def</span> <span class="nf">_SIGCONT</span><span class="p">(</span><span class="n">signum</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span> <span class="n">TTkSignalDriver</span><span class="o">.</span><span class="n">sigCont</span><span class="o">.</span><span class="n">emit</span><span class="p">()</span> |
|
|
|
|
<span class="k">def</span> <span class="nf">_SIGINT</span><span class="p">(</span> <span class="n">signum</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span> <span class="n">TTkSignalDriver</span><span class="o">.</span><span class="n">sigInt</span><span class="o">.</span><span class="n">emit</span><span class="p">()</span> |
|
|
|
|
</pre></div> |
|
|
|
|
|
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<footer> |
|
|
|
|
|
|
|
|
|
<hr/> |
|
|
|
|
|
|
|
|
|
<div role="contentinfo"> |
|
|
|
|
<p>© Copyright 2021, Eugenio Parodi.</p> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a |
|
|
|
|
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> |
|
|
|
|
provided by <a href="https://readthedocs.org">Read the Docs</a>. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</footer> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</section> |
|
|
|
|
</div> |
|
|
|
|
<script> |
|
|
|
|
jQuery(function () { |
|
|
|
|
SphinxRtdTheme.Navigation.enable(true); |
|
|
|
|
}); |
|
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
</body> |
|
|
|
|
</html> |