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

Unified Diff: ash/display/mouse_cursor_event_filter.cc

Issue 10835047: Allow the cursor to warp even when a window is dragged (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: do not move modal windows to another display Created 8 years, 5 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
« no previous file with comments | « ash/display/display_controller.cc ('k') | ash/shell.h » ('j') | ash/shell.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/display/mouse_cursor_event_filter.cc
diff --git a/ash/display/mouse_cursor_event_filter.cc b/ash/display/mouse_cursor_event_filter.cc
index 9b6d2973cde40375253e5cd909298ce5305d84bc..f958ce791a1649ba465b7d612940175bf289db05 100644
--- a/ash/display/mouse_cursor_event_filter.cc
+++ b/ash/display/mouse_cursor_event_filter.cc
@@ -7,6 +7,7 @@
#include "ash/display/display_controller.h"
#include "ash/shell.h"
#include "ash/wm/cursor_manager.h"
+#include "ui/aura/client/screen_position_client.h"
#include "ui/aura/env.h"
#include "ui/aura/event.h"
#include "ui/aura/root_window.h"
@@ -31,14 +32,33 @@ bool MouseCursorEventFilter::PreHandleKeyEvent(aura::Window* target,
bool MouseCursorEventFilter::PreHandleMouseEvent(aura::Window* target,
aura::MouseEvent* event) {
- if (event->type() != ui::ET_MOUSE_MOVED ||
- ash::Shell::GetInstance()->cursor_manager()->is_cursor_locked())
- return false;
- aura::RootWindow* current_root = target->GetRootWindow();
+ const bool is_cursor_locked =
+ Shell::GetInstance()->cursor_manager()->is_cursor_locked();
+
+ // When the cursor is not locked (i.e., nothing is dragged), we only handle
+ // ET_MOUSE_MOVED events. When it's locked, we only handle ET_MOUSE_DRAGGED
+ // events. This is because when the cursor enters the other root window while
+ // dragging, the underlying window system (at least X11) stops generating an
+ // ET_MOUSE_MOVED event.
+ if (!is_cursor_locked) {
+ if (event->type() != ui::ET_MOUSE_MOVED)
+ return false;
+ } else {
+ if (event->type() != ui::ET_MOUSE_DRAGGED)
+ return false;
+ }
+
gfx::Point location_in_root(event->location());
- aura::Window::ConvertPointToWindow(target, current_root, &location_in_root);
+ aura::Window::ConvertPointToWindow(
+ target, target->GetRootWindow(), &location_in_root);
+
+ // Get the root window where the cursor is currently on, then pass the window
+ // and the location in the window's coordinates to ash::DisplayController.
+ std::pair<aura::RootWindow*, gfx::Point> actual_location =
+ Shell::GetInstance()->NormalizeLocationInDragEvent(
+ target->GetRootWindow(), location_in_root);
return display_controller_->WarpMouseCursorIfNecessary(
- current_root, location_in_root);
+ actual_location.first, actual_location.second, is_cursor_locked);
}
ui::TouchStatus MouseCursorEventFilter::PreHandleTouchEvent(
« no previous file with comments | « ash/display/display_controller.cc ('k') | ash/shell.h » ('j') | ash/shell.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698