Skip to content

Commit

Permalink
fix: global shortcut media keys
Browse files Browse the repository at this point in the history
  • Loading branch information
codebytere committed Jun 16, 2020
1 parent 7a216a8 commit 6f679ce
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 3 deletions.
Expand Up @@ -8,8 +8,21 @@ The new kGlobalRequiresAccessibility Scope type should be upstreamed
and then we can use that and minimize this patch to just the change in
global_shortcut_listener_mac.mm

diff --git a/chrome/browser/extensions/global_shortcut_listener_mac.h b/chrome/browser/extensions/global_shortcut_listener_mac.h
index af972bb5193296e7af120918d5b07b9c3dbf19d3..89c6679382edc4639abc4883a709fd2c79da43cf 100644
--- a/chrome/browser/extensions/global_shortcut_listener_mac.h
+++ b/chrome/browser/extensions/global_shortcut_listener_mac.h
@@ -48,6 +48,8 @@ class GlobalShortcutListenerMac : public GlobalShortcutListener,
bool RegisterAcceleratorImpl(const ui::Accelerator& accelerator) override;
void UnregisterAcceleratorImpl(const ui::Accelerator& accelerator) override;

+ void SetShouldUseInternalMediaKeyHandling(bool should_use);
+
// ui::MediaKeysListener::Delegate:
void OnMediaKeysAccelerator(const ui::Accelerator& accelerator) override;

diff --git a/chrome/browser/extensions/global_shortcut_listener_mac.mm b/chrome/browser/extensions/global_shortcut_listener_mac.mm
index befe726af9c10b1563a7fc0bb77cc55f65943d5c..bac51f33f35f96fe4ecc764cf5ca887176642f74 100644
index befe726af9c10b1563a7fc0bb77cc55f65943d5c..390575d4050bb2fa575a7bdc2e76d9631ab7fe99 100644
--- a/chrome/browser/extensions/global_shortcut_listener_mac.mm
+++ b/chrome/browser/extensions/global_shortcut_listener_mac.mm
@@ -39,7 +39,7 @@ GlobalShortcutListenerMac::GlobalShortcutListenerMac()
Expand All @@ -21,6 +34,49 @@ index befe726af9c10b1563a7fc0bb77cc55f65943d5c..bac51f33f35f96fe4ecc764cf5ca8871
DCHECK(media_keys_listener_);
}
}
@@ -86,6 +86,22 @@ void GlobalShortcutListenerMac::OnHotKeyEvent(EventHotKeyID hot_key_id) {
NotifyKeyPressed(accelerator);
}

+// static
+void GlobalShortcutListenerMac::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();
+ }
+ }
+}
+
bool GlobalShortcutListenerMac::RegisterAcceleratorImpl(
const ui::Accelerator& accelerator) {
CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
diff --git a/content/browser/media/media_keys_listener_manager_impl.cc b/content/browser/media/media_keys_listener_manager_impl.cc
index 22fd524ae2996108fefdc3bb55a0f2b366310aa9..047fdce0bb57f1d78963200f907df147e174b978 100644
--- a/content/browser/media/media_keys_listener_manager_impl.cc
+++ b/content/browser/media/media_keys_listener_manager_impl.cc
@@ -177,8 +177,14 @@ void MediaKeysListenerManagerImpl::EnsureMediaKeysListener() {

EnsureAuxiliaryServices();

- media_keys_listener_ = ui::MediaKeysListener::Create(
+ if (!media_key_handling_enabled_) {
+ media_keys_listener_ = ui::MediaKeysListener::Create(
+ this, ui::MediaKeysListener::Scope::kGlobalRequiresAccessibility);
+ } else {
+ media_keys_listener_ = ui::MediaKeysListener::Create(
this, ui::MediaKeysListener::Scope::kGlobal);
+ }
+
DCHECK(media_keys_listener_);

media_keys_listener_->SetIsMediaPlaying(is_media_playing_);
diff --git a/ui/base/accelerators/media_keys_listener.h b/ui/base/accelerators/media_keys_listener.h
index 6787fa39da18ec26c215e4cbe0b3f69093323f8c..ec10c46cde437a935edfdf79e5ba9622c6ba1d67 100644
--- a/ui/base/accelerators/media_keys_listener.h
Expand Down
25 changes: 23 additions & 2 deletions shell/browser/api/electron_api_global_shortcut.cc
Expand Up @@ -9,6 +9,7 @@

#include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/common/extensions/command.h"
#include "gin/dictionary.h"
#include "gin/object_template_builder.h"
#include "shell/browser/api/electron_api_system_preferences.h"
Expand All @@ -20,6 +21,7 @@
#include "base/mac/mac_util.h"
#endif

using extensions::Command;
using extensions::GlobalShortcutListener;

namespace {
Expand All @@ -45,6 +47,14 @@ bool RegisteringMediaKeyForUntrustedClient(const ui::Accelerator& accelerator) {
}
#endif

bool MapHasMediaKeys(std::map<ui::Accelerator, base::Closure> accelerator_map) {
auto media_key = std::find_if(
accelerator_map.begin(), accelerator_map.end(),
[](const auto& ac) { return Command::IsMediaKey(ac.first); });

return media_key != accelerator_map.end();
}

} // namespace

namespace electron {
Expand Down Expand Up @@ -89,10 +99,14 @@ bool GlobalShortcut::RegisterAll(

bool GlobalShortcut::Register(const ui::Accelerator& accelerator,
const base::Closure& callback) {
if (Command::IsMediaKey(accelerator)) {
#if defined(OS_MACOSX)
if (RegisteringMediaKeyForUntrustedClient(accelerator))
return false;
if (RegisteringMediaKeyForUntrustedClient(accelerator))
return false;

GlobalShortcutListener::SetShouldUseInternalMediaKeyHandling(false);
#endif
}

if (!GlobalShortcutListener::GetInstance()->RegisterAccelerator(accelerator,
this)) {
Expand All @@ -107,6 +121,13 @@ void GlobalShortcut::Unregister(const ui::Accelerator& accelerator) {
if (accelerator_callback_map_.erase(accelerator) == 0)
return;

#if defined(OS_MACOSX)
if (Command::IsMediaKey(accelerator) &&
!MapHasMediaKeys(accelerator_callback_map_)) {
GlobalShortcutListener::SetShouldUseInternalMediaKeyHandling(true);
}
#endif

GlobalShortcutListener::GetInstance()->UnregisterAccelerator(accelerator,
this);
}
Expand Down

0 comments on commit 6f679ce

Please sign in to comment.