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

Side by Side Diff: components/exo/display.cc

Issue 2396883003: exo: Fix dragging edge cases (Closed)
Patch Set: Fix unit tests Created 4 years, 2 months 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/exo/display.h" 5 #include "components/exo/display.h"
6 6
7 #include <iterator> 7 #include <iterator>
8 #include <utility> 8 #include <utility>
9 9
10 #include "ash/common/shell_window_ids.h" 10 #include "ash/common/shell_window_ids.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
13 #include "base/trace_event/trace_event.h" 13 #include "base/trace_event/trace_event.h"
14 #include "base/trace_event/trace_event_argument.h" 14 #include "base/trace_event/trace_event_argument.h"
15 #include "components/exo/notification_surface.h" 15 #include "components/exo/notification_surface.h"
16 #include "components/exo/notification_surface_manager.h" 16 #include "components/exo/notification_surface_manager.h"
17 #include "components/exo/shared_memory.h" 17 #include "components/exo/shared_memory.h"
18 #include "components/exo/shell_surface.h" 18 #include "components/exo/shell_surface.h"
19 #include "components/exo/sub_surface.h" 19 #include "components/exo/sub_surface.h"
20 #include "components/exo/surface.h" 20 #include "components/exo/surface.h"
21 #include "ui/views/widget/widget.h" 21 #include "ui/views/widget/widget.h"
22 #include "ui/wm/core/coordinate_conversion.h"
22 23
23 #if defined(USE_OZONE) 24 #if defined(USE_OZONE)
24 #include <GLES2/gl2extchromium.h> 25 #include <GLES2/gl2extchromium.h>
25 #include "components/exo/buffer.h" 26 #include "components/exo/buffer.h"
26 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" 27 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
27 #include "third_party/khronos/GLES2/gl2.h" 28 #include "third_party/khronos/GLES2/gl2.h"
28 #include "third_party/khronos/GLES2/gl2ext.h" 29 #include "third_party/khronos/GLES2/gl2ext.h"
29 #include "ui/aura/env.h" 30 #include "ui/aura/env.h"
30 #endif 31 #endif
31 32
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 106
106 std::unique_ptr<ShellSurface> Display::CreateShellSurface(Surface* surface) { 107 std::unique_ptr<ShellSurface> Display::CreateShellSurface(Surface* surface) {
107 TRACE_EVENT1("exo", "Display::CreateShellSurface", "surface", 108 TRACE_EVENT1("exo", "Display::CreateShellSurface", "surface",
108 surface->AsTracedValue()); 109 surface->AsTracedValue());
109 110
110 if (surface->HasSurfaceDelegate()) { 111 if (surface->HasSurfaceDelegate()) {
111 DLOG(ERROR) << "Surface has already been assigned a role"; 112 DLOG(ERROR) << "Surface has already been assigned a role";
112 return nullptr; 113 return nullptr;
113 } 114 }
114 115
115 return base::MakeUnique<ShellSurface>(surface, nullptr, gfx::Rect(), 116 return base::MakeUnique<ShellSurface>(*this, surface, nullptr, gfx::Rect(),
116 true /* activatable */, 117 true /* activatable */,
117 ash::kShellWindowId_DefaultContainer); 118 ash::kShellWindowId_DefaultContainer);
118 } 119 }
119 120
120 std::unique_ptr<ShellSurface> Display::CreatePopupShellSurface( 121 std::unique_ptr<ShellSurface> Display::CreatePopupShellSurface(
121 Surface* surface, 122 Surface* surface,
122 ShellSurface* parent, 123 ShellSurface* parent,
123 const gfx::Point& position) { 124 const gfx::Point& position) {
124 TRACE_EVENT2("exo", "Display::CreatePopupShellSurface", "surface", 125 TRACE_EVENT2("exo", "Display::CreatePopupShellSurface", "surface",
125 surface->AsTracedValue(), "parent", parent->AsTracedValue()); 126 surface->AsTracedValue(), "parent", parent->AsTracedValue());
126 127
127 if (surface->window()->Contains(parent->GetWidget()->GetNativeWindow())) { 128 if (surface->window()->Contains(parent->GetWidget()->GetNativeWindow())) {
128 DLOG(ERROR) << "Parent is contained within surface's hierarchy"; 129 DLOG(ERROR) << "Parent is contained within surface's hierarchy";
129 return nullptr; 130 return nullptr;
130 } 131 }
131 132
132 if (surface->HasSurfaceDelegate()) { 133 if (surface->HasSurfaceDelegate()) {
133 DLOG(ERROR) << "Surface has already been assigned a role"; 134 DLOG(ERROR) << "Surface has already been assigned a role";
134 return nullptr; 135 return nullptr;
135 } 136 }
136 137
137 // Determine the initial bounds for popup. |position| is relative to the 138 // Determine the initial bounds for popup. |position| is relative to the
138 // parent's main surface origin and initial bounds are relative to the 139 // parent's main surface origin and initial bounds are in virtual coordinates.
139 // container origin. 140 gfx::Point origin = position;
140 gfx::Rect initial_bounds(position, gfx::Size(1, 1)); 141 wm::ConvertPointToScreen(
141 aura::Window::ConvertRectToTarget(
142 ShellSurface::GetMainSurface(parent->GetWidget()->GetNativeWindow()) 142 ShellSurface::GetMainSurface(parent->GetWidget()->GetNativeWindow())
143 ->window(), 143 ->window(),
144 parent->GetWidget()->GetNativeWindow()->parent(), &initial_bounds); 144 &origin);
145 ConvertFromScreenToVirtual(&origin);
146 gfx::Rect initial_bounds(origin, gfx::Size(1, 1));
145 147
146 return base::MakeUnique<ShellSurface>(surface, parent, initial_bounds, 148 return base::MakeUnique<ShellSurface>(*this, surface, parent, initial_bounds,
147 false /* activatable */, 149 false /* activatable */,
148 ash::kShellWindowId_DefaultContainer); 150 ash::kShellWindowId_DefaultContainer);
149 } 151 }
150 152
151 std::unique_ptr<ShellSurface> Display::CreateRemoteShellSurface( 153 std::unique_ptr<ShellSurface> Display::CreateRemoteShellSurface(
152 Surface* surface, 154 Surface* surface,
153 int container) { 155 int container) {
154 TRACE_EVENT2("exo", "Display::CreateRemoteShellSurface", "surface", 156 TRACE_EVENT2("exo", "Display::CreateRemoteShellSurface", "surface",
155 surface->AsTracedValue(), "container", container); 157 surface->AsTracedValue(), "container", container);
156 158
157 if (surface->HasSurfaceDelegate()) { 159 if (surface->HasSurfaceDelegate()) {
158 DLOG(ERROR) << "Surface has already been assigned a role"; 160 DLOG(ERROR) << "Surface has already been assigned a role";
159 return nullptr; 161 return nullptr;
160 } 162 }
161 163
162 return base::MakeUnique<ShellSurface>(surface, nullptr, gfx::Rect(1, 1), 164 return base::MakeUnique<ShellSurface>(*this, surface, nullptr,
163 true /* activatable */, container); 165 gfx::Rect(1, 1), true /* activatable */,
166 container);
164 } 167 }
165 168
166 std::unique_ptr<SubSurface> Display::CreateSubSurface(Surface* surface, 169 std::unique_ptr<SubSurface> Display::CreateSubSurface(Surface* surface,
167 Surface* parent) { 170 Surface* parent) {
168 TRACE_EVENT2("exo", "Display::CreateSubSurface", "surface", 171 TRACE_EVENT2("exo", "Display::CreateSubSurface", "surface",
169 surface->AsTracedValue(), "parent", parent->AsTracedValue()); 172 surface->AsTracedValue(), "parent", parent->AsTracedValue());
170 173
171 if (surface->window()->Contains(parent->window())) { 174 if (surface->window()->Contains(parent->window())) {
172 DLOG(ERROR) << "Parent is contained within surface's hierarchy"; 175 DLOG(ERROR) << "Parent is contained within surface's hierarchy";
173 return nullptr; 176 return nullptr;
(...skipping 17 matching lines...) Expand all
191 notification_surface_manager_->GetSurface(notification_id)) { 194 notification_surface_manager_->GetSurface(notification_id)) {
192 DLOG(ERROR) << "Invalid notification id, id=" << notification_id; 195 DLOG(ERROR) << "Invalid notification id, id=" << notification_id;
193 return nullptr; 196 return nullptr;
194 } 197 }
195 198
196 return base::MakeUnique<NotificationSurface>(notification_surface_manager_, 199 return base::MakeUnique<NotificationSurface>(notification_surface_manager_,
197 surface, notification_id); 200 surface, notification_id);
198 } 201 }
199 202
200 } // namespace exo 203 } // namespace exo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698