@@ -396,7 +396,7 @@ extension KeyboardShortcuts {
396
396
var body: some View {
397
397
Text(isUnicornMode ? "🦄" : "🐴")
398
398
.task {
399
- for await _ in KeyboardShortcuts.on(.keyUp, for: .toggleUnicornMode) {
399
+ for await event in KeyboardShortcuts.events( for: .toggleUnicornMode) where event == .keyUp {
400
400
isUnicornMode.toggle()
401
401
}
402
402
}
@@ -407,6 +407,69 @@ extension KeyboardShortcuts {
407
407
- Note: This method is not affected by `.removeAllHandlers()`.
408
408
*/
409
409
@available ( macOS 10 . 15 , * )
410
+ public static func events( for name: Name ) -> AsyncStream < KeyboardShortcuts . EventType > {
411
+ AsyncStream { continuation in
412
+ let id = UUID ( )
413
+
414
+ DispatchQueue . main. async {
415
+ streamKeyDownHandlers [ name, default: [ : ] ] [ id] = {
416
+ continuation. yield ( . keyDown)
417
+ }
418
+
419
+ streamKeyUpHandlers [ name, default: [ : ] ] [ id] = {
420
+ continuation. yield ( . keyUp)
421
+ }
422
+
423
+ registerShortcutIfNeeded ( for: name)
424
+ }
425
+
426
+ continuation. onTermination = { _ in
427
+ DispatchQueue . main. async {
428
+ streamKeyDownHandlers [ name] ? [ id] = nil
429
+ streamKeyUpHandlers [ name] ? [ id] = nil
430
+
431
+ unregisterShortcutIfNeeded ( for: name)
432
+ }
433
+ }
434
+ }
435
+ }
436
+
437
+ /**
438
+ Listen to keyboard shortcut events with the given name and type.
439
+
440
+ You can register multiple listeners.
441
+
442
+ You can safely call this even if the user has not yet set a keyboard shortcut. It will just be inactive until they do.
443
+
444
+ Ending the async sequence will stop the listener. For example, in the below example, the listener will stop when the view disappears.
445
+
446
+ ```swift
447
+ import SwiftUI
448
+ import KeyboardShortcuts
449
+
450
+ struct ContentView: View {
451
+ @State private var isUnicornMode = false
452
+
453
+ var body: some View {
454
+ Text(isUnicornMode ? "🦄" : "🐴")
455
+ .task {
456
+ for await event in KeyboardShortcuts.events(for: .toggleUnicornMode) where event == .keyUp {
457
+ isUnicornMode.toggle()
458
+ }
459
+ }
460
+ }
461
+ }
462
+ ```
463
+
464
+ - Note: This method is not affected by `.removeAllHandlers()`.
465
+ */
466
+ @available ( macOS 10 . 15 , * )
467
+ public static func events( _ type: EventType , for name: Name ) -> AsyncFilterSequence < AsyncStream < EventType > > {
468
+ events ( for: name) . filter { $0 == type }
469
+ }
470
+
471
+ @available ( macOS 10 . 15 , * )
472
+ @available ( * , deprecated, renamed: " events(_:for:) " )
410
473
public static func on( _ type: EventType , for name: Name ) -> AsyncStream < Void > {
411
474
AsyncStream { continuation in
412
475
let id = UUID ( )
0 commit comments