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

Proposed by Alan Griffiths
Status: Merged
Approved by: Gerry Boland
Approved revision: 401
Merged at revision: 403
Proposed branch: lp:~alan-griffiths/miral/fix-1631958
Merge into: lp:miral
Diff against target: 106 lines (+44/-5)
3 files modified
miral/basic_window_manager.cpp (+6/-4)
test/select_active_window.cpp (+24/-0)
test/test_window_manager_tools.h (+14/-1)
To merge this branch: bzr merge lp:~alan-griffiths/miral/fix-1631958
Reviewer Review Type Date Requested Status
Gerry Boland (community) Approve
Review via email: mp+308061@code.launchpad.net

Commit message

Invisible windows are poor candidates for receiving focus. Especially if they are modal dialogs (LP:1631958)

To post a comment you must log in.
Revision history for this message
Gerry Boland (gerboland) wrote :

Yep, looks good & tests ok, thanks

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'miral/basic_window_manager.cpp'
2--- miral/basic_window_manager.cpp 2016-10-05 09:07:53 +0000
3+++ miral/basic_window_manager.cpp 2016-10-10 14:59:30 +0000
4@@ -843,6 +843,8 @@
5 policy->advise_state_change(window_info, value);
6 window_info.state(value);
7
8+ mir_surface->configure(mir_surface_attrib_state, value);
9+
10 switch (value)
11 {
12 case mir_surface_state_hidden:
13@@ -856,6 +858,8 @@
14 {
15 if (candidate == window)
16 return true;
17+ if (!std::shared_ptr<scene::Surface>(candidate)->visible())
18+ return true;
19 auto const w = candidate;
20 return !(select_active_window(w));
21 });
22@@ -865,8 +869,6 @@
23 default:
24 mir_surface->show();
25 }
26-
27- mir_surface->configure(mir_surface_attrib_state, value);
28 }
29
30 void miral::BasicWindowManager::update_event_timestamp(MirKeyboardEvent const* kev)
31@@ -930,8 +932,8 @@
32 {
33 if (std::shared_ptr<mir::scene::Surface> surface = child)
34 {
35- if (surface->type() == mir_surface_type_dialog)
36- return (select_active_window(child));
37+ if (surface->type() == mir_surface_type_dialog && surface->visible())
38+ return select_active_window(child);
39 }
40 }
41
42
43=== modified file 'test/select_active_window.cpp'
44--- test/select_active_window.cpp 2016-09-23 11:47:24 +0000
45+++ test/select_active_window.cpp 2016-10-10 14:59:30 +0000
46@@ -96,4 +96,28 @@
47 auto actual = basic_window_manager.select_active_window(parent);
48 EXPECT_THAT(actual, Eq(dialog))
49 << "actual=" << actual << ", expected=" << dialog;
50+}
51+
52+TEST_F(SelectActiveWindow, given_a_hidden_child_dialog_when_selecting_the_parent_the_parent_receives_focus)
53+{
54+ mir::scene::SurfaceCreationParameters creation_parameters;
55+ creation_parameters.name = "parent";
56+ creation_parameters.type = mir_surface_type_normal;
57+ creation_parameters.size = Size{600, 400};
58+
59+ auto parent = create_window(creation_parameters);
60+
61+ creation_parameters.name = "dialog";
62+ creation_parameters.type = mir_surface_type_dialog;
63+ creation_parameters.parent = parent;
64+
65+ auto dialog = create_window(creation_parameters);
66+
67+ WindowSpecification mods;
68+ mods.state() = mir_surface_state_hidden;
69+ basic_window_manager.modify_window(basic_window_manager.info_for(dialog), mods);
70+
71+ auto actual = basic_window_manager.select_active_window(parent);
72+ EXPECT_THAT(actual, Eq(parent))
73+ << "actual=" << actual << ", expected=" << parent;
74 }
75\ No newline at end of file
76
77=== modified file 'test/test_window_manager_tools.h'
78--- test/test_window_manager_tools.h 2016-09-30 09:39:48 +0000
79+++ test/test_window_manager_tools.h 2016-10-10 14:59:30 +0000
80@@ -86,12 +86,25 @@
81 mir::geometry::Size size() const override { return size_; }
82 void resize(mir::geometry::Size const& size) override { size_ = size; }
83
84- bool visible() const override { return true; }
85+ auto state() const -> MirSurfaceState override { return state_; }
86+ auto configure(MirSurfaceAttrib attrib, int value) -> int override {
87+ switch (attrib)
88+ {
89+ case mir_surface_attrib_state:
90+ state_ = MirSurfaceState(value);
91+ return state_;
92+ default:
93+ return value;
94+ }
95+ }
96+
97+ bool visible() const override { return state() != mir_surface_state_hidden; }
98
99 std::string name_;
100 MirSurfaceType type_;
101 mir::geometry::Point top_left_;
102 mir::geometry::Size size_;
103+ MirSurfaceState state_ = mir_surface_state_restored;
104 };
105
106 struct StubStubSession : mir::test::doubles::StubSession

Subscribers

People subscribed via source and target branches