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

Side by Side Diff: ui/ozone/platform/dri/dri_window.cc

Issue 657603002: ash: ozone: apply transformation to events outside the root window (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove explicit gfx::Rect to gfx::RectF conversion Created 6 years 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/ozone/platform/dri/dri_window.h" 5 #include "ui/ozone/platform/dri/dri_window.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "ui/events/devices/device_data_manager.h" 8 #include "ui/events/devices/device_data_manager.h"
9 #include "ui/events/event.h" 9 #include "ui/events/event.h"
10 #include "ui/events/ozone/evdev/event_factory_evdev.h" 10 #include "ui/events/ozone/evdev/event_factory_evdev.h"
11 #include "ui/events/ozone/events_ozone.h" 11 #include "ui/events/ozone/events_ozone.h"
12 #include "ui/events/platform/platform_event_source.h" 12 #include "ui/events/platform/platform_event_source.h"
13 #include "ui/gfx/display.h" 13 #include "ui/gfx/display.h"
14 #include "ui/ozone/common/gpu/ozone_gpu_messages.h" 14 #include "ui/ozone/common/gpu/ozone_gpu_messages.h"
15 #include "ui/ozone/platform/dri/display_manager.h" 15 #include "ui/ozone/platform/dri/display_manager.h"
16 #include "ui/ozone/platform/dri/dri_cursor.h" 16 #include "ui/ozone/platform/dri/dri_cursor.h"
17 #include "ui/ozone/platform/dri/dri_gpu_platform_support_host.h" 17 #include "ui/ozone/platform/dri/dri_gpu_platform_support_host.h"
18 #include "ui/ozone/platform/dri/dri_window_manager.h" 18 #include "ui/ozone/platform/dri/dri_window_manager.h"
19 #include "ui/platform_window/platform_window_delegate.h" 19 #include "ui/platform_window/platform_window_delegate.h"
20 20
21 namespace ui { 21 namespace ui {
22 22
23 namespace { 23 namespace {
24 24
25 void RewriteTouchEvent(TouchEvent* event) { 25 void RewriteTouchEvent(TouchEvent* event, const gfx::PointF& window_offset) {
26 float x = event->location_f().x(); 26 float x = event->location_f().x();
27 float y = event->location_f().y(); 27 float y = event->location_f().y();
28 double radius_x = event->radius_x(); 28 double radius_x = event->radius_x();
29 double radius_y = event->radius_y(); 29 double radius_y = event->radius_y();
30 30
31 DeviceDataManager::GetInstance()->ApplyTouchTransformer( 31 DeviceDataManager::GetInstance()->ApplyTouchTransformer(
32 event->source_device_id(), &x, &y); 32 event->source_device_id(), &x, &y);
33 DeviceDataManager::GetInstance()->ApplyTouchRadiusScale( 33 DeviceDataManager::GetInstance()->ApplyTouchRadiusScale(
34 event->source_device_id(), &radius_x); 34 event->source_device_id(), &radius_x);
35 DeviceDataManager::GetInstance()->ApplyTouchRadiusScale( 35 DeviceDataManager::GetInstance()->ApplyTouchRadiusScale(
36 event->source_device_id(), &radius_y); 36 event->source_device_id(), &radius_y);
37 37
38 event->set_location(gfx::PointF(x, y)); 38 event->set_location(gfx::PointF(x, y));
39 event->set_root_location(
40 gfx::PointF(x + window_offset.x(), y + window_offset.y()));
39 event->set_radius_x(radius_x); 41 event->set_radius_x(radius_x);
40 event->set_radius_y(radius_y); 42 event->set_radius_y(radius_y);
41 } 43 }
42 44
43 } // namespace 45 } // namespace
44 46
45 DriWindow::DriWindow(PlatformWindowDelegate* delegate, 47 DriWindow::DriWindow(PlatformWindowDelegate* delegate,
46 const gfx::Rect& bounds, 48 const gfx::Rect& bounds,
47 DriGpuPlatformSupportHost* sender, 49 DriGpuPlatformSupportHost* sender,
48 EventFactoryEvdev* event_factory, 50 EventFactoryEvdev* event_factory,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 sender_->Send(new OzoneGpuMsg_WindowBoundsChanged(widget_, bounds)); 96 sender_->Send(new OzoneGpuMsg_WindowBoundsChanged(widget_, bounds));
95 97
96 if (window_manager_->cursor()->GetCursorWindow() == widget_) 98 if (window_manager_->cursor()->GetCursorWindow() == widget_)
97 window_manager_->cursor()->ShowCursor(); 99 window_manager_->cursor()->ShowCursor();
98 } 100 }
99 101
100 gfx::Rect DriWindow::GetBounds() { 102 gfx::Rect DriWindow::GetBounds() {
101 return bounds_; 103 return bounds_;
102 } 104 }
103 105
104 void DriWindow::SetCapture() {} 106 void DriWindow::SetCapture() {
107 window_manager_->GrabEvents(widget_);
108 }
105 109
106 void DriWindow::ReleaseCapture() {} 110 void DriWindow::ReleaseCapture() {
111 window_manager_->UngrabEvents(widget_);
112 }
107 113
108 void DriWindow::ToggleFullscreen() {} 114 void DriWindow::ToggleFullscreen() {}
109 115
110 void DriWindow::Maximize() {} 116 void DriWindow::Maximize() {}
111 117
112 void DriWindow::Minimize() {} 118 void DriWindow::Minimize() {}
113 119
114 void DriWindow::Restore() {} 120 void DriWindow::Restore() {}
115 121
116 void DriWindow::SetCursor(PlatformCursor cursor) { 122 void DriWindow::SetCursor(PlatformCursor cursor) {
117 DriCursor* dri_cursor = window_manager_->cursor(); 123 DriCursor* dri_cursor = window_manager_->cursor();
118 dri_cursor->SetCursor(widget_, cursor); 124 dri_cursor->SetCursor(widget_, cursor);
119 // ShowCursor results in a IPC call to GPU. So, we make sure the channel 125 // ShowCursor results in a IPC call to GPU. So, we make sure the channel
120 // is connected. OnChannelEstablished guarantees that ShowCursor is called 126 // is connected. OnChannelEstablished guarantees that ShowCursor is called
121 // eventually. 127 // eventually.
122 if (sender_->IsConnected() && dri_cursor->GetCursorWindow() == widget_) 128 if (sender_->IsConnected() && dri_cursor->GetCursorWindow() == widget_)
123 dri_cursor->ShowCursor(); 129 dri_cursor->ShowCursor();
124 } 130 }
125 131
126 void DriWindow::MoveCursorTo(const gfx::Point& location) { 132 void DriWindow::MoveCursorTo(const gfx::Point& location) {
127 event_factory_->WarpCursorTo(widget_, location); 133 event_factory_->WarpCursorTo(widget_, location);
128 } 134 }
129 135
130 bool DriWindow::CanDispatchEvent(const PlatformEvent& ne) { 136 bool DriWindow::CanDispatchEvent(const PlatformEvent& ne) {
131 DCHECK(ne); 137 DCHECK(ne);
132 Event* event = static_cast<Event*>(ne); 138 Event* event = static_cast<Event*>(ne);
139
140 // If there is a grab, capture relevant events here.
141 gfx::AcceleratedWidget grabber = window_manager_->event_grabber();
142 if (grabber != gfx::kNullAcceleratedWidget)
143 return grabber == widget_;
144
145 // Otherwise, just consider the position of the cursor.
133 if (event->IsMouseEvent() || event->IsScrollEvent()) 146 if (event->IsMouseEvent() || event->IsScrollEvent())
134 return window_manager_->cursor()->GetCursorWindow() == widget_; 147 return window_manager_->cursor()->GetCursorWindow() == widget_;
135 148
136 if (event->IsTouchEvent()) { 149 if (event->IsTouchEvent()) {
137 int64_t display_id = 150 int64_t display_id =
138 DeviceDataManager::GetInstance()->GetDisplayForTouchDevice( 151 DeviceDataManager::GetInstance()->GetDisplayForTouchDevice(
139 event->source_device_id()); 152 event->source_device_id());
140 153
141 if (display_id == gfx::Display::kInvalidDisplayID) 154 if (display_id == gfx::Display::kInvalidDisplayID)
142 return false; 155 return false;
(...skipping 12 matching lines...) Expand all
155 } 168 }
156 169
157 return true; 170 return true;
158 } 171 }
159 172
160 uint32_t DriWindow::DispatchEvent(const PlatformEvent& native_event) { 173 uint32_t DriWindow::DispatchEvent(const PlatformEvent& native_event) {
161 DCHECK(native_event); 174 DCHECK(native_event);
162 175
163 Event* event = static_cast<Event*>(native_event); 176 Event* event = static_cast<Event*>(native_event);
164 if (event->IsTouchEvent()) 177 if (event->IsTouchEvent())
165 RewriteTouchEvent(static_cast<TouchEvent*>(event)); 178 RewriteTouchEvent(static_cast<TouchEvent*>(event), bounds_.origin());
166 179 if (event->IsLocatedEvent()) {
sadrul 2014/11/24 22:27:04 Why do we rewrite the location of the touch-event
180 // We need to convert the cursor's position into coordinates
181 // relative to the window in case of an implicit grab.
182 LocatedEvent* located_event = static_cast<LocatedEvent*>(event);
183 gfx::PointF location = located_event->root_location();
184 location.Offset(-bounds_.origin().x(), -bounds_.origin().y());
sadrul 2014/11/24 22:27:04 Just bounds_.x(), bounds_.y();
185 located_event->set_location(location);
186 }
167 DispatchEventFromNativeUiEvent( 187 DispatchEventFromNativeUiEvent(
168 native_event, base::Bind(&PlatformWindowDelegate::DispatchEvent, 188 native_event, base::Bind(&PlatformWindowDelegate::DispatchEvent,
169 base::Unretained(delegate_))); 189 base::Unretained(delegate_)));
170 return POST_DISPATCH_STOP_PROPAGATION; 190 return POST_DISPATCH_STOP_PROPAGATION;
171 } 191 }
172 192
173 void DriWindow::OnChannelEstablished() { 193 void DriWindow::OnChannelEstablished() {
174 sender_->Send(new OzoneGpuMsg_CreateWindowDelegate(widget_)); 194 sender_->Send(new OzoneGpuMsg_CreateWindowDelegate(widget_));
175 sender_->Send(new OzoneGpuMsg_WindowBoundsChanged(widget_, bounds_)); 195 sender_->Send(new OzoneGpuMsg_WindowBoundsChanged(widget_, bounds_));
176 196
177 DriCursor* dri_cursor = window_manager_->cursor(); 197 DriCursor* dri_cursor = window_manager_->cursor();
178 if (dri_cursor->GetCursorWindow() == widget_) 198 if (dri_cursor->GetCursorWindow() == widget_)
179 dri_cursor->ShowCursor(); 199 dri_cursor->ShowCursor();
180 } 200 }
181 201
182 void DriWindow::OnChannelDestroyed() { 202 void DriWindow::OnChannelDestroyed() {
183 } 203 }
184 204
185 } // namespace ui 205 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698