19 #ifndef MIR_EXAMPLE_BASIC_WINDOW_MANAGER_H_
20 #define MIR_EXAMPLE_BASIC_WINDOW_MANAGER_H_
41 template<
typename Info>
44 using type = std::map<std::weak_ptr<scene::Surface>, Info, std::owner_less<std::weak_ptr<scene::Surface>>>;
47 template<
typename Info>
50 using type = std::map<std::weak_ptr<scene::Session>, Info, std::owner_less<std::weak_ptr<scene::Session>>>;
57 template<
typename SessionInfo,
typename SurfaceInfo>
61 virtual auto find_session(std::function<
bool(SessionInfo
const& info)>
const& predicate)
62 -> std::shared_ptr<scene::Session> = 0;
64 virtual auto info_for(std::weak_ptr<scene::Session>
const& session)
const -> SessionInfo& = 0;
66 virtual auto info_for(std::weak_ptr<scene::Surface>
const& surface)
const -> SurfaceInfo& = 0;
75 std::shared_ptr<scene::Session>
const& focus,
76 std::shared_ptr<scene::Surface>
const& surface) = 0;
80 virtual void raise(
SurfaceSet const& surfaces) = 0;
84 virtual void forget(std::weak_ptr<scene::Surface>
const& surface) = 0;
112 template<
typename WindowManagementPolicy,
typename SessionInfo,
typename SurfaceInfo>
117 template <
typename... PolicyArgs>
120 PolicyArgs&&... policy_args) :
121 focus_controller(focus_controller),
122 policy(this,
std::forward<PolicyArgs>(policy_args)...)
127 void add_session(std::shared_ptr<scene::Session>
const& session)
override
129 std::lock_guard<decltype(mutex)> lock(mutex);
130 session_info[session] = SessionInfo();
131 policy.handle_session_info_updated(session_info, displays);
134 void remove_session(std::shared_ptr<scene::Session>
const& session)
override
136 std::lock_guard<decltype(mutex)> lock(mutex);
137 session_info.erase(session);
138 policy.handle_session_info_updated(session_info, displays);
142 std::shared_ptr<scene::Session>
const& session,
143 scene::SurfaceCreationParameters
const& params,
144 std::function<
frontend::SurfaceId(std::shared_ptr<scene::Session>
const& session, scene::SurfaceCreationParameters
const& params)>
const& build)
override
146 std::lock_guard<decltype(mutex)> lock(mutex);
147 scene::SurfaceCreationParameters
const placed_params = policy.handle_place_new_surface(session, params);
148 auto const result = build(session, placed_params);
149 auto const surface = session->surface(result);
150 surface_info.emplace(surface, SurfaceInfo{session, surface, placed_params});
151 policy.handle_new_surface(session, surface);
152 policy.generate_decorations_for(session, surface, surface_info, build);
157 std::shared_ptr<scene::Session>
const& session,
158 std::shared_ptr<scene::Surface>
const& surface,
159 shell::SurfaceSpecification
const& modifications)
override
161 std::lock_guard<decltype(mutex)> lock(mutex);
162 policy.handle_modify_surface(session, surface, modifications);
166 std::shared_ptr<scene::Session>
const& session,
167 std::weak_ptr<scene::Surface>
const& surface)
override
169 std::lock_guard<decltype(mutex)> lock(mutex);
170 policy.handle_delete_surface(session, surface);
172 surface_info.erase(surface);
175 void forget(std::weak_ptr<scene::Surface>
const& surface)
override
177 surface_info.erase(surface);
180 void add_display(geometry::Rectangle
const& area)
override
182 std::lock_guard<decltype(mutex)> lock(mutex);
184 policy.handle_displays_updated(session_info, displays);
187 void remove_display(geometry::Rectangle
const& area)
override
189 std::lock_guard<decltype(mutex)> lock(mutex);
191 policy.handle_displays_updated(session_info, displays);
196 std::lock_guard<decltype(mutex)> lock(mutex);
197 return policy.handle_keyboard_event(event);
202 std::lock_guard<decltype(mutex)> lock(mutex);
203 return policy.handle_touch_event(event);
208 std::lock_guard<decltype(mutex)> lock(mutex);
214 return policy.handle_pointer_event(event);
217 int set_surface_attribute(
218 std::shared_ptr<scene::Session>
const& ,
219 std::shared_ptr<scene::Surface>
const& surface,
223 std::lock_guard<decltype(mutex)> lock(mutex);
228 auto const state = policy.handle_set_state(surface,
MirSurfaceState(value));
229 return surface->configure(attrib, state);
232 return surface->configure(attrib, value);
236 auto find_session(std::function<
bool(SessionInfo
const& info)>
const& predicate)
237 -> std::shared_ptr<scene::Session>
override
239 for(
auto& info : session_info)
241 if (predicate(info.second))
243 return info.first.lock();
247 return std::shared_ptr<scene::Session>{};
250 auto info_for(std::weak_ptr<scene::Session>
const& session)
const -> SessionInfo&
override
252 return const_cast<SessionInfo&
>(session_info.at(session));
255 auto info_for(std::weak_ptr<scene::Surface>
const& surface)
const -> SurfaceInfo&
override
257 return const_cast<SurfaceInfo&
>(surface_info.at(surface));
260 std::shared_ptr<scene::Session> focused_session()
const override
265 std::shared_ptr<scene::Surface> focused_surface()
const override
270 void focus_next_session()
override
276 std::shared_ptr<scene::Session>
const& focus,
277 std::shared_ptr<scene::Surface>
const& surface)
override
282 auto surface_at(geometry::Point cursor)
const -> std::shared_ptr<scene::Surface>
override
287 void raise(
SurfaceSet const& surfaces)
override
289 focus_controller->
raise(surfaces);
292 auto active_display() -> geometry::Rectangle
const override
294 geometry::Rectangle result;
298 if (
auto const surface = focused_surface())
300 auto const surface_rect = surface->input_bounds();
301 int max_overlap_area = -1;
303 for (
auto const& display : displays)
305 auto const intersection = surface_rect.intersection_with(display).size;
306 if (intersection.width.as_int()*intersection.height.as_int() > max_overlap_area)
308 max_overlap_area = intersection.width.as_int()*intersection.height.as_int();
321 for (
auto const& display : displays)
323 if (display.contains(cursor))
334 result = *displays.begin();
339 shell::FocusController*
const focus_controller;
340 WindowManagementPolicy policy;
345 geometry::Rectangles displays;
346 geometry::Point cursor;
All things Mir.
Definition: atomic_callback.h:25
IntWrapper< detail::SessionsSurfaceIdTag > SurfaceId
Definition: surface_id.h:29
interface to provide window management logic
Definition: window_manager.h:37
std::map< std::weak_ptr< scene::Surface >, SurfaceInfo, std::owner_less< std::weak_ptr< scene::Surface >>> type
Definition: server_example_basic_window_manager.h:44
Definition: server_example_basic_window_manager.h:42
std::set< std::weak_ptr< scene::Surface >, std::owner_less< std::weak_ptr< scene::Surface >>> SurfaceSet
Definition: focus_controller.h:32
Definition: focus_controller.h:38
std::map< std::weak_ptr< scene::Session >, SessionInfo, std::owner_less< std::weak_ptr< scene::Session >>> type
Definition: server_example_basic_window_manager.h:50
void remove(Rectangle const &rect)
removes at most one matching rectangle
Definition: rectangles.cpp:56
virtual auto focused_session() const -> std::shared_ptr< scene::Session >=0
virtual void raise(SurfaceSet const &surfaces)=0
virtual void set_focus_to(std::shared_ptr< scene::Session > const &focus_session, std::shared_ptr< scene::Surface > const &focus_surface)=0
A policy based window manager. This takes care of the management of any meta implementation held for ...
Definition: server_example_basic_window_manager.h:113
virtual std::shared_ptr< scene::Surface > focused_surface() const =0
Definition: rectangle.h:33
void add(Rectangle const &rect)
Definition: rectangles.cpp:51
virtual auto surface_at(geometry::Point cursor) const -> std::shared_ptr< scene::Surface >=0
BasicWindowManagerCopy(shell::FocusController *focus_controller, PolicyArgs &&...policy_args)
Definition: server_example_basic_window_manager.h:118
virtual void focus_next_session()=0
Definition: server_example_basic_window_manager.h:48