<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=GetKey</id>
	<title>GetKey - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=GetKey"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=GetKey&amp;action=history"/>
	<updated>2026-04-28T22:10:39Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=GetKey&amp;diff=1814&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=GetKey&amp;diff=1814&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:54Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Back to [[BasicSource]]&lt;br /&gt;
&lt;br /&gt;
QM has a function called keycode() that will return one character for any key pressed.  This subroutine is an attempt to emulate that behaviour.  It is designed to be as terminal independant as possible; and does this by storing multiple escape sequences for the same key.  This means that the following key combinations are, effectively, defaults for the arrow keys.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;Ctrl-F&amp;gt; returns char(204) = RIGHT&lt;br /&gt;
:&amp;lt;Ctrl-J&amp;gt; returns char(206) = DOWN&lt;br /&gt;
:&amp;lt;Ctrl-U&amp;gt; returns char(203) = LEFT&lt;br /&gt;
:&amp;lt;Ctrl-Z&amp;gt; returns char(205) = UP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
     subroutine getkey(what)&lt;br /&gt;
* Returns single character for just about any terminal escape sequence&lt;br /&gt;
*======================================================================&lt;br /&gt;
* This is for QM[[/UniVerse]], you can change it to run under other MVDBMS&lt;br /&gt;
     what = &amp;#039;COPYRIGHT Keith Robert Johnson 2007&amp;#039;&lt;br /&gt;
* This program has been put in the public domain by Keith Johnson&lt;br /&gt;
* as a source-code resource. That is, anyone may copy, modify, or&lt;br /&gt;
* otherwise use it as if they had written it themselves, and&lt;br /&gt;
* Keith Johnson is not liable in any way for the results.&lt;br /&gt;
* The code will not work unless it is compiled, it is up to whoever&lt;br /&gt;
* so compiles it to determine the suitability of the code for use.&lt;br /&gt;
*======================================================================&lt;br /&gt;
* Version - Description&lt;br /&gt;
*    1.00 - Initial program, based on FINP&lt;br /&gt;
*======================================================================&lt;br /&gt;
* what - The character returned (based on QM practice).&lt;br /&gt;
*        This program does not use Control or Alt function keys&lt;br /&gt;
*        but has still got the equated numbers to use&lt;br /&gt;
*======================================================================&lt;br /&gt;
* Arrow keys&lt;br /&gt;
     equ larr to 203, rarr to 204, uarr to 205, darr to 206&lt;br /&gt;
* Page up and down, home and end&lt;br /&gt;
     equ upag to 207, dpag to 208, home to 209, pend to 210&lt;br /&gt;
* Insert, delete, backtab&lt;br /&gt;
     equ insk to 211, delk to 212, btab to 213&lt;br /&gt;
* Control - Page up and down, home and end&lt;br /&gt;
     equ cupg to 214, cdpg to 215, chom to 216, cend to 217&lt;br /&gt;
* Function, Control+Function, Alt+Function, Shift+Function&lt;br /&gt;
     equ f1   to 128, cf1  to 140, af1  to 152, sf1  to 164&lt;br /&gt;
     equ f2   to 129, cf2  to 141, af2  to 153, sf2  to 165&lt;br /&gt;
     equ f3   to 130, cf3  to 142, af3  to 154, sf3  to 166&lt;br /&gt;
     equ f4   to 131, cf4  to 143, af4  to 155, sf4  to 167&lt;br /&gt;
     equ f5   to 132, cf5  to 144, af5  to 156, sf5  to 168&lt;br /&gt;
     equ f6   to 133, cf6  to 145, af6  to 157, sf6  to 169&lt;br /&gt;
     equ f7   to 134, cf7  to 146, af7  to 158, sf7  to 170&lt;br /&gt;
     equ f8   to 135, cf8  to 147, af8  to 159, sf8  to 171&lt;br /&gt;
     equ f9   to 136, cf9  to 148, af9  to 160, sf9  to 172&lt;br /&gt;
     equ f10  to 137, cf10 to 149, af10 to 161, sf10 to 173&lt;br /&gt;
     equ f11  to 138, cf11 to 150, af11 to 162, sf11 to 174&lt;br /&gt;
     equ f12  to 139, cf12 to 151, af12 to 163, sf12 to 175&lt;br /&gt;
