fix_media_key_usage_with_globalshortcuts.patch 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Shelley Vohr <[email protected]>
  3. Date: Mon, 16 Aug 2021 17:55:32 +0200
  4. Subject: fix: media key usage with globalShortcuts
  5. This patch enables media keys to work properly with Electron's globalShortcut
  6. module. Chromium's default usage of RemoteCommandCenterDelegate on macOS falls
  7. down into MPRemoteCommandCenter, which makes it such that an app will not
  8. receive remote control events until it begins playing audio. This runs
  9. counter to the design of globalShortcuts, and so we need to instead
  10. use `ui::MediaKeysListener`.
  11. diff --git a/chrome/browser/extensions/global_shortcut_listener.cc b/chrome/browser/extensions/global_shortcut_listener.cc
  12. index fa5be7e4dbddd8333263c412b84a1d93b2d5046a..1b3c65359bff41a96ff27aef6e979ac7e6e8518d 100644
  13. --- a/chrome/browser/extensions/global_shortcut_listener.cc
  14. +++ b/chrome/browser/extensions/global_shortcut_listener.cc
  15. @@ -7,6 +7,7 @@
  16. #include "base/check.h"
  17. #include "base/notreached.h"
  18. #include "content/public/browser/browser_thread.h"
  19. +#include "content/public/browser/media_keys_listener_manager.h"
  20. #include "ui/base/accelerators/accelerator.h"
  21. using content::BrowserThread;
  22. @@ -66,6 +67,22 @@ void GlobalShortcutListener::UnregisterAccelerator(
  23. StopListening();
  24. }
  25. +// static
  26. +void GlobalShortcutListener::SetShouldUseInternalMediaKeyHandling(bool should_use) {
  27. + if (content::MediaKeysListenerManager::
  28. + IsMediaKeysListenerManagerEnabled()) {
  29. + content::MediaKeysListenerManager* media_keys_listener_manager =
  30. + content::MediaKeysListenerManager::GetInstance();
  31. + DCHECK(media_keys_listener_manager);
  32. +
  33. + if (should_use) {
  34. + media_keys_listener_manager->EnableInternalMediaKeyHandling();
  35. + } else {
  36. + media_keys_listener_manager->DisableInternalMediaKeyHandling();
  37. + }
  38. + }
  39. +}
  40. +
  41. void GlobalShortcutListener::UnregisterAccelerators(Observer* observer) {
  42. CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
  43. if (IsShortcutHandlingSuspended())
  44. diff --git a/chrome/browser/extensions/global_shortcut_listener.h b/chrome/browser/extensions/global_shortcut_listener.h
  45. index f96af14cb915c8ab92b314ac15b6dffcdd6ec607..2556abe433493251ebd48d4aeddaa6d4f553208f 100644
  46. --- a/chrome/browser/extensions/global_shortcut_listener.h
  47. +++ b/chrome/browser/extensions/global_shortcut_listener.h
  48. @@ -33,6 +33,8 @@ class GlobalShortcutListener {
  49. static GlobalShortcutListener* GetInstance();
  50. + static void SetShouldUseInternalMediaKeyHandling(bool should_use);
  51. +
  52. // Register an observer for when a certain |accelerator| is struck. Returns
  53. // true if register successfully, or false if 1) the specificied |accelerator|
  54. // has been registered by another caller or other native applications, or
  55. diff --git a/content/browser/media/media_keys_listener_manager_impl.cc b/content/browser/media/media_keys_listener_manager_impl.cc
  56. index 169a009fd62d677955ac67df086dd658f902560c..134919f7ecedf2342139626977520b088f8b93d5 100644
  57. --- a/content/browser/media/media_keys_listener_manager_impl.cc
  58. +++ b/content/browser/media/media_keys_listener_manager_impl.cc
  59. @@ -56,7 +56,11 @@ bool MediaKeysListenerManagerImpl::StartWatchingMediaKey(
  60. CanActiveMediaSessionControllerReceiveEvents();
  61. // Tell the underlying MediaKeysListener to listen for the key.
  62. - if (should_start_watching && media_keys_listener_ &&
  63. + if (
  64. +#if BUILDFLAG(IS_MAC)
  65. + !media_key_handling_enabled_ &&
  66. +#endif // BUILDFLAG(IS_MAC)
  67. + should_start_watching && media_keys_listener_ &&
  68. !media_keys_listener_->StartWatchingMediaKey(key_code)) {
  69. return false;
  70. }
  71. @@ -240,6 +244,7 @@ void MediaKeysListenerManagerImpl::StartListeningForMediaKeysIfNecessary() {
  72. #endif
  73. if (system_media_controls_) {
  74. + // This is required for proper functioning of MediaMetadata.
  75. system_media_controls_->AddObserver(this);
  76. system_media_controls_notifier_ =
  77. std::make_unique<SystemMediaControlsNotifier>(
  78. @@ -252,6 +257,19 @@ void MediaKeysListenerManagerImpl::StartListeningForMediaKeysIfNecessary() {
  79. DCHECK(media_keys_listener_);
  80. }
  81. +#if BUILDFLAG(IS_MAC)
  82. + // Chromium's implementation of SystemMediaControls falls
  83. + // down into MPRemoteCommandCenter, which makes it such that an app will not
  84. + // will not receive remote control events until it begins playing audio.
  85. + // If there's not already a MediaKeysListener instance, create one so
  86. + // that globalShortcuts work correctly.
  87. + if (!media_keys_listener_) {
  88. + media_keys_listener_ = ui::MediaKeysListener::Create(
  89. + this, ui::MediaKeysListener::Scope::kGlobal);
  90. + DCHECK(media_keys_listener_);
  91. + }
  92. +#endif
  93. +
  94. EnsureAuxiliaryServices();
  95. }