Keyboard macros: Difference between revisions

m
m (→‎{{header|Wren}}: Minor tidy)
 
(21 intermediate revisions by 13 users not shown)
Line 1:
{{task|GUI}}
{{task|GUI}}Show how to link user defined methods to user defined keys. An example of this is the facility provided by emacs for [http://www.gnu.org/software/emacs/manual/html_node/emacs/Key-Bindings.html key bindings]. These key bindings may be application-specific or system-wide; state which you have done.
Show how to link user defined methods to user defined keys.
An example of this is the facility provided by emacs for [http://www.gnu.org/software/emacs/manual/html_node/emacs/Key-Bindings.html key bindings].
 
These key bindings may be application-specific or system-wide; state which you have done.
<br><br>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">Loop, 200 ; loop 200 times while not paused
{
TrayTip, counting, %A_Index% press alt-p to pause
Line 25 ⟶ 32:
TrayTip, resume, resuming, 2
Pause, off
}</langsyntaxhighlight>
See [http://www.autohotkey.com/forum/topic44290.html&highlight=vim ahk-viper-mode] for a context sensitive vi key bindings example.
 
=={{header|BBC BASIC}}==
===Native===
<langsyntaxhighlight lang="bbcbasic"> *KEY 1 |!|A
*KEY 2 |!|B
REPEAT
Line 47 ⟶ 54:
DEF PROCmethod2
PRINT "You pressed F2"
ENDPROC</langsyntaxhighlight>
===Windows===
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> FVIRTKEY = 1
VK_F1 = &70
VK_F2 = &71
Line 82 ⟶ 89:
DEF PROCmethod2
PRINT "You pressed F2"
ENDPROC</langsyntaxhighlight>
 
=={{header|C}}==
Line 88 ⟶ 95:
 
The following example grabs Alt+F6 and Alt+F7 system-wide on a X server.
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
Line 125 ⟶ 132:
}
return EXIT_SUCCESS;
}</langsyntaxhighlight>
 
=={{header|Clojure}}==
Line 131 ⟶ 138:
 
The following example is at application level, printing out what key was pressed:
<langsyntaxhighlight lang="clojure">
(ns hello-seesaw.core
(:use seesaw.core))
Line 142 ⟶ 149:
pack!
show!)))
</syntaxhighlight>
</lang>
 
=={{header|Delphi}}==
Version Console Application
<syntaxhighlight lang="delphi">
program Key_Bindings_test;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
System.SysUtils,
Winapi.Windows,
Messages,
Classes;
 
type
// Class of application without window
TWindowlessApplication = class
private
Terminated: Boolean;
F7_id: Word;
F6_id: Word;
WIN_A: Word;
procedure HandleMessage;
public
Handle: THandle;
constructor Create;
destructor Destroy;
procedure Run;
end;
 
{ TWindowlessApplication }
 
constructor TWindowlessApplication.Create;
begin
// Allocate handle to receve a mensages
Handle := CreateWindowEx(WS_EX_TOOLWINDOW, 'TWindowlessApplication', '',
WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);
 
// Set the key bind for WIN+A, F6 and F7
WIN_A := GlobalAddAtom('Hotkey_WIN_A');
F6_id := GlobalAddAtom('Hotkey_F6');
F7_id := GlobalAddAtom('Hotkey_F7');
 
RegisterHotKey(Handle, WIN_A, MOD_WIN, ord('A'));
RegisterHotKey(Handle, F6_id, 0, VK_F6);
RegisterHotKey(Handle, F7_id, 0, VK_F7);
 
// Set flag to keep running application
Terminated := false;
end;
 
destructor TWindowlessApplication.Destroy;
begin
// Remove key bind
UnRegisterHotKey(Handle, WIN_A);
UnRegisterHotKey(Handle, F6_id);
UnRegisterHotKey(Handle, F7_id);
 
GlobalDeleteAtom(WIN_A);
GlobalDeleteAtom(F6_id);
GlobalDeleteAtom(F7_id);
 
// Deallocate handle
DeallocateHWnd(Handle);
end;
 
procedure TWindowlessApplication.Run;
begin
// Application loop
repeat
// Deal with new messages
HandleMessage();
until Terminated;
end;
 
procedure TWindowlessApplication.HandleMessage;
var
Msg: TMsg;
begin
// Check for new messages
if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then
begin
// Extract it
PeekMessageW(Msg, 0, 0, 0, PM_REMOVE);
 
