Skip to content

Commit 6345c3d

Browse files
authored
Merge pull request flutter#20 from canonical/feature/mir-positioning-code
Use Mir positioning code
2 parents 09d4242 + e72cbb0 commit 6345c3d

File tree

6 files changed

+481
-504
lines changed

6 files changed

+481
-504
lines changed

shell/platform/windows/client_wrapper/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ _wrapper_includes = [
1313
"include/flutter/flutter_view.h",
1414
"include/flutter/flutter_win32_window.h",
1515
"include/flutter/flutter_window_controller.h",
16+
"include/flutter/flutter_window_types.h",
1617
"include/flutter/plugin_registrar_windows.h",
1718
"include/flutter/win32_window.h",
1819
]

shell/platform/windows/client_wrapper/flutter_window_controller.cc

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <dwmapi.h>
77

88
namespace {
9+
910
auto const* const kChannel{"flutter/windowing"};
1011
auto const* const kErrorCodeInvalidValue{"INVALID_VALUE"};
1112
auto const* const kErrorCodeUnavailable{"UNAVAILABLE"};
@@ -131,7 +132,7 @@ void handleCreateWindow(flutter::FlutterWindowArchetype archetype,
131132
}
132133

133134
std::optional<flutter::FlutterWindowPositioner> positioner;
134-
std::optional<flutter::FlutterWindowPositioner::Rect> anchor_rect;
135+
std::optional<flutter::FlutterWindowRectangle> anchor_rect;
135136

136137
if (archetype == flutter::FlutterWindowArchetype::satellite ||
137138
archetype == flutter::FlutterWindowArchetype::popup) {
@@ -144,11 +145,10 @@ void handleCreateWindow(flutter::FlutterWindowArchetype archetype,
144145
if (!anchor_rect_list) {
145146
return;
146147
}
147-
anchor_rect = flutter::FlutterWindowPositioner::Rect{
148-
.x = anchor_rect_list->at(0),
149-
.y = anchor_rect_list->at(1),
150-
.width = anchor_rect_list->at(2),
151-
.height = anchor_rect_list->at(3)};
148+
anchor_rect = flutter::FlutterWindowRectangle{
149+
{.x = anchor_rect_list->at(0), .y = anchor_rect_list->at(1)},
150+
{.width = anchor_rect_list->at(2),
151+
.height = anchor_rect_list->at(3)}};
152152
}
153153
} else {
154154
result->Error(kErrorCodeInvalidValue,
@@ -166,36 +166,9 @@ void handleCreateWindow(flutter::FlutterWindowArchetype archetype,
166166
if (!positioner_child_anchor) {
167167
return;
168168
}
169-
170-
auto const gravity{[](flutter::FlutterWindowPositioner::Anchor anchor)
171-
-> flutter::FlutterWindowPositioner::Gravity {
172-
// Convert from |FlutterWindowPositioner::Anchor| (originally a
173-
// |WindowPositionerAnchor|) to |FlutterWindowPositioner::Gravity|
174-
switch (anchor) {
175-
case flutter::FlutterWindowPositioner::Anchor::none:
176-
return flutter::FlutterWindowPositioner::Gravity::none;
177-
case flutter::FlutterWindowPositioner::Anchor::top:
178-
return flutter::FlutterWindowPositioner::Gravity::bottom;
179-
case flutter::FlutterWindowPositioner::Anchor::bottom:
180-
return flutter::FlutterWindowPositioner::Gravity::top;
181-
case flutter::FlutterWindowPositioner::Anchor::left:
182-
return flutter::FlutterWindowPositioner::Gravity::right;
183-
case flutter::FlutterWindowPositioner::Anchor::right:
184-
return flutter::FlutterWindowPositioner::Gravity::left;
185-
case flutter::FlutterWindowPositioner::Anchor::top_left:
186-
return flutter::FlutterWindowPositioner::Gravity::bottom_right;
187-
case flutter::FlutterWindowPositioner::Anchor::bottom_left:
188-
return flutter::FlutterWindowPositioner::Gravity::top_right;
189-
case flutter::FlutterWindowPositioner::Anchor::top_right:
190-
return flutter::FlutterWindowPositioner::Gravity::bottom_left;
191-
case flutter::FlutterWindowPositioner::Anchor::bottom_right:
192-
return flutter::FlutterWindowPositioner::Gravity::top_left;
193-
}
194-
std::cerr << "Unhandled anchor value: " << static_cast<int>(anchor)
195-
<< "\n";
196-
std::abort();
197-
}(static_cast<flutter::FlutterWindowPositioner::Anchor>(
198-
positioner_child_anchor.value()))};
169+
auto const child_anchor{
170+
static_cast<flutter::FlutterWindowPositioner::Anchor>(
171+
positioner_child_anchor.value())};
199172

200173
auto const positioner_offset_list{getListValuesForKeyOrSendError<int, 2>(
201174
"positionerOffset", map, result)};
@@ -210,13 +183,14 @@ void handleCreateWindow(flutter::FlutterWindowArchetype archetype,
210183
}
211184
positioner = flutter::FlutterWindowPositioner{
212185
.anchor_rect = anchor_rect,
213-
.anchor = static_cast<flutter::FlutterWindowPositioner::Anchor>(
186+
.parent_anchor = static_cast<flutter::FlutterWindowPositioner::Anchor>(
214187
positioner_parent_anchor.value()),
215-
.gravity = gravity,
216-
.offset = {.dx = positioner_offset_list->at(0),
217-
.dy = positioner_offset_list->at(1)},
188+
.child_anchor = child_anchor,
189+
.offset = {.x = positioner_offset_list->at(0),
190+
.y = positioner_offset_list->at(1)},
218191
.constraint_adjustment =
219-
static_cast<uint32_t>(positioner_constraint_adjustment.value())};
192+
static_cast<flutter::FlutterWindowPositioner::ConstraintAdjustment>(
193+
positioner_constraint_adjustment.value())};
220194
}
221195

222196
std::optional<flutter::FlutterViewId> parent_view_id;
@@ -260,9 +234,7 @@ void handleCreateWindow(flutter::FlutterWindowArchetype archetype,
260234

261235
if (auto const data_opt{
262236
flutter::FlutterWindowController::instance().createWindow(
263-
title,
264-
{static_cast<unsigned int>(size_list->at(0)),
265-
static_cast<unsigned int>(size_list->at(1))},
237+
title, {.width = size_list->at(0), .height = size_list->at(1)},
266238
archetype, positioner, parent_view_id)}) {
267239
auto const& data{data_opt.value()};
268240
result->Success(flutter::EncodableValue(flutter::EncodableMap{
@@ -352,7 +324,7 @@ void FlutterWindowController::setEngine(std::shared_ptr<FlutterEngine> engine) {
352324

353325
auto FlutterWindowController::createWindow(
354326
std::wstring const& title,
355-
Win32Window::Size const& size,
327+
FlutterWindowSize const& size,
356328
FlutterWindowArchetype archetype,
357329
std::optional<FlutterWindowPositioner> positioner,
358330
std::optional<FlutterViewId> parent_view_id)

shell/platform/windows/client_wrapper/include/flutter/flutter_window_controller.h

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,12 @@
66
#include <mutex>
77

88
#include "flutter_engine.h"
9-
#include "flutter_view.h"
109
#include "flutter_win32_window.h"
10+
#include "flutter_window_types.h"
1111
#include "method_channel.h"
1212

1313
namespace flutter {
1414

15-
struct FlutterWindowSize {
16-
int width = 0;
17-
int height = 0;
18-
};
19-
20-
struct FlutterWindowCreationResult {
21-
FlutterViewId view_id;
22-
std::optional<FlutterViewId> parent_id = std::nullopt;
23-
FlutterWindowArchetype archetype;
24-
FlutterWindowSize size;
25-
};
26-
2715
// A singleton controller for Flutter windows.
2816
class FlutterWindowController {
2917
public:
@@ -45,7 +33,7 @@ class FlutterWindowController {
4533

4634
void setEngine(std::shared_ptr<FlutterEngine> engine);
4735
auto createWindow(std::wstring const& title,
48-
Win32Window::Size const& size,
36+
FlutterWindowSize const& size,
4937
FlutterWindowArchetype archetype,
5038
std::optional<FlutterWindowPositioner> positioner,
5139
std::optional<FlutterViewId> parent_view_id)
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_CLIENT_WRAPPER_INCLUDE_FLUTTER_FLUTTER_WINDOW_TYPES_H_
2+
#define FLUTTER_SHELL_PLATFORM_WINDOWS_CLIENT_WRAPPER_INCLUDE_FLUTTER_FLUTTER_WINDOW_TYPES_H_
3+
4+
#include "flutter_view.h"
5+
6+
#include <optional>
7+
8+
namespace flutter {
9+
10+
struct FlutterWindowSize {
11+
int width{0};
12+
int height{0};
13+
};
14+
15+
struct FlutterWindowPoint {
16+
int x{0};
17+
int y{0};
18+
19+
auto operator+(FlutterWindowSize const& size) const -> FlutterWindowPoint {
20+
return {x + size.width, y + size.height};
21+
}
22+
23+
friend auto operator+(FlutterWindowPoint const& lhs,
24+
FlutterWindowPoint const& rhs) -> FlutterWindowPoint {
25+
return {lhs.x + rhs.x, lhs.y + rhs.y};
26+
}
27+
};
28+
29+
struct FlutterWindowRectangle {
30+
FlutterWindowPoint top_left;
31+
FlutterWindowSize size;
32+
33+
// Checks if this rectangle fully contains |rect|.
34+
// Note: An empty rectangle can still contain other empty rectangles,
35+
// which are treated as points or lines of thickness zero
36+
auto contains(FlutterWindowRectangle const& rect) const -> bool {
37+
return rect.top_left.x >= top_left.x &&
38+
rect.top_left.x + rect.size.width <= top_left.x + size.width &&
39+
rect.top_left.y >= top_left.y &&
40+
rect.top_left.y + rect.size.height <= top_left.y + size.height;
41+
}
42+
};
43+
44+
struct FlutterWindowPositioner {
45+
enum class Anchor {
46+
none,
47+
top,
48+
bottom,
49+
left,
50+
right,
51+
top_left,
52+
bottom_left,
53+
top_right,
54+
bottom_right,
55+
};
56+
57+
enum ConstraintAdjustment {
58+
none = 0,
59+
slide_x = 1 << 0,
60+
slide_y = 1 << 1,
61+
flip_x = 1 << 2,
62+
flip_y = 1 << 3,
63+
resize_x = 1 << 4,
64+
resize_y = 1 << 5,
65+
antipodes = 1 << 6,
66+
flip_any = flip_x | flip_y,
67+
slide_any = slide_x | slide_y,
68+
resize_any = resize_x | resize_y,
69+
};
70+
71+
std::optional<FlutterWindowRectangle> anchor_rect;
72+
Anchor parent_anchor{Anchor::none};
73+
Anchor child_anchor{Anchor::none};
74+
FlutterWindowPoint offset;
75+
ConstraintAdjustment constraint_adjustment{ConstraintAdjustment::none};
76+
};
77+
78+
enum class FlutterWindowArchetype {
79+
regular,
80+
floating_regular,
81+
dialog,
82+
satellite,
83+
popup,
84+
tip,
85+
};
86+
87+
struct FlutterWindowCreationResult {
88+
FlutterViewId view_id{0};
89+
std::optional<FlutterViewId> parent_id;
90+
FlutterWindowArchetype archetype{FlutterWindowArchetype::regular};
91+
FlutterWindowSize size;
92+
};
93+
94+
} // namespace flutter
95+
96+
#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_CLIENT_WRAPPER_INCLUDE_FLUTTER_FLUTTER_WINDOW_TYPES_H_

shell/platform/windows/client_wrapper/include/flutter/win32_window.h

Lines changed: 3 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_CLIENT_WRAPPER_INCLUDE_FLUTTER_WIN32_WINDOW_H_
22
#define FLUTTER_SHELL_PLATFORM_WINDOWS_CLIENT_WRAPPER_INCLUDE_FLUTTER_WIN32_WINDOW_H_
33

4+
#include "flutter_window_types.h"
5+
46
#include <windows.h>
57

68
#include <optional>
@@ -9,92 +11,11 @@
911

1012
namespace flutter {
1113

12-
enum class FlutterWindowArchetype {
13-
regular,
14-
floating_regular,
15-
dialog,
16-
satellite,
17-
popup,
18-
tip
19-
};
20-
21-
struct FlutterWindowPositioner {
22-
struct Size {
23-
int32_t width;
24-
int32_t height;
25-
};
26-
27-
struct Rect {
28-
int32_t x;
29-
int32_t y;
30-
int32_t width;
31-
int32_t height;
32-
};
33-
34-
struct Offset {
35-
int32_t dx;
36-
int32_t dy;
37-
};
38-
39-
enum class Anchor {
40-
none,
41-
top,
42-
bottom,
43-
left,
44-
right,
45-
top_left,
46-
bottom_left,
47-
top_right,
48-
bottom_right
49-
};
50-
51-
enum class Gravity {
52-
none,
53-
top,
54-
bottom,
55-
left,
56-
right,
57-
top_left,
58-
bottom_left,
59-
top_right,
60-
bottom_right
61-
};
62-
63-
enum class ConstraintAdjustment {
64-
none = 0,
65-
slide_x = 1,
66-
slide_y = 2,
67-
flip_x = 4,
68-
flip_y = 8,
69-
resize_x = 16,
70-
resize_y = 32
71-
};
72-
73-
std::optional<Rect> anchor_rect;
74-
Anchor anchor;
75-
Gravity gravity;
76-
Offset offset;
77-
uint32_t constraint_adjustment;
78-
};
79-
8014
// A class abstraction for a high DPI-aware Win32 Window. Intended to be
8115
// inherited from by classes that wish to specialize with custom
8216
// rendering and input handling.
8317
class Win32Window {
8418
public:
85-
struct Point {
86-
unsigned int x;
87-
unsigned int y;
88-
Point(unsigned int x, unsigned int y) : x(x), y(y) {}
89-
};
90-
91-
struct Size {
92-
unsigned int width;
93-
unsigned int height;
94-
Size(unsigned int width, unsigned int height)
95-
: width(width), height(height) {}
96-
};
97-
9819
Win32Window();
9920
virtual ~Win32Window();
10021

@@ -106,7 +27,7 @@ class Win32Window {
10627
// is created if |parent| is specified; otherwise, the dialog is modeless.
10728
// After creation, |OnCreate| is called and its result is returned.
10829
auto Create(std::wstring const& title,
109-
Size const& client_size,
30+
FlutterWindowSize const& client_size,
11031
FlutterWindowArchetype archetype,
11132
std::optional<HWND> parent,
11233
std::optional<FlutterWindowPositioner> positioner) -> bool;

0 commit comments

Comments
 (0)