Merge lp:~alan-griffiths/miral/BasicWindowManager-provides-active_window-logic into lp:miral

Proposed by Alan Griffiths
Status: Merged
Approved by: Alan Griffiths
Approved revision: 201
Merged at revision: 176
Proposed branch: lp:~alan-griffiths/miral/BasicWindowManager-provides-active_window-logic
Merge into: lp:miral
Prerequisite: lp:~alan-griffiths/miral/mru-list-of-active-windows
Diff against target: 688 lines (+142/-196)
10 files modified
include/miral/window_management_policy.h (+2/-1)
include/miral/window_manager_tools.h (+3/-3)
miral-kiosk/kiosk_window_manager.cpp (+15/-35)
miral-kiosk/kiosk_window_manager.h (+3/-1)
miral-shell/canonical_window_manager.cpp (+15/-69)
miral-shell/canonical_window_manager.h (+3/-5)
miral-shell/tiling_window_manager.cpp (+18/-36)
miral-shell/tiling_window_manager.h (+3/-1)
miral/basic_window_manager.cpp (+73/-40)
miral/basic_window_manager.h (+7/-5)
To merge this branch: bzr merge lp:~alan-griffiths/miral/BasicWindowManager-provides-active_window-logic
Reviewer Review Type Date Requested Status
Mir development team Pending
Review via email: mp+295860@code.launchpad.net

Commit message

Provide standard "active window" support in BasicWindowManager, just calling the policies for stuff that can reasonably differ.

Description of the change

Provide standard "active window" support in BasicWindowManager, just calling the policies for stuff that can reasonably differ.

To post a comment you must log in.
200. By Alan Griffiths

Use MRU list when switching applications

201. By Alan Griffiths