// Check if Msg is a HOTKEY mensage
if Msg.message = WM_HOTKEY then
begin
// Check if the hotkey is for Win+A
if Msg.wParam = WIN_A then
begin
// Report and terminate
writeln('Win + A pressed !'#10);
writeln('Bye bye');
Terminated := true;
end;
 
// Check if the hotkey is for F6
if Msg.wParam = F6_id then
begin
// Report and terminate
writeln('F6 pressed !');
end;
 
// Check if the hotkey is for F7
if Msg.wParam = F7_id then
begin
// Report and terminate
writeln('F7 pressed !');
end;
end;
end;
end;
 
var
App: TWindowlessApplication;
 
begin
App := TWindowlessApplication.Create;
Writeln('Waiting user press F6 ou F7, then press WIN+A for terminate');
App.Run;
App.Destroy;
readln;
end.
</syntaxhighlight>
{{out}}
<pre>
Waiting user press F6 ou F7, then press WIN+A for terminate
F6 pressed !
F7 pressed !
Win + A pressed !
 
Bye bye
</pre>
 
=={{header|EchoLisp}}==
The '''(meta-key "key-value" "bound-string")''' function binds a modifier+key keypress to a string or function call.
<langsyntaxhighlight lang="lisp">
;; see initial bindings : GREEK DICTIONARY
(meta-keys) → (("0" "❌") ("1" "❗️") ("2" "❓") ("3" "✔️") ("4" "⛔️") ("5" "✅") ("6" "🚩") ("7" "⌚️")
Line 163 ⟶ 306:
(meta-key "A" "Antoinette") ; string
(meta-key "H" "(begin (writeln 'HELLO) (date 'today))") ; function call
</syntaxhighlight>
</lang>
 
=={{header|Go}}==
{{libheader|Xlib}}
{{trans|C}}
<br>
Note that 'cgo' does not support C unions as such - it expresses them as byte arrays. Consequently, the easiest way to access a field of a union (such as XEvent) is to write a C assessor function for it and then invoke that function from the Go side.
 
Note also that if you pass 'nil' to the XOpenDisplay function, it defaults to the value of the DISPLAY environment variable which has to be in a certain format to enable a connection to the X server to be established - check [https://www.x.org/releases/X11R7.7/doc/libX11/libX11/libX11.html the documentation] for details.
<syntaxhighlight lang="go">package main
 
/*
#cgo LDFLAGS: -lX11
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
 
static inline Window DefaultRootWindow_macro(Display *dpy) {
return ScreenOfDisplay(dpy, DefaultScreen(dpy))->root;
}
 
static inline int getXEvent_type(XEvent event) {
return event.type;
}
 
static inline XKeyEvent getXEvent_xkey(XEvent event) {
return event.xkey;
}
*/
import "C"
import "fmt"
import "unsafe"
 
func main() {
d := C.XOpenDisplay(nil)
f7, f6 := C.CString("F7"), C.CString("F6")
defer C.free(unsafe.Pointer(f7))
defer C.free(unsafe.Pointer(f6))
 
if d != nil {
C.XGrabKey(d, C.int(C.XKeysymToKeycode(d, C.XStringToKeysym(f7))),
C.Mod1Mask, /* normally it's Alt */
C.DefaultRootWindow_macro(d), C.True, C.GrabModeAsync, C.GrabModeAsync)
C.XGrabKey(d, C.int(C.XKeysymToKeycode(d, C.XStringToKeysym(f6))),
C.Mod1Mask,
C.DefaultRootWindow_macro(d), C.True, C.GrabModeAsync, C.GrabModeAsync)
 
var event C.XEvent
for {
C.XNextEvent(d, &event)
if C.getXEvent_type(event) == C.KeyPress {
xkeyEvent := C.getXEvent_xkey(event)
s := C.XLookupKeysym(&xkeyEvent, 0)
if s == C.XK_F7 {
fmt.Println("something's happened")
} else if s == C.XK_F6 {
break
}
}
}
 
C.XUngrabKey(d, C.int(C.XKeysymToKeycode(d, C.XStringToKeysym(f7))), C.Mod1Mask, C.DefaultRootWindow_macro(d))
C.XUngrabKey(d, C.int(C.XKeysymToKeycode(d, C.XStringToKeysym(f6))), C.Mod1Mask, C.DefaultRootWindow_macro(d))
} else {
fmt.Println("XOpenDisplay did not succeed")
}
}</syntaxhighlight>
 
=={{header|HicEst}}==
<langsyntaxhighlight lang="hicest">! bound to application
CALL F2
! ...
Line 187 ⟶ 396:
! Fn is suspended if m > n AND n <= 5, else Fm is queued
! ...
END</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
 
This is application-specific and works in both languages:
<langsyntaxhighlight lang="unicon">
global kMap
 
Line 213 ⟶ 422:
procedure italicsOff()
return "<\\i>"
end</langsyntaxhighlight>
 
Sample run:
Line 223 ⟶ 432:
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">
package keybord.macro.demo;
 
Line 254 ⟶ 463:
}
}
</syntaxhighlight>
</lang>
 
=={{header|JavaScript}}==
The example below captures the F7 key when pressed, if the document (that is, the web page) has focus. If the function returns ''false'', the event processing is halted. If it returns any other value, including ''undefined'', the event continues up the DOM tree ('bubbling').
 
<langsyntaxhighlight lang="javascript">document.onkeydown = function(evt) {
if (evt.keyCode === 118) {
alert("You pressed F7!");
return false;
}
}</langsyntaxhighlight>
 
See [http://www.quirksmode.org/js/keys.html quirksmode] for more information about key detection in JavaScript.
 
=={{header|Julia}}==
Macros are within the Gtk window.
<syntaxhighlight lang="julia">using Gtk
 
function keypresswindow()
tcount = 0
txt = "Press a Number Key"
win = GtkWindow("Keyboard Macros Test", 300, 50) |> (GtkFrame() |> ((vbox = GtkBox(:v)) |> (lab = GtkLabel(txt))))
function keycall(w, event)
ch = Char(event.keyval)
if isdigit(ch)
set_gtk_property!(lab, :label, "Keyboard Macro Number $ch Invoked.")
end
end
signal_connect(keycall, win, "key-press-event")
 
cond = Condition()
endit(w) = notify(cond)
signal_connect(endit, win, :destroy)
showall(win)
wait(cond)
end
 
keypresswindow()
</syntaxhighlight>
 
=={{header|Kotlin}}==
{{trans|Java}}
<langsyntaxhighlight lang="scala">// version 1.2.31
 
import javax.swing.JFrame
Line 294 ⟶ 529:
isVisible = true
}
}</langsyntaxhighlight>
 
=={{header|MathematicaM2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
Module CheckIt {
\\ Scan statement exist from version 1
\\ We can make targets and use function keys, in console
\\ Scan track mouse click on targets and functions keys state
\\ when any of these selected then a call to a global module happen
\\ show$(hide$("&8%", "master",3), "code1", 10)="123"
Global a$
Module Global GetIt {
Input "Password:"; a$
if a$<>"" then a$<=show$(hide$(a$, "code1", 10), "master", 3)
}
Module Global myHelp {
Print "Press F1 for help, F3 to enter password, F5 exit"
}
Fkey 1, "myHelp"
Fkey 3, "GetIt"
Fkey 5, {a$="---"}
myHelp
tries=0
Repeat {
Scan .1
if a$="---" then 1000
if a$="&8%" then Exit
if a$<>"" then tries++ : if tries>2 then 1000
a$<=""
} Always
Print "Enter ok"
1000 Print "Exit ", tries : End
}
Checkit
</syntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
Map the keystroke t to a simple script
<langsyntaxhighlight Mathematicalang="mathematica">SetOptions[EvaluationNotebook[], NotebookEventActions -> {{"KeyDown", "t"} :> Print["You pressed \"t\""]}]</langsyntaxhighlight>
 
=={{header|Nim}}==
{{libheader|gintro}}
As we need to catch the key press events, we give an example inside a Gtk3 application.
<syntaxhighlight lang="nim">import tables
 
import gintro/[glib, gobject, gio]
import gintro/gtk except Table
import gintro/gdk except Window
 
type
 
MacroProc = proc(app: App)
MacroTable = Table[int, MacroProc] # Mapping key values -> procedures.
 
App = ref object of Application
dispatchTable: MacroTable
label: Label
 
#---------------------------------------------------------------------------------------------------
 
proc addMacro(app: App; ch: char; macroProc: MacroProc) =
## Assign a procedure to a key.
## If the key is already assigned, nothing is done.
let keyval = ord(ch)
if keyval notin app.dispatchTable:
app.dispatchTable[keyval] = macroProc
 
#---------------------------------------------------------------------------------------------------
# Macro procedures.
 
proc proc1(app: App) =
app.label.setText("You called macro 1")
 
proc proc2(app: App) =
app.label.setText("You called macro 2")
 
proc proc3(app: App) =
app.label.setText("You called macro 3")
 
#---------------------------------------------------------------------------------------------------
 
proc onKeyPress(window: ApplicationWindow; event: Event; app: App): bool =
var keyval: int
if not event.getKeyval(keyval): return false
if keyval in app.dispatchTable:
app.dispatchTable[keyval](app)
result = true
 
#---------------------------------------------------------------------------------------------------
 
proc activate(app: App) =
## Activate the application.
 
app.addMacro('1', proc1)
app.addMacro('2', proc2)
app.addMacro('3', proc3)
 
let window = app.newApplicationWindow()
window.setTitle("Keyboard macros")
 
let hbox = newBox(Orientation.horizontal, 10)
window.add(hbox)
let vbox = newBox(Orientation.vertical, 10)
hbox.packStart(vbox, true, true, 10)
 
app.label = newLabel()
app.label.setWidthChars(18)
vbox.packStart(app.label, true, true, 5)
 
discard window.connect("key-press-event", onKeyPress, app)
 
window.showAll()
 
#———————————————————————————————————————————————————————————————————————————————————————————————————
 
let app = newApplication(App, "Rosetta.KeyboardMacros")
discard app.connect("activate", activate)
discard app.run()</syntaxhighlight>
 
=={{header|Oz}}==
Window-specific key bindings:
<langsyntaxhighlight lang="oz">declare
[QTk] = {Module.link ['x-oz://system/wp/QTk.ozf']}
Label
Line 315 ⟶ 664:
action:toplevel#close
)}
{Window show}</langsyntaxhighlight>
=={{header|Perl 6}}==
<lang perl6>my $TTY = open("/dev/tty");
my @INPUT;
 
