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

Proposed by Alan Griffiths
Status: Merged
Approved by: Gerry Boland
Approved revision: 568
Merged at revision: 568
Proposed branch: lp:~alan-griffiths/miral/fix-1705695
Merge into: lp:miral
Diff against target: 169 lines (+88/-4)
4 files modified
miral-shell/tiling_window_manager.cpp (+2/-0)
miral/basic_window_manager.cpp (+72/-1)
miral/basic_window_manager.h (+3/-2)
miral/output.cpp (+11/-1)
To merge this branch: bzr merge lp:~alan-griffiths/miral/fix-1705695
Reviewer Review Type Date Requested Status
Gerry Boland (community) Approve
Mir CI Bot continuous-integration Approve
Review via email: mp+327977@code.launchpad.net

Commit message

[miral-shell] Update maximized windows on display changes. {LP: #1705695)

To post a comment you must log in.
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:568
https://mir-jenkins.ubuntu.com/job/miral-ci/49/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-miral/74
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4981
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4970
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4970
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4970
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=amd64,release=artful/78
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=amd64,release=artful/78/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=amd64,release=xenial/78
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=amd64,release=xenial/78/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=amd64,release=zesty/78
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=amd64,release=zesty/78/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=i386,release=artful/78
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=i386,release=artful/78/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=i386,release=xenial/78
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=i386,release=xenial/78/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=i386,release=zesty/78
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-miral/arch=i386,release=zesty/78/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/miral-ci/49/rebuild

review: Approve (continuous-integration)
Revision history for this message
Gerry Boland (gerboland) wrote :

Yep, works ok

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'miral-shell/tiling_window_manager.cpp'
2--- miral-shell/tiling_window_manager.cpp 2017-03-01 16:32:46 +0000
3+++ miral-shell/tiling_window_manager.cpp 2017-07-24 16:22:13 +0000
4@@ -651,10 +651,12 @@
5 dirty_displays = true;
6 }
7
8+#include <iostream>
9 void TilingWindowManagerPolicy::advise_output_update(const Output& updated, const Output& original)
10 {
11 if (!equivalent_display_area(updated, original))
12 {
13+ std::cout << "Original: " << original.extents() << "new: " << updated.extents() << '\n';
14 live_displays.remove(original.extents());
15 live_displays.add(updated.extents());
16
17
18=== modified file 'miral/basic_window_manager.cpp'
19--- miral/basic_window_manager.cpp 2017-06-09 09:49:53 +0000
20+++ miral/basic_window_manager.cpp 2017-07-24 16:22:13 +0000
21@@ -169,8 +169,21 @@
22 for_each_workspace_containing(parent,
23 [&](std::shared_ptr<miral::Workspace> const& workspace) { add_tree_to_workspace(window, workspace); });
24
25- if (window_info.state() == mir_window_state_fullscreen)
26+ switch (window_info.state())
27+ {
28+ case mir_window_state_fullscreen:
29 fullscreen_surfaces.insert(window_info.window());
30+ break;
31+
32+ case mir_window_state_maximized:
33+ case mir_window_state_vertmaximized:
34+ case mir_window_state_horizmaximized:
35+ maximized_surfaces.insert(window_info.window());
36+ break;
37+
38+ default:
39+ break;
40+ }
41
42 policy->advise_new_window(window_info);
43
44@@ -233,6 +246,7 @@
45 info_for(application).remove_window(info.window());
46 mru_active_windows.erase(info.window());
47 fullscreen_surfaces.erase(info.window());
48+ maximized_surfaces.erase(info.window());
49
50 application->destroy_surface(info.window());
51
52@@ -329,6 +343,8 @@
53 place_and_size(info, rect.top_left, rect.size);
54 }
55 }
56+
57+ update_maximized_windows_for_displays();
58 }
59
60 void miral::BasicWindowManager::remove_display(geometry::Rectangle const& area)
61@@ -344,6 +360,49 @@
62 place_and_size(info, rect.top_left, rect.size);
63 }
64 }
65+
66+ update_maximized_windows_for_displays();
67+}
68+
69+void miral::BasicWindowManager::update_maximized_windows_for_displays()
70+{
71+ if (displays.size() == 0)
72+ return;
73+
74+ auto const display_area = displays.bounding_rectangle();
75+
76+ for (auto window : maximized_surfaces)
77+ {
78+ if (window)
79+ {
80+ auto& info = info_for(window);
81+
82+ Rectangle rect{window.top_left(), window.size()};
83+
84+ switch (info.state())
85+ {
86+ case mir_window_state_maximized:
87+ rect = display_area;
88+ place_and_size(info, rect.top_left, rect.size);
89+ break;
90+
91+ case mir_window_state_horizmaximized:
92+ rect.top_left.x = display_area.top_left.x;
93+ rect.size.width = display_area.size.width;
94+ place_and_size(info, rect.top_left, rect.size);
95+ break;
96+
97+ case mir_window_state_vertmaximized:
98+ rect.top_left.y = display_area.top_left.y;
99+ rect.size.height = display_area.size.height;
100+ place_and_size(info, rect.top_left, rect.size);
101+ break;
102+
103+ default:
104+ break;
105+ }
106+ }
107+ }
108 }
109
110 bool miral::BasicWindowManager::handle_keyboard_event(MirKeyboardEvent const* event)
111@@ -1128,6 +1187,18 @@
112 fullscreen_surfaces.insert(window);
113 }
114
115+ switch (value)
116+ {
117+ case mir_window_state_maximized:
118+ case mir_window_state_vertmaximized:
119+ case mir_window_state_horizmaximized:
120+ maximized_surfaces.insert(window);
121+ break;
122+
123+ default:
124+ maximized_surfaces.erase(window);
125+ }
126+
127 if (window_info.state() == value)
128 {
129 return;
130
131=== modified file 'miral/basic_window_manager.h'
132--- miral/basic_window_manager.h 2017-04-03 16:14:01 +0000
133+++ miral/basic_window_manager.h 2017-07-24 16:22:13 +0000
134@@ -211,8 +211,9 @@
135 MirEvent const* last_input_event{nullptr};
136 #endif
137 miral::MRUWindowList mru_active_windows;
138- using FullscreenSurfaces = std::set<Window>;
139- FullscreenSurfaces fullscreen_surfaces;
140+ std::set<Window> fullscreen_surfaces;
141+ std::set<Window> maximized_surfaces;
142+ void update_maximized_windows_for_displays();
143
144 friend class Workspace;
145 using wwbimap_t = boost::bimap<
146
147=== modified file 'miral/output.cpp'
148--- miral/output.cpp 2016-07-22 11:12:58 +0000
149+++ miral/output.cpp 2017-07-24 16:22:13 +0000
150@@ -82,8 +82,18 @@
151
152 auto miral::Output::extents() const -> Rectangle
153 {
154- return Rectangle{self->top_left, self->modes[self->current_mode_index].size};
155+ switch (self->orientation)
156+ {
157+ case mir_orientation_normal:
158+ case mir_orientation_inverted:
159+ default:
160+ return Rectangle{self->top_left, self->modes[self->current_mode_index].size};
161
162+ case mir_orientation_left:
163+ case mir_orientation_right:
164+ auto const unrotated_size = self->modes[self->current_mode_index].size;
165+ return Rectangle{self->top_left, {unrotated_size.height.as_int(), unrotated_size.width.as_int()}};
166+ }
167 }
168
169 auto miral::Output::valid() const -> bool

Subscribers

People subscribed via source and target branches