fix_media_key_usage_with_globalshortcuts.patch 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 bc009606d01469125052e68a9cdc82aaa697c764..ff18043cb07d748a49adea9874517fb29e3e7f9f 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 ad366d0fd4c3a637d75a102ab56984f0d01bfc04..d63eb133fd4bab1ea309bb8c742acf88d97d779e 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 d352b23f4a42b10e77a61de71069083f20f99136..36e9109a2eeb14983aa80905d09499ff68daeaf9 100644
  57. --- a/content/browser/media/media_keys_listener_manager_impl.cc
  58. +++ b/content/browser/media/media_keys_listener_manager_impl.cc
  59. @@ -55,7 +55,12 @@ 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 defined(OS_MAC)
  65. + !media_key_handling_enabled_ &&
  66. +#endif // defined(OS_MAC)
  67. + should_start_watching &&
  68. + media_keys_listener_ &&
  69. !media_keys_listener_->StartWatchingMediaKey(key_code)) {
  70. return false;
  71. }
  72. @@ -232,18 +237,18 @@ void MediaKeysListenerManagerImpl::StartListeningForMediaKeysIfNecessary() {
  73. #endif
  74. if (system_media_controls_) {
  75. + // This is required for proper functioning of MediaMetadata.
  76. system_media_controls_->AddObserver(this);
  77. system_media_controls_notifier_ =
  78. std::make_unique<SystemMediaControlsNotifier>(
  79. system_media_controls_.get());
  80. - } else {
  81. - // If we can't access system media controls, then directly listen for media
  82. - // key keypresses instead.
  83. - media_keys_listener_ = ui::MediaKeysListener::Create(
  84. - this, ui::MediaKeysListener::Scope::kGlobal);
  85. - DCHECK(media_keys_listener_);
  86. }
  87. + // Directly listen for media key keypresses when using GlobalShortcuts.
  88. + media_keys_listener_ = ui::MediaKeysListener::Create(
  89. + this, ui::MediaKeysListener::Scope::kGlobal);
  90. + DCHECK(media_keys_listener_);
  91. +
  92. EnsureAuxiliaryServices();
  93. }