=={{header|Perl}}==
sub log($mess) { print "$mess\r\n" }
<syntaxhighlight lang="perl">use strict;
use warnings;
use Term::ReadKey;
 
ReadMode 4; # change to raw input mode
INIT { shell "stty raw -echo min 1 time 1"; log "(raw mode)"; }
END { shell "stty sane"; log "(sane mode)"; }
 
sub logger { my($message) = @_; print "$message\n" }
loop {
push @INPUT, $TTY.getc unless @INPUT;
given @INPUT.shift {
when "q" | "\c4" { log "QUIT"; last; }
 
while (1) {
when "\r" { log "CR" }
if (my $c = ReadKey 0) { # read a single character
if ($c eq 'q') { logger "QUIT"; last }
elsif ($c =~ /\n|\r/) { logger "CR" }
elsif ($c eq "j") { logger "down" }
elsif ($c eq "k") { logger "up" }
elsif ($c eq "h") { logger "left" }
elsif ($c eq "l") { logger "right" }
 
whenelsif ($c eq "jJ") { loglogger "downDOWN" }
whenelsif ($c eq "kK") { loglogger "upUP" }
whenelsif ($c eq "hH") { loglogger "leftLEFT" }
whenelsif ($c eq "lL") { loglogger "rightRIGHT" }
 
whenelsif ($c eq "J\e") { log# "DOWN"handle a few escape }sequences
when "K" { log "UP"my }$esc = ReadKey 0;
when "H" { log "LEFT" } $esc .= ReadKey 0;
when if ($esc eq "L[A") { loglogger "RIGHTup" }
elsif ($esc eq "[B") { logger "down" }
 
when elsif ($esc eq "\e[C") { logger "right" }
myelsif ($esc =eq '';"[D") { logger "left" }
repeat until myelsif ($xesc ~~eq /^<alpha>$/"[5") { logger "page up" }
elsif ($esc eq "[6") push{ @INPUT,logger $TTY.getc"page unlessdown" @INPUT;}
else { logger "Unrecognized $xescape: = @INPUT.shift$esc"; }
$esc ~= $x;
}
given $esc {
when "[A" { log "up" }
when "[B" { log "down" }
when "[C" { log "right" }
when "[D" { log "left" }
when "[1;2A" { log "UP" }
when "[1;2B" { log "DOWN" }
when "[1;2C" { log "RIGHT" }
when "[1;2D" { log "LEFT" }
default { log "Unrecognized escape: $esc"; }
}
}
 
default { log "Unrecognized key: $_"; }
else { logger "you typed: $c"; }
}
}
}</lang>
 
ReadMode 0; # reset the terminal to normal mode</syntaxhighlight>
 
=={{header|Phix}}==
{{libheader|Phix/basics}}
===application===
{{libheader|Phix/pGUI}}
Shows how to link a specific key (C) to a specific function, and
a general key handler.
Obviously K_C and K_F2 could be swapped without any problem.
<!--<syntaxhighlight lang="phix">-->
<lang Phix>include pGUI.e
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">C_Keyed</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000080;font-style:italic;">/*c*/</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- (Note without K_c below this does not respond to 'c', just 'C')</span>
<span style="color: #0000FF;">?</span><span style="color: #008000;">"you pressed C"</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">F2_keyed</span><span style="color: #0000FF;">()</span>
<span style="color: #0000FF;">?</span><span style="color: #008000;">"you pressed F2"</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">key_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #000000;">K_F2</span> <span style="color: #008080;">then</span> <span style="color: #000000;">F2_keyed</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #004600;">K_ESC</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">IUP_CLOSE</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #7060A8;">IupOpen</span><span style="color: #0000FF;">()</span>
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">dlg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDialog</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"hello"</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"TITLE=\"Press F2\""</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupSetCallback</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"K_C"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"C_Keyed"</span><span style="color: #0000FF;">))</span>
<span style="color: #000080;font-style:italic;">--IupSetCallback(dlg, "K_c", Icallback("C_Keyed"))</span>
<span style="color: #7060A8;">IupSetCallback</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"K_ANY"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"key_cb"</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">IupShow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupMainLoop</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--</syntaxhighlight>-->
 
function C_Keyed(Ihandle /*ih*/, atom /*c*/)
-- (Note without K_c below this does not respond to 'c', just 'C')
?"you pressed C"
return IUP_DEFAULT
end function
 
procedure F2_keyed()
?"you pressed F2"
end procedure
 
function key_cb(Ihandle /*ih*/, atom c)
if c=K_F2 then F2_keyed()
elsif c=K_ESC then return IUP_CLOSE
end if
return IUP_DEFAULT
end function
 
IupOpen()
Ihandle dlg = IupDialog(IupLabel("hello"),"TITLE=\"Press F2\"")
IupSetCallback(dlg, "K_C", Icallback("C_Keyed"))
--IupSetCallback(dlg, "K_c", Icallback("C_Keyed"))
IupSetCallback(dlg, "K_ANY", Icallback("key_cb"))
IupShow(dlg)
IupMainLoop()
IupClose()</lang>
===system===
A low-level (windows 32-bit only) demo for system-wide keyboard macros,
Line 405 ⟶ 754:
of "keyboard macros" - though of course you could easily replace that
SendInput call with any routine of your choosing.
<!--<syntaxhighlight lang="phix">-->
<lang Phix>--
<span style="color: #000080;font-style:italic;">--
-- demo\arwendemo\hotkey.exw
-- demo\arwendemo\hotkey.exw
-- =========================
-- =========================
--
--
-- Author: Pete Lomax, credit to Aku Saya for HotKey
-- Author: Pete Lomax, credit to Aku Saya for HotKey
-- and Thomas Parslow for sendkeys
-- and Thomas Parslow for sendkeys
--
--
-- http://phix.x10.mx
-- http://phix.x10.mx
--
--
--/**/with gui
--/**/</span><span style="color: #008080;">with</span> <span style="color: #000000;">gui</span>
include arwen.ew
<span style="color: #008080;">include</span> <span style="color: #000000;">arwen</span><span style="color: #0000FF;">.</span><span style="color: #000000;">ew</span>
 
constant
<span style="color: #008080;">constant</span>
MOD_ALT = #1,
<span style="color: #000000;">MOD_ALT</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#1</span><span style="color: #0000FF;">,</span>
MOD_CONTROL = #2,
<span style="color: #000000;">MOD_CONTROL</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#2</span><span style="color: #0000FF;">,</span>
MOD_SHIFT = #4,
<span style="color: #000000;">MOD_SHIFT</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#4</span><span style="color: #0000FF;">,</span>
MOD_WIN = #8
<span style="color: #000000;">MOD_WIN</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">#8</span>
 
integer Modifier, vKeyCode
<span style="color: #004080;">integer</span> <span style="color: #000000;">Modifier</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">vKeyCode</span>
 
