Home | History | Annotate | Download | only in desktop_aura
      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 "ui/views/widget/desktop_aura/x11_desktop_window_move_client.h"
      6 
      7 #include <X11/Xlib.h>
      8 // Get rid of a macro from Xlib.h that conflicts with Aura's RootWindow class.
      9 #undef RootWindow
     10 
     11 #include "base/debug/stack_trace.h"
     12 #include "base/message_loop/message_loop.h"
     13 #include "base/message_loop/message_pump_aurax11.h"
     14 #include "base/run_loop.h"
     15 #include "ui/aura/env.h"
     16 #include "ui/aura/root_window.h"
     17 #include "ui/base/events/event.h"
     18 #include "ui/base/x/x11_util.h"
     19 #include "ui/gfx/screen.h"
     20 
     21 namespace views {
     22 
     23 X11DesktopWindowMoveClient::X11DesktopWindowMoveClient()
     24     : move_loop_(this),
     25       root_window_(NULL) {
     26 }
     27 
     28 X11DesktopWindowMoveClient::~X11DesktopWindowMoveClient() {}
     29 
     30 void X11DesktopWindowMoveClient::OnMouseMovement(XMotionEvent* event) {
     31   gfx::Point cursor_point(event->x_root, event->y_root);
     32   gfx::Point system_loc = cursor_point - window_offset_;
     33   root_window_->SetHostBounds(gfx::Rect(
     34       system_loc, root_window_->GetHostSize()));
     35 }
     36 
     37 void X11DesktopWindowMoveClient::OnMouseReleased() {
     38   EndMoveLoop();
     39 }
     40 
     41 void X11DesktopWindowMoveClient::OnMoveLoopEnded() {
     42   root_window_ = NULL;
     43 }
     44 
     45 ////////////////////////////////////////////////////////////////////////////////
     46 // DesktopRootWindowHostLinux, aura::client::WindowMoveClient implementation:
     47 
     48 aura::client::WindowMoveResult X11DesktopWindowMoveClient::RunMoveLoop(
     49     aura::Window* source,
     50     const gfx::Vector2d& drag_offset,
     51     aura::client::WindowMoveSource move_source) {
     52   window_offset_ = drag_offset;
     53   root_window_ = source->GetRootWindow();
     54 
     55   bool success = move_loop_.RunMoveLoop(source, root_window_->last_cursor());
     56   return success ? aura::client::MOVE_SUCCESSFUL : aura::client::MOVE_CANCELED;
     57 }
     58 
     59 void X11DesktopWindowMoveClient::EndMoveLoop() {
     60   move_loop_.EndMoveLoop();
     61 }
     62 
     63 }  // namespace views
     64