1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_CHROMEOS_EVENTS_SYSTEM_KEY_EVENT_LISTENER_H_
6 #define CHROME_BROWSER_CHROMEOS_EVENTS_SYSTEM_KEY_EVENT_LISTENER_H_
8 #include "base/memory/singleton.h"
9 #include "base/message_loop/message_loop.h"
11 typedef union _XEvent XEvent;
15 class SystemKeyEventListener : public base::MessageLoopForUI::Observer {
17 // Observer for caps lock state changes.
18 class CapsLockObserver {
20 virtual void OnCapsLockChange(bool enabled) = 0;
24 virtual ~CapsLockObserver() {}
26 DISALLOW_COPY_AND_ASSIGN(CapsLockObserver);
29 // Observer for modifier keys' state changes.
30 class ModifiersObserver {
34 CTRL_PRESSED = 1 << 1,
38 // |pressed_modifiers| is a bitmask of SHIFT_PRESSED, CTRL_PRESSED and
40 virtual void OnModifiersChange(int pressed_modifiers) = 0;
43 ModifiersObserver() {}
44 virtual ~ModifiersObserver() {}
46 DISALLOW_COPY_AND_ASSIGN(ModifiersObserver);
49 static void Initialize();
50 static void Shutdown();
51 // GetInstance returns NULL if not initialized or if already shutdown.
52 static SystemKeyEventListener* GetInstance();
56 void AddCapsLockObserver(CapsLockObserver* observer);
57 void AddModifiersObserver(ModifiersObserver* observer);
58 void RemoveCapsLockObserver(CapsLockObserver* observer);
59 void RemoveModifiersObserver(ModifiersObserver* observer);
62 // Defines the delete on exit Singleton traits we like. Best to have this
63 // and const/dest private as recommended for Singletons.
64 friend struct DefaultSingletonTraits<SystemKeyEventListener>;
65 friend class SystemKeyEventListenerTest;
67 SystemKeyEventListener();
68 virtual ~SystemKeyEventListener();
70 // MessageLoopForUI::Observer overrides.
71 virtual base::EventStatus WillProcessEvent(
72 const base::NativeEvent& event) OVERRIDE;
73 virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE;
75 void OnCapsLock(bool enabled);
76 void OnModifiers(int state);
78 // Returns true if the event was processed, false otherwise.
79 virtual bool ProcessedXEvent(XEvent* xevent);
83 unsigned int num_lock_mask_;
84 bool caps_lock_is_on_;
85 int pressed_modifiers_;
86 ObserverList<CapsLockObserver> caps_lock_observers_;
87 ObserverList<ModifiersObserver> modifiers_observers_;
89 // Base X ID for events from the XKB extension.
92 DISALLOW_COPY_AND_ASSIGN(SystemKeyEventListener);
95 } // namespace chromeos
97 #endif // CHROME_BROWSER_CHROMEOS_EVENTS_SYSTEM_KEY_EVENT_LISTENER_H_