constant Main = create(Window, "Hotkey", 0, 0, 36, 99, 294, 201, 0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">Main</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Window</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Hotkey"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">36</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">99</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">294</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">201</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
constant MainHwnd = getHwnd(Main)
<span style="color: #008080;">constant</span> <span style="color: #000000;">MainHwnd</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">getHwnd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Main</span><span style="color: #0000FF;">)</span>
constant mFile = create(Menu,"File",0,Main,190,63,0,0,0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">mFile</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Menu</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"File"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span><span style="color: #000000;">190</span><span style="color: #0000FF;">,</span><span style="color: #000000;">63</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
constant mExit = create(MenuItem,"Exit",0,mFile,194,53,0,0,0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">mExit</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">MenuItem</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Exit"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mFile</span><span style="color: #0000FF;">,</span><span style="color: #000000;">194</span><span style="color: #0000FF;">,</span><span style="color: #000000;">53</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
constant mHelp = create(Menu,"Help",0,Main,182,57,0,0,0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">mHelp</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Menu</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Help"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span><span style="color: #000000;">182</span><span style="color: #0000FF;">,</span><span style="color: #000000;">57</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
constant mAbout = create(MenuItem,"About",0,mHelp,184,45,0,0,0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">mAbout</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">MenuItem</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"About"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mHelp</span><span style="color: #0000FF;">,</span><span style="color: #000000;">184</span><span style="color: #0000FF;">,</span><span style="color: #000000;">45</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
constant AltKey = create(CheckBox, "Alt", 0, Main, 8, 5, 62, 20, 0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">AltKey</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CheckBox</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Alt"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">62</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
constant ShiftKey = create(CheckBox, "Shift", 0, Main, 8, 28, 56, 20, 0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">ShiftKey</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CheckBox</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Shift"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">28</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">56</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
constant CtrlKey = create(CheckBox, "Ctrl", 0, Main, 8, 52, 70, 20, 0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">CtrlKey</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CheckBox</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Ctrl"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">52</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">70</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
constant WinKey = create(CheckBox, "Windows", 0, Main, 8, 76, 72, 20, 0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">WinKey</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CheckBox</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Windows"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">76</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">72</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
constant KeyList = create(ComboDropDown, "KeyList", 0, Main, 89, 11, 100, 652, 0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">KeyList</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ComboDropDown</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"KeyList"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">89</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">11</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">100</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">652</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
constant KeyInfoText = create(Label, "", 0, Main, 90, 72, 186, 20, SS_LEFTNOWORDWRAP)
<span style="color: #008080;">constant</span> <span style="color: #000000;">KeyInfoText</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Label</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">""</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">90</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">72</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">186</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">SS_LEFTNOWORDWRAP</span><span style="color: #0000FF;">)</span>
constant SetButton = create(Button, "setHotKey", 0, Main, 8, 99, 176, 40, BS_DEFPUSHBUTTON)
<span style="color: #008080;">constant</span> <span style="color: #000000;">SetButton</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Button</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"setHotKey"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">99</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">176</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">40</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">BS_DEFPUSHBUTTON</span><span style="color: #0000FF;">)</span>
constant KillButton = create(Button, "killHotKey", 0, Main, 195, 99, 80, 40, 0)
<span style="color: #008080;">constant</span> <span style="color: #000000;">KillButton</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">create</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Button</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"killHotKey"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">195</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">99</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">80</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">40</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
 
sequence KeyCodes
<span style="color: #004080;">sequence</span> <span style="color: #000000;">KeyCodes</span>
 
procedure initialise()
<span style="color: #008080;">procedure</span> <span style="color: #000000;">initialise</span><span style="color: #0000FF;">()</span>
string text
<span style="color: #004080;">string</span> <span style="color: #000000;">text</span>
for f=1 to 11 do -- F1 to F11 (F12 is reserved)
<span style="color: #008080;">for</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">11</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- F1 to F11 (F12 is reserved)</span>
text = sprintf("F%d",f)
<span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"F%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">f</span><span style="color: #0000FF;">)</span>
void = insertItem(KeyList,text,0)
<span style="color: #004600;">void</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">insertItem</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KeyList</span><span style="color: #0000FF;">,</span><span style="color: #000000;">text</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
KeyCodes = {VK_F1, VK_F2, VK_F3, VK_F4, VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_F10, VK_F11}
<span style="color: #000000;">KeyCodes</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">VK_F1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">VK_F2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">VK_F3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">VK_F4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">VK_F5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">VK_F6</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">VK_F7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">VK_F8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">VK_F9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">VK_F10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">VK_F11</span><span style="color: #0000FF;">}</span>
for ch='A' to 'Z' do
<span style="color: #008080;">for</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">=</span><span style="color: #008000;">'A'</span> <span style="color: #008080;">to</span> <span style="color: #008000;">'Z'</span> <span style="color: #008080;">do</span>
text = sprintf("%s",ch)
<span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%s"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">)</span>
void = insertItem(KeyList,text,0)
<span style="color: #004600;">void</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">insertItem</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KeyList</span><span style="color: #0000FF;">,</span><span style="color: #000000;">text</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
KeyCodes &= ch -- (as char, not string)
<span style="color: #000000;">KeyCodes</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">ch</span> <span style="color: #000080;font-style:italic;">-- (as char, not string)</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
for i=1 to 9 do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">9</span> <span style="color: #008080;">do</span>
text = sprintf("%d",i)
<span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
void = insertItem(KeyList,text,0)
<span style="color: #004600;">void</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">insertItem</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KeyList</span><span style="color: #0000FF;">,</span><span style="color: #000000;">text</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
KeyCodes &= i -- (as char, not string)
<span style="color: #000000;">KeyCodes</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">i</span> <span style="color: #000080;font-style:italic;">-- (as char, not string)</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
initialise()
<span style="color: #000000;">initialise</span><span style="color: #0000FF;">()</span>
 
constant INPUT_KEYBOARD=1
<span style="color: #008080;">constant</span> <span style="color: #000000;">INPUT_KEYBOARD</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span>
 
procedure pokeKey(atom pKey, integer key)
<span style="color: #008080;">procedure</span> <span style="color: #000000;">pokeKey</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">pKey</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">key</span><span style="color: #0000FF;">)</span>
-- see http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
<span style="color: #000080;font-style:italic;">-- andsee http://msdn.microsoft.com/en-us/library/windows/desktop/ms646271ms646270(v=vs.85).aspx
-- and http://msdn.microsoft.com/en-us/library/windows/desktop/ms646271(v=vs.85).aspx</span>
integer ScanCode
<span style="color: #004080;">integer</span> <span style="color: #000000;">ScanCode</span>
ScanCode = c_func(xVkKeyScan,{key})
<span style="color: #000000;">ScanCode</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xVkKeyScan</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">key</span><span style="color: #0000FF;">})</span>
poke4(pKey+KEYBDINPUT_type,INPUT_KEYBOARD)
<span style="color: #000000;">poke4</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pKey</span><span style="color: #0000FF;">+</span><span style="color: #000000;">KEYBDINPUT_type</span><span style="color: #0000FF;">,</span><span style="color: #000000;">INPUT_KEYBOARD</span><span style="color: #0000FF;">)</span>
poke2(pKey+KEYBDINPUT_wVk,key)
<span style="color: #000000;">poke2</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pKey</span><span style="color: #0000FF;">+</span><span style="color: #000000;">KEYBDINPUT_wVk</span><span style="color: #0000FF;">,</span><span style="color: #000000;">key</span><span style="color: #0000FF;">)</span>
poke4(pKey+KEYBDINPUT_dwFlags,0)
<span style="color: #000000;">poke4</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pKey</span><span style="color: #0000FF;">+</span><span style="color: #000000;">KEYBDINPUT_dwFlags</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
poke4(pKey+KEYBDINPUT_wScan,ScanCode)
<span style="color: #000000;">poke4</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pKey</span><span style="color: #0000FF;">+</span><span style="color: #000000;">KEYBDINPUT_wScan</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ScanCode</span><span style="color: #0000FF;">)</span>
poke4(pKey+KEYBDINPUT_time,0)
<span style="color: #000000;">poke4</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pKey</span><span style="color: #0000FF;">+</span><span style="color: #000000;">KEYBDINPUT_time</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
poke4(pKey+KEYBDINPUT_dwExtraInfo,0)
<span style="color: #000000;">poke4</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pKey</span><span style="color: #0000FF;">+</span><span style="color: #000000;">KEYBDINPUT_dwExtraInfo</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
 
function MainHandler(integer id, integer msg, atom wParam, object lParam)
<span style="color: #008080;">function</span> <span style="color: #000000;">MainHandler</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">id</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">msg</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">wParam</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">object</span> <span style="color: #000000;">lParam</span><span style="color: #0000FF;">)</span>
string text
<span style="color: #004080;">string</span> <span style="color: #000000;">text</span>
atom pKeys, pKey
<span style="color: #004080;">atom</span> <span style="color: #000000;">pKeys</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pKey</span>
integer nRes
<span style="color: #004080;">integer</span> <span style="color: #000000;">nRes</span>
 
if msg=WM_SETFOCUS then
<span style="color: #008080;">if</span> <span style="color: #000000;">msg</span><span style="color: #0000FF;">=</span><span style="color: #000000;">WM_SETFOCUS</span> <span style="color: #008080;">then</span>
if id=SetButton then
<span style="color: #008080;">if</span> <span style="color: #000000;">id</span><span style="color: #0000FF;">=</span><span style="color: #000000;">SetButton</span> <span style="color: #008080;">then</span>
if not getIndex(KeyList) then
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">getIndex</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KeyList</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
setFocus(KeyList)
<span style="color: #000000;">setFocus</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KeyList</span><span style="color: #0000FF;">)</span>
void = messageBox("HotKey","Select a key from the drop-down",MB_OK)
<span style="color: #004600;">void</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">messageBox</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"HotKey"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Select a key from the drop-down"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">MB_OK</span><span style="color: #0000FF;">)</span>
else
<span Modifier style="color: isChecked(AltKey) * MOD_ALT +#008080;">else</span>
<span style="color: #000000;">Modifier</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">isChecked</span><span style="color: #0000FF;">(</span><span style="color: #000000;">AltKey</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">MOD_ALT</span> <span style="color: #0000FF;">+</span>
isChecked(ShiftKey) * MOD_SHIFT +
<span style="color: #000000;">isChecked</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ShiftKey</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">MOD_SHIFT</span> <span style="color: #0000FF;">+</span>
isChecked(CtrlKey) * MOD_CONTROL +
<span style="color: #000000;">isChecked</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CtrlKey</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">MOD_CONTROL</span> <span style="color: #0000FF;">+</span>
isChecked(WinKey) * MOD_WIN
<span style="color: #000000;">isChecked</span><span style="color: #0000FF;">(</span><span style="color: #000000;">WinKey</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">MOD_WIN</span>
vKeyCode = KeyCodes[getIndex(KeyList)]
<span style="color: #000000;">vKeyCode</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">KeyCodes</span><span style="color: #0000FF;">[</span><span style="color: #000000;">getIndex</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KeyList</span><span style="color: #0000FF;">)]</span>
text = sprintf("setHotKey(Main, #%02x, #%02x) [%s]",{Modifier,vKeyCode,getText(KeyList)})
<span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"setHotKey(Main, #%02x, #%02x) [%s]"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">Modifier</span><span style="color: #0000FF;">,</span><span style="color: #000000;">vKeyCode</span><span style="color: #0000FF;">,</span><span style="color: #000000;">getText</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KeyList</span><span style="color: #0000FF;">)})</span>
setText(KeyInfoText, text)
<span style="color: #000000;">setText</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KeyInfoText</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">text</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
elsif id=KillButton then
<span style="color: #008080;">elsif</span> <span style="color: #000000;">id</span><span style="color: #0000FF;">=</span><span style="color: #000000;">KillButton</span> <span style="color: #008080;">then</span>
text = sprintf("killHotKey(Main) [%s]",{getText(KeyList)})
<span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"killHotKey(Main) [%s]"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">getText</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KeyList</span><span style="color: #0000FF;">)})</span>
setText(KeyInfoText, text)
<span style="color: #000000;">setText</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KeyInfoText</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">text</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
elsif msg=WM_COMMAND then
<span style="color: #008080;">elsif</span> <span style="color: #000000;">msg</span><span style="color: #0000FF;">=</span><span style="color: #000000;">WM_COMMAND</span> <span style="color: #008080;">then</span>
if id=mExit then
<span style="color: #008080;">if</span> <span style="color: #000000;">id</span><span style="color: #0000FF;">=</span><span style="color: #000000;">mExit</span> <span style="color: #008080;">then</span>
closeWindow(Main)
<span style="color: #000000;">closeWindow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Main</span><span style="color: #0000FF;">)</span>
elsif id=mAbout then
<span style="color: #008080;">elsif</span> <span style="color: #000000;">id</span><span style="color: #0000FF;">=</span><span style="color: #000000;">mAbout</span> <span style="color: #008080;">then</span>
text = "Simple hotkey/sendinput wrapper.\n\n"&
<span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Simple hotkey/sendinput wrapper.\n\n"</span><span style="color: #0000FF;">&</span>
 
"Author Pete Lomax.\n"&
<span style="color: #008000;">"Author Pete Lomax.\n"</span><span style="color: #0000FF;">&</span>
"Written in phix (http://phix.x10.mx) but could easily be ported\n"&
<span style="color: #008000;">"Written in phix (http://phix.x10.mx) but could easily be ported\n"</span><span style="color: #0000FF;">&</span>
"to any language (that can invoke RegisterHotKey and SendInput).\n\n"&
<span style="color: #008000;">"to any language (that can invoke RegisterHotKey and SendInput).\n\n"</span><span style="color: #0000FF;">&</span>
 
"First, use the checkboxes and dropdown to select a hotkey (eg F7).\n"&
<span style="color: #008000;">"First, use the checkboxes and dropdown to select a hotkey (eg F7).\n"</span><span style="color: #0000FF;">&</span>
"Currently always sends {delete,down}, but that could easily be changed.\n"&
<span style="color: #008000;">"Currently always sends {delete,down}, but that could easily be changed.\n"</span><span style="color: #0000FF;">&</span>
"Used on build02 to perform the GUID stripping.\n\n"&
<span style="color: #008000;">"Used on build02 to perform the GUID stripping.\n\n"</span><span style="color: #0000FF;">&</span>
 
"Note that Windows Server 2008 requires this to be run in admin mode, \n"&
<span style="color: #008000;">"Note that Windows Server 2008 requires this to be run in admin mode, \n"</span><span style="color: #0000FF;">&</span>
"as otherwise something called UIPI will block it and not say why.\n"
<span style="color: #008000;">"as otherwise something called UIPI will block it and not say why.\n"</span>
void = messageBox("HotKey",text,MB_OK)
<span style="color: #004600;">void</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">messageBox</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"HotKey"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">text</span><span style="color: #0000FF;">,</span><span style="color: #000000;">MB_OK</span><span style="color: #0000FF;">)</span>
elsif id=SetButton then
<span style="color: #008080;">elsif</span> <span style="color: #000000;">id</span><span style="color: #0000FF;">=</span><span style="color: #000000;">SetButton</span> <span style="color: #008080;">then</span>
-- see http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309(v=vs.85).aspx
<span style="color: #000080;font-style:italic;">-- see http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309(v=vs.85).aspx</span>
if c_func(xRegisterHotKey,{MainHwnd, 0, Modifier, vKeyCode})=0 then
<span style="color: #008080;">if</span> <span style="color: #000000;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xRegisterHotKey</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">MainHwnd</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Modifier</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">vKeyCode</span><span style="color: #0000FF;">})=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
void = messageBox("HotKey","Register Hotkey failed",MB_OK)
<span style="color: #004600;">void</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">messageBox</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"HotKey"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Register Hotkey failed"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">MB_OK</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
elsif id=KillButton then
<span style="color: #008080;">elsif</span> <span style="color: #000000;">id</span><span style="color: #0000FF;">=</span><span style="color: #000000;">KillButton</span> <span style="color: #008080;">then</span>
if c_func(xUnregisterHotKey,{MainHwnd, 0})=0 then
<span style="color: #008080;">if</span> <span style="color: #000000;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xUnregisterHotKey</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">MainHwnd</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">})=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
void = messageBox("HotKey","UnRegister Hotkey failed",MB_OK)
<span style="color: #004600;">void</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">messageBox</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"HotKey"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"UnRegister Hotkey failed"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">MB_OK</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
elsif msg=WM_HOTKEY then
<span style="color: #008080;">elsif</span> <span style="color: #000000;">msg</span><span style="color: #0000FF;">=</span><span style="color: #000000;">WM_HOTKEY</span> <span style="color: #008080;">then</span>
setText(Main,sprintf("%g",time()))
<span style="color: #000000;">setText</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%g"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()))</span>
pKeys = allocate(sizeofstruct(KEYBDINPUT)*2)
<span style="color: #000000;">pKeys</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">allocate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sizeofstruct</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KEYBDINPUT</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
pKey = pKeys
<span style="color: #000000;">pKey</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pKeys</span>
pokeKey(pKey,VK_DELETE)
<span style="color: #000000;">pokeKey</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pKey</span><span style="color: #0000FF;">,</span><span style="color: #000000;">VK_DELETE</span><span style="color: #0000FF;">)</span>
pKey += sizeofstruct(KEYBDINPUT)
<span style="color: #000000;">pKey</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">sizeofstruct</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KEYBDINPUT</span><span style="color: #0000FF;">)</span>
pokeKey(pKey,VK_DOWN)
<span style="color: #000000;">pokeKey</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pKey</span><span style="color: #0000FF;">,</span><span style="color: #000000;">VK_DOWN</span><span style="color: #0000FF;">)</span>
 
