Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 13 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -946,24 +946,24 @@ taken unasked, and a key bound to one action is refused for another until it is
cleared there. Replay and Save clip use the Replay panel's picks, and a
recording the Output panel's.

The key pressed is the key that fires, on any keyboard layout: the panel names
it as the layout prints it, and the system hears the key where it sits, through
the layout in use when the studio starts or a key is bound. On X11, a key that
types only a letter outside A to Z, such as ö on a German layout, is refused.
Keypad keys are refused everywhere, since the window hears keypad 1 as the 1
above the letters.
The key pressed is the key that fires, wherever it sits, on any keyboard layout
and after a layout change: the panel names it as the layout printed it when it
was bound. Keypad keys bind apart from the keys above the letters, so keypad 1
and 1 can do different things; the panel calls them **Keypad 1** and **1**.

Bound keys fire even while another app, such as a game in full screen, has
focus, and the app does not see them, so bind keys you do not type or play
with, such as a function key or one with modifiers:
with, such as a function key, a keypad key, or one with modifiers:

- **macOS** and **Windows** register them with the system, which needs no
permission. A key another app already registered is refused, saying so. On
macOS 15 and later, the system refuses a key whose only modifiers are Option,
or Option and Shift.
- **Linux on X11** grabs them from the X server. Once a layout change moves
a key the studio holds, its keys stay as they are until it restarts, and the
panel says so.
permission. A key another app already registered is refused, saying so, as
is a key the system has no name for. On macOS 15 and later, the system
refuses a key whose only modifiers are Option, or Option and Shift. Windows
hears a keypad key only with NumLock on, cannot tell keypad Enter from Enter
so refuses it, and fires a binding on Enter for both.
- **Linux on X11** grabs them from the X server by where they sit, so any key
binds, such as ö on a German layout or a key with no name, and fires
whatever NumLock and CapsLock are.
- **Linux on Wayland**, where no app hears keys meant for another, asks the
desktop through its GlobalShortcuts portal (KDE Plasma, and GNOME 48 and
later). The desktop shows its own dialog, may bind other keys than those
Expand Down
1 change: 0 additions & 1 deletion quest/m1/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ than opening an m2 for them.
## Required

- [Viewer-side composition](/quest/m1/compose/README.md) - sources as their own tracks plus a layout track, composed by viewers and by a server
- [Hotkeys bind by physical key](/quest/m1/hotkeys-keypad.md) - keypad keys apart from the main row, any X11 key, and every binding across layout changes
- [Scene graph view](/quest/m1/scene-graph.md) - a node view of picture and audio scenes, their routing, volume, pan, and waveforms
- [Effects in the studio UI](/quest/m1/ui-effects.md) - rune-fx glow, bursts, metal and gradient chrome, and alert effects in the egui UI
- [Rune UI spike](/quest/m1/rune-spike.md) - the monitors prototyped on Rune, with a verdict on moving the UI off egui
51 changes: 0 additions & 51 deletions quest/m1/hotkeys-keypad.md

This file was deleted.

28 changes: 16 additions & 12 deletions rs/moq-studio/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,6 @@ eframe = { version = "0.36", default-features = false, features = ["default_font
egui = "0.36"
# Docked, rearrangeable panels. 0.21 is the newest release and pins egui 0.36.
egui_dock = "0.21"
# System-wide hotkeys on macOS, Windows, and X11; Wayland goes through the
# GlobalShortcuts portal instead.
global-hotkey = "0.9"
hang = { workspace = true }
# Stamps a recording's file name with when it started. Already in the graph
# through moq-scene's humantime-serde.
Expand Down Expand Up @@ -83,9 +80,11 @@ toml = { workspace = true }
tracing = { workspace = true }
url = { workspace = true }
usage-rs = { workspace = true, features = ["completions", "config"] }
# The window's event loop, run here so keypad keys are noted before egui
# folds them into their main keyboard twins. eframe's version and features.
winit = { version = "0.30", default-features = false }
# The window's event loop, run here so a hotkey is the key winit names by where
# it sits, which egui folds into its main keyboard twin for a keypad key and
# drops for a key outside its own list. eframe's version and features, with
# `serde` to keep the key bound.
winit = { version = "0.30", default-features = false, features = ["serde"] }

[target.'cfg(target_os = "linux")'.dependencies]
# The GlobalShortcuts portal for hotkeys on Wayland. 0.13, as moq-video's
Expand All @@ -100,14 +99,19 @@ moq-v4l = { workspace = true }
pipewire = { version = "0.10", optional = true, features = ["v0_3_34"] }
# Whether the window is on Wayland, where only the portal hears keys globally.
raw-window-handle = "0.6"
# Which keysyms the X11 layout puts on each key, so a hotkey grabs the key
# pressed. 0.13, as global-hotkey uses, so default builds compile one.
x11rb = "0.13"
# Hotkeys on X11, grabbed by keycode so any key binds on any layout. `xkb`
# tells a held key's repeats from new presses.
x11rb = { version = "0.13", features = ["xkb"] }

[target.'cfg(any(target_os = "macos", windows))'.dependencies]
# System-wide hotkeys on macOS and Windows; X11 grabs keys itself, and Wayland
# goes through the GlobalShortcuts portal.
global-hotkey = "0.9"

[target.'cfg(windows)'.dependencies]
# Which virtual key the Windows layout puts on each key, so a hotkey
# registers the key pressed.
windows-sys = { version = "0.61", features = ["Win32_UI_Input_KeyboardAndMouse"] }
# Which virtual key the foreground window's layout puts on each key, so a
# hotkey registers the key pressed.
windows-sys = { version = "0.61", features = ["Win32_UI_Input_KeyboardAndMouse", "Win32_UI_WindowsAndMessaging"] }

[dev-dependencies]
# A clock that moves wall time too, which renewed tokens' expiries read.
Expand Down
Loading