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.
5 #include "ash/drag_drop/drag_drop_tracker.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/window.h"
12 #include "ui/aura/window_event_dispatcher.h"
13 #include "ui/events/event.h"
14 #include "ui/gfx/screen.h"
15 #include "ui/wm/core/coordinate_conversion.h"
16 #include "ui/wm/public/activation_delegate.h"
21 // An activation delegate which disables activating the drag and drop window.
22 class CaptureWindowActivationDelegate
23 : public aura::client::ActivationDelegate
{
25 CaptureWindowActivationDelegate() {}
26 ~CaptureWindowActivationDelegate() override
{}
28 // aura::client::ActivationDelegate overrides:
29 bool ShouldActivate() const override
{ return false; }
33 DISALLOW_COPY_AND_ASSIGN(CaptureWindowActivationDelegate
);
36 // Creates a window for capturing drag events.
37 aura::Window
* CreateCaptureWindow(aura::Window
* context_root
,
38 aura::WindowDelegate
* delegate
) {
39 static CaptureWindowActivationDelegate
* activation_delegate_instance
= NULL
;
40 if (!activation_delegate_instance
)
41 activation_delegate_instance
= new CaptureWindowActivationDelegate
;
42 aura::Window
* window
= new aura::Window(delegate
);
43 // Set type of window as popup to prevent different window manager codes
44 // trying to manage this window.
45 window
->SetType(ui::wm::WINDOW_TYPE_POPUP
);
46 window
->Init(aura::WINDOW_LAYER_NOT_DRAWN
);
47 aura::client::ParentWindowWithContext(window
, context_root
, gfx::Rect());
48 aura::client::SetActivationDelegate(window
, activation_delegate_instance
);
50 DCHECK(window
->bounds().size().IsEmpty());
56 DragDropTracker::DragDropTracker(aura::Window
* context_root
,
57 aura::WindowDelegate
* delegate
)
58 : capture_window_(CreateCaptureWindow(context_root
, delegate
)) {
61 DragDropTracker::~DragDropTracker() {
62 capture_window_
->ReleaseCapture();
65 void DragDropTracker::TakeCapture() {
66 capture_window_
->SetCapture();
69 aura::Window
* DragDropTracker::GetTarget(const ui::LocatedEvent
& event
) {
70 DCHECK(capture_window_
.get());
71 gfx::Point location_in_screen
= event
.location();
72 ::wm::ConvertPointToScreen(capture_window_
.get(), &location_in_screen
);
73 aura::Window
* root_window_at_point
=
74 wm::GetRootWindowAt(location_in_screen
);
75 gfx::Point location_in_root
= location_in_screen
;
76 ::wm::ConvertPointFromScreen(root_window_at_point
, &location_in_root
);
77 return root_window_at_point
->GetEventHandlerForPoint(location_in_root
);
80 ui::LocatedEvent
* DragDropTracker::ConvertEvent(
82 const ui::LocatedEvent
& event
) {
83 DCHECK(capture_window_
.get());
84 gfx::Point target_location
= event
.location();
85 aura::Window::ConvertPointToTarget(capture_window_
.get(), target
,
87 gfx::Point location_in_screen
= event
.location();
88 ::wm::ConvertPointToScreen(capture_window_
.get(), &location_in_screen
);
89 gfx::Point target_root_location
= event
.root_location();
90 aura::Window::ConvertPointToTarget(
91 capture_window_
->GetRootWindow(),
92 ash::wm::GetRootWindowAt(location_in_screen
),
93 &target_root_location
);
94 return new ui::MouseEvent(event
.type(),
98 static_cast<const ui::MouseEvent
&>(event
).
99 changed_button_flags());