Extract common code

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'include/miral/window_management_policy.h'
--- include/miral/window_management_policy.h 2016-05-06 15:36:23 +0000
+++ include/miral/window_management_policy.h 2016-05-28 07:54:16 +0000
@@ -50,7 +50,8 @@
50 virtual bool handle_pointer_event(MirPointerEvent const* event) = 0;50 virtual bool handle_pointer_event(MirPointerEvent const* event) = 0;
51 virtual void handle_raise_window(WindowInfo& window_info) = 0;51 virtual void handle_raise_window(WindowInfo& window_info) = 0;
5252
53 virtual auto select_active_window(Window const& hint) -> Window = 0;53 virtual void handle_focus_lost(miral::WindowInfo const& info) = 0;
54 virtual void handle_focus_gained(miral::WindowInfo const& info) = 0;
5455
55 virtual ~WindowManagementPolicy() = default;56 virtual ~WindowManagementPolicy() = default;
56 WindowManagementPolicy() = default;57 WindowManagementPolicy() = default;
5758
=== modified file 'include/miral/window_manager_tools.h'
--- include/miral/window_manager_tools.h 2016-05-06 16:04:34 +0000
+++ include/miral/window_manager_tools.h 2016-05-28 07:54:16 +0000
@@ -55,10 +55,10 @@
55 virtual auto info_for(std::weak_ptr<mir::scene::Session> const& session) const -> ApplicationInfo& = 0;55 virtual auto info_for(std::weak_ptr<mir::scene::Session> const& session) const -> ApplicationInfo& = 0;
56 virtual auto info_for(std::weak_ptr<mir::scene::Surface> const& surface) const -> WindowInfo& = 0;56 virtual auto info_for(std::weak_ptr<mir::scene::Surface> const& surface) const -> WindowInfo& = 0;
57 virtual auto info_for(Window const& window) const -> WindowInfo& = 0;57 virtual auto info_for(Window const& window) const -> WindowInfo& = 0;
58 virtual auto focused_application() const -> Application = 0;58 virtual void kill_active_application(int sig) = 0;
59 virtual auto focused_window() const -> Window = 0;59 virtual auto active_window() const -> Window = 0;
60 virtual auto select_active_window(Window const& hint) -> Window = 0;
60 virtual void focus_next_application() = 0;61 virtual void focus_next_application() = 0;
61 virtual void set_focus_to(Window const& window) = 0;
62 virtual auto window_at(mir::geometry::Point cursor) const -> Window = 0;62 virtual auto window_at(mir::geometry::Point cursor) const -> Window = 0;
63 virtual auto active_display() -> mir::geometry::Rectangle const = 0;63 virtual auto active_display() -> mir::geometry::Rectangle const = 0;
64 virtual void destroy(Window& window) = 0;64 virtual void destroy(Window& window) = 0;
6565
=== modified file 'miral-kiosk/kiosk_window_manager.cpp'
--- miral-kiosk/kiosk_window_manager.cpp 2016-05-28 07:54:16 +0000
+++ miral-kiosk/kiosk_window_manager.cpp 2016-05-28 07:54:16 +0000
@@ -116,7 +116,7 @@
116116
117void KioskWindowManagerPolicy::handle_window_ready(WindowInfo& window_info)117void KioskWindowManagerPolicy::handle_window_ready(WindowInfo& window_info)
118{118{
119 select_active_window(window_info.window());119 tools->select_active_window(window_info.window());
120}120}
121121
122void KioskWindowManagerPolicy::handle_modify_window(122void KioskWindowManagerPolicy::handle_modify_window(
@@ -147,7 +147,7 @@
147147
148void KioskWindowManagerPolicy::handle_raise_window(WindowInfo& window_info)148void KioskWindowManagerPolicy::handle_raise_window(WindowInfo& window_info)
149{149{
150 select_active_window(window_info.window());150 tools->select_active_window(window_info.window());
151}151}
152152
153bool KioskWindowManagerPolicy::handle_keyboard_event(MirKeyboardEvent const* event)153bool KioskWindowManagerPolicy::handle_keyboard_event(MirKeyboardEvent const* event)
@@ -168,18 +168,18 @@
168 modifiers == mir_input_event_modifier_alt &&168 modifiers == mir_input_event_modifier_alt &&
169 scan_code == KEY_GRAVE)169 scan_code == KEY_GRAVE)
170 {170 {
171 if (auto const prev = tools->focused_window())171 if (auto const prev = tools->active_window())
172 {172 {
173 auto const& siblings = tools->info_for(prev.application()).windows();173 auto const& siblings = tools->info_for(prev.application()).windows();
174 auto current = find(begin(siblings), end(siblings), prev);174 auto current = find(begin(siblings), end(siblings), prev);
175175
176 while (current != end(siblings) && prev == select_active_window(*current))176 while (current != end(siblings) && prev == tools->select_active_window(*current))
177 ++current;177 ++current;
178178
179 if (current == end(siblings))179 if (current == end(siblings))
180 {180 {
181 current = begin(siblings);181 current = begin(siblings);
182 while (prev != *current && prev == select_active_window(*current))182 while (prev != *current && prev == tools->select_active_window(*current))
183 ++current;183 ++current;
184 }184 }
185 }185 }
@@ -218,41 +218,12 @@
218218
219 if (action == mir_pointer_action_button_down)219 if (action == mir_pointer_action_button_down)
220 {220 {
221 select_active_window(tools->window_at(cursor));221 tools->select_active_window(tools->window_at(cursor));
222 }222 }
223223
224 return false;224 return false;
225}225}
226226
227auto KioskWindowManagerPolicy::select_active_window(Window const& window) -> Window
228{
229 if (!window)
230 {
231 tools->set_focus_to({});
232 return window;
233 }
234
235 auto const& info_for = tools->info_for(window);
236
237 if (info_for.can_be_active())
238 {
239 tools->set_focus_to(info_for.window());
240 tools->raise_tree(window);
241
242 raise_splash_session();
243
244 return window;
245 }
246 else
247 {
248 // Cannot have input focus - try the parent
249 if (auto const parent = info_for.parent())
250 return select_active_window(parent);
251
252 return {};
253 }
254}
255
256void KioskWindowManagerPolicy::raise_splash_session() const227void KioskWindowManagerPolicy::raise_splash_session() const
257{228{
258 if (auto session = splash.session().lock())229 if (auto session = splash.session().lock())
@@ -263,3 +234,12 @@
263 tools->raise_tree(s);234 tools->raise_tree(s);
264 }235 }
265}236}
237
238void KioskWindowManagerPolicy::handle_focus_gained(WindowInfo const& info)
239{
240 tools->raise_tree(info.window());
241}
242
243void KioskWindowManagerPolicy::handle_focus_lost(WindowInfo const& /*info*/)
244{
245}
266246
=== modified file 'miral-kiosk/kiosk_window_manager.h'
--- miral-kiosk/kiosk_window_manager.h 2016-05-06 14:38:26 +0000
+++ miral-kiosk/kiosk_window_manager.h 2016-05-28 07:54:16 +0000
@@ -57,7 +57,9 @@
5757
58 void handle_raise_window(miral::WindowInfo& window_info) override;58 void handle_raise_window(miral::WindowInfo& window_info) override;
5959
60 auto select_active_window(miral::Window const& window) -> miral::Window override;60 void handle_focus_lost(miral::WindowInfo const& info) override;
61
62 void handle_focus_gained(miral::WindowInfo const& info) override;
6163
62private:64private:
63 static const int modifier_mask =65 static const int modifier_mask =
6466
=== modified file 'miral-shell/canonical_window_manager.cpp'
--- miral-shell/canonical_window_manager.cpp 2016-05-28 07:54:16 +0000
+++ miral-shell/canonical_window_manager.cpp 2016-05-28 07:54:16 +0000
@@ -58,7 +58,7 @@
58void CanonicalWindowManagerPolicy::click(Point cursor)58void CanonicalWindowManagerPolicy::click(Point cursor)
59{59{
60 if (auto const window = tools->window_at(cursor))60 if (auto const window = tools->window_at(cursor))
61 select_active_window(window);61 tools->select_active_window(window);
62}62}
6363
64void CanonicalWindowManagerPolicy::handle_app_info_updated(Rectangles const& /*displays*/)64void CanonicalWindowManagerPolicy::handle_app_info_updated(Rectangles const& /*displays*/)
@@ -86,8 +86,8 @@
86bool CanonicalWindowManagerPolicy::resize(Point cursor)86bool CanonicalWindowManagerPolicy::resize(Point cursor)
87{87{
88 if (!resizing)88 if (!resizing)
89 select_active_window(tools->window_at(old_cursor));89 tools->select_active_window(tools->window_at(old_cursor));
90 return resize(active_window(), cursor, old_cursor);90 return resize(tools->active_window(), cursor, old_cursor);
91}91}
9292
9393
@@ -279,7 +279,7 @@
279279
280void CanonicalWindowManagerPolicy::handle_window_ready(WindowInfo& window_info)280void CanonicalWindowManagerPolicy::handle_window_ready(WindowInfo& window_info)
281{281{
282 select_active_window(window_info.window());282 tools->select_active_window(window_info.window());
283}283}
284284
285void CanonicalWindowManagerPolicy::handle_modify_window(285void CanonicalWindowManagerPolicy::handle_modify_window(
@@ -370,9 +370,6 @@
370 {370 {
371 tools->destroy(titlebar->window);371 tools->destroy(titlebar->window);
372 }372 }
373
374 if (active_window() == window_info.window())
375 active_window_.reset();
376}373}
377374
378auto CanonicalWindowManagerPolicy::handle_set_state(WindowInfo& window_info, MirSurfaceState value)375auto CanonicalWindowManagerPolicy::handle_set_state(WindowInfo& window_info, MirSurfaceState value)
@@ -505,13 +502,13 @@
505502
506void CanonicalWindowManagerPolicy::drag(Point cursor)503void CanonicalWindowManagerPolicy::drag(Point cursor)
507{504{
508 select_active_window(tools->window_at(old_cursor));505 tools->select_active_window(tools->window_at(old_cursor));
509 drag(active_window(), cursor, old_cursor, display_area);506 drag(tools->active_window(), cursor, old_cursor, display_area);
510}507}
511508
512void CanonicalWindowManagerPolicy::handle_raise_window(WindowInfo& window_info)509void CanonicalWindowManagerPolicy::handle_raise_window(WindowInfo& window_info)
513{510{
514 select_active_window(window_info.window());511 tools->select_active_window(window_info.window());
515}512}
516513
517bool CanonicalWindowManagerPolicy::handle_keyboard_event(MirKeyboardEvent const* event)514bool CanonicalWindowManagerPolicy::handle_keyboard_event(MirKeyboardEvent const* event)
@@ -545,13 +542,11 @@
545 switch (modifiers & modifier_mask)542 switch (modifiers & modifier_mask)
546 {543 {
547 case mir_input_event_modifier_alt:544 case mir_input_event_modifier_alt:
548 if (auto const application = tools->focused_application())545 tools->kill_active_application(SIGTERM);
549 miral::kill(application, SIGTERM);
550
551 return true;546 return true;
552547
553 case mir_input_event_modifier_ctrl:548 case mir_input_event_modifier_ctrl:
554 if (auto const window = tools->focused_window())549 if (auto const window = tools->active_window())
555 window.request_client_surface_close();550 window.request_client_surface_close();
556551
557 return true;552 return true;
@@ -572,18 +567,18 @@
572 modifiers == mir_input_event_modifier_alt &&567 modifiers == mir_input_event_modifier_alt &&
573 scan_code == KEY_GRAVE)568 scan_code == KEY_GRAVE)
574 {569 {
575 if (auto const prev = tools->focused_window())570 if (auto const prev = tools->active_window())
576 {571 {
577 auto const& siblings = tools->info_for(prev.application()).windows();572 auto const& siblings = tools->info_for(prev.application()).windows();
578 auto current = find(begin(siblings), end(siblings), prev);573 auto current = find(begin(siblings), end(siblings), prev);
579574
580 while (current != end(siblings) && prev == select_active_window(*current))575 while (current != end(siblings) && prev == tools->select_active_window(*current))
581 ++current;576 ++current;
582577
583 if (current == end(siblings))578 if (current == end(siblings))
584 {579 {
585 current = begin(siblings);580 current = begin(siblings);
586 while (prev != *current && prev == select_active_window(*current))581 while (prev != *current && prev == tools->select_active_window(*current))
587 ++current;582 ++current;
588 }583 }
589 }584 }
@@ -702,7 +697,7 @@
702697
703void CanonicalWindowManagerPolicy::toggle(MirSurfaceState state)698void CanonicalWindowManagerPolicy::toggle(MirSurfaceState state)
704{699{
705 if (auto window = active_window())700 if (auto const window = tools->active_window())
706 {701 {
707 auto& info = tools->info_for(window);702 auto& info = tools->info_for(window);
708703
@@ -713,54 +708,13 @@
713 }708 }
714}709}
715710
716auto CanonicalWindowManagerPolicy::select_active_window(Window const& hint) -> miral::Window
717{
718 auto const prev_window = active_window();
719
720 if (hint == prev_window)
721 return hint;
722
723 if (!hint)
724 {
725 if (prev_window)
726 {
727 tools->set_focus_to({});
728 handle_focus_lost(tools->info_for(prev_window));
729 }
730
731 return hint;
732 }
733
734 auto const& info_for_hint = tools->info_for(hint);
735
736 if (info_for_hint.can_be_active())
737 {
738 tools->set_focus_to(hint);
739 tools->raise_tree(hint);
740
741 if (prev_window)
742 handle_focus_lost(tools->info_for(prev_window));
743
744 handle_focus_gained(info_for_hint);
745 return hint;
746 }
747 else
748 {
749 // Cannot have input focus - try the parent
750 if (auto const parent = info_for_hint.parent())
751 return select_active_window(parent);
752 }
753
754 return {};
755}
756
757void CanonicalWindowManagerPolicy::handle_focus_gained(WindowInfo const& info)711void CanonicalWindowManagerPolicy::handle_focus_gained(WindowInfo const& info)
758{712{
713 tools->raise_tree(info.window());
714
759 if (auto const titlebar = std::static_pointer_cast<CanonicalWindowManagementPolicyData>(info.userdata()))715 if (auto const titlebar = std::static_pointer_cast<CanonicalWindowManagementPolicyData>(info.userdata()))
760 titlebar->paint_titlebar(0xFF);716 titlebar->paint_titlebar(0xFF);
761717
762 active_window_ = info.window();
763
764 // Frig to force the spinner to the top718 // Frig to force the spinner to the top
765 if (auto const spinner_session = spinner.session())719 if (auto const spinner_session = spinner.session())
766 {720 {
@@ -775,14 +729,6 @@
775{729{
776 if (auto const titlebar = std::static_pointer_cast<CanonicalWindowManagementPolicyData>(info.userdata()))730 if (auto const titlebar = std::static_pointer_cast<CanonicalWindowManagementPolicyData>(info.userdata()))
777 titlebar->paint_titlebar(0x3F);731 titlebar->paint_titlebar(0x3F);
778
779 active_window_.reset();
780}
781
782auto CanonicalWindowManagerPolicy::active_window() const
783-> Window
784{
785 return active_window_;
786}732}
787733
788bool CanonicalWindowManagerPolicy::resize(Window const& window, Point cursor, Point old_cursor)734bool CanonicalWindowManagerPolicy::resize(Window const& window, Point cursor, Point old_cursor)
789735
=== modified file 'miral-shell/canonical_window_manager.h'
--- miral-shell/canonical_window_manager.h 2016-05-28 07:54:16 +0000
+++ miral-shell/canonical_window_manager.h 2016-05-28 07:54:16 +0000
@@ -74,7 +74,9 @@
7474
75 void handle_raise_window(miral::WindowInfo& window_info) override;75 void handle_raise_window(miral::WindowInfo& window_info) override;
7676
77 auto select_active_window(miral::Window const& hint) -> miral::Window override;77 void handle_focus_lost(miral::WindowInfo const& info) override;
78
79 void handle_focus_gained(miral::WindowInfo const& info) override;
7880
79private:81private:
80 static const int modifier_mask =82 static const int modifier_mask =
@@ -89,9 +91,6 @@
89 bool resize(Point cursor);91 bool resize(Point cursor);
90 void toggle(MirSurfaceState state);92 void toggle(MirSurfaceState state);
9193
92 auto active_window() const -> miral::Window;
93 void handle_focus_lost(miral::WindowInfo const& info);
94 void handle_focus_gained(miral::WindowInfo const& info);
9594
96 bool resize(miral::Window const& window, Point cursor, Point old_cursor);95 bool resize(miral::Window const& window, Point cursor, Point old_cursor);
97 bool drag(miral::Window window, Point to, Point from, Rectangle bounds);96 bool drag(miral::Window window, Point to, Point from, Rectangle bounds);
@@ -105,7 +104,6 @@
105104
106 Rectangle display_area;105 Rectangle display_area;
107 Point old_cursor{};106 Point old_cursor{};
108 miral::Window active_window_;
109 using FullscreenSurfaces = std::set<miral::Window>;107 using FullscreenSurfaces = std::set<miral::Window>;
110108
111 FullscreenSurfaces fullscreen_surfaces;109 FullscreenSurfaces fullscreen_surfaces;
112110
=== modified file 'miral-shell/tiling_window_manager.cpp'
--- miral-shell/tiling_window_manager.cpp 2016-05-28 07:54:16 +0000
+++ miral-shell/tiling_window_manager.cpp 2016-05-28 07:54:16 +0000
@@ -57,7 +57,7 @@
57void TilingWindowManagerPolicy::click(Point cursor)57void TilingWindowManagerPolicy::click(Point cursor)
58{58{
59 auto const window = tools->window_at(cursor);59 auto const window = tools->window_at(cursor);
60 select_active_window(window);60 tools->select_active_window(window);
61}61}
6262
63void TilingWindowManagerPolicy::handle_app_info_updated(Rectangles const& displays)63void TilingWindowManagerPolicy::handle_app_info_updated(Rectangles const& displays)
@@ -76,7 +76,7 @@
76 {76 {
77 if (application == application_under(old_cursor))77 if (application == application_under(old_cursor))
78 {78 {
79 if (auto const window = select_active_window(tools->window_at(old_cursor)))79 if (auto const window = tools->select_active_window(tools->window_at(old_cursor)))
80 {80 {
81 resize(window, cursor, old_cursor, tile_for(tools->info_for(application)));81 resize(window, cursor, old_cursor, tile_for(tools->info_for(application)));
82 }82 }
@@ -154,7 +154,7 @@
154154
155void TilingWindowManagerPolicy::handle_window_ready(WindowInfo& window_info)155void TilingWindowManagerPolicy::handle_window_ready(WindowInfo& window_info)
156{156{
157 select_active_window(window_info.window());157 tools->select_active_window(window_info.window());
158}158}
159159
160void TilingWindowManagerPolicy::handle_modify_window(160void TilingWindowManagerPolicy::handle_modify_window(
@@ -240,7 +240,7 @@
240 {240 {
241 if (application == application_under(old_cursor))241 if (application == application_under(old_cursor))
242 {242 {
243 if (auto const window = select_active_window(tools->window_at(old_cursor)))243 if (auto const window = tools->select_active_window(tools->window_at(old_cursor)))
244 {244 {
245 drag(tools->info_for(window), cursor, old_cursor, tile_for(tools->info_for(application)));245 drag(tools->info_for(window), cursor, old_cursor, tile_for(tools->info_for(application)));
246 }246 }
@@ -250,7 +250,7 @@
250250
251void TilingWindowManagerPolicy::handle_raise_window(WindowInfo& window_info)251void TilingWindowManagerPolicy::handle_raise_window(WindowInfo& window_info)
252{252{
253 select_active_window(window_info.window());253 tools-> select_active_window(window_info.window());
254}254}
255255
256bool TilingWindowManagerPolicy::handle_keyboard_event(MirKeyboardEvent const* event)256bool TilingWindowManagerPolicy::handle_keyboard_event(MirKeyboardEvent const* event)
@@ -284,13 +284,12 @@
284 switch (modifiers & modifier_mask)284 switch (modifiers & modifier_mask)
285 {285 {
286 case mir_input_event_modifier_alt:286 case mir_input_event_modifier_alt:
287 if (auto const application = tools->focused_application())287 tools->kill_active_application(SIGTERM);
288 miral::kill(application, SIGTERM);
289288
290 return true;289 return true;
291290
292 case mir_input_event_modifier_ctrl:291 case mir_input_event_modifier_ctrl:
293 if (auto const window = tools->focused_window())292 if (auto const window = tools->active_window())
294 window.request_client_surface_close();293 window.request_client_surface_close();
295294
296 return true;295 return true;
@@ -311,18 +310,18 @@
311 modifiers == mir_input_event_modifier_alt &&310 modifiers == mir_input_event_modifier_alt &&
312 scan_code == KEY_GRAVE)311 scan_code == KEY_GRAVE)
313 {312 {
314 if (auto const prev = tools->focused_window())313 if (auto const prev = tools->active_window())
315 {314 {
316 auto const& siblings = tools->info_for(prev.application()).windows();315 auto const& siblings = tools->info_for(prev.application()).windows();
317 auto current = find(begin(siblings), end(siblings), prev);316 auto current = find(begin(siblings), end(siblings), prev);
318317
319 while (current != end(siblings) && prev == select_active_window(*current))318 while (current != end(siblings) && prev == tools->select_active_window(*current))
320 ++current;319 ++current;
321320
322 if (current == end(siblings))321 if (current == end(siblings))
323 {322 {
324 current = begin(siblings);323 current = begin(siblings);
325 while (prev != *current && prev == select_active_window(*current))324 while (prev != *current && prev == tools->select_active_window(*current))
326 ++current;325 ++current;
327 }326 }
328 }327 }
@@ -420,7 +419,7 @@
420419
421void TilingWindowManagerPolicy::toggle(MirSurfaceState state)420void TilingWindowManagerPolicy::toggle(MirSurfaceState state)
422{421{
423 if (auto window = tools->focused_window())422 if (auto window = tools->active_window())
424 {423 {
425 auto& window_info = tools->info_for(window);424 auto& window_info = tools->info_for(window);
426425
@@ -583,28 +582,11 @@
583 }582 }
584}583}
585584
586auto TilingWindowManagerPolicy::select_active_window(Window const& window) -> Window585void TilingWindowManagerPolicy::handle_focus_gained(WindowInfo const& info)
587{586{
588 if (!window)587 tools->raise_tree(info.window());
589 {588}
590 tools->set_focus_to({});589
591 return window;590void TilingWindowManagerPolicy::handle_focus_lost(WindowInfo const& /*info*/)
592 }591{
593
594 auto const& info_for = tools->info_for(window);
595
596 if (info_for.can_be_active())
597 {
598 tools->set_focus_to(info_for.window());
599 tools->raise_tree(window);
600 return window;
601 }
602 else
603 {
604 // Cannot have input focus - try the parent
605 if (auto const parent = info_for.parent())
606 return select_active_window(parent);
607
608 return {};
609 }
610}592}
611593
=== modified file 'miral-shell/tiling_window_manager.h'
--- miral-shell/tiling_window_manager.h 2016-05-06 14:38:26 +0000
+++ miral-shell/tiling_window_manager.h 2016-05-28 07:54:16 +0000
@@ -68,7 +68,9 @@
6868
69 void handle_raise_window(miral::WindowInfo& window_info) override;69 void handle_raise_window(miral::WindowInfo& window_info) override;
7070
71 auto select_active_window(miral::Window const& window) -> miral::Window override;71 void handle_focus_lost(miral::WindowInfo const& info) override;
72
73 void handle_focus_gained(miral::WindowInfo const& info) override;
7274
73private:75private:
74 static const int modifier_mask =76 static const int modifier_mask =
7577
=== modified file 'miral/basic_window_manager.cpp'
--- miral/basic_window_manager.cpp 2016-05-28 07:54:16 +0000
+++ miral/basic_window_manager.cpp 2016-05-28 07:54:16 +0000
@@ -151,38 +151,21 @@
151 if (is_active_window)151 if (is_active_window)
152 {152 {
153 // Try to make the parent active153 // Try to make the parent active
154 if (parent)154 if (parent && select_active_window(parent))
155 {155 return;
156 if (policy->select_active_window(parent))156
157 return;157 if (can_activate_window_for_session(session))
158 }158 return;
159
160 // TODO the policy for choosing a window is mixed with implementing the choice.
161 // I.e. select_active_window() calls set_focus_to() which updates mru_active_windows
162 // during the iteration. There must be a better way to sequence the logic.
163 // Until then we copy the list.
164 auto const copy_mru_windows = mru_active_windows;
165
166 // Try to activate to recently active window of same application
167 {
168 Window new_focus;
169
170 copy_mru_windows.enumerate([&](Window& window)
171 {
172 return window.application() != session ||
173 !(new_focus = policy->select_active_window(window));
174 });
175
176 if (new_focus) return;
177 }
178159
179 // Try to activate to recently active window of any application160 // Try to activate to recently active window of any application
180 {161 {
181 Window new_focus;162 Window new_focus;
182163
183 copy_mru_windows.enumerate([&](Window& window)164 mru_active_windows.enumerate([&](Window& window)
184 {165 {
185 return !(new_focus = policy->select_active_window(window));166 // select_active_window() calls set_focus_to() which updates mru_active_windows and changes window
167 auto const w = window;
168 return !(new_focus = select_active_window(w));
186 });169 });
187170
188 if (new_focus) return;171 if (new_focus) return;
@@ -315,29 +298,27 @@
315 return info_for(std::weak_ptr<mir::scene::Surface>(window));298 return info_for(std::weak_ptr<mir::scene::Surface>(window));
316}299}
317300
318auto miral::BasicWindowManager::focused_application() const301void miral::BasicWindowManager::kill_active_application(int sig)
319-> Application
320{302{
321 return focus_controller->focused_session();303 if (auto const application = focus_controller->focused_session())
304 miral::kill(application, sig);
322}305}
323306
324auto miral::BasicWindowManager::focused_window() const307auto miral::BasicWindowManager::active_window() const -> Window
325-> Window
326{308{
327 auto focussed_surface = focus_controller->focused_surface();309 return mru_active_windows.top();
328 return focussed_surface ? info_for(focussed_surface).window() : Window{};
329}310}
330311
331void miral::BasicWindowManager::focus_next_application()312void miral::BasicWindowManager::focus_next_application()
332{313{
333 focus_controller->focus_next_session();314 focus_controller->focus_next_session();
334 policy->select_active_window(focused_window());315
335}316 if (can_activate_window_for_session(focus_controller->focused_session()))
336317 return;
337void miral::BasicWindowManager::set_focus_to(Window const& window)318
338{319 // Last resort: accept wherever focus_controller placed focus
339 if (window) mru_active_windows.push(window);320 auto const focussed_surface = focus_controller->focused_surface();
340 focus_controller->set_focus_to(window.application(), window);321 select_active_window(focussed_surface ? info_for(focussed_surface).window() : Window{});
341}322}
342323
343auto miral::BasicWindowManager::window_at(geometry::Point cursor) const324auto miral::BasicWindowManager::window_at(geometry::Point cursor) const
@@ -462,3 +443,55 @@
462 std::lock_guard<decltype(mutex)> lock(mutex);443 std::lock_guard<decltype(mutex)> lock(mutex);
463 callback();444 callback();
464}445}
446
447auto miral::BasicWindowManager::select_active_window(Window const& hint) -> miral::Window
448{
449 auto const prev_window = active_window();
450
451 if (!hint)
452 {
453 if (prev_window)
454 {
455 focus_controller->set_focus_to(hint.application(), hint);
456 policy->handle_focus_lost(info_for(prev_window));
457 }
458
459 return hint;
460 }
461
462 auto const& info_for_hint = info_for(hint);
463
464 if (info_for_hint.can_be_active())
465 {
466 mru_active_windows.push(hint);
467 focus_controller->set_focus_to(hint.application(), hint);
468
469 if (prev_window && prev_window != hint)
470 policy->handle_focus_lost(info_for(prev_window));
471
472 policy->handle_focus_gained(info_for_hint);
473 return hint;
474 }
475 else
476 {
477 // Cannot have input focus - try the parent
478 if (auto const parent = info_for_hint.parent())
479 return select_active_window(parent);
480 }
481
482 return {};
483}
484
485auto miral::BasicWindowManager::can_activate_window_for_session(miral::Application const& session) -> bool
486{
487 miral::Window new_focus;
488
489 mru_active_windows.enumerate([&](miral::Window& window)
490 {
491 // select_active_window() calls set_focus_to() which updates mru_active_windows and changes window
492 auto const w = window;
493 return w.application() != session || !(new_focus = miral::BasicWindowManager::select_active_window(w));
494 });
495
496 return new_focus;
497}
465\ No newline at end of file498\ No newline at end of file
466499
=== modified file 'miral/basic_window_manager.h'
--- miral/basic_window_manager.h 2016-05-28 07:54:16 +0000
+++ miral/basic_window_manager.h 2016-05-28 07:54:16 +0000
@@ -114,14 +114,14 @@
114114
115 auto info_for(Window const& window) const -> WindowInfo& override;115 auto info_for(Window const& window) const -> WindowInfo& override;
116116
117 auto focused_application() const -> Application override;117 void kill_active_application(int sig) override;
118118
119 auto focused_window() const -> Window override;119 auto active_window() const -> Window override;
120
121 auto select_active_window(Window const& hint) -> Window override;
120122
121 void focus_next_application() override;123 void focus_next_application() override;
122124
123 void set_focus_to(Window const& window) override;
124
125 auto window_at(mir::geometry::Point cursor) const -> Window override;125 auto window_at(mir::geometry::Point cursor) const -> Window override;
126126
127 auto active_display() -> mir::geometry::Rectangle const override;127 auto active_display() -> mir::geometry::Rectangle const override;
@@ -156,6 +156,8 @@
156 void update_event_timestamp(MirKeyboardEvent const* kev);156 void update_event_timestamp(MirKeyboardEvent const* kev);
157 void update_event_timestamp(MirPointerEvent const* pev);157 void update_event_timestamp(MirPointerEvent const* pev);
158 void update_event_timestamp(MirTouchEvent const* tev);158 void update_event_timestamp(MirTouchEvent const* tev);
159
160 auto can_activate_window_for_session(miral::Application const& session) -> bool;
159};161};
160}162}
161163

Subscribers

People subscribed via source and target branches