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 3 // found in the LICENSE file. 4 5 #include "ash/drag_drop/drag_drop_tracker.h" 6 7 #include "ash/shell.h" 8 #include "ash/shell_window_ids.h" 9 #include "ash/wm/coordinate_conversion.h" 10 #include "ui/aura/client/window_tree_client.h" 11 #include "ui/aura/root_window.h" 12 #include "ui/aura/window.h" 13 #include "ui/events/event.h" 14 #include "ui/gfx/screen.h" 15 16 namespace ash { 17 namespace internal { 18 19 namespace { 20 21 // Creates a window for capturing drag events. 22 aura::Window* CreateCaptureWindow(aura::Window* context_root, 23 aura::WindowDelegate* delegate) { 24 aura::Window* window = new aura::Window(delegate); 25 window->SetType(aura::client::WINDOW_TYPE_NORMAL); 26 window->Init(ui::LAYER_NOT_DRAWN); 27 aura::client::ParentWindowWithContext(window, context_root, gfx::Rect()); 28 window->Show(); 29 DCHECK(window->bounds().size().IsEmpty()); 30 return window; 31 } 32 33 } // namespace 34 35 DragDropTracker::DragDropTracker(aura::Window* context_root, 36 aura::WindowDelegate* delegate) 37 : capture_window_(CreateCaptureWindow(context_root, delegate)) { 38 } 39 40 DragDropTracker::~DragDropTracker() { 41 capture_window_->ReleaseCapture(); 42 } 43 44 void DragDropTracker::TakeCapture() { 45 capture_window_->SetCapture(); 46 } 47 48 aura::Window* DragDropTracker::GetTarget(const ui::LocatedEvent& event) { 49 DCHECK(capture_window_.get()); 50 gfx::Point location_in_screen = event.location(); 51 wm::ConvertPointToScreen(capture_window_.get(), 52 &location_in_screen); 53 aura::Window* root_window_at_point = 54 wm::GetRootWindowAt(location_in_screen); 55 gfx::Point location_in_root = location_in_screen; 56 wm::ConvertPointFromScreen(root_window_at_point, &location_in_root); 57 return root_window_at_point->GetEventHandlerForPoint(location_in_root); 58 } 59 60 ui::LocatedEvent* DragDropTracker::ConvertEvent( 61 aura::Window* target, 62 const ui::LocatedEvent& event) { 63 DCHECK(capture_window_.get()); 64 gfx::Point target_location = event.location(); 65 aura::Window::ConvertPointToTarget(capture_window_.get(), target, 66 &target_location); 67 gfx::Point location_in_screen = event.location(); 68 ash::wm::ConvertPointToScreen(capture_window_.get(), &location_in_screen); 69 gfx::Point target_root_location = event.root_location(); 70 aura::Window::ConvertPointToTarget( 71 capture_window_->GetRootWindow(), 72 ash::wm::GetRootWindowAt(location_in_screen), 73 &target_root_location); 74 return new ui::MouseEvent(event.type(), 75 target_location, 76 target_root_location, 77 event.flags()); 78 } 79 80 } // namespace internal 81 } // namespace ash 82