Skip to content

Commit 402b292

Browse files
BohdanBohdan
authored andcommitted
Added "Show indicator on Caps Lock change"
1 parent 59de200 commit 402b292

File tree

4 files changed

+35
-8
lines changed

4 files changed

+35
-8
lines changed

LanguageFlag/Helpers/CapsLockManager.swift

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@ class CapsLockManager {
55

66
// MARK: - Variables
77
private(set) var isCapsLockEnabled: Bool = false
8-
8+
private var eventMonitor: Any?
9+
910
// MARK: - Init
1011
init() {
12+
setupCapsLockObserver()
13+
}
14+
15+
deinit {
16+
if let monitor = eventMonitor {
17+
NSEvent.removeMonitor(monitor)
18+
}
1119
}
1220

1321
func isCapsLockOn() -> Bool {
@@ -22,8 +30,7 @@ extension CapsLockManager {
2230

2331
/// Sets up an observer to monitor Caps Lock state changes.
2432
private func setupCapsLockObserver() {
25-
let eventMask = NSEvent.EventTypeMask.flagsChanged
26-
NSEvent.addGlobalMonitorForEvents(matching: eventMask) { [weak self] event in
33+
eventMonitor = NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged) { [weak self] event in
2734
self?.handleCapsLockStateChange(event: event)
2835
}
2936
}
@@ -40,7 +47,8 @@ extension CapsLockManager {
4047

4148
/// Notifies observers about the Caps Lock state change.
4249
private func notifyCapsLockStateChanged(newCapsLockEnabled: Bool) {
43-
NotificationCenter.default.post(name: .capsLockChanged,
44-
object: newCapsLockEnabled)
50+
guard UserPreferences.shared.showCapsLockIndicator else { return }
51+
52+
NotificationCenter.default.post(name: .capsLockChanged, object: newCapsLockEnabled)
4553
}
4654
}

LanguageFlag/Helpers/NotificationManager.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import Combine
44

55
class NotificationManager {
66

7+
// MARK: - Variables
8+
private let capsLockManager = CapsLockManager()
9+
710
// MARK: - Init
811
init() {
912
setupObservers()

LanguageFlag/Models/UserPreferences.swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ final class UserPreferences: ObservableObject {
9797
static let showShortcuts = "showShortcuts"
9898
static let showInMenuBar = "showInMenuBar"
9999
static let resetAnimationOnChange = "resetAnimationOnChange"
100+
static let showCapsLockIndicator = "showCapsLockIndicator"
100101
}
101102

102103
// MARK: - Published Properties
@@ -148,6 +149,10 @@ final class UserPreferences: ObservableObject {
148149
didSet { defaults.set(resetAnimationOnChange, forKey: Keys.resetAnimationOnChange) }
149150
}
150151

152+
@Published var showCapsLockIndicator: Bool {
153+
didSet { defaults.set(showCapsLockIndicator, forKey: Keys.showCapsLockIndicator) }
154+
}
155+
151156
// MARK: - Initialization
152157
private init() {
153158
self.defaults = .standard
@@ -157,13 +162,14 @@ final class UserPreferences: ObservableObject {
157162
self.showShortcuts = false
158163
self.showInMenuBar = false
159164
self.resetAnimationOnChange = true
165+
self.showCapsLockIndicator = false
160166
self.displayPosition = .bottomCenter
161167
self.windowSize = .medium
162168
self.animationStyle = .fade
163-
169+
164170
loadSavedPreferences()
165171
}
166-
172+
167173
// Initializer for testing with dependency injection
168174
init(defaults: UserDefaults) {
169175
self.defaults = defaults
@@ -173,10 +179,11 @@ final class UserPreferences: ObservableObject {
173179
self.showShortcuts = false
174180
self.showInMenuBar = false
175181
self.resetAnimationOnChange = true
182+
self.showCapsLockIndicator = false
176183
self.displayPosition = .bottomCenter
177184
self.windowSize = .medium
178185
self.animationStyle = .fade
179-
186+
180187
loadSavedPreferences()
181188
}
182189

@@ -188,6 +195,7 @@ final class UserPreferences: ObservableObject {
188195
self.showShortcuts = defaults.object(forKey: Keys.showShortcuts) as? Bool ?? false
189196
self.showInMenuBar = defaults.object(forKey: Keys.showInMenuBar) as? Bool ?? false
190197
self.resetAnimationOnChange = defaults.object(forKey: Keys.resetAnimationOnChange) as? Bool ?? true
198+
self.showCapsLockIndicator = defaults.object(forKey: Keys.showCapsLockIndicator) as? Bool ?? false
191199

192200
// Decode complex types
193201
if
@@ -228,5 +236,6 @@ final class UserPreferences: ObservableObject {
228236
showShortcuts = false
229237
showInMenuBar = false
230238
resetAnimationOnChange = true
239+
showCapsLockIndicator = false
231240
}
232241
}

LanguageFlag/Stories/Preferences/Panes/GeneralPreferencesPane.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ struct GeneralPreferencesPane: View {
3333

3434
menuBarToggle
3535

36+
capsLockToggle
37+
3638
Spacer().frame(height: 20)
3739

3840
resetButton
@@ -111,6 +113,11 @@ struct GeneralPreferencesPane: View {
111113
Toggle("Show current layout in menu bar", isOn: $preferences.showInMenuBar)
112114
.help("Display the current keyboard layout in the menu bar")
113115
}
116+
117+
private var capsLockToggle: some View {
118+
Toggle("Show indicator on Caps Lock change", isOn: $preferences.showCapsLockIndicator)
119+
.help("Show the language indicator window when Caps Lock is toggled")
120+
}
114121

115122
private var resetButton: some View {
116123
HStack {

0 commit comments

Comments
 (0)