Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 #import "chrome/browser/ui/cocoa/chrome_event_processing_window.h" | 5 #import "chrome/browser/ui/cocoa/chrome_command_dispatch_delegate.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "chrome/browser/global_keyboard_shortcuts_mac.h" | 8 #include "chrome/browser/global_keyboard_shortcuts_mac.h" |
| 9 #include "chrome/browser/ui/browser_commands.h" | 9 #include "chrome/browser/ui/browser_commands.h" |
| 10 #include "chrome/browser/ui/browser_finder.h" | 10 #include "chrome/browser/ui/browser_finder.h" |
| 11 #import "chrome/browser/ui/cocoa/browser_window_controller_private.h" | 11 #import "chrome/browser/ui/cocoa/browser_window_controller_private.h" |
| 12 #import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h" | 12 #import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h" |
| 13 #import "content/public/browser/render_widget_host_view_mac_base.h" | 13 #import "content/public/browser/render_widget_host_view_mac_base.h" |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 92 windowNumber:[window windowNumber] | 92 windowNumber:[window windowNumber] |
| 93 context:nil | 93 context:nil |
| 94 characters:characters | 94 characters:characters |
| 95 charactersIgnoringModifiers:charactors_ignoring_modifiers | 95 charactersIgnoringModifiers:charactors_ignoring_modifiers |
| 96 isARepeat:is_a_repeat | 96 isARepeat:is_a_repeat |
| 97 keyCode:[event keyCode]]; | 97 keyCode:[event keyCode]]; |
| 98 } | 98 } |
| 99 | 99 |
| 100 } // namespace | 100 } // namespace |
| 101 | 101 |
| 102 @implementation ChromeEventProcessingWindow | 102 @implementation ChromeCommandDispatchDelegate |
| 103 | 103 |
| 104 - (BOOL)handleExtraKeyboardShortcut:(NSEvent*)event { | 104 - (BOOL)handleExtraKeyboardShortcut:(NSEvent*)event window:(NSWindow*)window { |
| 105 return HandleExtraBrowserKeyboardShortcut(event, self) || | 105 return HandleExtraBrowserKeyboardShortcut(event, window) || |
| 106 HandleExtraWindowKeyboardShortcut(event, self) || | 106 HandleExtraWindowKeyboardShortcut(event, window) || |
| 107 HandleDelayedWindowKeyboardShortcut(event, self); | 107 HandleDelayedWindowKeyboardShortcut(event, window); |
| 108 } | 108 } |
| 109 | 109 |
| 110 - (BOOL)performKeyEquivalent:(NSEvent*)event { | 110 - (BOOL)performKeyEquivalent:(NSEvent*)event |
| 111 window:(NSWindow*)window | |
|
tapted
2015/07/31 03:06:49
Could the delegate simply have a (weak) NSWindow*
jackhou1
2015/08/04 01:03:58
Done.
| |
| 112 nativeHandler:(BOOL (^)(NSEvent*))nativePerformKeyEquivalent { | |
| 111 // Some extension commands have higher priority than web content, and some | 113 // Some extension commands have higher priority than web content, and some |
| 112 // have lower priority. Regardless of whether the event is being | 114 // have lower priority. Regardless of whether the event is being |
| 113 // redispatched, let the extension system try to handle the event. | 115 // redispatched, let the extension system try to handle the event. |
| 114 NSWindow* window = event.window; | 116 if (event.window) { |
|
tapted
2015/07/31 03:06:49
event.window -> window? (or, owner_?) (or, comment
jackhou1
2015/08/04 01:03:58
Done.
| |
| 115 if (window) { | 117 BrowserWindowController* controller = [event.window windowController]; |
|
tapted
2015/07/31 03:06:49
ObjCCastStrict?
And.. that might actually fail. I
tapted
2015/07/31 03:06:50
event.window -> window?
jackhou1
2015/08/04 01:03:58
Done.
| |
| 116 BrowserWindowController* controller = [window windowController]; | |
| 117 if ([controller respondsToSelector:@selector(handledByExtensionCommand: | 118 if ([controller respondsToSelector:@selector(handledByExtensionCommand: |
| 118 priority:)]) { | 119 priority:)]) { |
| 119 ui::AcceleratorManager::HandlerPriority priority = | 120 ui::AcceleratorManager::HandlerPriority priority = |
| 120 redispatchingEvent_ ? ui::AcceleratorManager::kNormalPriority | 121 redispatchingEvent_ ? ui::AcceleratorManager::kNormalPriority |
| 121 : ui::AcceleratorManager::kHighPriority; | 122 : ui::AcceleratorManager::kHighPriority; |
| 122 if ([controller handledByExtensionCommand:event priority:priority]) | 123 if ([controller handledByExtensionCommand:event priority:priority]) |
| 123 return YES; | 124 return YES; |
| 124 } | 125 } |
| 125 } | 126 } |
| 126 | 127 |
| 127 if (redispatchingEvent_) | 128 if (redispatchingEvent_) |
| 128 return NO; | 129 return NO; |
| 129 | 130 |
| 130 // Give the web site a chance to handle the event. If it doesn't want to | 131 // Give the web site a chance to handle the event. If it doesn't want to |
| 131 // handle it, it will call us back with one of the |handle*| methods above. | 132 // handle it, it will call us back with one of the |handle*| methods above. |
| 132 NSResponder* r = [self firstResponder]; | 133 NSResponder* r = [window firstResponder]; |
| 133 if ([r conformsToProtocol:@protocol(RenderWidgetHostViewMacBase)]) | 134 if ([r conformsToProtocol:@protocol(RenderWidgetHostViewMacBase)]) |
| 134 return [r performKeyEquivalent:event]; | 135 return [r performKeyEquivalent:event]; |
| 135 | 136 |
| 136 // Handle per-window shortcuts like cmd-1, but do not handle browser-level | 137 // Handle per-window shortcuts like cmd-1, but do not handle browser-level |
| 137 // shortcuts like cmd-left (else, cmd-left would do history navigation even | 138 // shortcuts like cmd-left (else, cmd-left would do history navigation even |
| 138 // if e.g. the Omnibox has focus). | 139 // if e.g. the Omnibox has focus). |
| 139 if (HandleExtraWindowKeyboardShortcut(event, self)) | 140 if (HandleExtraWindowKeyboardShortcut(event, window)) |
| 140 return YES; | 141 return YES; |
| 141 | 142 |
| 142 if ([super performKeyEquivalent:event]) | 143 if (nativePerformKeyEquivalent(event)) |
|
tapted
2015/07/31 03:06:50
e.g. this could become [owner_ defaultPerformKeyEq
jackhou1
2015/08/04 01:03:58
Done.
| |
| 143 return YES; | 144 return YES; |
| 144 | 145 |
| 145 // Handle per-window shortcuts like Esc after giving everybody else a chance | 146 // Handle per-window shortcuts like Esc after giving everybody else a chance |
| 146 // to handle them | 147 // to handle them |
| 147 return HandleDelayedWindowKeyboardShortcut(event, self); | 148 return HandleDelayedWindowKeyboardShortcut(event, window); |
| 148 } | 149 } |
| 149 | 150 |
| 150 - (BOOL)redispatchKeyEvent:(NSEvent*)event { | 151 - (BOOL)redispatchKeyEvent:(NSEvent*)event window:(NSWindow*)window { |
| 151 DCHECK(event); | 152 DCHECK(event); |
| 152 NSEventType eventType = [event type]; | 153 NSEventType eventType = [event type]; |
| 153 if (eventType != NSKeyDown && | 154 if (eventType != NSKeyDown && eventType != NSKeyUp && |
| 154 eventType != NSKeyUp && | |
| 155 eventType != NSFlagsChanged) { | 155 eventType != NSFlagsChanged) { |
| 156 NOTREACHED(); | 156 NOTREACHED(); |
| 157 return YES; // Pretend it's been handled in an effort to limit damage. | 157 return YES; // Pretend it's been handled in an effort to limit damage. |
| 158 } | 158 } |
| 159 | 159 |
| 160 // Ordinarily, the event's window should be this window. However, when | 160 // Ordinarily, the event's window should be this window. However, when |
| 161 // switching between normal and fullscreen mode, we switch out the window, and | 161 // switching between normal and fullscreen mode, we switch out the window, and |
| 162 // the event's window might be the previous window (or even an earlier one if | 162 // the event's window might be the previous window (or even an earlier one if |
| 163 // the renderer is running slowly and several mode switches occur). In this | 163 // the renderer is running slowly and several mode switches occur). In this |
| 164 // rare case, we synthesize a new key event so that its associate window | 164 // rare case, we synthesize a new key event so that its associate window |
| 165 // (number) is our own. | 165 // (number) is our own. |
| 166 if ([event window] != self) | 166 if ([event window] != window) |
| 167 event = KeyEventForWindow(self, event); | 167 event = KeyEventForWindow(window, event); |
| 168 | 168 |
| 169 // Redispatch the event. | 169 // Redispatch the event. |
| 170 eventHandled_ = YES; | 170 eventHandled_ = YES; |
| 171 redispatchingEvent_ = YES; | 171 redispatchingEvent_ = YES; |
| 172 [NSApp sendEvent:event]; | 172 [NSApp sendEvent:event]; |
| 173 redispatchingEvent_ = NO; | 173 redispatchingEvent_ = NO; |
| 174 | 174 |
| 175 // If the event was not handled by [NSApp sendEvent:], the sendEvent: | 175 // If the event was not handled by [NSApp sendEvent:], the sendEvent: |
| 176 // method below will be called, and because |redispatchingEvent_| is YES, | 176 // method below will be called, and because |redispatchingEvent_| is YES, |
| 177 // |eventHandled_| will be set to NO. | 177 // |eventHandled_| will be set to NO. |
| 178 return eventHandled_; | 178 return eventHandled_; |
| 179 } | 179 } |
| 180 | 180 |
| 181 - (void)sendEvent:(NSEvent*)event { | 181 - (BOOL)preSendEvent:(NSEvent*)event { |
| 182 if (!redispatchingEvent_) | 182 if (redispatchingEvent_) { |
| 183 [super sendEvent:event]; | |
| 184 else | |
| 185 eventHandled_ = NO; | 183 eventHandled_ = NO; |
| 184 return NO; | |
| 185 } | |
| 186 | |
| 187 return YES; | |
| 186 } | 188 } |
| 187 | 189 |
| 188 @end // ChromeEventProcessingWindow | 190 @end // ChromeCommandDispatchDelegate |
| OLD | NEW |