Changelog#
This document records all notable changes to the omni.kit.hotkeys.core extension.
The format is based on Keep a Changelog. The project adheres to Semantic Versioning.
[1.6.1] - 2026-08-18#
Changed#
HotkeyRegistry.get_all_hotkeys_for_keynow answers from a by-key index instead of scanning every registered hotkey. It runs on every key press and release (HotkeyTrigger._on_input_eventgates the trigger queue with it), and each scan step cost aKeyCombinationcomparison, so the whole registry was re-rendered to strings twice per key event.KeyCombination.as_string/.idare memoized and resolve the key name through a prebuilt reverse map, instead of rebuilding two ~300 entry lists and linear-searching them on every call. Both back__eq__/__hash__, so every registry lookup paid for it. Writingkey,modifiersortrigger_pressdrops the memo.
[1.6.0] - 2026-08-07#
Fixed#
OMPE-89437 / NVBug 6065952:
HotkeysExtension.on_shutdownnow callsHotkeyContext.clean()before dropping the context, so the/exts/omni.kit.hotkeys.core/contextsetting no longer keeps the last pushed context after the extension is disabled (a later startup built an emptyHotkeyContextthat disagreed with the stale setting).
Changed#
OMPE-89437:
get_hotkey_context()/get_hotkey_registry()are annotatedOptional[...]and document that they returnNoneoutside the extension lifecycle (beforeon_startup, afteron_shutdown), which is what they have always done — the previous non-Optionalannotations told callers aNonereturn was impossible.
[1.5.0] - 2026-08-01#
Security#
OMPE-91698 / NVBug 6116598: Confine hotkey presets to
${data}/hotkeys/presets.HotkeyStorage.save_preset/preload_presetrefuse any path resolving outside it, closing path-traversal read/write viaHotkeyRegistry.import_storage/export_storage.
Added#
OMPE-91698:
get_preset_dir()returns the directory presets are confined to.
Changed#
OMPE-91698:
HotkeyRegistry.export_storagenow returns whether the preset was written.
Fixed#
OMPE-91698 / NVBug 6117935: Drop the unsafe
finallyblock inHotkeyStorage.save_presetthat raisedUnboundLocalErrorwhenopen()failed before bindingjson_file.
[1.4.3] - 2026-08-01#
Fixed#
OMPE-88664:
KeyCombination.__init__keeps the trigger spelled out in a key string, e.g."CTRL + D (On Release)".
[1.4.2] - 2026-07-31#
Fixed#
OMPE-91898: Fix operator precedence in the
allow_listguard so the registry lookup always gates hotkey enqueue
[1.4.1] - 2026-07-31#
Fixed#
OMPE-88682: Fix
HotkeyStorage.save_presetraisingUnboundLocalErrorfrom itsfinally:block on write failures, masking the real error.
[1.4.0] - 2026-06-11#
Fixed#
OMPE-92130: Guard
Hotkey.actionagainst aNoneaction registry.
[1.3.13] - 2026-06-11#
Fixed#
OMPE-92126:
HotkeyRegistry.__deregister_hotkey_mapsnow removes the by-key map entry (_hotkeys_by_key_and_context/_hotkeys_by_key_and_window/_global_hotkeys_by_key) by the stableHotkey.idacross all keys, instead of subscripting the currentkey_combination. When a hotkey’skey_combinationis changed after registration (e.g.switch_layoutmutates it in place, or a caller holding the live object reassigns it), the entry still lives under the original key — the old code raisedKeyErrorand a.get(...)-only guard would silently leave a stale entry pointing at an already-deregistered hotkey. Identity-based removal both prevents theKeyErrorand guarantees no dangling mapping survives (which previously could mis-dispatch the old key combo or spuriously reportERROR_KEY_DUPLICATED).
[1.3.12] - 2025-11-04#
Changed#
OMPE-64840: Remove regex used in key comnination
[1.3.11] - 2025-10-23#
Changed#
OMPE-64840: Make sure the regex used here cannot lead to denial of service
[1.3.10] - 2024-12-04#
Changed#
OMPE-24897: OVC: RuntimeError: Failed to acquire interface: card::windowing::IWindowing
[1.3.9] - 2024-12-03#
Changed#
OMPE-24897: No carb.windowing on OVC
[1.3.8] - 2024-11-04#
Changed#
OMPE-24897: Support different keyboard layouts with carb.windowing.translate_key
[1.3.7] - 2024-09-25#
Changed#
OMPE-22565: add KeyboardLayoutDelegate in public API
[1.3.6] - 2024-09-23#
Changed#
OMPE-21262: Fix issue that hotkey not work if key combinations are exchanged when switch Keyboard layout
[1.3.5] - 2024-01-24#
Changed#
OM-118968: Window “Debug##Default” should be ignored in hotkey trigger
[1.3.4] - 2024-01-18#
Fixed#
OMPRW-513: Fix for hotkeys can still be triggered on destroyed windows.
[1.3.3] - 2024-01-09#
Added#
OM-117920: Send deregister event when restore user hotkey
[1.3.2] - 2023-11-17#
Added#
Add disable_hotkey to disable system hotkeys
[1.3.1] - 2023-07-31#
Added#
OM-76181: isolated modifier keys are not invalid hotkey, warn if they are used.
[1.3.0] - 2023-07-20#
Added#
OM-102413: Add setting for hotkey allow list
[1.2.3] - 2023-07-19#
Added#
OM-97180: Add setting to globally disable all hotkeys
[1.2.2] - 2023-06-21#
Changed#
OM-98697: TAB is a valid key for QuickSearch window
[1.2.1] - 2023-04-13#
Changed#
OM-88070: Bring docs up to standards for omni.kit.hotkeys.core
[1.2.0] - 2023-03-22#
Added#
OM-77340: Add keyboard layouts with 3 defaults: U.S., German and French
[1.1.1] - 2023-01-13#
Changed#
OM-63678: Add API to check if hotkey is user defined
OM-70929: change extension category from “Rendering” to “Internal”
[1.1.0] - 2022-11-21#
Changed#
OM-55820: Linting for omni.kit.hotkeys.core
[1.0.8] - 2022-11-10#
Changed#
OM-67801: Filter keyboard event only
[1.0.7] - 2022-10-26#
Changed#
OM-67426: Change “KEY_X” to “X” in key string. For example, “KEY_1” to “1”.
[1.0.6] - 2022-10-12#
Changed#
OM-65313: Clear saved hotkeys from user config if restore default
OM-65505: Make get hovered window work for docked ui.ToolBar
[1.0.5] - 2022-10-05#
Changed#
Only check KEY_PRESS and KEY_RELEASE event for hotkey (ignore KEY_CHAR and KEY_REPEAT)
[1.0.4] - 2022-09-28#
Added#
Add API to restore all hotkeys
[1.0.3] - 2022-09-27#
Changed#
Support different DPI when finding hovered window
[1.0.2] - 2022-09-26#
Added#
Add feature flag
[1.0.1] - 2022-09-23#
Added#
Add fastShutdown for test since it failed in 104
[1.0.0] - 2022-05-23#
Added#
First release