| Index: ui/aura/desktop_host_linux.cc
|
| diff --git a/ui/aura/desktop_host_linux.cc b/ui/aura/desktop_host_linux.cc
|
| index 46492cff2a60735fbc63bc5b9410b2cd4cf04731..733b96d66fd65f0c62e9472226b35ff4e7b02e09 100644
|
| --- a/ui/aura/desktop_host_linux.cc
|
| +++ b/ui/aura/desktop_host_linux.cc
|
| @@ -238,6 +238,7 @@ class DesktopHostLinux : public DesktopHost {
|
| virtual void ToggleFullScreen() OVERRIDE;
|
| virtual gfx::Size GetSize() const OVERRIDE;
|
| virtual void SetSize(const gfx::Size& size) OVERRIDE;
|
| + virtual gfx::Point GetLocationOnNativeScreen() const OVERRIDE;
|
| virtual void SetCursor(gfx::NativeCursor cursor_type) OVERRIDE;
|
| virtual gfx::Point QueryMouseLocation() OVERRIDE;
|
| virtual void PostNativeEvent(const base::NativeEvent& event) OVERRIDE;
|
| @@ -256,8 +257,8 @@ class DesktopHostLinux : public DesktopHost {
|
| // Current Aura cursor.
|
| gfx::NativeCursor current_cursor_;
|
|
|
| - // The size of |xwindow_|.
|
| - gfx::Size size_;
|
| + // The bounds of |xwindow_|.
|
| + gfx::Rect bounds_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(DesktopHostLinux);
|
| };
|
| @@ -267,7 +268,7 @@ DesktopHostLinux::DesktopHostLinux(const gfx::Rect& bounds)
|
| xdisplay_(base::MessagePumpX::GetDefaultXDisplay()),
|
| xwindow_(0),
|
| current_cursor_(aura::kCursorNull),
|
| - size_(bounds.size()) {
|
| + bounds_(bounds) {
|
| xwindow_ = XCreateSimpleWindow(xdisplay_, DefaultRootWindow(xdisplay_),
|
| bounds.x(), bounds.y(),
|
| bounds.width(), bounds.height(),
|
| @@ -328,11 +329,12 @@ base::MessagePumpDispatcher::DispatchStatus DesktopHostLinux::Dispatch(
|
| // It's possible that the X window may be resized by some other means than
|
| // from within aura (e.g. the X window manager can change the size). Make
|
| // sure the desktop size is maintained properly.
|
| - gfx::Size size(xev->xconfigure.width, xev->xconfigure.height);
|
| - if (size_ != size) {
|
| - size_ = size;
|
| - desktop_->OnHostResized(size);
|
| - }
|
| + gfx::Rect bounds(xev->xconfigure.x, xev->xconfigure.y,
|
| + xev->xconfigure.width, xev->xconfigure.height);
|
| + bool size_changed = bounds_.size() != bounds.size();
|
| + bounds_ = bounds;
|
| + if (size_changed)
|
| + desktop_->OnHostResized(bounds.size());
|
| handled = true;
|
| break;
|
| }
|
| @@ -434,11 +436,11 @@ void DesktopHostLinux::ToggleFullScreen() {
|
| }
|
|
|
| gfx::Size DesktopHostLinux::GetSize() const {
|
| - return size_;
|
| + return bounds_.size();
|
| }
|
|
|
| void DesktopHostLinux::SetSize(const gfx::Size& size) {
|
| - if (size == size_)
|
| + if (size == bounds_.size())
|
| return;
|
|
|
| XResizeWindow(xdisplay_, xwindow_, size.width(), size.height());
|
| @@ -447,11 +449,15 @@ void DesktopHostLinux::SetSize(const gfx::Size& size) {
|
| // case if we're running without a window manager. If there's a window
|
| // manager, it can modify or ignore the request, but (per ICCCM) we'll get a
|
| // (possibly synthetic) ConfigureNotify about the actual size and correct
|
| - // |size_| later.
|
| - size_ = size;
|
| + // |bounds_| later.
|
| + bounds_.set_size(size);
|
| desktop_->OnHostResized(size);
|
| }
|
|
|
| +gfx::Point DesktopHostLinux::GetLocationOnNativeScreen() const {
|
| + return bounds_.origin();
|
| +}
|
| +
|
| void DesktopHostLinux::SetCursor(gfx::NativeCursor cursor) {
|
| if (current_cursor_ == cursor)
|
| return;
|
| @@ -475,8 +481,8 @@ gfx::Point DesktopHostLinux::QueryMouseLocation() {
|
| &root_x_return, &root_y_return,
|
| &win_x_return, &win_y_return,
|
| &mask_return);
|
| - return gfx::Point(max(0, min(size_.width(), win_x_return)),
|
| - max(0, min(size_.height(), win_y_return)));
|
| + return gfx::Point(max(0, min(bounds_.width(), win_x_return)),
|
| + max(0, min(bounds_.height(), win_y_return)));
|
| }
|
|
|
| void DesktopHostLinux::PostNativeEvent(const base::NativeEvent& native_event) {
|
| @@ -485,7 +491,30 @@ void DesktopHostLinux::PostNativeEvent(const base::NativeEvent& native_event) {
|
| XEvent xevent = *native_event;
|
| xevent.xany.display = xdisplay_;
|
| xevent.xany.window = xwindow_;
|
| - ::XPutBackEvent(xdisplay_, &xevent);
|
| +
|
| + switch (xevent.type) {
|
| + case EnterNotify:
|
| + case LeaveNotify:
|
| + case MotionNotify:
|
| + case KeyPress:
|
| + case KeyRelease:
|
| + case ButtonPress:
|
| + case ButtonRelease: {
|
| + // The fields used below are in the same place for all of events
|
| + // above. Using xmotion from XEvent's unions to avoid repeating
|
| + // the code.
|
| + xevent.xmotion.root = DefaultRootWindow(xdisplay_);
|
| + xevent.xmotion.time = CurrentTime;
|
| +
|
| + gfx::Point point(xevent.xmotion.x, xevent.xmotion.y);
|
| + desktop_->ConvertPointToNativeScreen(&point);
|
| + xevent.xmotion.x_root = point.x();
|
| + xevent.xmotion.y_root = point.y();
|
| + }
|
| + default:
|
| + break;
|
| + }
|
| + XSendEvent(xdisplay_, xwindow_, False, 0, &xevent);
|
| }
|
|
|
| bool DesktopHostLinux::IsWindowManagerPresent() {
|
|
|