123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Shelley Vohr <[email protected]>
- Date: Mon, 16 Aug 2021 17:55:32 +0200
- Subject: fix: media key usage with globalShortcuts
- This patch enables media keys to work properly with Electron's globalShortcut
- module. Chromium's default usage of RemoteCommandCenterDelegate on macOS falls
- down into MPRemoteCommandCenter, which makes it such that an app will not
- receive remote control events until it begins playing audio. This runs
- counter to the design of globalShortcuts, and so we need to instead
- use `ui::MediaKeysListener`.
- diff --git a/content/browser/media/media_keys_listener_manager_impl.cc b/content/browser/media/media_keys_listener_manager_impl.cc
- index 42e37564e585987d367921568f0f1d2b7507f953..9baf89efbade01e8b60c579255f10799914e144f 100644
- --- a/content/browser/media/media_keys_listener_manager_impl.cc
- +++ b/content/browser/media/media_keys_listener_manager_impl.cc
- @@ -87,7 +87,11 @@ bool MediaKeysListenerManagerImpl::StartWatchingMediaKey(
- CanActiveMediaSessionControllerReceiveEvents();
-
- // Tell the underlying MediaKeysListener to listen for the key.
- - if (should_start_watching && media_keys_listener_ &&
- + if (
- +#if BUILDFLAG(IS_MAC)
- + !media_key_handling_enabled_ &&
- +#endif // BUILDFLAG(IS_MAC)
- + should_start_watching && media_keys_listener_ &&
- !media_keys_listener_->StartWatchingMediaKey(key_code)) {
- return false;
- }
- @@ -361,6 +365,20 @@ void MediaKeysListenerManagerImpl::StartListeningForMediaKeysIfNecessary() {
- this, ui::MediaKeysListener::Scope::kGlobal);
- DCHECK(media_keys_listener_);
- }
- +
- +#if BUILDFLAG(IS_MAC)
- + // Chromium's implementation of SystemMediaControls falls
- + // down into MPRemoteCommandCenter, which makes it such that an app will not
- + // will not receive remote control events until it begins playing audio.
- + // If there's not already a MediaKeysListener instance, create one so
- + // that globalShortcuts work correctly.
- + if (!media_keys_listener_) {
- + media_keys_listener_ = ui::MediaKeysListener::Create(
- + this, ui::MediaKeysListener::Scope::kGlobal);
- + DCHECK(media_keys_listener_);
- + }
- +#endif
- +
- EnsureAuxiliaryServices();
- }
-
- diff --git a/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.cc b/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.cc
- index cdf35a5bcec7b30f1b75e77cc29a9b7bb591cfd6..b6dfeee587faa742beb4f1d871db4c4f76bf46ab 100644
- --- a/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.cc
- +++ b/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.cc
- @@ -65,6 +65,22 @@ void GlobalAcceleratorListener::UnregisterAccelerator(
- }
- }
-
- +// static
- +void GlobalAcceleratorListener::SetShouldUseInternalMediaKeyHandling(bool should_use) {
- + if (content::MediaKeysListenerManager::
- + IsMediaKeysListenerManagerEnabled()) {
- + content::MediaKeysListenerManager* media_keys_listener_manager =
- + content::MediaKeysListenerManager::GetInstance();
- + DCHECK(media_keys_listener_manager);
- +
- + if (should_use) {
- + media_keys_listener_manager->EnableInternalMediaKeyHandling();
- + } else {
- + media_keys_listener_manager->DisableInternalMediaKeyHandling();
- + }
- + }
- +}
- +
- void GlobalAcceleratorListener::UnregisterAccelerators(Observer* observer) {
- if (IsShortcutHandlingSuspended()) {
- return;
- diff --git a/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.h b/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.h
- index 701808699796b0ef1a87d4d12f79fb6cf580c617..bf6e38410cedd6dd6d339b6f2f456124770bbd96 100644
- --- a/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.h
- +++ b/ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.h
- @@ -8,6 +8,7 @@
- #include <map>
-
- #include "base/memory/raw_ptr.h"
- +#include "content/public/browser/media_keys_listener_manager.h"
- #include "ui/base/accelerators/command.h"
-
- namespace ui {
- @@ -38,6 +39,9 @@ class GlobalAcceleratorListener {
- // The instance may be nullptr.
- static GlobalAcceleratorListener* GetInstance();
-
- + // enables media keys to work with Electron's globalShortcut module.
- + static void SetShouldUseInternalMediaKeyHandling(bool should_use);
- +
- // Register an observer for when a certain `accelerator` is struck. Returns
- // true if register successfully, or false if the specified `accelerator`
- // has been registered by another caller or other native applications.
|