1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 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/chrome/browser/extensions/global_shortcut_listener.cc b/chrome/browser/extensions/global_shortcut_listener.cc
- index fa5be7e4dbddd8333263c412b84a1d93b2d5046a..1b3c65359bff41a96ff27aef6e979ac7e6e8518d 100644
- --- a/chrome/browser/extensions/global_shortcut_listener.cc
- +++ b/chrome/browser/extensions/global_shortcut_listener.cc
- @@ -7,6 +7,7 @@
- #include "base/check.h"
- #include "base/notreached.h"
- #include "content/public/browser/browser_thread.h"
- +#include "content/public/browser/media_keys_listener_manager.h"
- #include "ui/base/accelerators/accelerator.h"
-
- using content::BrowserThread;
- @@ -66,6 +67,22 @@ void GlobalShortcutListener::UnregisterAccelerator(
- StopListening();
- }
-
- +// static
- +void GlobalShortcutListener::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 GlobalShortcutListener::UnregisterAccelerators(Observer* observer) {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (IsShortcutHandlingSuspended())
- diff --git a/chrome/browser/extensions/global_shortcut_listener.h b/chrome/browser/extensions/global_shortcut_listener.h
- index f96af14cb915c8ab92b314ac15b6dffcdd6ec607..2556abe433493251ebd48d4aeddaa6d4f553208f 100644
- --- a/chrome/browser/extensions/global_shortcut_listener.h
- +++ b/chrome/browser/extensions/global_shortcut_listener.h
- @@ -33,6 +33,8 @@ class GlobalShortcutListener {
-
- static GlobalShortcutListener* GetInstance();
-
- + static void SetShouldUseInternalMediaKeyHandling(bool should_use);
- +
- // Register an observer for when a certain |accelerator| is struck. Returns
- // true if register successfully, or false if 1) the specificied |accelerator|
- // has been registered by another caller or other native applications, or
- diff --git a/content/browser/media/media_keys_listener_manager_impl.cc b/content/browser/media/media_keys_listener_manager_impl.cc
- index 8bc58dd31b5822682fe13ad7ded1dc40892b296d..1811361f25fd8276c317e4fcd883e998af8aeab8 100644
- --- a/content/browser/media/media_keys_listener_manager_impl.cc
- +++ b/content/browser/media/media_keys_listener_manager_impl.cc
- @@ -86,7 +86,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;
- }
- @@ -320,6 +324,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();
- }
-
|