OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/views/widget/desktop_aura/x11_whole_screen_move_loop.h" | 5 #include "ui/views/widget/desktop_aura/x11_whole_screen_move_loop.h" |
6 | 6 |
7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
8 // Get rid of a macro from Xlib.h that conflicts with Aura's RootWindow class. | 8 // Get rid of a macro from Xlib.h that conflicts with Aura's RootWindow class. |
9 #undef RootWindow | 9 #undef RootWindow |
10 | 10 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 | 43 |
44 DISALLOW_COPY_AND_ASSIGN(ScopedCapturer); | 44 DISALLOW_COPY_AND_ASSIGN(ScopedCapturer); |
45 }; | 45 }; |
46 | 46 |
47 } // namespace | 47 } // namespace |
48 | 48 |
49 X11WholeScreenMoveLoop::X11WholeScreenMoveLoop( | 49 X11WholeScreenMoveLoop::X11WholeScreenMoveLoop( |
50 X11WholeScreenMoveLoopDelegate* delegate) | 50 X11WholeScreenMoveLoopDelegate* delegate) |
51 : delegate_(delegate), | 51 : delegate_(delegate), |
52 in_move_loop_(false), | 52 in_move_loop_(false), |
| 53 should_reset_mouse_flags_(false), |
53 grab_input_window_(None) { | 54 grab_input_window_(None) { |
54 } | 55 } |
55 | 56 |
56 X11WholeScreenMoveLoop::~X11WholeScreenMoveLoop() {} | 57 X11WholeScreenMoveLoop::~X11WholeScreenMoveLoop() {} |
57 | 58 |
58 //////////////////////////////////////////////////////////////////////////////// | 59 //////////////////////////////////////////////////////////////////////////////// |
59 // DesktopRootWindowHostLinux, MessageLoop::Dispatcher implementation: | 60 // DesktopRootWindowHostLinux, MessageLoop::Dispatcher implementation: |
60 | 61 |
61 bool X11WholeScreenMoveLoop::Dispatch(const base::NativeEvent& event) { | 62 bool X11WholeScreenMoveLoop::Dispatch(const base::NativeEvent& event) { |
62 XEvent* xev = event; | 63 XEvent* xev = event; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 CreateDragImageWindow(); | 107 CreateDragImageWindow(); |
107 base::MessagePumpX11::Current()->AddDispatcherForWindow( | 108 base::MessagePumpX11::Current()->AddDispatcherForWindow( |
108 this, grab_input_window_); | 109 this, grab_input_window_); |
109 | 110 |
110 if (!GrabPointerWithCursor(cursor)) | 111 if (!GrabPointerWithCursor(cursor)) |
111 return false; | 112 return false; |
112 | 113 |
113 // We are handling a mouse drag outside of the aura::RootWindow system. We | 114 // We are handling a mouse drag outside of the aura::RootWindow system. We |
114 // must manually make aura think that the mouse button is pressed so that we | 115 // must manually make aura think that the mouse button is pressed so that we |
115 // don't draw extraneous tooltips. | 116 // don't draw extraneous tooltips. |
116 aura::Env::GetInstance()->set_mouse_button_flags(ui::EF_LEFT_MOUSE_BUTTON); | 117 aura::Env* env = aura::Env::GetInstance(); |
| 118 if (!env->IsMouseButtonDown()) { |
| 119 env->set_mouse_button_flags(ui::EF_LEFT_MOUSE_BUTTON); |
| 120 should_reset_mouse_flags_ = true; |
| 121 } |
117 | 122 |
118 base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); | 123 base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); |
119 base::MessageLoop::ScopedNestableTaskAllower allow_nested(loop); | 124 base::MessageLoop::ScopedNestableTaskAllower allow_nested(loop); |
120 base::RunLoop run_loop(aura::Env::GetInstance()->GetDispatcher()); | 125 base::RunLoop run_loop(aura::Env::GetInstance()->GetDispatcher()); |
121 quit_closure_ = run_loop.QuitClosure(); | 126 quit_closure_ = run_loop.QuitClosure(); |
122 run_loop.Run(); | 127 run_loop.Run(); |
123 return true; | 128 return true; |
124 } | 129 } |
125 | 130 |
126 void X11WholeScreenMoveLoop::UpdateCursor(gfx::NativeCursor cursor) { | 131 void X11WholeScreenMoveLoop::UpdateCursor(gfx::NativeCursor cursor) { |
127 DCHECK(in_move_loop_); | 132 DCHECK(in_move_loop_); |
128 GrabPointerWithCursor(cursor); | 133 GrabPointerWithCursor(cursor); |
129 } | 134 } |
130 | 135 |
131 void X11WholeScreenMoveLoop::EndMoveLoop() { | 136 void X11WholeScreenMoveLoop::EndMoveLoop() { |
132 if (!in_move_loop_) | 137 if (!in_move_loop_) |
133 return; | 138 return; |
134 | 139 |
135 // We undo our emulated mouse click from RunMoveLoop(); | 140 // We undo our emulated mouse click from RunMoveLoop(); |
136 aura::Env::GetInstance()->set_mouse_button_flags(0); | 141 if (should_reset_mouse_flags_) { |
| 142 aura::Env::GetInstance()->set_mouse_button_flags(0); |
| 143 should_reset_mouse_flags_ = false; |
| 144 } |
137 | 145 |
138 // TODO(erg): Is this ungrab the cause of having to click to give input focus | 146 // TODO(erg): Is this ungrab the cause of having to click to give input focus |
139 // on drawn out windows? Not ungrabbing here screws the X server until I kill | 147 // on drawn out windows? Not ungrabbing here screws the X server until I kill |
140 // the chrome process. | 148 // the chrome process. |
141 | 149 |
142 // Ungrab before we let go of the window. | 150 // Ungrab before we let go of the window. |
143 XDisplay* display = gfx::GetXDisplay(); | 151 XDisplay* display = gfx::GetXDisplay(); |
144 XUngrabPointer(display, CurrentTime); | 152 XUngrabPointer(display, CurrentTime); |
145 | 153 |
146 base::MessagePumpX11::Current()->RemoveDispatcherForWindow( | 154 base::MessagePumpX11::Current()->RemoveDispatcherForWindow( |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 image->SetBounds(0, 0, drag_image_.width(), drag_image_.height()); | 236 image->SetBounds(0, 0, drag_image_.width(), drag_image_.height()); |
229 widget->SetContentsView(image); | 237 widget->SetContentsView(image); |
230 | 238 |
231 widget->Show(); | 239 widget->Show(); |
232 widget->GetNativeWindow()->layer()->SetFillsBoundsOpaquely(false); | 240 widget->GetNativeWindow()->layer()->SetFillsBoundsOpaquely(false); |
233 | 241 |
234 drag_widget_.reset(widget); | 242 drag_widget_.reset(widget); |
235 } | 243 } |
236 | 244 |
237 } // namespace views | 245 } // namespace views |
OLD | NEW |