Merge lp:~alan-griffiths/miral/miral-shell-intro-text into lp:miral

Proposed by Alan Griffiths
Status: Superseded
Proposed branch: lp:~alan-griffiths/miral/miral-shell-intro-text
Merge into: lp:miral
Prerequisite: lp:~alan-griffiths/miral/workspaces-example
Diff against target: 761 lines (+293/-73)
7 files modified
include/mir/client/display_config.h (+75/-0)
miral-shell/CMakeLists.txt (+1/-1)
miral-shell/decoration_provider.cpp (+176/-35)
miral-shell/decoration_provider.h (+14/-8)
miral-shell/titlebar_window_manager.cpp (+23/-26)
miral-shell/titlebar_window_manager.h (+3/-3)
miral/CMakeLists.txt (+1/-0)
To merge this branch: bzr merge lp:~alan-griffiths/miral/miral-shell-intro-text
Reviewer Review Type Date Requested Status
Mir development team Pending
Review via email: mp+317120@code.launchpad.net

This proposal has been superseded by a proposal from 2017-02-17.

Commit message

[miral-shell] Use background on 1st monitor to show keyboard shortcuts

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

Better naming

512. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

513. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

514. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

515. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

516. By Alan Griffiths

Display helptext on all outputs

517. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

518. By Alan Griffiths

Remove intro text if display config changes

Unmerged revisions

518. By Alan Griffiths

Remove intro text if display config changes

517. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

516. By Alan Griffiths

Display helptext on all outputs

515. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

514. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

513. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

512. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

511. By Alan Griffiths

Better naming

510. By Alan Griffiths

Fix whitespace

509. By Alan Griffiths

