OLD | NEW |
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 Loading... |
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(event_targets_[accelerator].size(), 1u); |
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(event_targets_[accelerator].size(), 1u); |
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(event_targets_[accelerator].size(), 1u); |
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(event_targets_[accelerator].size(), 1u); |
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 } |
OLD | NEW |