-- see http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx
<span style="color: #000080;font-style:italic;">-- see http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx</span>
nRes = c_func(xSendInput,{2,pKeys,sizeofstruct(KEYBDINPUT)})
<span style="color: #000000;">nRes</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xSendInput</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pKeys</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sizeofstruct</span><span style="color: #0000FF;">(</span><span style="color: #000000;">KEYBDINPUT</span><span style="color: #0000FF;">)})</span>
if nRes!=2 then
<span style="color: #008080;">if</span> <span style="color: #000000;">nRes</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span>
nRes = c_func(xGetLastError,{})
<span style="color: #000000;">nRes</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xGetLastError</span><span style="color: #0000FF;">,{})</span>
text = sprintf("SendInput failed[%d]",nRes)
<span style="color: #000000;">text</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"SendInput failed[%d]"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">nRes</span><span style="color: #0000FF;">)</span>
void = messageBox("HotKey",text,MB_OK)
<span style="color: #004600;">void</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">messageBox</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"HotKey"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">text</span><span style="color: #0000FF;">,</span><span style="color: #000000;">MB_OK</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if wParam or object(lParam) then end if -- suppress warnings
<span style="color: #008080;">if</span> <span style="color: #000000;">wParam</span> <span style="color: #008080;">or</span> <span style="color: #004080;">object</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lParam</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #000080;font-style:italic;">-- suppress warnings</span>
return 0
<span style="color: #008080;">return</span> <span style="color: #000000;">0</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
setHandler({Main,SetButton,KillButton,mExit,mAbout},routine_id("MainHandler"))
<span style="color: #000000;">setHandler</span><span style="color: #0000FF;">({</span><span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SetButton</span><span style="color: #0000FF;">,</span><span style="color: #000000;">KillButton</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mExit</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mAbout</span><span style="color: #0000FF;">},</span><span style="color: #7060A8;">routine_id</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"MainHandler"</span><span style="color: #0000FF;">))</span>
 
