Mir
server_example_basic_window_manager.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2015 Canonical Ltd.
3  *
4  * This program is free software: you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License version 3,
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authored By: Alan Griffiths <alan@octopull.co.uk>
17  */
18 
19 #ifndef MIR_EXAMPLE_BASIC_WINDOW_MANAGER_H_
20 #define MIR_EXAMPLE_BASIC_WINDOW_MANAGER_H_
21 
23 
27 
28 #include <map>
29 #include <mutex>
30 
33 
34 namespace mir
35 {
36 namespace examples
37 {
38 using shell::SurfaceSet;
39 
44 {
45 public:
46  using SurfaceInfoMap = std::map<std::weak_ptr<scene::Surface>, SurfaceInfo, std::owner_less<std::weak_ptr<scene::Surface>>>;
47  using SessionInfoMap = std::map<std::weak_ptr<scene::Session>, SessionInfo, std::owner_less<std::weak_ptr<scene::Session>>>;
48 
49  virtual auto find_session(std::function<bool(SessionInfo const& info)> const& predicate)
50  -> std::shared_ptr<scene::Session> = 0;
51 
52  virtual auto info_for(std::weak_ptr<scene::Session> const& session) const -> SessionInfo& = 0;
53 
54  virtual auto info_for(std::weak_ptr<scene::Surface> const& surface) const -> SurfaceInfo& = 0;
55 
56  virtual std::shared_ptr<scene::Session> focused_session() const = 0;
57 
58  virtual std::shared_ptr<scene::Surface> focused_surface() const = 0;
59 
60  virtual void focus_next_session() = 0;
61 
62  virtual void set_focus_to(
63  std::shared_ptr<scene::Session> const& focus,
64  std::shared_ptr<scene::Surface> const& surface) = 0;
65 
66  virtual auto surface_at(geometry::Point cursor) const -> std::shared_ptr<scene::Surface> = 0;
67 
68  virtual auto active_display() -> geometry::Rectangle const = 0;
69 
70  virtual void forget(std::weak_ptr<scene::Surface> const& surface) = 0;
71 
72  virtual void raise_tree(std::shared_ptr<scene::Surface> const& root) = 0;
73 
74  virtual ~WindowManagerTools() = default;
75  WindowManagerTools() = default;
76  WindowManagerTools(WindowManagerTools const&) = delete;
78 };
79 
81 {
82 public:
85 
86  virtual void handle_session_info_updated(SessionInfoMap& session_info, geometry::Rectangles const& displays) = 0;
87 
88  virtual void handle_displays_updated(SessionInfoMap& session_info, geometry::Rectangles const& displays) = 0;
89 
90  virtual auto handle_place_new_surface(
91  std::shared_ptr<scene::Session> const& session,
92  scene::SurfaceCreationParameters const& request_parameters)
94 
95  virtual void handle_new_surface(std::shared_ptr<scene::Session> const& session, std::shared_ptr<scene::Surface> const& surface) = 0;
96 
97  virtual void handle_modify_surface(
98  std::shared_ptr<scene::Session> const& session,
99  std::shared_ptr<scene::Surface> const& surface,
100  shell::SurfaceSpecification const& modifications) = 0;
101 
102  virtual void handle_delete_surface(std::shared_ptr<scene::Session> const& session, std::weak_ptr<scene::Surface> const& surface) = 0;
103 
104  virtual int handle_set_state(std::shared_ptr<scene::Surface> const& surface, MirWindowState value) = 0;
105 
106  virtual void generate_decorations_for(
107  std::shared_ptr<scene::Session> const& session, std::shared_ptr<scene::Surface> const& surface,
108  SurfaceInfoMap& surface_info,
109  std::function<frontend::SurfaceId(std::shared_ptr<scene::Session> const&, scene::SurfaceCreationParameters const&)> const& build) = 0;
110 
111  virtual bool handle_keyboard_event(MirKeyboardEvent const* event) = 0;
112 
113  virtual bool handle_touch_event(MirTouchEvent const* event) = 0;
114 
115  virtual bool handle_pointer_event(MirPointerEvent const* event) = 0;
116 
117  virtual void handle_raise_surface(
118  std::shared_ptr<scene::Session> const& session,
119  std::shared_ptr<scene::Surface> const& surface) = 0;
120 
121  virtual ~WindowManagementPolicy() = default;
122  WindowManagementPolicy() = default;
125 };
126 
130  protected WindowManagerTools
131 {
132 protected:
134  shell::FocusController* focus_controller,
135  std::unique_ptr<WindowManagementPolicy> policy);
136 
137 public:
138  using typename WindowManagerTools::SurfaceInfoMap;
139  using typename WindowManagerTools::SessionInfoMap;
140 
141  void add_session(std::shared_ptr<scene::Session> const& session) override;
142 
143  void remove_session(std::shared_ptr<scene::Session> const& session) override;
144 
145  auto add_surface(
146  std::shared_ptr<scene::Session> const& session,
147  scene::SurfaceCreationParameters const& params,
148  std::function<frontend::SurfaceId(std::shared_ptr<scene::Session> const& session, scene::SurfaceCreationParameters const& params)> const& build)
149  -> frontend::SurfaceId override;
150 
151  void modify_surface(
152  std::shared_ptr<scene::Session> const& session,
153  std::shared_ptr<scene::Surface> const& surface,
154  shell::SurfaceSpecification const& modifications) override;
155 
156  void remove_surface(
157  std::shared_ptr<scene::Session> const& session,
158  std::weak_ptr<scene::Surface> const& surface) override;
159 
160  void forget(std::weak_ptr<scene::Surface> const& surface) override;
161 
162  void add_display(geometry::Rectangle const& area) override;
163 
164  void remove_display(geometry::Rectangle const& area) override;
165 
166  bool handle_keyboard_event(MirKeyboardEvent const* event) override;
167 
168  bool handle_touch_event(MirTouchEvent const* event) override;
169 
170  bool handle_pointer_event(MirPointerEvent const* event) override;
171 
172  void handle_raise_surface(
173  std::shared_ptr<scene::Session> const& session,
174  std::shared_ptr<scene::Surface> const& surface,
175  uint64_t timestamp) override;
176 
177  int set_surface_attribute(
178  std::shared_ptr<scene::Session> const& /*session*/,
179  std::shared_ptr<scene::Surface> const& surface,
180  MirWindowAttrib attrib,
181  int value) override;
182 
183  auto find_session(std::function<bool(SessionInfo const& info)> const& predicate)
184  -> std::shared_ptr<scene::Session> override;
185 
186  auto info_for(std::weak_ptr<scene::Session> const& session) const -> SessionInfo& override;
187 
188  auto info_for(std::weak_ptr<scene::Surface> const& surface) const -> SurfaceInfo& override;
189 
190  std::shared_ptr<scene::Session> focused_session() const override;
191 
192  std::shared_ptr<scene::Surface> focused_surface() const override;
193 
194  void focus_next_session() override;
195 
196  void set_focus_to(
197  std::shared_ptr<scene::Session> const& focus,
198  std::shared_ptr<scene::Surface> const& surface) override;
199 
200  auto surface_at(geometry::Point cursor) const -> std::shared_ptr<scene::Surface> override;
201 
202  auto active_display() -> geometry::Rectangle const override;
203 
204  void raise_tree(std::shared_ptr<scene::Surface> const& root) override;
205 
206 private:
207  shell::FocusController* const focus_controller;
208  std::unique_ptr<WindowManagementPolicy> const policy;
209 
210  std::mutex mutex;
211  SessionInfoMap session_info;
212  SurfaceInfoMap surface_info;
213  geometry::Rectangles displays;
214  geometry::Point cursor;
215  uint64_t last_input_event_timestamp{0};
216 
217  void update_event_timestamp(MirKeyboardEvent const* kev);
218  void update_event_timestamp(MirPointerEvent const* pev);
219  void update_event_timestamp(MirTouchEvent const* tev);
220 };
221 
225 template<typename WMPolicy>
227 {
228 public:
229 
230  template <typename... PolicyArgs>
232  shell::FocusController* focus_controller,
233  PolicyArgs&&... policy_args) :
235  focus_controller,
236  build_policy(std::forward<PolicyArgs>(policy_args)...))
237  {
238  }
239 
240 private:
241  template <typename... PolicyArgs>
242  auto build_policy(PolicyArgs&&... policy_args)
243  -> std::unique_ptr<WMPolicy>
244  {
245  return std::unique_ptr<WMPolicy>(
246  new WMPolicy(this, std::forward<PolicyArgs>(policy_args)...));
247  }
248 };
249 }
250 }
251 
252 #endif /* MIR_EXAMPLE_BASIC_WINDOW_MANAGER_H_ */
virtual auto info_for(std::weak_ptr< scene::Session > const &session) const -> SessionInfo &=0
Definition: as_render_target.h:27
WindowManagerTools & operator=(WindowManagerTools const &)=delete
interface to provide window management logic
Definition: window_manager.h:37
A collection of rectangles (with possible duplicates).
Definition: rectangles.h:34
Definition: point.h:30
MirWindowAttrib
Attributes of a window that the client and server/shell may wish to get or set over the wire...
Definition: common.h:76
virtual void raise_tree(std::shared_ptr< scene::Surface > const &root)=0
Definition: server_example_basic_window_manager.h:80
virtual ~WindowManagerTools()=default
struct MirPointerEvent MirPointerEvent
An event type describing a change in pointer device state.
Definition: pointer_event.h:35
STL namespace.
std::set< std::weak_ptr< scene::Surface >, std::owner_less< std::weak_ptr< scene::Surface >>> SurfaceSet
Definition: focus_controller.h:32
A policy based window manager. This exists to initialize BasicWindowManager and the WMPolicy (in an a...
Definition: server_example_basic_window_manager.h:226
Definition: focus_controller.h:38
typename WindowManagerTools::SessionInfoMap SessionInfoMap
Definition: server_example_basic_window_manager.h:83
std::map< std::weak_ptr< scene::Surface >, SurfaceInfo, std::owner_less< std::weak_ptr< scene::Surface >>> SurfaceInfoMap
Definition: server_example_basic_window_manager.h:46
struct MirTouchEvent MirTouchEvent
An event type describing a change in touch device state.
Definition: touch_event.h:33
std::map< std::weak_ptr< scene::Session >, SessionInfo, std::owner_less< std::weak_ptr< scene::Session >>> SessionInfoMap
Definition: server_example_basic_window_manager.h:47
virtual std::shared_ptr< scene::Session > focused_session() const =0
WindowManagerBuilder(shell::FocusController *focus_controller, PolicyArgs &&...policy_args)
Definition: server_example_basic_window_manager.h:231
typename WindowManagerTools::SurfaceInfoMap SurfaceInfoMap
Definition: server_example_basic_window_manager.h:84
struct MirKeyboardEvent MirKeyboardEvent
An event type describing a change in keyboard state.
Definition: keyboard_event.h:41
Definition: surface_creation_parameters.h:41
Definition: rectangle.h:33
virtual std::shared_ptr< scene::Surface > focused_surface() const =0
Definition: server_example_window_management_info.h:94
std::map< std::weak_ptr< scene::Session >, SessionInfo, std::owner_less< std::weak_ptr< scene::Session >>> SessionInfoMap
Definition: server_example_basic_window_manager.h:47
Specification of surface properties requested by client.
Definition: surface_specification.h:57
virtual void forget(std::weak_ptr< scene::Surface > const &surface)=0
virtual auto find_session(std::function< bool(SessionInfo const &info)> const &predicate) -> std::shared_ptr< scene::Session >=0
virtual void set_focus_to(std::shared_ptr< scene::Session > const &focus, std::shared_ptr< scene::Surface > const &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:129
MirWindowState
Definition: common.h:139
The interface through which the policy instructs the controller. These functions assume that the Basi...
Definition: server_example_basic_window_manager.h:43
Definition: server_example_window_management_info.h:33
virtual auto surface_at(geometry::Point cursor) const -> std::shared_ptr< scene::Surface >=0
std::map< std::weak_ptr< scene::Surface >, SurfaceInfo, std::owner_less< std::weak_ptr< scene::Surface >>> SurfaceInfoMap
Definition: server_example_basic_window_manager.h:46
virtual auto active_display() -> geometry::Rectangle const =0

Copyright © 2012-2016 Canonical Ltd.
Generated on Wed Oct 11 22:26:23 UTC 2017