19 #ifndef MIR_SHELL_BASIC_WINDOW_MANAGER_H_
20 #define MIR_SHELL_BASIC_WINDOW_MANAGER_H_
36 template<
typename Info>
39 using type = std::map<std::weak_ptr<scene::Surface>, Info, std::owner_less<std::weak_ptr<scene::Surface>>>;
42 template<
typename Info>
45 using type = std::map<std::weak_ptr<scene::Session>, Info, std::owner_less<std::weak_ptr<scene::Session>>>;
51 template<
typename SessionInfo,
typename SurfaceInfo>
55 virtual auto find_session(std::function<
bool(SessionInfo
const& info)>
const& predicate)
56 -> std::shared_ptr<scene::Session> = 0;
58 virtual auto info_for(std::weak_ptr<scene::Session>
const& session)
const -> SessionInfo& = 0;
60 virtual auto info_for(std::weak_ptr<scene::Surface>
const& surface)
const -> SurfaceInfo& = 0;
62 virtual auto focused_session()
const -> std::shared_ptr<scene::Session> = 0;
64 virtual auto focused_surface()
const -> std::shared_ptr<scene::Surface> = 0;
69 std::shared_ptr<scene::Session>
const& focus,
70 std::shared_ptr<scene::Surface>
const& surface) = 0;
74 virtual void raise(
SurfaceSet const& surfaces) = 0;
104 template<
typename WindowManagementPolicy,
typename SessionInfo,
typename SurfaceInfo>
109 template <
typename... PolicyArgs>
112 PolicyArgs&&... policy_args) :
113 focus_controller(focus_controller),
114 policy(this,
std::forward<PolicyArgs>(policy_args)...)
119 void add_session(std::shared_ptr<scene::Session>
const& session)
override
121 std::lock_guard<decltype(mutex)> lock(
mutex);
128 std::lock_guard<decltype(mutex)> lock(
mutex);
134 std::shared_ptr<scene::Session>
const& session,
138 std::lock_guard<decltype(mutex)> lock(
mutex);
140 auto const result = build(session, placed_params);
141 auto const surface = session->surface(result);
142 surface_info.emplace(surface, SurfaceInfo{session, surface, placed_params});
143 policy.handle_new_surface(session, surface);
148 std::shared_ptr<scene::Session>
const& session,
149 std::shared_ptr<scene::Surface>
const& surface,
152 std::lock_guard<decltype(mutex)> lock(
mutex);
153 policy.handle_modify_surface(session, surface, modifications);
157 std::shared_ptr<scene::Session>
const& session,
158 std::weak_ptr<scene::Surface>
const& surface)
override
160 std::lock_guard<decltype(mutex)> lock(
mutex);
161 policy.handle_delete_surface(session, surface);
168 std::lock_guard<decltype(mutex)> lock(
mutex);
175 std::lock_guard<decltype(mutex)> lock(
mutex);
182 std::lock_guard<decltype(mutex)> lock(
mutex);
183 return policy.handle_keyboard_event(event);
188 std::lock_guard<decltype(mutex)> lock(
mutex);
189 return policy.handle_touch_event(event);
194 std::lock_guard<decltype(mutex)> lock(
mutex);
200 return policy.handle_pointer_event(event);
204 std::shared_ptr<scene::Session>
const& ,
205 std::shared_ptr<scene::Surface>
const& surface,
209 std::lock_guard<decltype(mutex)> lock(
mutex);
215 return surface->configure(attrib, state);
218 return surface->configure(attrib, value);
222 auto find_session(std::function<
bool(SessionInfo
const& info)>
const& predicate)
223 -> std::shared_ptr<scene::Session>
override
227 if (predicate(info.second))
229 return info.first.lock();
233 return std::shared_ptr<scene::Session>{};
236 auto info_for(std::weak_ptr<scene::Session>
const& session)
const -> SessionInfo&
override
238 return const_cast<SessionInfo&
>(
session_info.at(session));
241 auto info_for(std::weak_ptr<scene::Surface>
const& surface)
const -> SurfaceInfo&
override
243 return const_cast<SurfaceInfo&
>(
surface_info.at(surface));
262 std::shared_ptr<scene::Session>
const& focus,
263 std::shared_ptr<scene::Surface>
const& surface)
override
286 auto const surface_rect = surface->input_bounds();
287 int max_overlap_area = -1;
289 for (
auto const& display :
displays)
292 if (intersection.width.as_int()*intersection.height.as_int() > max_overlap_area)
294 max_overlap_area = intersection.
width.
as_int()*intersection.height.as_int();
307 for (
auto const& display :
displays)
309 if (display.contains(
cursor))
320 result = *displays.begin();
void focus_next_session() override
Definition: basic_window_manager.h:256
auto active_display() -> geometry::Rectangle const override
Definition: basic_window_manager.h:278
All things Mir.
Definition: atomic_callback.h:25
FocusController *const focus_controller
Definition: basic_window_manager.h:325
void remove_surface(std::shared_ptr< scene::Session > const &session, std::weak_ptr< scene::Surface > const &surface) override
Definition: basic_window_manager.h:156
interface to provide window management logic
Definition: window_manager.h:37
void add_display(geometry::Rectangle const &area) override
Definition: basic_window_manager.h:166
int set_surface_attribute(std::shared_ptr< scene::Session > const &, std::shared_ptr< scene::Surface > const &surface, MirSurfaceAttrib attrib, int value) override
Definition: basic_window_manager.h:203
void remove_display(geometry::Rectangle const &area) override
Definition: basic_window_manager.h:173
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
void set_focus_to(std::shared_ptr< scene::Session > const &focus, std::shared_ptr< scene::Surface > const &surface) override
Definition: basic_window_manager.h:261
A collection of rectangles (with possible duplicates).
Definition: rectangles.h:34
Size size
Definition: rectangle.h:43
auto focused_surface() const -> std::shared_ptr< scene::Surface > override
Definition: basic_window_manager.h:251
std::mutex mutex
Definition: basic_window_manager.h:328
void add_session(std::shared_ptr< scene::Session > const &session) override
Definition: basic_window_manager.h:119
std::set< std::weak_ptr< scene::Surface >, std::owner_less< std::weak_ptr< scene::Surface >>> SurfaceSet
Definition: focus_controller.h:32
frontend::SurfaceId add_surface(std::shared_ptr< scene::Session > const &session, scene::SurfaceCreationParameters const ¶ms, std::function< frontend::SurfaceId(std::shared_ptr< scene::Session > const &session, scene::SurfaceCreationParameters const ¶ms)> const &build) override
Definition: basic_window_manager.h:133
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
Definition: basic_window_manager.h:43
bool handle_touch_event(MirTouchEvent const *event) override
Definition: basic_window_manager.h:186
Rectangle intersection_with(Rectangle const &r) const
Definition: rectangle.cpp:80
void modify_surface(std::shared_ptr< scene::Session > const &session, std::shared_ptr< scene::Surface > const &surface, shell::SurfaceSpecification const &modifications) override
Definition: basic_window_manager.h:147
bool handle_pointer_event(MirPointerEvent const *event) override
Definition: basic_window_manager.h:192
geometry::Rectangles displays
Definition: basic_window_manager.h:331
BasicWindowManager(FocusController *focus_controller, PolicyArgs &&...policy_args)
Definition: basic_window_manager.h:110
void remove_session(std::shared_ptr< scene::Session > const &session) override
Definition: basic_window_manager.h:126
virtual auto focused_session() const -> std::shared_ptr< scene::Session >=0
Definition: basic_window_manager.h:37
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: basic_window_manager.h:105
auto info_for(std::weak_ptr< scene::Surface > const &surface) const -> SurfaceInfo &override
Definition: basic_window_manager.h:241
SurfaceTo< SurfaceInfo >::type surface_info
Definition: basic_window_manager.h:330
auto surface_at(geometry::Point cursor) const -> std::shared_ptr< scene::Surface > override
Definition: basic_window_manager.h:268
WindowManagementPolicy policy
Definition: basic_window_manager.h:326
auto info_for(std::weak_ptr< scene::Session > const &session) const -> SessionInfo &override
Definition: basic_window_manager.h:236
virtual std::shared_ptr< scene::Surface > focused_surface() const =0
Definition: surface_creation_parameters.h:42
Definition: rectangle.h:33
auto focused_session() const -> std::shared_ptr< scene::Session > override
Definition: basic_window_manager.h:246
void add(Rectangle const &rect)
Definition: rectangles.cpp:51
bool handle_keyboard_event(MirKeyboardEvent const *event) override
Definition: basic_window_manager.h:180
Specification of surface properties requested by client.
Definition: surface_specification.h:50
Width width
Definition: size.h:39
virtual auto surface_at(geometry::Point cursor) const -> std::shared_ptr< scene::Surface >=0
SessionTo< SessionInfo >::type session_info
Definition: basic_window_manager.h:329
virtual void focus_next_session()=0
auto find_session(std::function< bool(SessionInfo const &info)> const &predicate) -> std::shared_ptr< scene::Session > override
Definition: basic_window_manager.h:222
geometry::Point cursor
Definition: basic_window_manager.h:332
int as_int() const
Definition: dimensions.h:49