Merge lp:~alan-griffiths/miral/fix-1603086 into lp:miral

Proposed by Alan Griffiths
Status: Merged
Approved by: Alan Griffiths
Approved revision: 229
Merged at revision: 226
Proposed branch: lp:~alan-griffiths/miral/fix-1603086
Merge into: lp:miral
Diff against target: 181 lines (+79/-44)
3 files modified
miral-shell/titlebar_provider.cpp (+16/-5)
miral/basic_window_manager.cpp (+60/-37)
miral/basic_window_manager.h (+3/-2)
To merge this branch: bzr merge lp:~alan-griffiths/miral/fix-1603086
Reviewer Review Type Date Requested Status
Andreas Pokorny (community) Approve
Review via email: mp+300220@code.launchpad.net

Commit message

Add support for modifying surface attachment

To post a comment you must log in.
lp:~alan-griffiths/miral/fix-1603086 updated
229. By Alan Griffiths

Revert unnecessary logic

Revision history for this message
Andreas Pokorny (andreas-pokorny) wrote :

I have been using that revision for testing gtk changes.. No new problems were found, and it fixes the tooltip placement.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'miral-shell/titlebar_provider.cpp'
--- miral-shell/titlebar_provider.cpp 2016-07-11 15:11:07 +0000
+++ miral-shell/titlebar_provider.cpp 2016-07-15 17:02:36 +0000
@@ -134,11 +134,22 @@
134134
135void TitlebarProvider::destroy_titlebar_for(miral::Window const& window)135void TitlebarProvider::destroy_titlebar_for(miral::Window const& window)
136{136{
137 enqueue_work([this, window]137 if (auto data = find_titlebar_data(window))
138 {
139 if (auto surface = data->titlebar.exchange(nullptr))
138 {140 {
139 std::lock_guard<decltype(mutex)> lock{mutex};141 enqueue_work([surface]
140 window_to_titlebar.erase(window);142 {
141 });143 mir_surface_release(surface, &null_surface_callback, nullptr);
144 });
145 }
146
147 enqueue_work([this, window]
148 {
149 std::lock_guard<decltype(mutex)> lock{mutex};
150 window_to_titlebar.erase(window);
151 });
152 }
142}153}
143154
144void TitlebarProvider::resize_titlebar_for(miral::Window const& window, Size const& size)155void TitlebarProvider::resize_titlebar_for(miral::Window const& window, Size const& size)
@@ -200,7 +211,7 @@
200211
201TitlebarProvider::Data::~Data()212TitlebarProvider::Data::~Data()
202{213{
203 if (auto const surface = titlebar.load())214 if (auto surface = titlebar.exchange(nullptr))
204 mir_surface_release(surface, &null_surface_callback, nullptr);215 mir_surface_release(surface, &null_surface_callback, nullptr);
205}216}
206217
207218
=== modified file 'miral/basic_window_manager.cpp'
--- miral/basic_window_manager.cpp 2016-07-13 10:28:40 +0000
+++ miral/basic_window_manager.cpp 2016-07-15 17:02:36 +0000
@@ -638,6 +638,19 @@
638 place_and_size(window_info, new_pos, new_size);638 place_and_size(window_info, new_pos, new_size);
639 }639 }
640640
641 if (window_info.parent() && modifications.aux_rect().is_set() && modifications.edge_attachment().is_set())
642 {
643 auto parent = window_info.parent();
644
645 if (parent)
646 {
647 auto new_pos = place_relative(parent.top_left(), modifications);
648
649 if (new_pos.is_set())
650 move_tree(window_info, new_pos.value() - window.top_left());
651 }
652 }
653
641 if (modifications.state().is_set())654 if (modifications.state().is_set())
642 {655 {
643 set_state(window_info, modifications.state().value());656 set_state(window_info, modifications.state().value());
@@ -937,8 +950,6 @@
937 parameters.state() = mir_surface_state_restored;950 parameters.state() = mir_surface_state_restored;
938951
939 auto const active_display_area = active_display();952 auto const active_display_area = active_display();
940
941 auto const width = parameters.size().value().width.as_int();
942 auto const height = parameters.size().value().height.as_int();953 auto const height = parameters.size().value().height.as_int();
943954
944 bool positioned = false;955 bool positioned = false;
@@ -976,41 +987,12 @@
976987
977 if (has_parent && parameters.aux_rect().is_set() && parameters.edge_attachment().is_set())988 if (has_parent && parameters.aux_rect().is_set() && parameters.edge_attachment().is_set())
978 {989 {
979 auto parent = info_for(parameters.parent().value()).window();990 auto const position = place_relative(info_for(parameters.parent().value()).window().top_left(), parameters);
980991
981 auto const edge_attachment = parameters.edge_attachment().value();992 if (position.is_set())
982 auto const aux_rect = parameters.aux_rect().value();993 {
983 auto const parent_top_left = parent.top_left();994 parameters.top_left() = position.value();
984 auto const top_left = aux_rect.top_left -Point{} + parent_top_left;995 positioned = true;
985 auto const top_right= aux_rect.top_right() -Point{} + parent_top_left;
986 auto const bot_left = aux_rect.bottom_left()-Point{} + parent_top_left;
987
988 if (edge_attachment & mir_edge_attachment_vertical)
989 {
990 if (active_display_area.contains(top_right + Displacement{width, height}))
991 {
992 parameters.top_left() = top_right;
993 positioned = true;
994 }
995 else if (active_display_area.contains(top_left + Displacement{-width, height}))
996 {
997 parameters.top_left() = top_left + Displacement{-width, 0};
998 positioned = true;
999 }
1000 }
1001
1002 if (edge_attachment & mir_edge_attachment_horizontal)
1003 {
1004 if (active_display_area.contains(bot_left + Displacement{width, height}))
1005 {
1006 parameters.top_left() = bot_left;
1007 positioned = true;
1008 }
1009 else if (active_display_area.contains(top_left + Displacement{width, -height}))
1010 {
1011 parameters.top_left() = top_left + Displacement{0, -height};
1012 positioned = true;
1013 }
1014 }996 }
1015 }997 }
1016 else if (has_parent)998 else if (has_parent)
@@ -1076,3 +1058,44 @@
10761058
1077 return parameters;1059 return parameters;
1078}1060}
1061
1062auto miral::BasicWindowManager::place_relative(Point const& parent_top_left, WindowSpecification const& parameters)
1063-> mir::optional_value<Point>
1064{
1065 mir::optional_value<Point> result;
1066 auto const active_display_area = active_display();
1067 auto const width = parameters.size().value().width.as_int();
1068 auto const height = parameters.size().value().height.as_int();
1069
1070 auto const edge_attachment = parameters.edge_attachment().value();
1071 auto const aux_rect = parameters.aux_rect().value();
1072 auto const top_left = aux_rect.top_left -Point{} + parent_top_left;
1073 auto const top_right= aux_rect.top_right() -Point{} + parent_top_left;
1074 auto const bot_left = aux_rect.bottom_left()-Point{} + parent_top_left;
1075
1076 if (edge_attachment & mir_edge_attachment_vertical)
1077 {
1078 if (active_display_area.contains(top_right + Displacement{width, height}))
1079 {
1080 result = top_right;
1081 }
1082 else if (active_display_area.contains(top_left + Displacement{-width, height}))
1083 {
1084 result = top_left + Displacement{-width, 0};
1085 }
1086 }
1087
1088 if (edge_attachment & mir_edge_attachment_horizontal)
1089 {
1090 if (active_display_area.contains(bot_left + Displacement{width, height}))
1091 {
1092 result = bot_left;
1093 }
1094 else if (active_display_area.contains(top_left + Displacement{width, -height}))
1095 {
1096 result = top_left + Displacement{0, -height};
1097 }
1098 }
1099
1100 return result;
1101}
10791102
=== modified file 'miral/basic_window_manager.h'
--- miral/basic_window_manager.h 2016-06-29 13:17:33 +0000
+++ miral/basic_window_manager.h 2016-07-15 17:02:36 +0000
@@ -161,8 +161,9 @@
161161
162 auto can_activate_window_for_session(miral::Application const& session) -> bool;162 auto can_activate_window_for_session(miral::Application const& session) -> bool;
163163
164 auto place_new_surface(ApplicationInfo const& app_info, WindowSpecification parameters)164 auto place_new_surface(ApplicationInfo const& app_info, WindowSpecification parameters) -> WindowSpecification;
165 -> WindowSpecification;165 auto place_relative(Point const& parent_top_left, miral::WindowSpecification const& parameters) -> mir::optional_value<Point>;
166
166 auto build_window(Application const& application, WindowSpecification const& spec)167 auto build_window(Application const& application, WindowSpecification const& spec)
167 -> WindowInfo&;168 -> WindowInfo&;
168 void move_tree(miral::WindowInfo& root, mir::geometry::Displacement movement);169 void move_tree(miral::WindowInfo& root, mir::geometry::Displacement movement);

Subscribers

People subscribed via source and target branches