Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Side by Side Diff: chrome/browser/ui/gtk/extensions/extension_keybinding_registry_gtk.cc

Issue 64273008: [Windows] Finish global and non-global media keys support on Windows. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: gclient sync. Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/gtk/extensions/extension_keybinding_registry_gtk.h" 5 #include "chrome/browser/ui/gtk/extensions/extension_keybinding_registry_gtk.h"
6 6
7 #include <gtk/gtk.h> 7 #include <gtk/gtk.h>
8 8
9 #include "chrome/browser/extensions/api/commands/command_service.h" 9 #include "chrome/browser/extensions/api/commands/command_service.h"
10 #include "chrome/browser/extensions/extension_service.h" 10 #include "chrome/browser/extensions/extension_service.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 extensions::CommandService::ACTIVE_ONLY, 66 extensions::CommandService::ACTIVE_ONLY,
67 extensions::CommandService::REGULAR, 67 extensions::CommandService::REGULAR,
68 &commands); 68 &commands);
69 69
70 for (extensions::CommandMap::const_iterator iter = commands.begin(); 70 for (extensions::CommandMap::const_iterator iter = commands.begin();
71 iter != commands.end(); ++iter) { 71 iter != commands.end(); ++iter) {
72 if (!command_name.empty() && (iter->second.command_name() != command_name)) 72 if (!command_name.empty() && (iter->second.command_name() != command_name))
73 continue; 73 continue;
74 74
75 ui::Accelerator accelerator(iter->second.accelerator()); 75 ui::Accelerator accelerator(iter->second.accelerator());
76 event_targets_[accelerator] = 76 event_targets_[accelerator].push_back(
77 std::make_pair(extension->id(), iter->second.command_name()); 77 std::make_pair(extension->id(), iter->second.command_name()));
78
79 // Shortcuts except media keys have only one target in the list. See comment
80 // about |event_targets_|.
81 if (!extensions::CommandService::IsMediaKey(iter->second.accelerator()))
82 DCHECK_EQ(1u, event_targets_[accelerator].size());
78 83
79 if (!accel_group_) { 84 if (!accel_group_) {
80 accel_group_ = gtk_accel_group_new(); 85 accel_group_ = gtk_accel_group_new();
81 gtk_window_add_accel_group(window_, accel_group_); 86 gtk_window_add_accel_group(window_, accel_group_);
82 } 87 }
83 88
84 gtk_accel_group_connect( 89 gtk_accel_group_connect(
85 accel_group_, 90 accel_group_,
86 ui::GetGdkKeyCodeForAccelerator(accelerator), 91 ui::GetGdkKeyCodeForAccelerator(accelerator),
87 ui::GetGdkModifierForAccelerator(accelerator), 92 ui::GetGdkModifierForAccelerator(accelerator),
88 GtkAccelFlags(0), 93 GtkAccelFlags(0),
89 g_cclosure_new(G_CALLBACK(OnGtkAcceleratorThunk), this, NULL)); 94 g_cclosure_new(G_CALLBACK(OnGtkAcceleratorThunk), this, NULL));
90 } 95 }
91 96
92 // Unlike on Windows, we need to explicitly add the browser action and page 97 // Unlike on Windows, we need to explicitly add the browser action and page
93 // action to the event_targets_, even though we don't register them as 98 // action to the event_targets_, even though we don't register them as
94 // handlers. See http://crbug.com/124873. 99 // handlers. See http://crbug.com/124873.
95 extensions::Command browser_action; 100 extensions::Command browser_action;
96 if (command_service->GetBrowserActionCommand( 101 if (command_service->GetBrowserActionCommand(
97 extension->id(), 102 extension->id(),
98 extensions::CommandService::ACTIVE_ONLY, 103 extensions::CommandService::ACTIVE_ONLY,
99 &browser_action, 104 &browser_action,
100 NULL)) { 105 NULL)) {
101 ui::Accelerator accelerator(browser_action.accelerator()); 106 ui::Accelerator accelerator(browser_action.accelerator());
102 event_targets_[accelerator] = 107 event_targets_[accelerator].push_back(
103 std::make_pair(extension->id(), browser_action.command_name()); 108 std::make_pair(extension->id(), browser_action.command_name()));
109 // We should have only one target. See comment about |event_targets_|.
110 DCHECK_EQ(1u, event_targets_[accelerator].size());
104 } 111 }
105 112
106 // Add the Page Action (if any). 113 // Add the Page Action (if any).
107 extensions::Command page_action; 114 extensions::Command page_action;
108 if (command_service->GetPageActionCommand( 115 if (command_service->GetPageActionCommand(
109 extension->id(), 116 extension->id(),
110 extensions::CommandService::ACTIVE_ONLY, 117 extensions::CommandService::ACTIVE_ONLY,
111 &page_action, 118 &page_action,
112 NULL)) { 119 NULL)) {
113 ui::Accelerator accelerator(page_action.accelerator()); 120 ui::Accelerator accelerator(page_action.accelerator());
114 event_targets_[accelerator] = 121 event_targets_[accelerator].push_back(
115 std::make_pair(extension->id(), page_action.command_name()); 122 std::make_pair(extension->id(), page_action.command_name()));
123 // We should have only one target. See comment about |event_targets_|.
124 DCHECK_EQ(1u, event_targets_[accelerator].size());
116 } 125 }
117 126
118 // Add the Script Badge (if any). 127 // Add the Script Badge (if any).
119 extensions::Command script_badge; 128 extensions::Command script_badge;
120 if (command_service->GetScriptBadgeCommand( 129 if (command_service->GetScriptBadgeCommand(
121 extension->id(), 130 extension->id(),
122 extensions::CommandService::ACTIVE_ONLY, 131 extensions::CommandService::ACTIVE_ONLY,
123 &script_badge, 132 &script_badge,
124 NULL)) { 133 NULL)) {
125 ui::Accelerator accelerator(script_badge.accelerator()); 134 ui::Accelerator accelerator(script_badge.accelerator());
126 event_targets_[accelerator] = 135 event_targets_[accelerator].push_back(
127 std::make_pair(extension->id(), script_badge.command_name()); 136 std::make_pair(extension->id(), script_badge.command_name()));
137 // We should have only one target. See comment about |event_targets_|.
138 DCHECK_EQ(1u, event_targets_[accelerator].size());
128 } 139 }
129 } 140 }
130 141
131 void ExtensionKeybindingRegistryGtk::RemoveExtensionKeybindingImpl( 142 void ExtensionKeybindingRegistryGtk::RemoveExtensionKeybindingImpl(
132 const ui::Accelerator& accelerator, 143 const ui::Accelerator& accelerator,
133 const std::string& command_name) { 144 const std::string& command_name) {
134 // On GTK, unlike Windows, the Event Targets contain all events but we must 145 // On GTK, unlike Windows, the Event Targets contain all events but we must
135 // only unregister the ones we registered targets for. 146 // only unregister the ones we registered targets for.
136 if (!ShouldIgnoreCommand(command_name)) { 147 if (!ShouldIgnoreCommand(command_name)) {
137 gtk_accel_group_disconnect_key( 148 gtk_accel_group_disconnect_key(
138 accel_group_, 149 accel_group_,
139 ui::GetGdkKeyCodeForAccelerator(accelerator), 150 ui::GetGdkKeyCodeForAccelerator(accelerator),
140 ui::GetGdkModifierForAccelerator(accelerator)); 151 ui::GetGdkModifierForAccelerator(accelerator));
141 } 152 }
142 } 153 }
143 154
144 gboolean ExtensionKeybindingRegistryGtk::OnGtkAccelerator( 155 gboolean ExtensionKeybindingRegistryGtk::OnGtkAccelerator(
145 GtkAccelGroup* group, 156 GtkAccelGroup* group,
146 GObject* acceleratable, 157 GObject* acceleratable,
147 guint keyval, 158 guint keyval,
148 GdkModifierType modifier) { 159 GdkModifierType modifier) {
149 ui::Accelerator accelerator = ui::AcceleratorForGdkKeyCodeAndModifier( 160 ui::Accelerator accelerator = ui::AcceleratorForGdkKeyCodeAndModifier(
150 keyval, modifier); 161 keyval, modifier);
151 162
152 EventTargets::iterator it = event_targets_.find(accelerator); 163 return ExtensionKeybindingRegistry::NotifyEventTargets(accelerator);
153 if (it == event_targets_.end()) {
154 NOTREACHED(); // Shouldn't get this event for something not registered.
155 return FALSE;
156 }
157
158 CommandExecuted(it->second.first, it->second.second);
159 return TRUE;
160 } 164 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698