Index: ui/views/widget/desktop_aura/x11_desktop_window_move_client.cc |
diff --git a/ui/views/widget/desktop_aura/x11_desktop_window_move_client.cc b/ui/views/widget/desktop_aura/x11_desktop_window_move_client.cc |
index 41573fece9a0b662decba46fc548292e769ddb34..651d6fa738e5c9b05536c8f3952c7578170a714f 100644 |
--- a/ui/views/widget/desktop_aura/x11_desktop_window_move_client.cc |
+++ b/ui/views/widget/desktop_aura/x11_desktop_window_move_client.cc |
@@ -18,6 +18,26 @@ |
#include "ui/events/event.h" |
#include "ui/gfx/screen.h" |
+namespace { |
+ |
+// Delay moving the window. |
+// |
+// When we receive a mouse move event, we have to have it processed in a |
+// different run through the message pump because moving the window will |
+// otherwise prevent tasks from running. |
+// |
+// This constant was derived with playing with builds of chrome; it has no |
+// theoretical justification. |
+// |
+// TODO(erg): This helps with the performance of dragging windows, but it |
+// doesn't really solve the hard problems, which is that various calls to X11, |
+// such as XQueryPointer, ui::IsWindowVisible() and ui::WindowContainsPoint() |
+// take a while to get replies and block in the process. I've seen all of the |
+// above take as long as 20ms to respond. |
+const int kMoveDelay = 3; |
+ |
+} // namespace |
+ |
namespace views { |
X11DesktopWindowMoveClient::X11DesktopWindowMoveClient() |
@@ -30,8 +50,15 @@ X11DesktopWindowMoveClient::~X11DesktopWindowMoveClient() {} |
void X11DesktopWindowMoveClient::OnMouseMovement(XMotionEvent* event) { |
gfx::Point cursor_point(event->x_root, event->y_root); |
gfx::Point system_loc = cursor_point - window_offset_; |
- root_window_->SetHostBounds(gfx::Rect( |
- system_loc, root_window_->GetHostSize())); |
+ |
+ gfx::Rect target_rect(system_loc, root_window_->GetHostSize()); |
+ |
+ window_move_timer_.Start( |
+ FROM_HERE, |
+ base::TimeDelta::FromMilliseconds(kMoveDelay), |
+ base::Bind(&X11DesktopWindowMoveClient::SetHostBounds, |
+ base::Unretained(this), |
+ target_rect)); |
} |
void X11DesktopWindowMoveClient::OnMouseReleased() { |
@@ -57,7 +84,15 @@ aura::client::WindowMoveResult X11DesktopWindowMoveClient::RunMoveLoop( |
} |
void X11DesktopWindowMoveClient::EndMoveLoop() { |
+ window_move_timer_.Stop(); |
move_loop_.EndMoveLoop(); |
} |
+//////////////////////////////////////////////////////////////////////////////// |
+// DesktopRootWindowHostLinux, private: |
+ |
+void X11DesktopWindowMoveClient::SetHostBounds(const gfx::Rect& rect) { |
+ root_window_->SetHostBounds(rect); |
+} |
+ |
} // namespace views |