123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- 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 169a009fd62d677955ac67df086dd658f902560c..134919f7ecedf2342139626977520b088f8b93d5 100644
- --- a/content/browser/media/media_keys_listener_manager_impl.cc
- +++ b/content/browser/media/media_keys_listener_manager_impl.cc
- @@ -56,7 +56,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;
- }
- @@ -240,6 +244,7 @@ void MediaKeysListenerManagerImpl::StartListeningForMediaKeysIfNecessary() {
- #endif
-
- if (system_media_controls_) {
- + // This is required for proper functioning of MediaMetadata.
- system_media_controls_->AddObserver(this);
- system_media_controls_notifier_ =
- std::make_unique<SystemMediaControlsNotifier>(
- @@ -252,6 +257,19 @@ void MediaKeysListenerManagerImpl::StartListeningForMediaKeysIfNecessary() {
- 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();
- }
-
|