Packed-runtime capability manifest, packed argument contract, and the cross-version upgrade matrix (Audit47 I11 / §13.2).
ahk-inputd
relied on an in-process SIGALRM handler to release
EVIOCGRAB when its loop stalled — a handler that cannot run
while the process is SIGSTOPped or wedged inside a syscall, so
a live-but-stopped broker kept every keyboard grabbed. Each grabbed device
now also has a forked lease process (visible as
ahk-inp-lease) holding a duplicate device fd, which releases
the grab unless the main loop heartbeats within 1.5 s; losing
supervision also fails open, and a device whose lease cannot be armed is
refused with an explicit message instead of being held unsupervised. The
SIGALRM watchdog remains as a second layer.tests/oracle/run_runtime_daemon_matrix_oracle.sh
pairs the real published linux.19 binaries (whose broker
predates protocol v2) with the build under test: it proves the old broker is
v1-only, the new one negotiates v2, all four runtime × daemon
pairings work, a runtime never reports a healthy/granted suppression lane
against a broker that cannot grant it, and a live runtime survives its
broker being swapped to a different release without changing PID.--pack now probes the
template it embeds (--pack-info) instead of assuming it
matches, prints an explicit notice when this runtime has a capability the
template lacks (today: consented libei/EIS injection), and embeds a
machine-readable manifest naming the release and capabilities that are
actually inside the produced executable. --version,
--pack-info and --diag report it, so a
capability difference is visible before deployment rather than as a late
runtime failure. A template that cannot declare its capabilities is an
explicit error, never a guess.A_Args) instead of
treating the first word as a replacement script path; --
forces forwarding and /script PATH keeps the override. Its own
switches (--version/--diag/--pack-info)
still win, and A_IsCompiled is now 1 for the whole packed
process lifetime rather than only when the embedded payload happens to be
the script being executed.ahk_core --version and
--diag name the port release (read from
tools/linux/VERSION at configure time), removing the previous
drift where only the launcher knew which release was installed.tests/oracle/run_upgrade_matrix_oracle.sh proves install
N-1 → upgrade to N (while a script is running) → downgrade to N-1
→ uninstall → fresh install of N, including prefix hygiene and
the launcher's stamped release. tools/linux/fetch-release-assets.sh
fetches and checksum-verifies the real published N-1 assets for CI.package run
means every release gate for that ref passed instead of a two-job
subset.SIGKILL fallback so a stopped lease
cannot block a fail-open transition, a lease that stops draining counts as
lost supervision (persistent EAGAIN is not "healthy") and
reports degraded health, the lease is armed before EVIOCGRAB,
the lease child closes descriptors 0-2 and resets inherited signal
dispositions, sAnyGrabbed is derived from armed leases rather
than file-descriptor count, the pack template path is canonicalized, the
reserved manifest name is refused as a FileInstall source, the writer
enforces the reader's 64 MiB bound, a lone -- forwards
zero arguments, and --pack-info in a packed binary reports the
embedded manifest verbatim.AutoHotkey Linux Audit47 closure and release qualification.
Repository hardening closure (check0905); doc-check totals synchronized.
Type=notify.INCR, strict
UTF-8 and MIME/checksum validation.Input safety and semantics closures (P0-1/P0-2/P0-3, M2a, M5, M6a, M7, P2-6, P2-10, P2-11); rich ClipboardAll; doc-check 1170/1170.
UI_SET_*/UI_DEV_CREATE result is checked;
runtime replay write failures release all grabs, broadcast
BACKEND_DEGRADED and set systemd
STATUS=degraded; two-phase EVIOCGKEY grab with
defer/retry removes stuck keys at the grab boundary. 12/12 fault
oracle.input_semantics.h) enforces the official strict
send_level > input_level rule for hotkeys/hotstrings,
MinSendLevel semantics for InputHook, hotstring level-0 buffer
exclusion, and hook-unloaded SendMode "Input"; hotkey
threads start at their InputLevel. 22/22 Windows-golden policy
oracle.AHK2 frames with HELLO/HELLO_ACK capability negotiation,
per-process script nonces bound to broker-assigned client ids,
authoritative provenance envelopes (authority/generation/event_seq,
send_level, transaction ids) on every broker event, machine-readable
errors, and v1 fallback. M4a adds broker-owned INJECT transactions
(BEGIN/EVENT/COMMIT/ABORT with TTL, quotas, crash auto-abort and
held-key balancing). Oracles: v2 protocol 25/25, injection 24/24,
arbitration 29/29.BackendHealth/RouteGuarantees; stale
generation updates are rejected; inputd publishes typed
BACKEND_HEALTH; the client walks
PROBING→BINDING→RESUBSCRIBING→RECONCILING→HEALTHY and preserves
registrations across broker SIGKILL/restart (23/23 oracle).AHK_INPUT_PIPELINE rollback gate (six
dedicated oracles).AHK_COM_CALL_TIMEOUT_MS); Wayland compositor
restarts tear down the whole proxy tree by generation and rebuild lazily
(real SIGKILL oracle); each §11.3 fault class is gated by its own
dedicated oracle.MB_ERR_INVALID_CHARS; invalid-UTF-8 IME commits are dropped
before any state update; IME state is mutex-protected; the framework
probe moved off script threads; the corpus oracle gates the full §22
grapheme/ZWJ corpus over real Fcitx5 D-Bus signals (startup race fixed
by holding the producer until the listener is ready).inline member
definitions were dropped (Object::Variant::ToToken,
Script::ConvertActionType); IME engine snapshots are
mutex-copied.GTK GUI event and rendering fixes; VS Code debugger reliability fixes.
PostMessage()
stub, so every Gui.OnEvent callback was silently dropped.
They now always enqueue on the native GTK queue drained by
GtkPump(). Control event callbacks also receive the correct
GuiControl first argument (previously the Gui),
so OnEvent("Click", (ctrl, *) => ctrl.Gui.Destroy()) works.app_paintable without a draw handler, leaving the whole
window unpainted and visually transparent. The default theme background
is now painted, and Gui.BackColor is applied to the window
so custom colors render (e.g. a solid green background).ahk2 under contributes.breakpoints, enabling red
breakpoint dots for .ahk/.ah2 editors. The DBGp
adapter already accepted breakpoint requests; 0.2.0 omitted the editor
capability declaration.DBGp is not connected error when a
short script already exited; the session tears down cleanly instead.
A missing/not-on-PATH runtime now fails the launch immediately with a
clear message instead of waiting for the DBGp init timeout.ahk launcher instead of ahk_core, and bare
names are resolved against /usr/bin,
/usr/local/bin and /bin, so system installs
debug out of the box.Hardened socket-activated ahk-inputd service release.
root:input 0660 socket. The daemon validates/inherits
LISTEN_FDS, audits SO_PEERCRED, handles fragmented/coalesced protocol
frames, restarts after SIGKILL and releases all grabs five seconds after
the final client while the socket remains available for demand restart.
Automatic core discovery trusts only the private XDG runtime dir and
managed /run, never /tmp. External launcher, real
systemd, core-client, full evdev/uinput and package lifecycle oracles pass.Input architecture, real desktop automation, VS Code debugger, differential reliability and complete examples release.
HotkeyBackendGet() and ahk_core --diag now expose
caps_version=2, scan-code/custom-combo/character-stream,
synthetic provenance strength, SendLevel gating and direct-Unicode fields.
The backend table and Linux documentation are generated from one source;
CI rejects drift.scXXX hotkeys work on X11 and evdev; InputHook reports
canonical VK/SC values; Send resolves Shift/AltGr bindings from the live
layout before borrowing a Unicode keycode. A deterministic external oracle
verifies physical sc01E across US/AZERTY and EuroSign on an
AltGr-only level.A & B, wildcard modifiers, key-up variants, tilde
passthrough and delayed/cancelled standalone-prefix hotkeys, including
explicit scan-code prefixes/suffixes. X11/portal/GNOME keep
custom_combo=false and reject registration until the M2 raw
event path can implement them without fragile passive grabs.send_event=False events;
Hotstring replacement uses exact Backspace counts instead of holding and
synthetically forwarding every key. Suppression requests stay on a
separate compatibility-grab lane.HotkeyBackendGet().mux
and --diag input-mux; runtime Hotkey changes differentially
start/stop lanes. A scenario proves XTEST F12 (X11) and a uinput
a & b (evdev) fire concurrently in the same script.ahk-inputd
daemon captures every keyboard with EVIOCGRAB, replays unconsumed keys via
a 0x0FAC virtual device and distributes length-prefixed v1 frames over a
UNIX socket to multi-client subscription rules (with per-key
want_suppress arbitration). Client crashes clean rules instantly; a
SIGALRM watchdog and the Backspace-Esc-Enter panic release grabs on a
stuck loop. An independent VM oracle proves distribution, replay,
suppression, client-crash cleanup and grab recovery after broker death.
The core client that consumes these frames lands with M4-C.AHK_INPUT_BACKEND=evdev the
core first tries the ahk-inputd socket (HELLO + SUBSCRIBE from the
EVDEV-assigned hotkey table, tilde clears suppression), consumes EVENT
frames through the same combo/scXXX matcher and falls back to the
in-process lane when no broker is reachable. Two scripts in one VM share
the broker stream and both fire a & b / c & d
without BadAccess. The shared protocol header lives in
inputd/inputd_proto.h.AHK_INPUT_BACKEND=evdev, the mux activates the
broker lane, subscribes text-producing keys (no suppression, matching the
M2-R backspace model) and decodes broker EVENT frames through the
three-layer model into the capture engine; XI2 raw skips capture in broker
mode to avoid double feeding. A VM oracle proves a
:B0X*:pq Hotstring fires from broker-distributed uinput
events. Pure Wayland still lacks a layout source for broker char_stream,
and the libei/InputCapture receiver remains upstream-gated._NET_CLIENT_LIST (real WM client windows), and falls
back to XQueryTree with an ICCCM WM_STATE subtree probe when
no window manager is present, keeping unmanaged test windows visible. An
independent oracle proves the EWMH list wins and the no-WM fallback stays
unchanged._NET_WM_PID, so windows this
script created can still use the semantics. Assertions moved to
NotSupported coverage (1135/17/230 totals).ControlGetText("OK","WintA") and ("OK","WintB")
resolve inside their own applications.org.a11y.atspi.Cache.GetItems once (500ms call budget) instead
of issuing GetChildren/Name calls per node. Unsupported and Qt old-signature
caches fall back per application. Each refresh has a 2s total deadline and
returns its partial table on expiry; diagnostics expose cache/fallback/item
and budget state. VM oracles prove cache, fallback and a 1ms fault-injected
timeout while preserving UTF-8 text results.ImeStatus() and
cross-context IBus/Fcitx5 listeners. Preedit rolls back/freeze the physical
phonetic suffix; only committed Unicode feeds Hotstring/InputHook and the
normalized IME_COMMIT event stream. A real GNOME IBus 1.5.32/libpinyin GTK
oracle proves nihao→你好, canceled-preedit
cleanliness and both consumers; CI validates the Fcitx5 InputContext1
protocol while real Fcitx/Flatpak E2E remains explicit. The status object
exposes framework, engine, preedit/listener scope and signal counters.focus (existing X11 focus/send/restore behavior) or
atspi. AT-SPI mode appends plain Unicode text to EditableText
without an X display and maps Enter/Space to Action; complex Send syntax is
rejected explicitly. CI covers the variable contract and a GNOME oracle
proves real Base-世界 text without focus fallback.x=10/y=15. D3 container trees now page
Array/Map/Object values; a 20-item Array across two pages, Map string keys
and a nested Object pass raw DBGp, external DAP and real VS Code tests.
Exception filters also stop a caught error at its throw line, expose its
Message and continue normally into catch. Persistent idle scripts can Pause
via the bounded Linux main-loop pump; an explicit no-active-frame entry
exposes Global scope without inventing a runtime stack. Linux D-Bus
compatibility objects expose only local adapter metadata (no hidden remote
calls) and typed values. Same-PID Detach/Reconnect uses a signal-safe
SIGUSR2 trigger for idle or running scripts; an IDE TCP crash leaves the
script alive for a later reconnect. VSC-2 D1-D3 is complete for this Linux
scope, and the VSIX stays in release checksums/artifacts.Wayland, packaging, interoperability and release-quality update:
A_HotkeyBackend / HotkeyBackendGet()), wlroots
Unicode injection through a private xkb keymap, evdev/uinput remaps and a
physical panic sequence which releases all EVIOCGRABs.--pack executables,
A_IsCompiled, embedded FileInstall resources and
Float/Double libffi callback ABI support.icon_main.ico /
ahk16.png, instead of a generic executable/terminal icon.check0820 direction-B core (round-37):
Hotkey() reaches the Wayland backends: the old
X-only guard (“no global hotkey protocol; use XWayland”)
made Hotkey() fail on every Wayland session before the
backend could be consulted. It now routes by the resolved input
backend (gnome-shell/portal/evdev) through
LinuxInputBackendSync(), with per-backend error surfacing
(verified live on GNOME 49).Activated sender check compared the signal sender against
the broker’s well-known name, but D-Bus delivers unique bus
names (:1.NNN); the handler now caches the broker’s
unique name (GetNameOwner, refreshed on NameOwnerChanged). The
extension’s own version-guard import (import {Config})
was broken on GNOME 49 (the module is a namespace export) - fixed to
import * as Config. VM-verified end-to-end: F12 and Ctrl+1
fire, and extension disable → enable re-registers automatically
(dedicated GNOME VM test scripts).ControlGetText,
ControlSetText and ControlClick now use the
org.a11y.atspi bus in Wayland sessions (text read / editable-text set /
Action.DoAction("click")); fixed the Control/WinTitle
parameter indexing and the session gate (GNOME Wayland with XWayland
present must still take the at-SPI path). Verified on a GTK3 app:
read label → click button → label changed.ImeGetState()
builtin returns framework|group (ibus/fcitx5 by session-bus
owner; current XKB group on X11). Preedit read, IME toggling and
wlroots input-method-v2 text delivery are recorded as out of scope with
the concrete reasons (mutter links no input-method symbols at all;
sway ships only v1 XML and no v2 backend) in
docs/IME-Integration.md; a client scaffold documents the
v2 bind shape.AHK_CLIPBOARD_TIMEOUT_MS
(default 2000) bounds the X11 SelectionNotify and Wayland
offer/receive waits; a slow app that only serves after 2.5 s times
out cleanly at the default and succeeds when the env is raised
(regression: assert_clipboard_slow, 4 assertions).audits/check0820.md.tools/linux/permissions/ ships the udev rule
(/dev/uinput 0666), the input-group setup for reading
/dev/input/event*, a polkit action for a future
privileged capture helper, and an install script (VM-verified).verify_report_numbers.sh).Reliability fixes from the check0820 review (round-36):
ll/oo), held-key auto-repeat and double-taps
fire the hotkey AND reach the foreground instead of being filtered by a
stale record. (Regression: assert_hotkey_pt adds a rapid
two-press ~F11 case.)AHK_UNICODE_BORROW_LEASE); a second AHK process
waits (bounded) or reports the character undeliverable instead of
overwriting the first process’s mapping mid-borrow. A crashed
process releases the lease automatically.AHK_WAYLAND_PASTE=0, warns once before
first use (sensitive text/password managers), and its wait is tunable
via AHK_WAYLAND_PASTE_TIMEOUT_MS.Send/Mouse* can
now fall back to a persistent uinput virtual keyboard/pointer when the
compositor has no virtual-keyboard protocol (GNOME/KWin; needs
/dev/uinput access, e.g. the input group);
AHK_UINPUT=0 disables it. Non-ASCII Send on
such compositors uses the paste fallback whenever a lane can deliver the
Ctrl+V.shell-version
now declares 45–50 (the grab_accelerator +
allowKeybinding API surface is stable across the series); a
runtime warning is logged when loading on a major other than the
verified 49.ahk --update <VER>),
each with a CKSUMS.txt (SHA-256) generated by
pack.sh and verified in CI.verify_report_numbers.sh).Unicode text input (round-34): SendText/Send and hotstring replacements now deliver non-ASCII characters (Chinese, Japanese, Korean, accented Latin, Emoji) on X11/XWayland via Unicode keysym transmission (a spare keycode is temporarily remapped when the layout has no binding, xdotool-style, with race fixes for late event consumers and a process-local FIFO borrow log); on pure Wayland (wlroots) non-ASCII runs use the controlled clipboard-paste fallback; compositors without a virtual keyboard (e.g. GNOME) raise a clear error naming the character instead of silently dropping it. Also fixes the Wayland virtual-keyboard letter keycodes (evdev letters are QWERTY-ordered; KEY_A + offset mapped 'V' to KEY_COMMA, which broke the paste path's Ctrl+V).
InputHook notifications: OnChar/OnKeyDown/OnKeyUp are now delivered (Windows semantics: VK/SC for keys, SC = X11 keycode; the character for OnChar, Unicode included), queued by the capture engine and fired from the main-loop dispatch. Hotstrings match Unicode trigger words character-for-character.
GNOME Shell backend hardening: activations are directed to the registering owner (never broadcast), hotkey ids are owner-scoped (<unique-bus-name>/<hotkey>), ClearOwner takes no owner argument (the caller's own unique name is used), only Activated is consumed, registrations use batch methods (RegisterMany/UnregisterMany) with bounded timeouts, and the event queue is dynamic with overflow counting.
Configuration correctness: AHK_FORCE_GLOBAL_SHORTCUTS only treats 1/true/yes/on as true; unknown AHK_INPUT_BACKEND values print a clear startup warning. Reporting: assertion counts in CHECK_REPORT.md are now machine-verified against the expect files by tests/doccheck/verify_report_numbers.sh in CI (doc-check 1063/1063, regression 27/27, Wayland 15/15, XWayland 247/247). The project is positioned as a technology preview; see Linux Port for the compatibility matrix and roadmap (evdev/ahk-inputd, IME, AT-SPI), and the credits for AHK_X11.
Unified input backend (AHK_INPUT_BACKEND=auto|x11|portal|gnome-shell|evdev) and a new GNOME Shell extension backend for GNOME 49 Wayland: zero-confirmation exclusive global hotkeys (1::/^1::/F12:: grab the physical key with no per-binding dialog), automatic re-registration after a shell/extension reload, and fail-open release on exit or crash. The XDG Global Shortcuts Portal backend stays the standard fallback (KDE/other Wayland); AHK_FORCE_GLOBAL_SHORTCUTS=1 keeps its documented meaning.
Launcher rework: commands are now -- prefixed (ahk --version shows the release, e.g. v2.0.26-linux.12; ahk --check verifies integrity/install method/latest release; ahk --uninstall; ahk --update [VER]) so plain names like update.ahk are always run as scripts. The Debian package now ships the full launcher instead of a bare exec, and its postrm cleans up any launcher residue left behind by dpkg-mismatched files (e.g. a wrapper clobbered by a tarball install), so apt remove never strands an ahk command. Older releases with outdated launchers were removed from the Releases page — only the latest release is published, so ahk --update can never install a version whose launcher lacks these commands.
Official release: MsgBox/ToolTip rendering fixed under a window manager; the ahk launcher gains uninstall and update [VER]; documentation site language switcher fixed and install guide rewritten for Linux; old Release packages cleaned up (latest converges on linux.11).
InputHook real-time key capture (capture engine feeds keys live; buffer/end-key/match/cap/backspace-undo/suppression), CollectChar, GetEndReason.
Hotstrings implemented for real (full capture-engine hold/flush/match, C/*/O/X options, case-follow, HotIf, end characters).
Left/right modifier keys and wildcard hotkeys, hash-indexed hotkey resolution, XI2 raw-event observer.
Reload implemented for real (exit reason "Reload"), hotkey audit first batch (isolated hotkey display, grab diff + XUngrabKey on Off/Suspend, BadAccess conflict reporting), GIF/CUR/JPEG image decoding, mouse hotkeys.
Hotkey audit second batch; dynamic modifier map; coverage completion for the docs worklist.
For the full per-module status report see CHECK_REPORT.md.
Fixed ControlGetItems/ControlGetChoice not throwing for Tab controls.
Fixed error reporting for ComObjArray().__Enum(), if it ever fails.
Fixed TraySetIcon("HBITMAP:" handle) without *.
Fixed ByRef alias to global var becoming unset in recursive calls.
Fixed error raised by Hotkey() not transferring control correctly.
Fixed navigation with Tab key in a Gui with a nested Gui (+Parent).
UX/DashAdded an optional check for AutoHotkey updates, disabled by default. [based on UX PR #11 by kczx3]
Fixed errors being raised when arrow keys are used in the Help Files menu. [UX PR #24 by iPhilip]
Fixed install-version.ahk to delete the temporary ".staging" directory after installing an upgrade.
Fixed Help Files menu to be displayed at the button, not at the mouse cursor.
Changed "New script" to add the file to recent files.
Changed how key-up events are correlated to key-down events for the purpose of determining whether to suppress key-up. A key-down with SendLevel between 1 and 7 now only correlates with a key-up of the same level. When #InputLevel 1 is in effect, this fixes Right::Send "{Right}" not suppressing key-up, RShift::RAlt interfering with RAlt::RShift and vice versa. Events with SendLevel 8 and above are still grouped with non-sent events for practical reasons.
Fixed WinExist("A",,,"B") to not exclude windows which have no controls.
Fixed custom combo hotkeys with neutral modifiers (e.g. Alt & Esc::) [broken by v2.0.22].
Fixed key-up hotkeys to fire consistently when the key is used as both a prefix and a suffix (e.g. a & b::, b & a:: and a up::).
Fixed timers interrupting MsgBox after the timeout starts but before the window is shown, such as if SetTimer(MsgBox, -10) is used immediately before MsgBox(1,,"T1").
Removed the undocumented effect that a hotkey with the </> prefix had on the corresponding modifier key; e.g. <^a:: causing LCtrl:: to fire on release, inconsistent with the documentation. Always firing on press provides greater consistency and flexibility. The modifier key itself was suppressed since v2.0.20. Neutral modifiers such as Ctrl:: always fire on release, and similar behaviour can be implemented with A_PriorKey and ~LCtrl up::.
Changed error dialogs to use msftedit.dll instead of riched20.dll to fix the following issues:
Fixed errors within __Delete being suppressed if a Try/Catch is active.
Fixed CallbackCreate to validate ParamCount.
Fixed detection of DllCall(... "str",&var:={} ...) as an error.
Fixed CapsLock:: to suppress even if CapsLock is used as a prefix key.
Fixed neutral Ctrl/Alt/Shift hotkeys to not suppress the key [broken by v2.0.20].
Fixed fire-on-release behaviour of neutral Ctrl/Alt/Shift hotkeys when a key-up variant is turned on but disabled by #HotIf.
Fixed CapsLock & 1:: to revert CapsLock state even if another prefix key is pressed before CapsLock is released.
Fixed L/R modifier key-up not being suppressed in some cases where key-down was suppressed.
Fixed L/R modifier key-up to be passed through if ~ is used even if key-down was suppressed.
Fixed L/R modifier hotkeys to fire on press even if the corresponding neutral modifier is present; e.g. LCtrl:: with Ctrl::.
Fixed corruption of unquoted continuation sections with trailing spaces.
Fixed file stream I/O to flush cached writes if the file hasn't been closed when the process exits.
Fixed `; in continuation sections with the ` (literal escape) and C (comment) options.
Cleaned up some code within the keyboard/mouse hook.
Fixed StrGet crashing when given an address and not a length. (Broken by v2.0.20)
Fixed potential undefined behaviour in message callbacks during script termination.
Fixed Run not closing the process handle.
Fixed GuiFromHwnd crashing if passed another script's GUI window HWND.
Fixed leading space in For( a in b ) incorrectly raising an error.
Fixed enumerator calls (For) treating implicitly returned "" as true.
Fixed A_maxHotkeysPerInterval and A_Hotkeyinterval returning incorrect values if spelled in lower case.
Fixed FileSelect duplicating the filter pattern if it lacks *..
Fixed ListBox tab-stop spacing when T option is used during control creation. [PR #346]
Fixed ~RAlt & <:: causing RAlt:: to fire on release despite ~ (and likewise with other L/R modifier keys).
Fixed remap with nonexistent source key causing silent exit.
Fixed key-up hotkey causing unwanted passthrough when modifiers don't match. e.g. RButton release not being suppressed after activating RButton:: if ^RButton up:: was also present.
Fixed semicolon in /* ; */ preventing the block comment from ending.
Fixed IsOptional and IsByRef return values for built-in methods.
Fixed RegWrite parameter 1 to be mandatory.
Fixed string return value being corrupted during debugging.
Fixed erroneous Else placement to raise an error, not crash on load.
Fixed StrPut/StrGet handling of 32-bit integer limits on x64.
Fixed 1:: to not fire after 1 & LButton up:: is used, and similar.
Fixed crash when ListView has the Sort option and Add is called with Col1 omitted.
Fixed static functions not using static variables of grandparent functions.
Fixed unpaired key-up hotkey not suppressing the key if it is also used as a prefix but the custom combos are disabled or have the tilde modifier.
Fixed L/R modifier hotkeys to suppress even if the corresponding neutral modifier is present; e.g. LCtrl:: with Ctrl::.
Fixed memory out-of-bounds access during RegEx compilation.
Fixed externally-released modifiers to not be "restored" post-Send.
Fixed modal dialog boxes suppressing InputHook events.
Fixed key-up erroneously being suppressed after key-repeat presses it down in some cases.
Fixed Critical Error when loading large icons with no alpha channel.
Fixed MouseGetPos to make Control blank and not throw if ClassNN cannot be determined.
Fixed FileSelect to validate Options.
Fixed unexpected Catch/Else/Finally/Until not being flagged as an error in some cases.
Fixed Try/Catch/Else/Finally not executing Finally if Else returns.
Fixed execution of if-else-if-else-if containing fat arrow functions.
Fixed A_Clipboard silently exiting when GetClipboardData returns NULL.
Fixed a.b[c] := d to invoke the getter for a.b if there is no setter.
Implemented an optimization to the WinText parameter by Descolada. [PR #335]
Changed UnsetError message to suggest a global declaration instead of appending "(same name as a global)" after the variable name.
Changed VarUnset warning message for consistency with UnsetError.
Fixed the increment/decrement operators to throw UnsetError if the var is unset, not TypeError.
Fixed OwnProps to assign the property name safely in cases where a property deletes itself.
Fixed breakpoints to work in arrow functions under a control flow statement without a block.
Fixed debugger to break at the line of the call when stepping out of a function. (This behaviour was added in Revision 31 and broken by v1.1.30.00.)
Stepping out of a function which was called as a new thread now breaks at the line which was interrupted, instead of waiting until the next line is reached.
Fixed debugger to not delete temporary breakpoints which are ignored while evaluating DBGp property_get or context_get.
Fixed load-time errors sent to stdout showing incorrect file/line number in some cases.
Fixed ExitApp on load-time error/warning dialogs to use exit code 2.
Fixed locating WindowSpy.ahk in Current User (non-admin) installs.
Fixed DBGp property_get paging items incorrectly (again).
Fixed StrPut failing if Length/Buffer is specified and MultiByteToWideChar doesn't support the WC_NO_BEST_FIT_CHARS flag for the target codepage.
Fixed Download to attempt anonymous authentication if the server requests client authentication.
Fixed DBGp property_get failing to retrieve properties due to incorrect paging (since v2.0.14).
Fixed DBGp property evaluation causing Try without Catch to fail (since v2.0.14).
Fixed <base> debugger pseudo-property leaking a reference (since v2.0.14).
Fixed the error dialog to handle letter key shortcuts even when text is focused.
Fixed MonthCal W-n (number of month) width values to not be affected by DPI scaling.
Fixed Click to not return an integer.
Fixed detection of key::try { as an error.
Fixed :B0*O:XY::Z to produce XYZ rather than XZ (suppressing Y).
Fixed Send to leave any prior {modifier Down} in effect even if the key happens to be physically held down.
Improved the reliability of the script taking focus when a menu popup is shown.
Debugger improvements:
Fixed stdout/stderr packets sent during the processing of another command to not corrupt the pending response.
Fixed property_get -n <exception>.message and similar.
Fixed corrupted results from property_get when a property returns a temporary object with a string, such as x.y.z where y => {z:"a"}.
Fixed crashes when an asynchronous command is received during the processing of another command.
Fixed exceptions not being deleted after they are suppressed via property_set.
Fixed property_get -c 0 -d 0 to allow global variables, as already allowed by -d 1.
Fixed property_get paging enumerated items incorrectly.
Improved property_get to support property getters with one parameter (previously only the implicit __Item property supported this).
Improved property_get to support properties of primitive values. The value must still be contained by a variable or returned from a property.
Improved property_get to allow calling functions with <=1 parameter.
Improved property_get to support float keys/parameters.
Changed debugger to suppress exceptions during property evaluation.
Changed debugger to ignore errors thrown by __Enum (treat as no items).
Changed the <enum> pseudo-property to require __Enum. This prevents the object itself from being called as an enumerator.
Small code size optimizations in the debugger.
Changed Hotkey function to throw ValueError if Options contains an invalid option.
Fixed InputHook to respect the +S option for Backspace when acting as undo.
Fixed debugger to safely handle property deletion during enumeration.
Fixed OLE clipboard content (e.g. error dialog text) being lost on exit.
Fixed detection of invalid suffix on a hotkey, such as Hotkey "a pu".
Fixed DllCall AStr* arg type to copy back only if address changes.
Fixed #Include to correctly "close" any built-in variable it reads (no known impact on real-world scripts).
Fixed WinTitles with two different ahk_id values to yield no match.
Fixed Gui GetPos/GetClientPos when Gui has an owner window or +DPIScale.
Fixed Until preventing subfolder recursion in file loops.
Fixed DllCall to throw when arg type is UStr.
Fixed a memory leak occurring for each regex callout.
Fixed Send erroneously releasing a modifier due to a race condition. For example, ~LAlt::Send "{Blind}x" intermittently released LAlt if some other keyboard hook was installed more recently than the script's own hook.
Fixed icon loader to prefer higher bit-depth when multiple bitmaps of the same size are present.
Fixed SendInput failing to release LCtrl if it had already released RAlt and the layout does not have AltGr.
Fixed key-up hotkeys not firing if the key repeats after modifiers change. For example, F1::Send "{Ctrl down}" should allow F1 up:: to execute when the key is released even though Ctrl is down, but was not allowing it after key-repeat occurs.
Fixed an error message to refer to #HotIf rather than #IfWin. [PR #327]
Fixed OwnProps erroneously skipping properties with optional parameters.
Fixed inconsistent behaviour of cloned dynamic properties.
a.b[c] to evaluate as (a.b)[c]).Fixed SysGetIPAddresses causing a Critical Error when the network subsystem is non-functional; e.g. in Windows safe mode.
Changed ControlGetFocus to return 0 when focus can't be determined, such as when a console window is active.
Added a workaround for the first shown menu not accepting keyboard input on Windows 10.
Fixed the Add method (Gui) to support the ShortDate option for DateTime controls.
Fixed a reference counting error with multi-level function nesting.
Fixed #include <x> causing a load-time crash if used inside a function.
Fixed ListView.Opt("NoSort").
Fixed a memory leak occurring when an object with no own properties is cloned.
Fixed #include and FileInstall (non-compiled) to compare file names ordinally, not linguistically.
Fixed crashing when a named function hotkey is used after #HotIf.
Fixed numeric literals ending with a dot to not cause line continuation.
Fixed pre-increment/decrement to work with chained array indexing.
Fixed OnNotify/OnCommand applying styles only applicable to OnEvent.
Fixed FileExist/DirExist leaking handles when emptydir\* is used.
Fixed DirExist leaking handles when only files match.
Fixed stacking of hotstrings with the X option.
Fixed debugger not listing local vars if the function is at the bottom of the stack.
Fixed Gui threads to show on the debugger's call stack.
Fixed some combinations of &/ByRef causing stack overflow in ExitApp.
Fixed ByRef parameters erroneously assigning the default value to the caller's VarRef if unset.
Fixed some issues affecting suppressed Alt/Ctrl/Shift/Win hotkeys, such as:
*LCtrl:: blocked LCtrl from the active window, but sending Alt-key combinations would fail because the system thinks Ctrl is down, and would therefore send WM_KEYDOWN instead of WM_SYSKEYDOWN.*LAlt:: caused the system to forget any prior {LAlt DownR}, so a remapping such as LCtrl::LAlt would not behave correctly while LAlt is physically down, even though LAlt was suppressed.Fixed some issues affecting continuation sections:
```` to become one literal ` instead of two, ``n to become a linefeed, and similar.`" or `' produced a literal backtick and ended the string, instead of producing a literal quote mark, if the continuation section was enclosed in quotes of the same type and lacked the ` option.Optimized the automatic escaping of quote marks and backtick in continuation sections.
Fixed breakpoint_list (debugger) returning duplicates on lines containing fat arrow functions.
Fixed +BackgroundDefault failing to override the Gui's BackColor property.
Fixed MouseClickDrag to allow X1 and Y1 to be omitted.
Fixed mouse AltTab hotkeys not suppressing execution of a prefix hotkey, such as 1:: for 1 & WheelDown::AltTab. (Broken by v2.0.4)
Fixed hook hotkeys not recognizing modifiers which are pressed down by SendInput.
Fixed A_AhkPath to not be reliant on the case/format of the command line used to launch the process.
Fixed heap corruption during window searches involving groups. (Broken by v2.0.6)
Launcher
Fixed #Requires not being detected if followed by a comment other than ; prefer xxx. (Broken by v2.0.6)
Fixed syntax detection misinterpreting multi-line auto-replace hotstrings.
Window Spy
Changed font to Segoe UI size 9, consistent with Dash.
Fixed some ambiguity with COM calls, such as x.y acting as x.y().
Fixed breakpoint on control flow statement being "hit" when a fat arrow function on the line below it returns.
Fixed Default : to not merge with the line below it. This prevented Default : from being used at the end of a Switch block, and caused any subsequent line to take the line number of the Default.
Optimized ProcessGetPath, ProcessSetPriority and ProcessClose to not scan through all processes when given a valid PID, even if access to the process is denied.
Fixed inability of LWin::Alt to be used to activate some Alt key combos.
Fixed TypeError thrown by x is y to say "Class" rather than "Object".
Fixed WinTitle to support criteria longer than 1023 characters.
Fixed issues when &ref is used on different aliases of the same variable.
Fixed optional parameter default expressions (other than simple literal values) preventing the use of assume-global/assume-static.
Fixed a memory leak caused by incorrect reference counting when an object is enumerated via COM. [PR# 325]
Fixed internal calls to __Enum to not call __Call.
Fixed error messages referring to parameter #65535.
Fixed incorrect IEnumVARIANT return count.
Fixed Download throwing OSError(0) when error should be non-zero.
Fixed LV.Add/Insert/Modify crashing when passed the minimum number of parameters.
Fixed stack traces to exclude calls to __new for Error subclasses.
Changed the Reload button on error/warning dialogs to explicitly close the dialog, even if the current script instance isn't terminated.
Removed an optimization for return var which caused the variable to appear blank when accessed within a finally block.
Fixed Default (Switch) to allow space before the colon.
Fixed Array.Prototype.RemoveAt to return the removed value when Length is "explicitly omitted" with unset or var?.
Fixed crashing when a ComObject is passed to a for-loop with only the second variable specified.
Changes merged from v1.1.37.00 and v1.1.37.01:
Changed COM method and property calls to pass large integers as VT_I8, not VT_R8 (floating-point), so the original type and precision is retained. Integers in the 32-bit range are still passed as VT_I4.
Added support for multi-variable enumerators (for-loops) with IDispatch-wrapped AutoHotkey objects. Both the script invoking the object and the object itself must be running a supported AutoHotkey version.
Fixed omitted parameters to receive their default values rather than the "optional argument marker" when an AutoHotkey method is called via IDispatch (COM). The reverse translation was already done when calling COM methods in previous versions.
Fixed VerCompare(a, ">" b) and reduced code size marginally.
Fixed AltTab-related load-time errors to be consistent with other errors.
Fixed errors thrown by a ComObject wrapper not being propagated correctly if it is called via an object/COM.
Fixed the Hotkey GUI control to allow setting the symbols ^, ! and + as hotkeys.
Fixed the Hotkey control to include modifiers when its value is set to a symbol.
Fixed potential misbehaviour of InputHook.KeyOpt() with single chars.
Fixed a bug with custom combos where a set of hotkeys like a & b::, a:: and a up:: would fail to suppress the release of a if a:: alone is disabled with #HotIf.
Fixed a bug where a key-down event is correctly suppressed by a hotkey, but sending an additional key-down with SendLevel > 0 would prevent the subsequent key-up from being suppressed, even if the sent event is ignored due to #InputLevel.
Fixed a & b up:: not suppressing b if a & b:: is present but disabled by #HotIf.
Fixed an issue with hotkeys not firing due to a race condition. If a modifier hotkey such as ~*RWin:: called Send or GetKeyState too soon, the OS could report that RWin isn't down, so the hook's modifier state would be "corrected" and hotkeys would wrongly fire or fail to fire. This was likely to occur only if another keyboard hook was installed more recently than the script's own hook, since in that case the OS would not update key state until the other hook's thread has resumed and returned.
Fixed hotstrings to use the Last Found Window set by #HotIf.
Fixed an issue where any attempt to reinstall the keyboard or mouse hook would fail if the OS had automatically uninstalled the hook. It is still necessary to meet certain conditions before any such attempt can be made.
Optimized allocation of cached COM property names for built-in IDispatch.
Refactored code to support a build configuration for AutoHotkey as a DLL.
Fixed Hotkey("a", "b") to use the original function of "b", not "a". [PR #318]
Fixed FileSetAttribute crash when used in a File Reading Loop. [PR #323]
Fixed duplicate Gui control name errors to correctly abort the thread.
Fixed DateTime/MonthCal Range option not applying minimum value.
Fixed s[x] => x and other single-line properties starting with "s".
Fixed a bug with deleting a breakpoint on a static line containing =>.
Fixed Button control not becoming default when clicked.
Fixed PixelSearch to unset X when pixel is not found.
Fixed hotstring with escape sequence causing next line to be skipped.
Fixed WinTitle ignoring character 1 when "ahk_" is at character 2.
Fixed remapping to utilize right-hand modifier already being down. For example, +x::+y will no longer release RShift to press LShift.
Changed error message for a == b && c() and similar cases to avoid alluding to legacy =.
Improved error message for some cases of unintended line continuation.
Fixed reserved words to be permitted as method names, as documented.
Fixed duplicate OnMessage calls for some keyboard messages.
Fixed inter-referenced closures being deleted prematurely.
Fixed SetFont to permit leading spaces in the Options parameter.
Fixed sending of {ASC nnnn}.
Fixed a.base := a to throw an error.
Fixed x.y := unset causing crashes or undefined behaviour.
Fixed GuiControl.Move() to be relative to the GUI's client area even when the GUI is not its parent.
Fixed Menu Add overwriting items which were appended by Menu Insert.
LauncherRun Dash instead of showing the old Welcome page in the documentation, when run without parameters.
Fixed version selection GUI raising an error if Enter is pressed without selecting a version. [PR UX/#4]
Suppress errors when checking whether an absent version can be downloaded.
Fixed absent version download prompt to not show the UAC shield if UAC is disabled.
Fixed issues with #Requires interpretation.
> >= < <= =).Fixed the default installation directory for command-line use.
Renamed the Start menu shortcut from "AutoHotkey" to "AutoHotkey Dash".
Fixed EnableUIAccess when running as SYSTEM.
Fixed EnableUIAccess to verify the private key when selecting a certificate.
DashFixed Launch Config GUI to update the "Run as administrator" and "Run with UI access" options.
Fixed Up/Down key handling in the Launch Config GUI.
Fixed Short DllCall arg type and undefined behaviour for invalid types.
Fixed (non-string) file version number for AutoHotkey binaries.
Fixed parameter type errors to show the correct parameter number.
Fixed Func.IsOptional(1) returning 0 in some cases where it shouldn't.
Fixed Gui event handler functions to not drop the Gui parameter when the Gui is its own event sink.
Fixed COM errors to not show "(null)" when no description is available.
Fixed ToolTips intermittently appearing at the wrong position.
Fixed __Enum(unset) to permit a second variable for Array, Match and Gui.
Fixed #include <> error messages to show "Script library" rather than "Function library".
Fixed new threads being unable to prevent a message check with Critical.
Optimized conversion of DllCall type names.
Made some trivial but effective code size optimizations.
For a history of changes prior to the v2.0.0 release, refer to the following (but note some changes were superseded):