Mir
decoration_provider.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2016-2017 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 2 or 3 as
6  * 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 MIRAL_SHELL_DECORATION_PROVIDER_H
20 #define MIRAL_SHELL_DECORATION_PROVIDER_H
21 
22 
24 
25 #include <mir/client/connection.h>
26 #include <mir/client/surface.h>
27 #include <mir/client/window.h>
28 
29 #include <mir/geometry/rectangle.h>
31 
32 #include <atomic>
33 #include <map>
34 #include <mutex>
35 #include <condition_variable>
36 #include <queue>
37 
38 class Worker
39 {
40 public:
41  ~Worker();
42 
43  void start_work();
44  void enqueue_work(std::function<void()> const& functor);
45  void stop_work();
46 
47 private:
48  using WorkQueue = std::queue<std::function<void()>>;
49 
50  std::mutex mutable work_mutex;
51  std::condition_variable work_cv;
52  WorkQueue work_queue;
53  bool work_done = false;
54 
55  void do_work();
56 };
57 
59 {
60 public:
63 
64  void operator()(mir::client::Connection connection);
65  void operator()(std::weak_ptr<mir::scene::Session> const& session);
66 
67  auto session() const -> std::shared_ptr<mir::scene::Session>;
68 
69  void create_titlebar_for(miral::Window const& window);
70  void place_new_decoration(miral::WindowSpecification& window_spec);
71  void paint_titlebar_for(miral::WindowInfo const& window, int intensity);
72  void destroy_titlebar_for(miral::Window const& window);
73  void resize_titlebar_for(miral::WindowInfo const& window_info, mir::geometry::Size const& size);
74  void advise_new_titlebar(miral::WindowInfo const& window_info);
75  void advise_state_change(miral::WindowInfo const& window_info, MirWindowState state);
76 
77  void stop();
78 
79  bool is_decoration(miral::Window const& window) const;
80  bool is_titlebar(miral::WindowInfo const& window_info) const;
81 
82 private:
83  struct Data
84  {
85  MirConnection* connection{nullptr};
86  mir::client::Surface surface;
87  MirBufferStream* stream{nullptr};
88  std::atomic<MirWindow*> titlebar{nullptr};
89  std::atomic<int> intensity{0xff};
90  std::function<void(MirWindow* surface)> on_create{[](MirWindow*){}};
91  miral::Window window;
92 
93  ~Data();
94  };
95 
96  using SurfaceMap = std::map<std::weak_ptr<mir::scene::Surface>, Data, std::owner_less<std::weak_ptr<mir::scene::Surface>>>;
97  using TitleMap = std::map<std::string, std::weak_ptr<mir::scene::Surface>>;
98 
100  std::mutex mutable mutex;
101  mir::client::Connection connection;
102  struct Wallpaper { mir::client::Surface surface; mir::client::Window window; MirBufferStream* stream; };
103  std::vector<Wallpaper> wallpaper;
104  std::weak_ptr<mir::scene::Session> weak_session;
105 
106  SurfaceMap window_to_titlebar;
107  TitleMap windows_awaiting_titlebar;
108 
109  static void insert(MirWindow* surface, Data* data);
110  Data* find_titlebar_data(miral::Window const& window);
111  miral::Window find_titlebar_window(miral::Window const& window) const;
112  void repaint_titlebar_for(miral::WindowInfo const& window_info);
113  static void handle_event(MirWindow* window, MirEvent const* ev, void* context_);
114  static void handle_event_for_background(MirWindow* window, MirEvent const* event, void* context_);
115  void handle_event_for_background(MirWindow* window, MirEvent const* ev);
116 };
117 
118 
119 #endif //MIRAL_SHELL_DECORATION_PROVIDER_H
Definition: size.h:30
struct MirSurface MirWindow
Definition: client_types.h:43
struct MirBufferStream MirBufferStream
Definition: client_types.h:49
~Worker()
Definition: decoration_provider.cpp:631
Definition: decoration_provider.h:58
Definition: window_info.h:32
Definition: window_specification.h:43
Handle class for MirWindow - provides automatic reference counting.
Definition: window.h:31
Handle class for MirConnection - provides automatic reference counting.
Definition: connection.h:34
void start_work()
Definition: decoration_provider.cpp:658
void enqueue_work(std::function< void()> const &functor)
Definition: decoration_provider.cpp:651
Handle class to manage a Mir surface. It may be null (e.g. default initialized)
Definition: window.h:37
void stop_work()
Definition: decoration_provider.cpp:663
struct MirConnection MirConnection
Definition: client_types.h:41
struct MirEvent MirEvent
Definition: event.h:84
Window management functions for querying and updating MirAL&#39;s model.
Definition: window_manager_tools.h:58
MirWindowState
Definition: common.h:139
Handle class for MirRenderSurface - provides automatic reference counting.
Definition: surface.h:31
Definition: decoration_provider.h:38

Copyright © 2012-2017 Canonical Ltd.
Generated on Mon Oct 30 19:44:55 UTC 2017