sys_color_change_listener.cc 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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.
  4. #include "ui/gfx/sys_color_change_listener.h"
  5. #include <windows.h>
  6. #include <memory>
  7. #include "base/bind.h"
  8. #include "base/callback_helpers.h"
  9. #include "base/memory/singleton.h"
  10. #include "base/observer_list.h"
  11. #include "ui/gfx/win/singleton_hwnd_observer.h"
  12. namespace gfx {
  13. class SysColorChangeObserver {
  14. public:
  15. static SysColorChangeObserver* GetInstance();
  16. void AddListener(SysColorChangeListener* listener);
  17. void RemoveListener(SysColorChangeListener* listener);
  18. private:
  19. friend struct base::DefaultSingletonTraits<SysColorChangeObserver>;
  20. SysColorChangeObserver();
  21. virtual ~SysColorChangeObserver();
  22. void OnWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
  23. base::ObserverList<SysColorChangeListener>::Unchecked listeners_;
  24. std::unique_ptr<gfx::SingletonHwndObserver> singleton_hwnd_observer_;
  25. };
  26. // static
  27. SysColorChangeObserver* SysColorChangeObserver::GetInstance() {
  28. return base::Singleton<SysColorChangeObserver>::get();
  29. }
  30. SysColorChangeObserver::SysColorChangeObserver()
  31. : singleton_hwnd_observer_(new SingletonHwndObserver(
  32. base::BindRepeating(&SysColorChangeObserver::OnWndProc,
  33. base::Unretained(this)))) {}
  34. SysColorChangeObserver::~SysColorChangeObserver() {}
  35. void SysColorChangeObserver::AddListener(SysColorChangeListener* listener) {
  36. listeners_.AddObserver(listener);
  37. }
  38. void SysColorChangeObserver::RemoveListener(SysColorChangeListener* listener) {
  39. listeners_.RemoveObserver(listener);
  40. }
  41. void SysColorChangeObserver::OnWndProc(HWND hwnd,
  42. UINT message,
  43. WPARAM wparam,
  44. LPARAM lparam) {
  45. if (message == WM_SYSCOLORCHANGE ||
  46. (message == WM_SETTINGCHANGE && wparam == SPI_SETHIGHCONTRAST)) {
  47. for (SysColorChangeListener& observer : listeners_)
  48. observer.OnSysColorChange();
  49. }
  50. }
  51. ScopedSysColorChangeListener::ScopedSysColorChangeListener(
  52. SysColorChangeListener* listener)
  53. : listener_(listener) {
  54. SysColorChangeObserver::GetInstance()->AddListener(listener_);
  55. }
  56. ScopedSysColorChangeListener::~ScopedSysColorChangeListener() {
  57. SysColorChangeObserver::GetInstance()->RemoveListener(listener_);
  58. }
  59. } // namespace gfx