merge lp:~alan-griffiths/miral/workspaces-example

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'include/mir/client/display_config.h'
--- include/mir/client/display_config.h 1970-01-01 00:00:00 +0000
+++ include/mir/client/display_config.h 2017-02-16 17:33:30 +0000
@@ -0,0 +1,75 @@
1/*
2 * Copyright © 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 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_CLIENT_DISPLAY_CONFIG_H
20#define MIR_CLIENT_DISPLAY_CONFIG_H
21
22#include <mir_toolkit/mir_connection.h>
23#include <mir_toolkit/mir_display_configuration.h>
24
25#include <functional>
26#include <memory>
27
28namespace mir
29{
30/// Convenient C++ wrappers around the Mir toolkit API.
31///
32/// These wrappers are intentionally inline adapters: the compiled code depend directly on the Mir toolkit API.
33namespace client
34{
35class DisplayConfig
36{
37public:
38 DisplayConfig() = default;
39
40 explicit DisplayConfig(MirDisplayConfig* config) : self{config, deleter} {}
41
42 explicit DisplayConfig(MirConnection* connection) :
43 self{mir_connection_create_display_configuration(connection), deleter} {}
44
45 operator MirDisplayConfig*() { return self.get(); }
46
47 operator MirDisplayConfig const*() const { return self.get(); }
48
49 void reset() { self.reset(); }
50
51 void for_each_output(std::function<void(MirOutput const*)> const& enumerator) const
52 {
53 auto const count = mir_display_config_get_num_outputs(*this);
54
55 for (int i = 0; i != count; ++i)
56 enumerator(mir_display_config_get_output(*this, i));
57 }
58
59 void for_each_output(std::function<void(MirOutput*)> const& enumerator)
60 {
61 auto const count = mir_display_config_get_num_outputs(*this);
62
63 for (int i = 0; i != count; ++i)
64 enumerator(mir_display_config_get_mutable_output(*this, i));
65 }
66
67private:
68 static void deleter(MirDisplayConfig* config) { mir_display_config_release(config); }
69
70 std::shared_ptr <MirDisplayConfig> self;
71};
72}
73}
74
75#endif //MIR_CLIENT_DISPLAY_CONFIG_H
076
=== modified file 'miral-shell/CMakeLists.txt'
--- miral-shell/CMakeLists.txt 2016-12-14 11:22:57 +0000
+++ miral-shell/CMakeLists.txt 2017-02-16 17:33:30 +0000
@@ -45,7 +45,7 @@
45 shell_main.cpp45 shell_main.cpp
46 tiling_window_manager.cpp tiling_window_manager.h46 tiling_window_manager.cpp tiling_window_manager.h
47 titlebar_window_manager.cpp titlebar_window_manager.h47 titlebar_window_manager.cpp titlebar_window_manager.h
48 titlebar_provider.cpp titlebar_provider.h48 decoration_provider.cpp decoration_provider.h
49 titlebar_config.cpp titlebar_config.h49 titlebar_config.cpp titlebar_config.h
50)50)
5151
5252
=== renamed file 'miral-shell/titlebar_provider.cpp' => 'miral-shell/decoration_provider.cpp'
--- miral-shell/titlebar_provider.cpp 2017-02-16 17:33:30 +0000
+++ miral-shell/decoration_provider.cpp 2017-02-16 17:33:30 +0000
@@ -1,5 +1,5 @@
1/*1/*
2 * Copyright © 2016 Canonical Ltd.2 * Copyright © 2016-2017 Canonical Ltd.
3 *3 *
4 * This program is free software: you can redistribute it and/or modify it4 * 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,5 * under the terms of the GNU General Public License version 3,
@@ -16,9 +16,10 @@
16 * Authored by: Alan Griffiths <alan@octopull.co.uk>16 * Authored by: Alan Griffiths <alan@octopull.co.uk>
17 */17 */
1818
19#include "titlebar_provider.h"19#include "decoration_provider.h"
20#include "titlebar_config.h"20#include "titlebar_config.h"
2121
22#include <mir/client/display_config.h>
22#include <mir/client/window_spec.h>23#include <mir/client/window_spec.h>
2324
24#include <mir_toolkit/mir_buffer_stream.h>25#include <mir_toolkit/mir_buffer_stream.h>
@@ -37,8 +38,9 @@
37namespace38namespace
38{39{
39int const title_bar_height = 12;40int const title_bar_height = 12;
41char const* const wallpaper_name = "wallpaper";
4042
41void null_surface_callback(MirWindow*, void*) {}43void null_window_callback(MirWindow*, void*) {}
4244
43struct Printer45struct Printer
44{46{
@@ -48,6 +50,7 @@
48 Printer& operator=(Printer const&) = delete;50 Printer& operator=(Printer const&) = delete;
4951
50 void print(MirGraphicsRegion const& region, std::string const& title, int const intensity);52 void print(MirGraphicsRegion const& region, std::string const& title, int const intensity);
53 void printhelp(MirGraphicsRegion const& region);
5154
52private:55private:
53 std::wstring_convert<std::codecvt_utf16<wchar_t>> converter;56 std::wstring_convert<std::codecvt_utf16<wchar_t>> converter;
@@ -59,11 +62,7 @@
5962
60void paint_surface(MirWindow* surface, std::string const& title, int const intensity)63void paint_surface(MirWindow* surface, std::string const& title, int const intensity)
61{64{
62#if MIR_CLIENT_VERSION <= MIR_VERSION_NUMBER(3, 4, 0)
63 MirBufferStream* buffer_stream = mir_surface_get_buffer_stream(surface);
64#else
65 MirBufferStream* buffer_stream = mir_window_get_buffer_stream(surface);65 MirBufferStream* buffer_stream = mir_window_get_buffer_stream(surface);
66#endif
6766
68 // TODO sometimes buffer_stream is nullptr - find out why (and fix).67 // TODO sometimes buffer_stream is nullptr - find out why (and fix).
69 // (Only observed when creating a lot of clients at once)68 // (Only observed when creating a lot of clients at once)
@@ -152,22 +151,114 @@
152 base_y += glyph->advance.y >> 6;151 base_y += glyph->advance.y >> 6;
153 }152 }
154}153}
154
155void Printer::printhelp(MirGraphicsRegion const& region)
156{
157 static char const* const helptext[] =
158 {
159 "Welcome to miral-shell",
160 "",
161 "Keyboard shortcuts:",
162 "",
163 " o Switch apps: Alt-Tab, tap or click on the corresponding window",
164 " o Switch window: Alt-`, tap or click on the corresponding window",
165 "",
166 " o Move window: Alt-leftmousebutton drag (three finger drag)",
167 " o Resize window: Alt-middle_button drag (three finger pinch)",
168 "",
169 " o Maximize/restore current window (to display size). : Alt-F11",
170 " o Maximize/restore current window (to display height): Shift-F11",
171 " o Maximize/restore current window (to display width) : Ctrl-F11",
172 "",
173 " o Switch workspace: Meta-Alt-[F1|F2|F3|F4]",
174 " o Switch workspace taking active window: Meta-Ctrl-[F1|F2|F3|F4]",
175 "",
176 " o To exit: Ctrl-Alt-BkSp",
177 };
178
179 int help_width = 0;
180 unsigned int help_height = 0;
181 unsigned int line_height = 0;
182
183 for (auto const* rawline : helptext)
184 {
185 int line_width = 0;
186
187 auto const line = converter.from_bytes(rawline);
188
189 auto const fwidth = std::min(region.width / 60, 20);
190
191 FT_Set_Pixel_Sizes(face, fwidth, 0);
192
193 for (auto const& ch : line)
194 {
195 FT_Load_Glyph(face, FT_Get_Char_Index(face, ch), FT_LOAD_DEFAULT);
196 auto const glyph = face->glyph;
197 FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL);
198
199 line_width += glyph->advance.x >> 6;
200 line_height = std::max(line_height, glyph->bitmap.rows + glyph->bitmap.rows/2);
201 }
202
203 if (help_width < line_width) help_width = line_width;
204 help_height += line_height;
205 }
206
207 int base_y = (region.height - help_height)/2;
208
209 for (auto const* rawline : helptext)
210 {
211 int base_x = (region.width - help_width)/2;
212
213 auto const line = converter.from_bytes(rawline);
214
215 for (auto const& ch : line)
216 {
217 FT_Load_Glyph(face, FT_Get_Char_Index(face, ch), FT_LOAD_DEFAULT);
218 auto const glyph = face->glyph;
219 FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL);
220
221 auto const& bitmap = glyph->bitmap;
222 auto const x = base_x + glyph->bitmap_left;
223
224 if (static_cast<int>(x + bitmap.width) <= region.width)
225 {
226 unsigned char* src = bitmap.buffer;
227
228 auto const y = base_y - glyph->bitmap_top;
229 char* dest = region.vaddr + y * region.stride + 4 * x;
230
231 for (auto row = 0u; row != bitmap.rows; ++row)
232 {
233 for (auto col = 0u; col != 4 * bitmap.width; ++col)
234 dest[col] |= src[col / 4]/2;
235
236 src += bitmap.pitch;
237 dest += region.stride;
238 }
239 }
240
241 base_x += glyph->advance.x >> 6;
242 }
243 base_y += line_height;
244 }
245}
155}246}
156247
157using namespace mir::client;248using namespace mir::client;
158using namespace mir::geometry;249using namespace mir::geometry;
159250
160TitlebarProvider::TitlebarProvider(miral::WindowManagerTools const& tools) : tools{tools}251DecorationProvider::DecorationProvider(miral::WindowManagerTools const& tools) : tools{tools}
161{252{
162253
163}254}
164255
165TitlebarProvider::~TitlebarProvider()256DecorationProvider::~DecorationProvider()
166{257{
167 stop();258 stop();
168}259}
169260
170void TitlebarProvider::stop()261void DecorationProvider::stop()
171{262{
172 enqueue_work([this]263 enqueue_work([this]
173 {264 {
@@ -177,30 +268,75 @@
177268
178 enqueue_work([this]269 enqueue_work([this]
179 {270 {
271 wallpaper.erase(begin(wallpaper), end(wallpaper));
180 connection.reset();272 connection.reset();
181 stop_work();273 stop_work();
182 });274 });
183}275}
184276
185void TitlebarProvider::operator()(mir::client::Connection connection)277namespace
278{
279void render_pattern(MirGraphicsRegion* region, uint8_t const pattern[])
280{
281 char* row = region->vaddr;
282
283 for (int j = 0; j < region->height; j++)
284 {
285 uint32_t* pixel = (uint32_t*)row;
286
287 for (int i = 0; i < region->width; i++)
288 memcpy(pixel + i, pattern, sizeof pixel[i]);
289
290 row += region->stride;
291 }
292
293 static Printer printer;
294 printer.printhelp(*region);
295}
296}
297
298void DecorationProvider::operator()(Connection connection)
186{299{
187 this->connection = connection;300 this->connection = connection;
301
302 DisplayConfig const display_conf{this->connection};
303
304 display_conf.for_each_output([this](MirOutput const* output)
305 {
306 wallpaper.push_back(
307 WindowSpec::for_gloss(this->connection, 100, 100)
308 .set_pixel_format(mir_pixel_format_xrgb_8888)
309 .set_buffer_usage(mir_buffer_usage_software)
310 .set_fullscreen_on_output(mir_output_get_id(output))
311 .set_name(wallpaper_name).create_window());
312
313 MirGraphicsRegion graphics_region;
314 MirBufferStream* buffer_stream = mir_window_get_buffer_stream(wallpaper.back());
315
316 mir_buffer_stream_get_graphics_region(buffer_stream, &graphics_region);
317
318 static uint8_t const pattern[4] = { 0x00, 0x00, 0x00, 0x00 };
319
320 render_pattern(&graphics_region, pattern);
321 mir_buffer_stream_swap_buffers_sync(buffer_stream);
322 });
323
188 start_work();324 start_work();
189}325}
190326
191void TitlebarProvider::operator()(std::weak_ptr<mir::scene::Session> const& session)327void DecorationProvider::operator()(std::weak_ptr<mir::scene::Session> const& session)
192{328{
193 std::lock_guard<decltype(mutex)> lock{mutex};329 std::lock_guard<decltype(mutex)> lock{mutex};
194 this->weak_session = session;330 this->weak_session = session;
195}331}
196332
197auto TitlebarProvider::session() const -> std::shared_ptr<mir::scene::Session>333auto DecorationProvider::session() const -> std::shared_ptr<mir::scene::Session>
198{334{
199 std::lock_guard<decltype(mutex)> lock{mutex};335 std::lock_guard<decltype(mutex)> lock{mutex};
200 return weak_session.lock();336 return weak_session.lock();
201}337}
202338
203void TitlebarProvider::create_titlebar_for(miral::Window const& window)339void DecorationProvider::create_titlebar_for(miral::Window const& window)
204{340{
205 enqueue_work([this, window]341 enqueue_work([this, window]
206 {342 {
@@ -220,7 +356,7 @@
220 });356 });
221}357}
222358
223void TitlebarProvider::paint_titlebar_for(miral::WindowInfo const& info, int intensity)359void DecorationProvider::paint_titlebar_for(miral::WindowInfo const& info, int intensity)
224{360{
225 if (auto data = find_titlebar_data(info.window()))361 if (auto data = find_titlebar_data(info.window()))
226 {362 {
@@ -240,7 +376,7 @@
240 }376 }
241}377}
242378
243void TitlebarProvider::destroy_titlebar_for(miral::Window const& window)379void DecorationProvider::destroy_titlebar_for(miral::Window const& window)
244{380{
245 if (auto data = find_titlebar_data(window))381 if (auto data = find_titlebar_data(window))
246 {382 {
@@ -248,11 +384,7 @@
248 {384 {
249 enqueue_work([surface]385 enqueue_work([surface]
250 {386 {
251#if MIR_CLIENT_VERSION <= MIR_VERSION_NUMBER(3, 4, 0)387 mir_window_release(surface, &null_window_callback, nullptr);
252 mir_surface_release(surface, &null_surface_callback, nullptr);
253#else
254 mir_window_release(surface, &null_surface_callback, nullptr);
255#endif
256 });388 });
257 }389 }
258390
@@ -264,7 +396,7 @@
264 }396 }
265}397}
266398
267void TitlebarProvider::resize_titlebar_for(miral::WindowInfo const& window_info, Size const& size)399void DecorationProvider::resize_titlebar_for(miral::WindowInfo const& window_info, Size const& size)
268{400{
269 auto const window = window_info.window();401 auto const window = window_info.window();
270402
@@ -279,9 +411,10 @@
279 }411 }
280}412}
281413
282void TitlebarProvider::place_new_titlebar(miral::WindowSpecification& window_spec)414void DecorationProvider::place_new_decoration(miral::WindowSpecification& window_spec)
283{415{
284 auto const name = window_spec.name().value();416 auto const name = window_spec.name().value();
417 if (name == "wallpaper") return;
285418
286 std::lock_guard<decltype(mutex)> lock{mutex};419 std::lock_guard<decltype(mutex)> lock{mutex};
287420
@@ -296,8 +429,10 @@
296 window_spec.top_left() = parent_window.top_left() - Displacement{0, title_bar_height};429 window_spec.top_left() = parent_window.top_left() - Displacement{0, title_bar_height};
297}430}
298431
299void TitlebarProvider::advise_new_titlebar(miral::WindowInfo const& window_info)432void DecorationProvider::advise_new_titlebar(miral::WindowInfo const& window_info)
300{433{
434 if (window_info.name() == wallpaper_name) return;
435
301 {436 {
302 std::lock_guard<decltype(mutex)> lock{mutex};437 std::lock_guard<decltype(mutex)> lock{mutex};
303438
@@ -307,7 +442,7 @@
307 tools.raise_tree(window_info.parent());442 tools.raise_tree(window_info.parent());
308}443}
309444
310void TitlebarProvider::advise_state_change(miral::WindowInfo const& window_info, MirWindowState state)445void DecorationProvider::advise_state_change(miral::WindowInfo const& window_info, MirWindowState state)
311{446{
312 if (auto titlebar = find_titlebar_window(window_info.window()))447 if (auto titlebar = find_titlebar_window(window_info.window()))
313 {448 {
@@ -332,7 +467,7 @@
332 }467 }
333}468}
334469
335void TitlebarProvider::repaint_titlebar_for(miral::WindowInfo const& window_info)470void DecorationProvider::repaint_titlebar_for(miral::WindowInfo const& window_info)
336{471{
337 if (auto data = find_titlebar_data(window_info.window()))472 if (auto data = find_titlebar_data(window_info.window()))
338 {473 {
@@ -346,23 +481,19 @@
346 }481 }
347}482}
348483
349TitlebarProvider::Data::~Data()484DecorationProvider::Data::~Data()
350{485{
351 if (auto surface = titlebar.exchange(nullptr))486 if (auto surface = titlebar.exchange(nullptr))
352#if MIR_CLIENT_VERSION <= MIR_VERSION_NUMBER(3, 4, 0)487 mir_window_release(surface, &null_window_callback, nullptr);
353 mir_surface_release(surface, &null_surface_callback, nullptr);
354#else
355 mir_window_release(surface, &null_surface_callback, nullptr);
356#endif
357}488}
358489
359void TitlebarProvider::insert(MirWindow* surface, Data* data)490void DecorationProvider::insert(MirWindow* surface, Data* data)
360{491{
361 data->on_create(surface);492 data->on_create(surface);
362 data->titlebar = surface;493 data->titlebar = surface;
363}494}
364495
365TitlebarProvider::Data* TitlebarProvider::find_titlebar_data(miral::Window const& window)496DecorationProvider::Data* DecorationProvider::find_titlebar_data(miral::Window const& window)
366{497{
367 std::lock_guard<decltype(mutex)> lock{mutex};498 std::lock_guard<decltype(mutex)> lock{mutex};
368499
@@ -371,7 +502,7 @@
371 return (find != window_to_titlebar.end()) ? &find->second : nullptr;502 return (find != window_to_titlebar.end()) ? &find->second : nullptr;
372}503}
373504
374miral::Window TitlebarProvider::find_titlebar_window(miral::Window const& window) const505miral::Window DecorationProvider::find_titlebar_window(miral::Window const& window) const
375{506{
376 std::lock_guard<decltype(mutex)> lock{mutex};507 std::lock_guard<decltype(mutex)> lock{mutex};
377508
@@ -380,6 +511,16 @@
380 return (find != window_to_titlebar.end()) ? find->second.window : miral::Window{};511 return (find != window_to_titlebar.end()) ? find->second.window : miral::Window{};
381}512}
382513
514bool DecorationProvider::is_decoration(miral::Window const& window) const
515{
516 return window.application() == session();
517}
518
519bool DecorationProvider::is_titlebar(miral::WindowInfo const& window_info) const
520{
521 return window_info.window().application() == session() && window_info.name() != wallpaper_name;
522}
523
383Worker::~Worker()524Worker::~Worker()
384{525{
385 if (worker.joinable()) worker.join();526 if (worker.joinable()) worker.join();
386527
=== renamed file 'miral-shell/titlebar_provider.h' => 'miral-shell/decoration_provider.h'
--- miral-shell/titlebar_provider.h 2017-02-16 17:33:30 +0000
+++ miral-shell/decoration_provider.h 2017-02-16 17:33:30 +0000
@@ -1,5 +1,5 @@
1/*1/*
2 * Copyright © 2016 Canonical Ltd.2 * Copyright © 2016-2017 Canonical Ltd.
3 *3 *
4 * This program is free software: you can redistribute it and/or modify it4 * 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,5 * under the terms of the GNU General Public License version 3,
@@ -16,8 +16,8 @@
16 * Authored by: Alan Griffiths <alan@octopull.co.uk>16 * Authored by: Alan Griffiths <alan@octopull.co.uk>
17 */17 */
1818
19#ifndef MIRAL_SHELL_TITLEBAR_PROVIDER_H19#ifndef MIRAL_SHELL_DECORATION_PROVIDER_H
20#define MIRAL_SHELL_TITLEBAR_PROVIDER_H20#define MIRAL_SHELL_DECORATION_PROVIDER_H
2121
2222
23#include <miral/window_manager_tools.h>23#include <miral/window_manager_tools.h>
@@ -29,6 +29,8 @@
29#include <map>29#include <map>
30#include <mutex>30#include <mutex>
31#include <mir/client/connection.h>31#include <mir/client/connection.h>
32#include <mir/client/window.h>
33
32#include <thread>34#include <thread>
33#include <condition_variable>35#include <condition_variable>
34#include <queue>36#include <queue>
@@ -54,11 +56,11 @@
54 void do_work();56 void do_work();
55};57};
5658
57class TitlebarProvider : Worker59class DecorationProvider : Worker
58{60{
59public:61public:
60 TitlebarProvider(miral::WindowManagerTools const& tools);62 DecorationProvider(miral::WindowManagerTools const& tools);
61 ~TitlebarProvider();63 ~DecorationProvider();
6264
63 void operator()(mir::client::Connection connection);65 void operator()(mir::client::Connection connection);
64 void operator()(std::weak_ptr<mir::scene::Session> const& session);66 void operator()(std::weak_ptr<mir::scene::Session> const& session);
@@ -66,7 +68,7 @@
66 auto session() const -> std::shared_ptr<mir::scene::Session>;68 auto session() const -> std::shared_ptr<mir::scene::Session>;
6769
68 void create_titlebar_for(miral::Window const& window);70 void create_titlebar_for(miral::Window const& window);
69 void place_new_titlebar(miral::WindowSpecification& window_spec);71 void place_new_decoration(miral::WindowSpecification& window_spec);
70 void paint_titlebar_for(miral::WindowInfo const& window, int intensity);72 void paint_titlebar_for(miral::WindowInfo const& window, int intensity);
71 void destroy_titlebar_for(miral::Window const& window);73 void destroy_titlebar_for(miral::Window const& window);
72 void resize_titlebar_for(miral::WindowInfo const& window_info, mir::geometry::Size const& size);74 void resize_titlebar_for(miral::WindowInfo const& window_info, mir::geometry::Size const& size);
@@ -75,6 +77,9 @@
7577
76 void stop();78 void stop();
7779
80 bool is_decoration(miral::Window const& window) const;
81 bool is_titlebar(miral::WindowInfo const& window_info) const;
82
78private:83private:
79 struct Data84 struct Data
80 {85 {
@@ -92,6 +97,7 @@
92 miral::WindowManagerTools tools;97 miral::WindowManagerTools tools;
93 std::mutex mutable mutex;98 std::mutex mutable mutex;
94 mir::client::Connection connection;99 mir::client::Connection connection;
100 std::vector<mir::client::Window> wallpaper;
95 std::weak_ptr<mir::scene::Session> weak_session;101 std::weak_ptr<mir::scene::Session> weak_session;
96102
97 SurfaceMap window_to_titlebar;103 SurfaceMap window_to_titlebar;
@@ -104,4 +110,4 @@
104};110};
105111
106112
107#endif //MIRAL_SHELL_TITLEBAR_PROVIDER_H113#endif //MIRAL_SHELL_DECORATION_PROVIDER_H
108114
=== modified file 'miral-shell/titlebar_window_manager.cpp'
--- miral-shell/titlebar_window_manager.cpp 2017-02-16 17:33:30 +0000
+++ miral-shell/titlebar_window_manager.cpp 2017-02-16 17:33:30 +0000
@@ -1,5 +1,5 @@
1/*1/*
2 * Copyright © 2016 Canonical Ltd.2 * Copyright © 2016-2017 Canonical Ltd.
3 *3 *
4 * This program is free software: you can redistribute it and/or modify it4 * 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,5 * under the terms of the GNU General Public License version 3,
@@ -17,7 +17,7 @@
17 */17 */
1818
19#include "titlebar_window_manager.h"19#include "titlebar_window_manager.h"
20#include "titlebar_provider.h"20#include "decoration_provider.h"
2121
22#include <miral/application_info.h>22#include <miral/application_info.h>
23#include <miral/internal_client.h>23#include <miral/internal_client.h>
@@ -78,9 +78,9 @@
78 miral::InternalClientLauncher const& launcher) :78 miral::InternalClientLauncher const& launcher) :
79 CanonicalWindowManagerPolicy(tools),79 CanonicalWindowManagerPolicy(tools),
80 spinner{spinner},80 spinner{spinner},
81 titlebar_provider{std::make_unique<TitlebarProvider>(tools)}81 decoration_provider{std::make_unique<DecorationProvider>(tools)}
82{82{
83 launcher.launch("decorations", *titlebar_provider);83 launcher.launch("decorations", *decoration_provider);
8484
85 for (auto key : {KEY_F1, KEY_F2, KEY_F3, KEY_F4})85 for (auto key : {KEY_F1, KEY_F2, KEY_F3, KEY_F4})
86 key_to_workspace[key] = this->tools.create_workspace();86 key_to_workspace[key] = this->tools.create_workspace();
@@ -142,9 +142,9 @@
142 {142 {
143 if (auto const possible_titlebar = tools.window_at(old_cursor))143 if (auto const possible_titlebar = tools.window_at(old_cursor))
144 {144 {
145 if (possible_titlebar.application() == titlebar_provider->session())145 auto const& info = tools.info_for(possible_titlebar);
146 if (decoration_provider->is_titlebar(info))
146 {147 {
147 auto const& info = tools.info_for(possible_titlebar);
148 if (tools.select_active_window(info.parent()) == info.parent())148 if (tools.select_active_window(info.parent()) == info.parent())
149 tools.drag_active_window(cursor - old_cursor);149 tools.drag_active_window(cursor - old_cursor);
150 consumes_event = true;150 consumes_event = true;
@@ -309,19 +309,16 @@
309{309{
310 CanonicalWindowManagerPolicy::advise_new_window(window_info);310 CanonicalWindowManagerPolicy::advise_new_window(window_info);
311311
312 auto const application = window_info.window().application();
313 auto const parent = window_info.parent();312 auto const parent = window_info.parent();
314313
315 auto const is_titlebar = application == titlebar_provider->session();314 if (decoration_provider->is_titlebar(window_info))
316
317 if (is_titlebar)
318 {315 {
319 titlebar_provider->advise_new_titlebar(window_info);316 decoration_provider->advise_new_titlebar(window_info);
320317
321 if (tools.active_window() == parent)318 if (tools.active_window() == parent)
322 titlebar_provider->paint_titlebar_for(tools.info_for(parent), 0xFF);319 decoration_provider->paint_titlebar_for(tools.info_for(parent), 0xFF);
323 else320 else
324 titlebar_provider->paint_titlebar_for(tools.info_for(parent), 0x3F);321 decoration_provider->paint_titlebar_for(tools.info_for(parent), 0x3F);
325 }322 }
326323
327 if (!parent)324 if (!parent)
@@ -340,7 +337,7 @@
340void TitlebarWindowManagerPolicy::handle_window_ready(WindowInfo& window_info)337void TitlebarWindowManagerPolicy::handle_window_ready(WindowInfo& window_info)
341{338{
342 if (window_info.window().application() != spinner.session() && window_info.needs_titlebar(window_info.type()))339 if (window_info.window().application() != spinner.session() && window_info.needs_titlebar(window_info.type()))
343 titlebar_provider->create_titlebar_for(window_info.window());340 decoration_provider->create_titlebar_for(window_info.window());
344341
345 CanonicalWindowManagerPolicy::handle_window_ready(window_info);342 CanonicalWindowManagerPolicy::handle_window_ready(window_info);
346}343}
@@ -349,14 +346,14 @@
349{346{
350 CanonicalWindowManagerPolicy::advise_focus_lost(info);347 CanonicalWindowManagerPolicy::advise_focus_lost(info);
351348
352 titlebar_provider->paint_titlebar_for(info, 0x3F);349 decoration_provider->paint_titlebar_for(info, 0x3F);
353}350}
354351
355void TitlebarWindowManagerPolicy::advise_focus_gained(WindowInfo const& info)352void TitlebarWindowManagerPolicy::advise_focus_gained(WindowInfo const& info)
356{353{
357 CanonicalWindowManagerPolicy::advise_focus_gained(info);354 CanonicalWindowManagerPolicy::advise_focus_gained(info);
358355
359 titlebar_provider->paint_titlebar_for(info, 0xFF);356 decoration_provider->paint_titlebar_for(info, 0xFF);
360357
361 // Frig to force the spinner to the top358 // Frig to force the spinner to the top
362 if (auto const spinner_session = spinner.session())359 if (auto const spinner_session = spinner.session())
@@ -372,21 +369,21 @@
372{369{
373 CanonicalWindowManagerPolicy::advise_state_change(window_info, state);370 CanonicalWindowManagerPolicy::advise_state_change(window_info, state);
374371
375 titlebar_provider->advise_state_change(window_info, state);372 decoration_provider->advise_state_change(window_info, state);
376}373}
377374
378void TitlebarWindowManagerPolicy::advise_resize(WindowInfo const& window_info, Size const& new_size)375void TitlebarWindowManagerPolicy::advise_resize(WindowInfo const& window_info, Size const& new_size)
379{376{
380 CanonicalWindowManagerPolicy::advise_resize(window_info, new_size);377 CanonicalWindowManagerPolicy::advise_resize(window_info, new_size);
381378
382 titlebar_provider->resize_titlebar_for(window_info, new_size);379 decoration_provider->resize_titlebar_for(window_info, new_size);
383}380}
384381
385void TitlebarWindowManagerPolicy::advise_delete_window(WindowInfo const& window_info)382void TitlebarWindowManagerPolicy::advise_delete_window(WindowInfo const& window_info)
386{383{
387 CanonicalWindowManagerPolicy::advise_delete_window(window_info);384 CanonicalWindowManagerPolicy::advise_delete_window(window_info);
388385
389 titlebar_provider->destroy_titlebar_for(window_info.window());386 decoration_provider->destroy_titlebar_for(window_info.window());
390}387}
391388
392bool TitlebarWindowManagerPolicy::handle_keyboard_event(MirKeyboardEvent const* event)389bool TitlebarWindowManagerPolicy::handle_keyboard_event(MirKeyboardEvent const* event)
@@ -535,7 +532,7 @@
535 if (action == mir_keyboard_action_down && scan_code == KEY_BACKSPACE &&532 if (action == mir_keyboard_action_down && scan_code == KEY_BACKSPACE &&
536 (modifiers == (mir_input_event_modifier_alt | mir_input_event_modifier_ctrl)))533 (modifiers == (mir_input_event_modifier_alt | mir_input_event_modifier_ctrl)))
537 {534 {
538 titlebar_provider->stop();535 decoration_provider->stop();
539 }536 }
540537
541 return false;538 return false;
@@ -654,8 +651,8 @@
654 if (parameters.state().value() != mir_window_state_fullscreen && needs_titlebar)651 if (parameters.state().value() != mir_window_state_fullscreen && needs_titlebar)
655 parameters.top_left() = Point{parameters.top_left().value().x, parameters.top_left().value().y + DeltaY{title_bar_height}};652 parameters.top_left() = Point{parameters.top_left().value().x, parameters.top_left().value().y + DeltaY{title_bar_height}};
656653
657 if (app_info.application() == titlebar_provider->session())654 if (app_info.application() == decoration_provider->session())
658 titlebar_provider->place_new_titlebar(parameters);655 decoration_provider->place_new_decoration(parameters);
659656
660 parameters.userdata() = std::make_shared<PolicyData>();657 parameters.userdata() = std::make_shared<PolicyData>();
661 return parameters;658 return parameters;
@@ -697,8 +694,8 @@
697694
698 tools.for_each_window_in_workspace(active_workspace, [&](Window const& window)695 tools.for_each_window_in_workspace(active_workspace, [&](Window const& window)
699 {696 {
700 if (window.application() == titlebar_provider->session())697 if (decoration_provider->is_decoration(window))
701 return; // titlebars are taken care of automatically698 return; // decorations are taken care of automatically
702699
703 auto const& window_info = tools.info_for(window);700 auto const& window_info = tools.info_for(window);
704 auto& pdata = policy_data_for(window_info);701 auto& pdata = policy_data_for(window_info);
@@ -709,8 +706,8 @@
709706
710 tools.for_each_window_in_workspace(old_active, [&](Window const& window)707 tools.for_each_window_in_workspace(old_active, [&](Window const& window)
711 {708 {
712 if (window.application() == titlebar_provider->session())709 if (decoration_provider->is_decoration(window))
713 return; // titlebars are taken care of automatically710 return; // decorations are taken care of automatically
714711
715 auto const& window_info = tools.info_for(window);712 auto const& window_info = tools.info_for(window);
716 auto& pdata = policy_data_for(window_info);713 auto& pdata = policy_data_for(window_info);
717714
=== modified file 'miral-shell/titlebar_window_manager.h'
--- miral-shell/titlebar_window_manager.h 2017-02-16 17:33:30 +0000
+++ miral-shell/titlebar_window_manager.h 2017-02-16 17:33:30 +0000
@@ -1,5 +1,5 @@
1/*1/*
2 * Copyright © 2016 Canonical Ltd.2 * Copyright © 2016-2017 Canonical Ltd.
3 *3 *
4 * This program is free software: you can redistribute it and/or modify it4 * 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,5 * under the terms of the GNU General Public License version 3,
@@ -31,7 +31,7 @@
3131
32using namespace mir::geometry;32using namespace mir::geometry;
3333
34class TitlebarProvider;34class DecorationProvider;
3535
36class TitlebarWindowManagerPolicy : public miral::CanonicalWindowManagerPolicy, miral::WorkspacePolicy36class TitlebarWindowManagerPolicy : public miral::CanonicalWindowManagerPolicy, miral::WorkspacePolicy
37{37{
@@ -98,7 +98,7 @@
9898
99 SpinnerSplash const spinner;99 SpinnerSplash const spinner;
100100
101 std::unique_ptr<TitlebarProvider> const titlebar_provider;101 std::unique_ptr<DecorationProvider> const decoration_provider;
102102
103 void end_resize();103 void end_resize();
104104
105105
=== modified file 'miral/CMakeLists.txt'
--- miral/CMakeLists.txt 2017-02-16 17:33:30 +0000
+++ miral/CMakeLists.txt 2017-02-16 17:33:30 +0000
@@ -55,6 +55,7 @@
55 ${CMAKE_SOURCE_DIR}/include/mir/client/window_spec.h55 ${CMAKE_SOURCE_DIR}/include/mir/client/window_spec.h
56 ${CMAKE_SOURCE_DIR}/include/mir/client/window_id.h56 ${CMAKE_SOURCE_DIR}/include/mir/client/window_id.h
57 ${CMAKE_SOURCE_DIR}/include/mir/client/connection.h57 ${CMAKE_SOURCE_DIR}/include/mir/client/connection.h
58 ${CMAKE_SOURCE_DIR}/include/mir/client/display_config.h
58 ${CMAKE_SOURCE_DIR}/include/mir/client/window.h59 ${CMAKE_SOURCE_DIR}/include/mir/client/window.h
59 ${CMAKE_SOURCE_DIR}/include/mir/client/detail/mir_forward_compatibility.h60 ${CMAKE_SOURCE_DIR}/include/mir/client/detail/mir_forward_compatibility.h
60)61)

Subscribers

People subscribed via source and target branches