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

Unified Diff: ui/views/widget/x11_desktop_window_move_client.cc

Issue 11369220: Move the desktop aura classes into a desktop subdir to make the gyp simpler. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 1 month 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 | « ui/views/widget/x11_desktop_window_move_client.h ('k') | ui/views/widget/x11_window_event_filter.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/widget/x11_desktop_window_move_client.cc
===================================================================
--- ui/views/widget/x11_desktop_window_move_client.cc (revision 167419)
+++ ui/views/widget/x11_desktop_window_move_client.cc (working copy)
@@ -1,144 +0,0 @@
-// 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 "ui/views/widget/x11_desktop_window_move_client.h"
-
-#include <X11/Xlib.h>
-// Get rid of a macro from Xlib.h that conflicts with Aura's RootWindow class.
-#undef RootWindow
-
-#include "base/debug/stack_trace.h"
-#include "base/message_loop.h"
-#include "base/message_pump_aurax11.h"
-#include "base/run_loop.h"
-#include "ui/aura/env.h"
-#include "ui/aura/root_window.h"
-#include "ui/base/events/event.h"
-#include "ui/base/x/x11_util.h"
-#include "ui/gfx/screen.h"
-
-namespace views {
-
-X11DesktopWindowMoveClient::X11DesktopWindowMoveClient()
- : in_move_loop_(false),
- grab_input_window_(None),
- root_window_(NULL) {
-}
-
-X11DesktopWindowMoveClient::~X11DesktopWindowMoveClient() {}
-
-////////////////////////////////////////////////////////////////////////////////
-// DesktopRootWindowHostLinux, MessageLoop::Dispatcher implementation:
-
-bool X11DesktopWindowMoveClient::Dispatch(const base::NativeEvent& event) {
- XEvent* xev = event;
-
- // Note: the escape key is handled in the tab drag controller, which has
- // keyboard focus even though we took pointer grab.
- switch (xev->type) {
- case MotionNotify: {
- gfx::Point cursor_point(xev->xmotion.x_root, xev->xmotion.y_root);
- gfx::Point system_loc = cursor_point - window_offset_;
- root_window_->SetHostBounds(gfx::Rect(
- system_loc, root_window_->GetHostSize()));
- break;
- }
- case ButtonPress:
- case ButtonRelease: {
- EndMoveLoop();
- break;
- }
- }
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DesktopRootWindowHostLinux, aura::client::WindowMoveClient implementation:
-
-aura::client::WindowMoveResult X11DesktopWindowMoveClient::RunMoveLoop(
- aura::Window* source,
- const gfx::Vector2d& drag_offset) {
- DCHECK(!in_move_loop_); // Can only handle one nested loop at a time.
- in_move_loop_ = true;
- window_offset_ = drag_offset;
-
- root_window_ = source->GetRootWindow();
-
- Display* display = base::MessagePumpAuraX11::GetDefaultXDisplay();
-
- // Creates an invisible, InputOnly toplevel window. This window will receive
- // all mouse movement for drags. It turns out that normal windows doing a
- // grab doesn't redirect pointer motion events if the pointer isn't over the
- // grabbing window. But InputOnly windows are able to grab everything. This
- // is what GTK+ does, and I found a patch to KDE that did something similar.
- unsigned long attribute_mask = CWEventMask | CWOverrideRedirect;
- XSetWindowAttributes swa;
- memset(&swa, 0, sizeof(swa));
- swa.event_mask = ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
- StructureNotifyMask;
- swa.override_redirect = True;
- grab_input_window_ = XCreateWindow(
- display,
- DefaultRootWindow(display),
- -100, -100, 10, 10,
- 0, 0, InputOnly, CopyFromParent,
- attribute_mask, &swa);
- base::MessagePumpAuraX11::Current()->AddDispatcherForWindow(
- this, grab_input_window_);
-
- // Wait for the window to be mapped. If we don't, XGrabPointer fails.
- XMapRaised(display, grab_input_window_);
- base::MessagePumpAuraX11::Current()->BlockUntilWindowMapped(
- grab_input_window_);
-
- XGrabServer(display);
- XUngrabPointer(display, CurrentTime);
- int ret = XGrabPointer(
- display,
- grab_input_window_,
- False,
- ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
- GrabModeAsync,
- GrabModeAsync,
- None,
- None,
- CurrentTime);
- XUngrabServer(display);
- if (ret != GrabSuccess) {
- DLOG(ERROR) << "Grabbing new tab for dragging failed: "
- << ui::GetX11ErrorString(display, ret);
- return aura::client::MOVE_CANCELED;
- }
-
- MessageLoopForUI* loop = MessageLoopForUI::current();
- MessageLoop::ScopedNestableTaskAllower allow_nested(loop);
- base::RunLoop run_loop(aura::Env::GetInstance()->GetDispatcher());
- quit_closure_ = run_loop.QuitClosure();
- run_loop.Run();
- return aura::client::MOVE_SUCCESSFUL;
-}
-
-void X11DesktopWindowMoveClient::EndMoveLoop() {
- if (!in_move_loop_)
- return;
-
- // TODO(erg): Is this ungrab the cause of having to click to give input focus
- // on drawn out windows? Not ungrabbing here screws the X server until I kill
- // the chrome process.
-
- // Ungrab before we let go of the window.
- Display* display = base::MessagePumpAuraX11::GetDefaultXDisplay();
- XUngrabPointer(display, CurrentTime);
-
- base::MessagePumpAuraX11::Current()->RemoveDispatcherForWindow(
- grab_input_window_);
- root_window_ = NULL;
- XDestroyWindow(display, grab_input_window_);
-
- in_move_loop_ = false;
- quit_closure_.Run();
-}
-
-} // namespace views
« no previous file with comments | « ui/views/widget/x11_desktop_window_move_client.h ('k') | ui/views/widget/x11_window_event_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698