2021-08-17 20:44:17 +03:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Shelley Vohr <shelley.vohr@gmail.com>
|
|
|
|
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`.
|
|
|
|
|
2021-10-21 22:39:38 +03:00
|
|
|
diff --git a/chrome/browser/extensions/global_shortcut_listener.cc b/chrome/browser/extensions/global_shortcut_listener.cc
|
|
|
|
index bc009606d01469125052e68a9cdc82aaa697c764..ff18043cb07d748a49adea9874517fb29e3e7f9f 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 554930bc33d87ee88a9bcc5f0cf17cef09c27ef0..8df4f91d3db453afb9f73bcaeb82c919ca8d1841 100644
|
|
|
|
--- a/chrome/browser/extensions/global_shortcut_listener.h
|
|
|
|
+++ b/chrome/browser/extensions/global_shortcut_listener.h
|
|
|
|
@@ -34,6 +34,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
|
2021-08-17 20:44:17 +03:00
|
|
|
diff --git a/content/browser/media/media_keys_listener_manager_impl.cc b/content/browser/media/media_keys_listener_manager_impl.cc
|
2021-11-15 16:16:16 +03:00
|
|
|
index 5938f75742b793868638e693a9a8c8dc686dfc46..1137ea6c6b2b14f912b400e3cc43dc6fd0243407 100644
|
2021-08-17 20:44:17 +03:00
|
|
|
--- a/content/browser/media/media_keys_listener_manager_impl.cc
|
|
|
|
+++ b/content/browser/media/media_keys_listener_manager_impl.cc
|
2021-11-15 16:16:16 +03:00
|
|
|
@@ -55,7 +55,12 @@ bool MediaKeysListenerManagerImpl::StartWatchingMediaKey(
|
|
|
|
CanActiveMediaSessionControllerReceiveEvents();
|
|
|
|
|
|
|
|
// Tell the underlying MediaKeysListener to listen for the key.
|
|
|
|
- if (should_start_watching && media_keys_listener_ &&
|
|
|
|
+ if (
|
|
|
|
+#if defined(OS_MAC)
|
|
|
|
+ !media_key_handling_enabled_ &&
|
|
|
|
+#endif // defined(OS_MAC)
|
|
|
|
+ should_start_watching &&
|
|
|
|
+ media_keys_listener_ &&
|
|
|
|
!media_keys_listener_->StartWatchingMediaKey(key_code)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
@@ -231,18 +236,16 @@ void MediaKeysListenerManagerImpl::StartListeningForMediaKeysIfNecessary() {
|
2021-08-17 20:44:17 +03:00
|
|
|
media::AudioManager::GetGlobalAppName());
|
|
|
|
#endif
|
|
|
|
|
|
|
|
- if (system_media_controls_) {
|
2021-10-21 22:39:38 +03:00
|
|
|
- system_media_controls_->AddObserver(this);
|
|
|
|
- system_media_controls_notifier_ =
|
|
|
|
- std::make_unique<SystemMediaControlsNotifier>(
|
|
|
|
- system_media_controls_.get());
|
|
|
|
- } else {
|
|
|
|
- // If we can't access system media controls, then directly listen for media
|
|
|
|
- // key keypresses instead.
|
2021-11-15 16:16:16 +03:00
|
|
|
- media_keys_listener_ = ui::MediaKeysListener::Create(
|
|
|
|
- this, ui::MediaKeysListener::Scope::kGlobal);
|
|
|
|
- DCHECK(media_keys_listener_);
|
|
|
|
- }
|
2021-10-21 22:39:38 +03:00
|
|
|
+ // This is required for proper functioning of MediaMetadata.
|
|
|
|
+ system_media_controls_->AddObserver(this);
|
|
|
|
+ system_media_controls_notifier_ =
|
|
|
|
+ std::make_unique<SystemMediaControlsNotifier>(
|
|
|
|
+ system_media_controls_.get());
|
|
|
|
+
|
|
|
|
+ // Directly listen for media key keypresses when using GlobalShortcuts.
|
|
|
|
+ media_keys_listener_ = ui::MediaKeysListener::Create(
|
|
|
|
+ this, ui::MediaKeysListener::Scope::kGlobal);
|
|
|
|
+ DCHECK(media_keys_listener_);
|
2021-08-17 20:44:17 +03:00
|
|
|
|
2021-10-21 22:39:38 +03:00
|
|
|
EnsureAuxiliaryServices();
|
|
|
|
}
|