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

Side by Side Diff: ui/views/test/event_generator_delegate_mac.mm

Issue 2448173002: Fix processing of mouse events on MacViews.
Patch Set: Fix review issues. Created 4 years, 1 month 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
« no previous file with comments | « ui/views/cocoa/bridged_native_widget.mm ('k') | ui/views/widget/native_widget_mac_unittest.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 <Cocoa/Cocoa.h> 5 #import <Cocoa/Cocoa.h>
6 #include <stddef.h> 6 #include <stddef.h>
7 7
8 #import "base/mac/scoped_nsobject.h" 8 #import "base/mac/scoped_nsobject.h"
9 #import "base/mac/scoped_objc_class_swizzler.h" 9 #import "base/mac/scoped_objc_class_swizzler.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 break; 165 break;
166 case NSMouseMoved: 166 case NSMouseMoved:
167 // Assumes [NSWindow acceptsMouseMovedEvents] would return YES, and that 167 // Assumes [NSWindow acceptsMouseMovedEvents] would return YES, and that
168 // NSTrackingAreas have been appropriately installed on |responder|. 168 // NSTrackingAreas have been appropriately installed on |responder|.
169 [responder mouseMoved:event]; 169 [responder mouseMoved:event];
170 break; 170 break;
171 case NSScrollWheel: 171 case NSScrollWheel:
172 [responder scrollWheel:event]; 172 [responder scrollWheel:event];
173 break; 173 break;
174 case NSMouseEntered: 174 case NSMouseEntered:
175 [responder mouseEntered:event];
176 break;
175 case NSMouseExited: 177 case NSMouseExited:
176 // With the assumptions in NSMouseMoved, it doesn't make sense for the 178 [responder mouseExited:event];
177 // generator to handle entered/exited separately. It's the responsibility
178 // of views::internal::RootView to convert the moved events into entered
179 // and exited events for the individual views.
180 NOTREACHED();
181 break; 179 break;
182 case NSEventTypeSwipe: 180 case NSEventTypeSwipe:
183 // NSEventTypeSwipe events can't be generated using public interfaces on 181 // NSEventTypeSwipe events can't be generated using public interfaces on
184 // NSEvent, so this will need to be handled at a higher level. 182 // NSEvent, so this will need to be handled at a higher level.
185 NOTREACHED(); 183 NOTREACHED();
186 break; 184 break;
187 default: 185 default:
188 NOTREACHED(); 186 NOTREACHED();
189 } 187 }
190 } 188 }
191 189
192 NSEvent* CreateMouseEventInWindow(NSWindow* window, 190 NSEvent* CreateMouseEventInWindow(NSWindow* window,
193 ui::EventType event_type, 191 ui::EventType event_type,
194 const gfx::Point& point_in_root, 192 const gfx::Point& point_in_root,
195 int flags) { 193 int flags) {
196 NSUInteger click_count = 0; 194 NSUInteger click_count = 0;
197 if (event_type == ui::ET_MOUSE_PRESSED || 195 if (event_type == ui::ET_MOUSE_PRESSED ||
198 event_type == ui::ET_MOUSE_RELEASED) { 196 event_type == ui::ET_MOUSE_RELEASED) {
199 if (flags & ui::EF_IS_TRIPLE_CLICK) 197 if (flags & ui::EF_IS_TRIPLE_CLICK)
200 click_count = 3; 198 click_count = 3;
201 else if (flags & ui::EF_IS_DOUBLE_CLICK) 199 else if (flags & ui::EF_IS_DOUBLE_CLICK)
202 click_count = 2; 200 click_count = 2;
203 else 201 else
204 click_count = 1; 202 click_count = 1;
205 } 203 }
206 NSPoint point = ConvertRootPointToTarget(window, point_in_root); 204 NSPoint point = ConvertRootPointToTarget(window, point_in_root);
207 NSUInteger modifiers = 0; 205 NSUInteger modifiers = 0;
208 NSEventType type = EventTypeToNative(event_type, flags, &modifiers); 206 NSEventType type = EventTypeToNative(event_type, flags, &modifiers);
209 return [NSEvent mouseEventWithType:type 207 if (type == NSMouseEntered || type == NSMouseExited) {
210 location:point 208 return [NSEvent enterExitEventWithType:type
211 modifierFlags:modifiers 209 location:point
212 timestamp:0 210 modifierFlags:modifiers
213 windowNumber:[window windowNumber] 211 timestamp:0
214 context:nil 212 windowNumber:[window windowNumber]
215 eventNumber:0 213 context:nil
216 clickCount:click_count 214 eventNumber:0
217 pressure:1.0]; 215 trackingNumber:0
216 userData:nil];
217 } else {
218 return [NSEvent mouseEventWithType:type
219 location:point
220 modifierFlags:modifiers
221 timestamp:0
222 windowNumber:[window windowNumber]
223 context:nil
224 eventNumber:0
225 clickCount:click_count
226 pressure:1.0];
227 }
228 }
229
230 NSEvent* CreateMouseWheelEventInWindow(NSWindow* window,
231 ui::MouseEvent* mouse_event) {
232 DCHECK(mouse_event->type() == ui::ET_MOUSEWHEEL);
233 ui::MouseWheelEvent* mouse_wheel_event =
234 static_cast<ui::MouseWheelEvent*>(mouse_event);
235 return cocoa_test_event_utils::TestScrollEvent(
236 ConvertRootPointToTarget(window, mouse_wheel_event->location()), window,
237 mouse_wheel_event->x_offset(), mouse_wheel_event->y_offset(), false,
238 NSEventPhaseNone, NSEventPhaseNone);
218 } 239 }
219 240
220 // Implementation of ui::test::EventGeneratorDelegate for Mac. Everything 241 // Implementation of ui::test::EventGeneratorDelegate for Mac. Everything
221 // defined inline is just a stub. Interesting overrides are defined below the 242 // defined inline is just a stub. Interesting overrides are defined below the
222 // class. 243 // class.
223 class EventGeneratorDelegateMac : public ui::EventTarget, 244 class EventGeneratorDelegateMac : public ui::EventTarget,
224 public ui::EventSource, 245 public ui::EventSource,
225 public ui::EventHandler, 246 public ui::EventHandler,
226 public ui::EventProcessor, 247 public ui::EventProcessor,
227 public ui::EventTargeter, 248 public ui::EventTargeter,
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 ui::test::EventGenerator::default_delegate = nullptr; 363 ui::test::EventGenerator::default_delegate = nullptr;
343 } 364 }
344 365
345 std::unique_ptr<ui::EventTargetIterator> 366 std::unique_ptr<ui::EventTargetIterator>
346 EventGeneratorDelegateMac::GetChildIterator() const { 367 EventGeneratorDelegateMac::GetChildIterator() const {
347 // Return nullptr to dispatch all events to the result of GetRootTarget(). 368 // Return nullptr to dispatch all events to the result of GetRootTarget().
348 return nullptr; 369 return nullptr;
349 } 370 }
350 371
351 void EventGeneratorDelegateMac::OnMouseEvent(ui::MouseEvent* event) { 372 void EventGeneratorDelegateMac::OnMouseEvent(ui::MouseEvent* event) {
352 NSEvent* ns_event = CreateMouseEventInWindow(window_, 373 NSEvent* ns_event =
353 event->type(), 374 event->type() == ui::ET_MOUSEWHEEL
354 event->location(), 375 ? CreateMouseWheelEventInWindow(window_, event)
355 event->changed_button_flags()); 376 : CreateMouseEventInWindow(window_, event->type(), event->location(),
377 event->changed_button_flags());
378
356 if (owner_->targeting_application()) 379 if (owner_->targeting_application())
357 [NSApp sendEvent:ns_event]; 380 [NSApp sendEvent:ns_event];
358 else 381 else
359 EmulateSendEvent(window_, ns_event); 382 EmulateSendEvent(window_, ns_event);
360 } 383 }
361 384
362 void EventGeneratorDelegateMac::OnKeyEvent(ui::KeyEvent* event) { 385 void EventGeneratorDelegateMac::OnKeyEvent(ui::KeyEvent* event) {
363 NSUInteger modifiers = EventFlagsToModifiers(event->flags()); 386 NSUInteger modifiers = EventFlagsToModifiers(event->flags());
364 NSEvent* ns_event = cocoa_test_event_utils::SynthesizeKeyEvent( 387 NSEvent* ns_event = cocoa_test_event_utils::SynthesizeKeyEvent(
365 window_, event->type() == ui::ET_KEY_PRESSED, event->key_code(), 388 window_, event->type() == ui::ET_KEY_PRESSED, event->key_code(),
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 - (NSEvent*)currentEvent { 514 - (NSEvent*)currentEvent {
492 if (g_current_event) 515 if (g_current_event)
493 return g_current_event; 516 return g_current_event;
494 517
495 // Find the original implementation and invoke it. 518 // Find the original implementation and invoke it.
496 IMP original = EventGeneratorDelegateMac::GetInstance()->CurrentEventMethod(); 519 IMP original = EventGeneratorDelegateMac::GetInstance()->CurrentEventMethod();
497 return original(self, _cmd); 520 return original(self, _cmd);
498 } 521 }
499 522
500 @end 523 @end
OLDNEW
« no previous file with comments | « ui/views/cocoa/bridged_native_widget.mm ('k') | ui/views/widget/native_widget_mac_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698