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

Unified Diff: ash/drag_drop/drag_drop_tracker.cc

Issue 10855159: Support Drag and Drop across displays. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months 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 side-by-side diff with in-line comments
Download patch
Index: ash/drag_drop/drag_drop_tracker.cc
diff --git a/ash/drag_drop/drag_drop_tracker.cc b/ash/drag_drop/drag_drop_tracker.cc
new file mode 100644
index 0000000000000000000000000000000000000000..91502e446b72e043fa73879768d4794c52bb3ff6
--- /dev/null
+++ b/ash/drag_drop/drag_drop_tracker.cc
@@ -0,0 +1,140 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/drag_drop/drag_drop_tracker.h"
+
+#include "ash/shell.h"
+#include "ash/shell_window_ids.h"
+#include "ash/wm/coordinate_conversion.h"
+#include "ui/aura/root_window.h"
+#include "ui/aura/window_delegate.h"
+#include "ui/base/event.h"
+#include "ui/gfx/path.h"
+
+namespace {
+
+// WindowDelegate for capturing drag events in DragDropTracker. This basically
+// does nothing.
+class DragDropTrackerWindowDelegate : public aura::WindowDelegate {
+ public:
+ DragDropTrackerWindowDelegate() {}
+ virtual ~DragDropTrackerWindowDelegate() {};
+
+ private:
+ // Overridden from WindowDelegate:
+ virtual gfx::Size GetMinimumSize() const OVERRIDE {
+ return gfx::Size();
+ }
+ virtual void OnBoundsChanged(const gfx::Rect& old_bounds,
+ const gfx::Rect& new_bounds) OVERRIDE {
+ }
+ virtual void OnFocus(aura::Window* old_focused_window) OVERRIDE {
+ }
+ virtual void OnBlur() OVERRIDE {
+ }
+ virtual bool OnKeyEvent(ui::KeyEvent* event) OVERRIDE {
+ return false;
+ }
+ virtual gfx::NativeCursor GetCursor(const gfx::Point& point) OVERRIDE {
+ return gfx::kNullCursor;
+ }
+ virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE {
+ return 0;
+ }
+ virtual bool ShouldDescendIntoChildForEventHandling(
+ aura::Window* child,
+ const gfx::Point& location) OVERRIDE {
+ return true;
+ }
+ virtual bool OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
+ return true;
+ }
+ virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
+ return ui::TOUCH_STATUS_END;
+ }
+ virtual ui::GestureStatus OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
+ return ui::GESTURE_STATUS_UNKNOWN;
+ }
+ virtual bool CanFocus() OVERRIDE { return true; }
+ virtual void OnCaptureLost() OVERRIDE {}
+ virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
+ }
+ virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE {}
+ virtual void OnWindowDestroying() OVERRIDE {}
+ virtual void OnWindowDestroyed() OVERRIDE { delete this; }
+ virtual void OnWindowTargetVisibilityChanged(bool visible) OVERRIDE {}
+ virtual bool HasHitTestMask() const OVERRIDE { return false; }
+ virtual void GetHitTestMask(gfx::Path* mask) const OVERRIDE {}
+
+ DISALLOW_COPY_AND_ASSIGN(DragDropTrackerWindowDelegate);
+};
+
+// Creates a window for capturing drag events.
+aura::Window* CreateCaptureWindow(aura::RootWindow* root_window) {
+ aura::Window* window = new aura::Window(new DragDropTrackerWindowDelegate);
+ window->Init(ui::LAYER_NOT_DRAWN);
+ aura::Window* default_container =
+ ash::Shell::GetContainer(root_window,
+ ash::internal::kShellWindowId_DefaultContainer);
+ default_container->AddChild(window);
+ window->Show();
+ return window;
+}
+
+} // namespace
+
+namespace ash {
+namespace internal {
+
+DragDropTracker::DragDropTracker()
+ : capture_window_(NULL) {
+}
+
+DragDropTracker::~DragDropTracker() {
+ StopTracking();
+}
+
+void DragDropTracker::StartTracking(aura::RootWindow* root_window) {
+ StopTracking();
+ capture_window_ = CreateCaptureWindow(root_window);
+ capture_window_->SetCapture();
+}
+
+void DragDropTracker::StopTracking() {
+ if (capture_window_) {
+ capture_window_->ReleaseCapture();
+ delete capture_window_;
+ }
+ capture_window_ = NULL;
+}
+
+aura::Window* DragDropTracker::GetTarget(const ui::LocatedEvent& event) {
+ std::pair<aura::RootWindow*, gfx::Point> pair =
+ ash::wm::GetRootWindowRelativeToWindow(capture_window_->GetRootWindow(),
+ event.location());
+ return pair.first->GetEventHandlerForPoint(pair.second);
+}
+
+ui::MouseEvent* DragDropTracker::ConvertMouseEvent(
+ aura::Window* target,
+ const ui::MouseEvent& event) {
+ DCHECK(capture_window_);
+ std::pair<aura::RootWindow*, gfx::Point> location_pair =
+ ash::wm::GetRootWindowRelativeToWindow(capture_window_->GetRootWindow(),
+ event.location());
+ aura::Window::ConvertPointToTarget(location_pair.first, target,
+ &location_pair.second);
+ std::pair<aura::RootWindow*, gfx::Point> root_location_pair =
+ ash::wm::GetRootWindowRelativeToWindow(capture_window_->GetRootWindow(),
+ event.root_location());
+ aura::Window::ConvertPointToTarget(root_location_pair.first, target,
+ &root_location_pair.second);
+ return new ui::MouseEvent(event.type(),
+ location_pair.second,
+ root_location_pair.second,
+ event.flags());
+}
+
+} // namespace internal
+} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698