*======================================================================&lt;br /&gt;
* Stash the escape sequences and key codes in labelled common&lt;br /&gt;
     common /keys$krj/ term,eseq,keys,stub,full&lt;br /&gt;
     if not(assigned(term)) then term = &amp;#039;&amp;#039;&lt;br /&gt;
     if term ne oconv(system(7),&amp;#039;MCU&amp;#039;) then&lt;br /&gt;
        term = oconv(system(7),&amp;#039;MCU&amp;#039;)&lt;br /&gt;
* Set up keys good for many terminals and as defaults&lt;br /&gt;
        escp = char(27)&lt;br /&gt;
        eseq = &amp;#039;&amp;#039; ; keys = &amp;#039;&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = larr; eseq&amp;lt;-1&amp;gt; = char(21)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = rarr; eseq&amp;lt;-1&amp;gt; = char(6)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = uarr; eseq&amp;lt;-1&amp;gt; = char(26)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = darr; eseq&amp;lt;-1&amp;gt; = char(10)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = upag; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[5~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = dpag; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[6~&amp;#039;&lt;br /&gt;
* Now do settings that don&amp;#039;t interfere between terminals&lt;br /&gt;
* VT-type terminals - cater for alternative arrow sequences&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = rarr; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[C&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = rarr; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;OC&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = uarr; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[A&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = uarr; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;OA&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = darr; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[B&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = darr; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;OB&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = insk; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[1~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = delk; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[4~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = btab; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[Z&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f1  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;OP&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f2  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;OQ&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f3  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;OR&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f4  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;OS&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f5  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;OT&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f6  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[17~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f7  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[18~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f8  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[19~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f9  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[20~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f10 ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[21~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f11 ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[23~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f12 ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[24~&amp;#039;&lt;br /&gt;
* Wyse-type terminals&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = insk; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;Q&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = delk; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;W&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = btab; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;I&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f1  ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;@&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f2  ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;A&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f3  ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;B&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f4  ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;C&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f5  ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;D&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f6  ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;E&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f7  ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;F&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f8  ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;G&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f9  ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;H&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f10 ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;I&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f11 ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;J&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f12 ; eseq&amp;lt;-1&amp;gt; = char(1):&amp;#039;K&amp;#039;:char(13)&lt;br /&gt;
* ADDS-type terminals&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f1  ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;1&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f2  ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;2&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f3  ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;3&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f4  ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;4&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f5  ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;5&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f6  ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;6&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f7  ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;7&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f8  ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;8&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f9  ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;9&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f10 ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;:&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f11 ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;;&amp;#039;:char(13)&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f12 ; eseq&amp;lt;-1&amp;gt; = char(2):&amp;#039;&amp;lt;&amp;#039;:char(13)&lt;br /&gt;
* xterm for my Asus eeePC[[/Linux/QM]] - which was why I wrote this&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = f5   ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[15~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf1  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[[O2P]]&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf2  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[[O2Q]]&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf3  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[[O2R]]&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf4  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[[O2S]]&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf5  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[15;2~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf6  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[17;2~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf7  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[18;2~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf8  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[19;2~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf9  ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[20;2~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf10 ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[21;2~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf11 ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[23;2~&amp;#039;&lt;br /&gt;
        keys&amp;lt;-1&amp;gt; = sf12 ; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[24;2~&amp;#039;&lt;br /&gt;
* Now do terminal-specific settings&lt;br /&gt;
* VT-type terminals&lt;br /&gt;
        if term[1,2] eq &amp;#039;VT&amp;#039; or term eq &amp;#039;XTERM&amp;#039;then&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = larr; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[D&amp;#039;&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = larr; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;OD&amp;#039;&lt;br /&gt;
        end else&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = insk; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[D&amp;#039;&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = delk; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;OD&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
* Wyse-type terminals&lt;br /&gt;
        if term[1,2] eq &amp;#039;WY&amp;#039; then&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = larr; eseq&amp;lt;-1&amp;gt; = char(8)  ;* added line&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = rarr; eseq&amp;lt;-1&amp;gt; = char(12)&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = uarr; eseq&amp;lt;-1&amp;gt; = char(11)&lt;br /&gt;
        end&lt;br /&gt;
* xterm again&lt;br /&gt;
        if term eq &amp;#039;XTERM&amp;#039; then&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = home; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[H&amp;#039;&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = pend; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[F&amp;#039;&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = insk; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[2~&amp;#039;&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = delk; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[3~&amp;#039;&lt;br /&gt;
        end else&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = home; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[2~&amp;#039;&lt;br /&gt;
           keys&amp;lt;-1&amp;gt; = pend; eseq&amp;lt;-1&amp;gt; = escp:&amp;#039;[3~&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
* Populate the escape sequence test variables&lt;br /&gt;
        stub = &amp;#039;&amp;#039;; full = &amp;#039;&amp;#039;&lt;br /&gt;
        amax = dcount(eseq,@am)&lt;br /&gt;
        for anum = 1 to amax&lt;br /&gt;
           temp = eseq&amp;lt;anum&amp;gt;&lt;br /&gt;
           if len(temp) le 1 then continue&lt;br /&gt;
           locate(temp[1,1],stub;posn)&lt;br /&gt;
              else posn = dcount(stub,@am)+1&lt;br /&gt;
           stub&amp;lt;posn&amp;gt; = temp[1,1]&lt;br /&gt;
           full&amp;lt;posn,-1&amp;gt; = temp&lt;br /&gt;
        next anum&lt;br /&gt;
     end&lt;br /&gt;
*======================================================================&lt;br /&gt;
* Actual code starts here&lt;br /&gt;
     what = &amp;#039;&amp;#039;&lt;br /&gt;
     loop&lt;br /&gt;
        this = keyin()&lt;br /&gt;
        locate(this,stub;posn) then gosub get.rest&lt;br /&gt;
        locate(this,eseq;cmd)&lt;br /&gt;
           then what = char(keys&amp;lt;cmd&amp;gt;)&lt;br /&gt;
           else if len(this) eq 1 then what = this&lt;br /&gt;
     while what eq &amp;#039;&amp;#039; do repeat&lt;br /&gt;
     return&lt;br /&gt;
get.rest:&lt;br /&gt;
     loop&lt;br /&gt;
        nap 5&lt;br /&gt;
        input that,-1&lt;br /&gt;
     while that do&lt;br /&gt;
        this := upcase(keyin())&lt;br /&gt;
        locate(this,full,posn;that) then return&lt;br /&gt;
     repeat&lt;br /&gt;
     return&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>