WinMain(Main,SW_NORMAL)</lang>
<span style="color: #000000;">WinMain</span><span style="color: #0000FF;">(</span><span style="color: #000000;">Main</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SW_NORMAL</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
 
=={{header|PicoLisp}}==
Line 555 ⟶ 906:
global variable, 'Up' and 'Down' arrows to increment or decrement that value,
and 'Home' to print the current value to the console.
<langsyntaxhighlight PicoLisplang="picolisp">(load "@lib/led.l" "@lib/term.l")
 
(fkey *XtF1
Line 567 ⟶ 918:
 
(fkey *XtHome
(prinl "Current value is " *Number) )</langsyntaxhighlight>
Output when hitting 'F1', 'Down', 'Up', 'Up' and 'Home':
<pre>Initialized value to 1
Line 578 ⟶ 929:
PureBasic has support for shortcut/macro creation in any window that supports events. This allows for creation of both single and combinations as shown in the code below.
For full set of combinations on PC, Mac & Linux please see the official manual, [http://www.purebasic.com/documentation/window/addkeyboardshortcut.html here].
<langsyntaxhighlight PureBasiclang="purebasic">#Win = 0
#Demo1 = 0
#Demo2 = 1
Line 603 ⟶ 954:
EndSelect
ForEver
EndIf</langsyntaxhighlight>
 
=={{header|Python}}==
Works on Unix platforms.
 
<langsyntaxhighlight lang="python">#!/usr/bin/env python
import curses
 
Line 629 ⟶ 980:
curses.echo()
curses.endwin()
</syntaxhighlight>
</lang>
 
=={{header|Racket}}==
 
<langsyntaxhighlight lang="racket">
#lang racket
 
Line 688 ⟶ 1,039:
macros '())]
[else (write-byte b) (flush-output) (loop inps v '())])))))
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" line>my $TTY = open("/dev/tty");
my @INPUT;
 
sub log($mess) { print "$mess\r\n" }
 
INIT { shell "stty raw -echo min 1 time 1"; log "(raw mode)"; }
END { shell "stty sane"; log "(sane mode)"; }
 
loop {
push @INPUT, $TTY.getc unless @INPUT;
given @INPUT.shift {
when "q" | "\c4" { log "QUIT"; last; }
 
when "\r" { log "CR" }
 
when "j" { log "down" }
when "k" { log "up" }
when "h" { log "left" }
when "l" { log "right" }
 
when "J" { log "DOWN" }
when "K" { log "UP" }
when "H" { log "LEFT" }
when "L" { log "RIGHT" }
 
when "\e" {
my $esc = '';
repeat until my $x ~~ /^<alpha>$/ {
push @INPUT, $TTY.getc unless @INPUT;
$x = @INPUT.shift;
$esc ~= $x;
}
given $esc {
when "[A" { log "up" }
when "[B" { log "down" }
when "[C" { log "right" }
when "[D" { log "left" }
when "[1;2A" { log "UP" }
when "[1;2B" { log "DOWN" }
when "[1;2C" { log "RIGHT" }
when "[1;2D" { log "LEFT" }
default { log "Unrecognized escape: $esc"; }
}
}
default { log "Unrecognized key: $_"; }
}
}</syntaxhighlight>
 
=={{header|REBOL}}==
<langsyntaxhighlight REBOLlang="rebol">REBOL [
Title: "Keyboard Macros"
URL: http://rosettacode.org/wiki/Keyboard_macros
Line 718 ⟶ 1,119:
pad 1x100 return
text "(c) 1977 G. Beker"
]</langsyntaxhighlight>
 
=={{header|Retro}}==
There is a global key handler which we can hook into to capture keys. As a fairly trivial example, remap the '''~''' key to clear the display.
 
<lang Retro>[ default: getc
[ '~ = ] [ drop clear 0 ] when
] is getc</lang>
 
Additional '''when''' conditions could be added to handle other keys. Clearing the key handler to restore its default functionality is done by doing:
 
<lang Retro>devector getc</lang>
 
=={{header|REXX}}==
Line 740 ⟶ 1,130:
<br><br>REXX programs not included are '''$T''' which is only used when specific options are used (used when TOPS is specified),
<br>the '''$ERR''' program which issues errors, and '''$H''' which shows '''help''' and other documentation.
<langsyntaxhighlight lang="rexx">/*REXX program can re-define most keys (including F keys) on a PC keyboard.*/
trace off
parse arg !
Line 1,339 ⟶ 1,729:
syntax: !sigl=sigl; call er 13,!FID(2) !FID(3) !sigl !cal() condition('D') sourceline(!sigl)
whenstamp: arg whenFID; call lineout whenFID,strip(left(date('U'),6)left(date("S"),4) time() arg(2)); call lineout whenFID,' '; call lineout whenFID; return
</syntaxhighlight>
</lang>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
load "guilib.ring"
 
Line 1,366 ⟶ 1,756:
on 16777265 see "You pressed F2 " + nl
off
</syntaxhighlight>
</lang>
Output:
<pre>
Line 1,377 ⟶ 1,767:
Here's a sample from the Shoes manual showing how to capture key sequences. This is application specific.
 
<langsyntaxhighlight lang="ruby">Shoes.app do
@info = para "NO KEY is PRESSED."
keypress do |k|
@info.replace "#{k.inspect} was PRESSED."
end
end</langsyntaxhighlight>
 
A more specific example, using some emacs bindings
 
<langsyntaxhighlight lang="ruby">Shoes.app do
keypress do |key|
case key
Line 1,408 ⟶ 1,798:
end
end
end</langsyntaxhighlight>
 
=={{header|Scala}}==
===Java Swing Interoperability===
{{libheader|Scala Java Swing interoperability}}
<lang Scala>import java.awt.event.{KeyAdapter, KeyEvent}
<syntaxhighlight lang="scala">import java.awt.event.{KeyAdapter, KeyEvent}
 
import javax.swing.{JFrame, JLabel, WindowConstants}
Line 1,435 ⟶ 1,826:
}
 
}</langsyntaxhighlight>
 
=={{header|Tcl}}==
{{libheader|Tk}}
All Tk bindings are bound to a context that is no wider than a particular application and is frequently smaller (e.g., a single dialog box or an individual widget).
<langsyntaxhighlight lang="tcl">package require Tk
# Show off some emacs-like bindings...
pack [label .l -text "C-x C-s to save, C-x C-c to quit"]
Line 1,446 ⟶ 1,838:
tk_messageBox -message "We would save here"
}
bind . <Control-x><Control-c> {exit}</langsyntaxhighlight>
===Key-to-key mapping macros===
A more direct macro-like facility (substituting one key sequence for another) would be:
<langsyntaxhighlight lang="tcl">bind . <F1> {
foreach c [split "Macro demo!" {}] {
event generate %W $c
}
}</langsyntaxhighlight>
This can then be wrapped up like this:
<langsyntaxhighlight lang="tcl">package require Tk
proc sendMacro {w string} {
foreach c [split $string {}] {
Line 1,470 ⟶ 1,862:
macro F2 "You pressed the F2 key"
macro F3 "I'm getting bored here..."
pack [text .t]; # A place for you to test the macros</langsyntaxhighlight>
 
=={{header|Vedit macro language}}==
<langsyntaxhighlight lang="vedit">// Configure a key to access menu item.
// The menu item may then contain the commands directly, or it may call a macro from disk.
// This has the advantage that the key binding is shown in the menu.
Line 1,491 ⟶ 1,883:
 
// Remove a key assignment. If INSERT option was used when the key was assigned, the old assignment will come in effect again.
Key_Delete("Ctrl-Shft-N")</langsyntaxhighlight>
 
=={{header|Wren}}==
{{trans|C}}
{{libheader|Xlib}}
<br>
As it's not currently possible for Wren-cli to access Xlib directly, we embed a Wren script in a C application to complete this task.
<syntaxhighlight lang="wren">/* Keyboard_macros.wren */
 
var GrabModeAsync = 1
var Mod1Mask = 1 << 3
var KeyPress = 2
 
var XK_F6 = 0xffc3
var XK_F7 = 0xffc4
 
foreign class XEvent {
construct new() {}
 
foreign eventType
}
 
foreign class XDisplay {
construct openDisplay(displayName) {}
 
foreign defaultRootWindow()
 
foreign grabKey(keycode, modifiers, grabWindow, ownerEvents, pointerMode, keyboardMode)
 
foreign ungrabKey(keycode, modifiers, grabWindow)
 
foreign keysymToKeycode(keysym)
 
foreign closeDisplay()
 
foreign nextEvent(eventReturn)
}
 
class X {
foreign static stringToKeysym(string)
 
foreign static lookupKeysym(keyEvent, index)
}
 
var xd = XDisplay.openDisplay("")
if (xd == 0) {
System.print("Cannot open display.")
return
}
var drw = xd.defaultRootWindow()
xd.grabKey(xd.keysymToKeycode(X.stringToKeysym("F7")), Mod1Mask, drw, true, GrabModeAsync, GrabModeAsync)
xd.grabKey(xd.keysymToKeycode(X.stringToKeysym("F6")), Mod1Mask, drw, true, GrabModeAsync, GrabModeAsync)
var e = XEvent.new()
while (true) {
xd.nextEvent(e)
if (e.eventType == KeyPress) {
var s = X.lookupKeysym(e, 0)
if (s == XK_F7) {
System.print("something's happened.")
} else if (s == XK_F6) {
break
}
}
}
xd.ungrabKey(xd.keysymToKeycode(X.stringToKeysym("F7")), Mod1Mask, drw)
xd.ungrabKey(xd.keysymToKeycode(X.stringToKeysym("F6")), Mod1Mask, drw)
xd.closeDisplay()</syntaxhighlight>
<br>
We now embed this Wren script in the following C program, compile and run it.
<syntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
#include "wren.h"
 
/* C <=> Wren interface functions */
 
void C_displayAllocate(WrenVM* vm) {
Display** pdisplay = (Display**)wrenSetSlotNewForeign(vm, 0, 0, sizeof(Display*));
const char *displayName = wrenGetSlotString(vm, 1);
if (displayName == "") {
*pdisplay = XOpenDisplay(NULL);
} else {
*pdisplay = XOpenDisplay(displayName);
}
}
 
void C_eventAllocate(WrenVM* vm) {
wrenSetSlotNewForeign(vm, 0, 0, sizeof(XEvent));
}
 
void C_eventType(WrenVM* vm) {
XEvent e = *(XEvent *)wrenGetSlotForeign(vm, 0);
wrenSetSlotDouble(vm, 0, (double)e.type);
}
 
void C_defaultRootWindow(WrenVM* vm) {
Display* display = *(Display**)wrenGetSlotForeign(vm, 0);
Window w = DefaultRootWindow(display);
wrenSetSlotDouble(vm, 0, (double)w);
}
 
void C_grabKey(WrenVM* vm) {
Display* display = *(Display**)wrenGetSlotForeign(vm, 0);
int keycode = (int)wrenGetSlotDouble(vm, 1);
unsigned int modifiers = (unsigned int)wrenGetSlotDouble(vm, 2);
Window w = (Window)wrenGetSlotDouble(vm, 3);
Bool owner_events = (Bool)wrenGetSlotBool(vm, 4);
int pointer_mode = (int)wrenGetSlotDouble(vm, 5);
int keyboard_mode = (int)wrenGetSlotDouble(vm, 6);
XGrabKey(display, keycode, modifiers, w, owner_events, pointer_mode, keyboard_mode);
}
 
void C_ungrabKey(WrenVM* vm) {
Display* display = *(Display**)wrenGetSlotForeign(vm, 0);
int keycode = (int)wrenGetSlotDouble(vm, 1);
unsigned int modifiers = (unsigned int)wrenGetSlotDouble(vm, 2);
Window w = (Window)wrenGetSlotDouble(vm, 3);
XUngrabKey(display, keycode, modifiers, w);
}
 
void C_keysymToKeycode(WrenVM* vm) {
Display* display = *(Display**)wrenGetSlotForeign(vm, 0);
KeySym k = (KeySym)wrenGetSlotDouble(vm, 1);
KeyCode code = XKeysymToKeycode(display, k);
wrenSetSlotDouble(vm, 0, (double)code);
}
 
void C_closeDisplay(WrenVM* vm) {
Display* display = *(Display**)wrenGetSlotForeign(vm, 0);
XCloseDisplay(display);
}
 
void C_nextEvent(WrenVM* vm) {
Display* display = *(Display**)wrenGetSlotForeign(vm, 0);
XEvent* pe = (XEvent*)wrenGetSlotForeign(vm, 1);
XNextEvent(display, pe);
}
 
void C_stringToKeysym(WrenVM* vm) {
char *string = (char *)wrenGetSlotString(vm, 1);
KeySym k = XStringToKeysym(string);
wrenSetSlotDouble(vm, 0, (double)k);
}
 
void C_lookupKeysym(WrenVM* vm) {
XKeyEvent *pke = (XKeyEvent*)wrenGetSlotForeign(vm, 1);
int index = (int)wrenGetSlotDouble(vm, 2);
KeySym k = XLookupKeysym(pke, index);
wrenSetSlotDouble(vm, 0, (double)k);
}
 
WrenForeignClassMethods bindForeignClass(WrenVM* vm, const char* module, const char* className) {
WrenForeignClassMethods methods;
methods.finalize = NULL;
if (strcmp(className, "XDisplay") == 0) {
methods.allocate = C_displayAllocate;
} else if (strcmp(className, "XEvent") == 0) {
methods.allocate = C_eventAllocate;
} else {
methods.allocate = NULL;
}
return methods;
}
 
WrenForeignMethodFn bindForeignMethod(
WrenVM* vm,
const char* module,
const char* className,
bool isStatic,
const char* signature) {
if (strcmp(module, "main") == 0) {
if (strcmp(className, "XEvent") == 0) {
if (!isStatic && strcmp(signature, "eventType") == 0) return C_eventType;
} else if (strcmp(className, "XDisplay") == 0) {
if (!isStatic && strcmp(signature, "defaultRootWindow()") == 0) return C_defaultRootWindow;
if (!isStatic && strcmp(signature, "grabKey(_,_,_,_,_,_)") == 0) return C_grabKey;
if (!isStatic && strcmp(signature, "ungrabKey(_,_,_)") == 0) return C_ungrabKey;
if (!isStatic && strcmp(signature, "keysymToKeycode(_)") == 0) return C_keysymToKeycode;
if (!isStatic && strcmp(signature, "closeDisplay()") == 0) return C_closeDisplay;
if (!isStatic && strcmp(signature, "nextEvent(_)") == 0) return C_nextEvent;
} else if (strcmp(className, "X") == 0) {
if (isStatic && strcmp(signature, "stringToKeysym(_)") == 0) return C_stringToKeysym;
if (isStatic && strcmp(signature, "lookupKeysym(_,_)") == 0) return C_lookupKeysym;
}
}
return NULL;
}
 
static void writeFn(WrenVM* vm, const char* text) {
printf("%s", text);
}
 
void errorFn(WrenVM* vm, WrenErrorType errorType, const char* module, const int line, const char* msg) {
switch (errorType) {
case WREN_ERROR_COMPILE:
printf("[%s line %d] [Error] %s\n", module, line, msg);
break;
case WREN_ERROR_STACK_TRACE:
printf("[%s line %d] in %s\n", module, line, msg);
break;
case WREN_ERROR_RUNTIME:
printf("[Runtime Error] %s\n", msg);
break;
}
}
 
char *readFile(const char *fileName) {
FILE *f = fopen(fileName, "r");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
rewind(f);
char *script = malloc(fsize + 1);
fread(script, 1, fsize, f);
fclose(f);
script[fsize] = 0;
return script;
}
 
int main(int argc, char **argv) {
WrenConfiguration config;
wrenInitConfiguration(&config);
config.writeFn = &writeFn;
config.errorFn = &errorFn;
config.bindForeignClassFn = &bindForeignClass;
config.bindForeignMethodFn = &bindForeignMethod;
WrenVM* vm = wrenNewVM(&config);
const char* module = "main";
const char* fileName = "Keyboard_macros.wren";
char *script = readFile(fileName);
WrenInterpretResult result = wrenInterpret(vm, module, script);
switch (result) {
case WREN_RESULT_COMPILE_ERROR:
printf("Compile Error!\n");
break;
case WREN_RESULT_RUNTIME_ERROR:
printf("Runtime Error!\n");
break;
case WREN_RESULT_SUCCESS:
break;
}
wrenFreeVM(vm);
free(script);
return 0;
}</syntaxhighlight>
 
{{omit from|ACL2}}
9,476

edits