Merge lp:~alan-griffiths/miral/0.4 into lp:miral/release

Proposed by Alan Griffiths
Status: Merged
Approved by: Alan Griffiths
Approved revision: 334
Merged at revision: 339
Proposed branch: lp:~alan-griffiths/miral/0.4
Merge into: lp:miral/release
Diff against target: 1590 lines (+853/-178)
32 files modified
CMakeLists.txt (+1/-1)
debian/changelog (+17/-0)
debian/control (+1/-0)
debian/libmiral1.symbols (+30/-0)
include/miral/application.h (+6/-0)
include/miral/application_info.h (+2/-1)
include/miral/command_line_option.h (+100/-0)
include/miral/keymap.h (+2/-1)
include/miral/window_manager_tools.h (+4/-0)
miral-shell/CMakeLists.txt (+6/-0)
miral-shell/shell_main.cpp (+5/-1)
miral-shell/titlebar_config.cpp (+38/-0)
miral-shell/titlebar_config.h (+30/-0)
miral-shell/titlebar_provider.cpp (+123/-8)
miral-shell/titlebar_provider.h (+4/-2)
miral-shell/titlebar_window_manager.cpp (+6/-6)
miral/CMakeLists.txt (+9/-0)
miral/application.cpp (+15/-0)
miral/application_info.cpp (+7/-0)
miral/basic_window_manager.cpp (+9/-1)
miral/basic_window_manager.h (+2/-0)
miral/command_line_option.cpp (+199/-0)
miral/display_configuration_option.cpp (+2/-2)
miral/keymap.cpp (+17/-8)
miral/symbols.map (+16/-0)
miral/window_management_trace.cpp (+8/-0)
miral/window_management_trace.h (+1/-0)
miral/window_manager_tools.cpp (+3/-0)
miral/window_manager_tools_implementation.h (+1/-0)
scripts/filter_symbols_diff.sh (+2/-0)
scripts/process_doxygen_xml.py (+187/-141)
tasks_for_the_interested_reader.md (+0/-6)
To merge this branch: bzr merge lp:~alan-griffiths/miral/0.4
Reviewer Review Type Date Requested Status
Alan Griffiths Approve
Review via email: mp+310083@code.launchpad.net

Commit message

Release 0.4.0

To post a comment you must log in.
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :
review: Needs Fixing
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> lp:1639567

Weird can't reproduce

Revision history for this message
Alan Griffiths (alan-griffiths) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt 2016-10-16 16:14:18 +0000
+++ CMakeLists.txt 2016-11-04 16:34:03 +0000
@@ -37,7 +37,7 @@
37include_directories(include SYSTEM ${MIRCLIENT_INCLUDE_DIRS})37include_directories(include SYSTEM ${MIRCLIENT_INCLUDE_DIRS})
3838
39set(MIRAL_VERSION_MAJOR 0)39set(MIRAL_VERSION_MAJOR 0)
40set(MIRAL_VERSION_MINOR 3)40set(MIRAL_VERSION_MINOR 4)
41set(MIRAL_VERSION_PATCH 0)41set(MIRAL_VERSION_PATCH 0)
4242
43set(MIRAL_VERSION ${MIRAL_VERSION_MAJOR}.${MIRAL_VERSION_MINOR}.${MIRAL_VERSION_PATCH})43set(MIRAL_VERSION ${MIRAL_VERSION_MAJOR}.${MIRAL_VERSION_MINOR}.${MIRAL_VERSION_PATCH})
4444
=== modified file 'debian/changelog'
--- debian/changelog 2016-10-28 16:03:16 +0000
+++ debian/changelog 2016-11-04 16:34:03 +0000
@@ -1,3 +1,20 @@
1miral (0.4.0) UNRELEASED; urgency=medium
2
3 * New upstream release 0.4.0 (https://launchpad.net/miral/+milestone/0.4)
4 - ABI summary:
5 . miral ABI unchanged at 1
6 - Enhancements:
7 . Add miral::WindowManagerTools::force_close(window) to forcefully close
8 a window (i.e. without a close request to the client)
9 . Add functions to manage Applications
10 . Add miral::CommandLineOption - enables the setting and processing of
11 configuration options. These may be supplied on the commandline, as
12 MIR_SERVER_XXX environment variables or in a config file.
13 . Add +options to the keymap configuration
14 . [miral-shell] Add window name to titlebars
15
16 -- Alan Griffiths <alan.griffiths@canonical.com> Fri, 28 Oct 2016 12:14:59 +0100
17
1miral (0.3.0+17.04.20161028-0ubuntu1) zesty; urgency=medium18miral (0.3.0+17.04.20161028-0ubuntu1) zesty; urgency=medium
219
3 * No change rebuild to target Xenial+Overlay20 * No change rebuild to target Xenial+Overlay
421
=== modified file 'debian/control'
--- debian/control 2016-09-19 13:27:49 +0000
+++ debian/control 2016-11-04 16:34:03 +0000
@@ -19,6 +19,7 @@
19 mirtest-dev,19 mirtest-dev,
20 libglib2.0-dev,20 libglib2.0-dev,
21 libgles2-mesa-dev,21 libgles2-mesa-dev,
22 libfreetype6-dev,
22# The following workaround missing dependencies in Mir packages23# The following workaround missing dependencies in Mir packages
23 uuid-dev,24 uuid-dev,
24 libboost-system-dev,25 libboost-system-dev,
2526
=== modified file 'debian/libmiral1.symbols'
--- debian/libmiral1.symbols 2016-10-11 13:28:07 +0000
+++ debian/libmiral1.symbols 2016-11-04 16:34:03 +0000
@@ -2,6 +2,7 @@
2 MIRAL_0.1@MIRAL_0.1 0.1.02 MIRAL_0.1@MIRAL_0.1 0.1.0
3 MIRAL_0.2@MIRAL_0.2 0.2.03 MIRAL_0.2@MIRAL_0.2 0.2.0
4 MIRAL_0.3@MIRAL_0.3 0.3.04 MIRAL_0.3@MIRAL_0.3 0.3.0
5 MIRAL_0.4@MIRAL_0.4 0.3.0
5 (c++)"miral::ActiveOutputsListener::advise_output_begin()@MIRAL_0.1" 0.1.06 (c++)"miral::ActiveOutputsListener::advise_output_begin()@MIRAL_0.1" 0.1.0
6 (c++)"miral::ActiveOutputsListener::advise_output_create(miral::Output const&)@MIRAL_0.1" 0.1.07 (c++)"miral::ActiveOutputsListener::advise_output_create(miral::Output const&)@MIRAL_0.1" 0.1.0
7 (c++)"miral::ActiveOutputsListener::advise_output_delete(miral::Output const&)@MIRAL_0.1" 0.1.08 (c++)"miral::ActiveOutputsListener::advise_output_delete(miral::Output const&)@MIRAL_0.1" 0.1.0
@@ -275,3 +276,32 @@
275 (c++)"miral::Keymap::~Keymap()@MIRAL_0.3" 0.3.0276 (c++)"miral::Keymap::~Keymap()@MIRAL_0.3" 0.3.0
276 (c++)"miral::Keymap::operator=(miral::Keymap const&)@MIRAL_0.3" 0.3.0277 (c++)"miral::Keymap::operator=(miral::Keymap const&)@MIRAL_0.3" 0.3.0
277 (c++)"miral::Keymap::operator()(mir::Server&) const@MIRAL_0.3" 0.3.0278 (c++)"miral::Keymap::operator()(mir::Server&) const@MIRAL_0.3" 0.3.0
279 (c++)"miral::ApplicationInfo::name[abi:cxx11]() const@MIRAL_0.4" 0.4.0
280 (c++)"miral::CommandLineOption::CommandLineOption(miral::CommandLineOption const&)@MIRAL_0.4" 0.4.0
281 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (mir::optional_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@MIRAL_0.4" 0.4.0
282 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (mir::optional_value<bool> const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@MIRAL_0.4" 0.4.0
283 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (mir::optional_value<int> const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@MIRAL_0.4" 0.4.0
284 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@MIRAL_0.4" 0.4.0
285 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@MIRAL_0.4" 0.4.0
286 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (bool)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@MIRAL_0.4" 0.4.0
287 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (bool)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@MIRAL_0.4" 0.4.0
288 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (double)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double)@MIRAL_0.4" 0.4.0
289 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (int)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@MIRAL_0.4" 0.4.0
290 (c++)"miral::CommandLineOption::CommandLineOption(miral::CommandLineOption const&)@MIRAL_0.4" 0.4.0
291 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (mir::optional_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@MIRAL_0.4" 0.4.0
292 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (mir::optional_value<bool> const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@MIRAL_0.4" 0.4.0
293 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (mir::optional_value<int> const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@MIRAL_0.4" 0.4.0
294 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@MIRAL_0.4" 0.4.0
295 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@MIRAL_0.4" 0.4.0
296 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (bool)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@MIRAL_0.4" 0.4.0
297 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (bool)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@MIRAL_0.4" 0.4.0
298 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (double)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, double)@MIRAL_0.4" 0.4.0
299 (c++)"miral::CommandLineOption::CommandLineOption(std::function<void (int)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@MIRAL_0.4" 0.4.0
300 (c++)"miral::CommandLineOption::~CommandLineOption()@MIRAL_0.4" 0.4.0
301 (c++)"miral::CommandLineOption::~CommandLineOption()@MIRAL_0.4" 0.4.0
302 (c++)"miral::CommandLineOption::operator=(miral::CommandLineOption const&)@MIRAL_0.4" 0.4.0
303 (c++)"miral::CommandLineOption::operator()(mir::Server&) const@MIRAL_0.4" 0.4.0
304 (c++)"miral::WindowManagerTools::force_close(miral::Window const&)@MIRAL_0.4" 0.4.0
305 (c++)"miral::apply_lifecycle_state_to(std::shared_ptr<mir::scene::Session> const&, MirLifecycleState)@MIRAL_0.4" 0.4.0
306 (c++)"miral::pid_of(std::shared_ptr<mir::scene::Session> const&)@MIRAL_0.4" 0.4.0
307 (c++)"miral::name_of[abi:cxx11](std::shared_ptr<mir::scene::Session> const&)@MIRAL_0.4" 0.4.0
278308
=== added directory 'debian/tmp'
=== modified file 'include/miral/application.h'
--- include/miral/application.h 2016-04-22 09:24:24 +0000
+++ include/miral/application.h 2016-11-04 16:34:03 +0000
@@ -19,7 +19,10 @@
19#ifndef MIRAL_APPLICATION_H19#ifndef MIRAL_APPLICATION_H
20#define MIRAL_APPLICATION_H20#define MIRAL_APPLICATION_H
2121
22#include <mir_toolkit/common.h>
23
22#include <memory>24#include <memory>
25#include <string>
2326
24namespace mir27namespace mir
25{28{
@@ -30,7 +33,10 @@
30{33{
31using Application = std::shared_ptr<mir::scene::Session>;34using Application = std::shared_ptr<mir::scene::Session>;
3235
36void apply_lifecycle_state_to(Application const& application, MirLifecycleState state);
33void kill(Application const& application, int sig);37void kill(Application const& application, int sig);
38auto name_of(Application const& application) -> std::string;
39auto pid_of(Application const& application) -> pid_t;
34}40}
3541
36#endif //MIRAL_APPLICATION_H42#endif //MIRAL_APPLICATION_H
3743
=== modified file 'include/miral/application_info.h'
--- include/miral/application_info.h 2016-06-07 16:26:40 +0000
+++ include/miral/application_info.h 2016-11-04 16:34:03 +0000
@@ -21,9 +21,9 @@
2121
22#include "miral/application.h"22#include "miral/application.h"
2323
24#include <string>
24#include <vector>25#include <vector>
2526
26
27namespace miral27namespace miral
28{28{
29class Window;29class Window;
@@ -36,6 +36,7 @@
36 ApplicationInfo(ApplicationInfo const& that);36 ApplicationInfo(ApplicationInfo const& that);
37 auto operator=(ApplicationInfo const& that) -> miral::ApplicationInfo&;37 auto operator=(ApplicationInfo const& that) -> miral::ApplicationInfo&;
3838
39 auto name() const -> std::string;
39 auto application() const -> Application;40 auto application() const -> Application;
40 auto windows() const -> std::vector <Window>&;41 auto windows() const -> std::vector <Window>&;
41 void add_window(Window const& window);42 void add_window(Window const& window);
4243
=== added file 'include/miral/command_line_option.h'
--- include/miral/command_line_option.h 1970-01-01 00:00:00 +0000
+++ include/miral/command_line_option.h 2016-11-04 16:34:03 +0000
@@ -0,0 +1,100 @@
1/*
2 * Copyright © 2016 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 MIRAL_COMMAND_LINE_OPTION_H
20#define MIRAL_COMMAND_LINE_OPTION_H
21
22#include <mir/optional_value.h>
23
24#include <functional>
25#include <memory>
26#include <string>
27
28namespace mir { class Server; }
29
30namespace miral
31{
32/// Add a user configuration option to Mir's option handling.
33/// The callback will be invoked during initialisation with a value supplied
34/// from the command line, environment variable, config file or the default.
35class CommandLineOption
36{
37public:
38 CommandLineOption(
39 std::function<void(int value)> callback,
40 std::string const& option,
41 std::string const& description,
42 int default_value);
43
44 CommandLineOption(
45 std::function<void(double value)> callback,
46 std::string const& option,
47 std::string const& description,
48 double default_value);
49
50 CommandLineOption(
51 std::function<void(std::string const& value)> callback,
52 std::string const& option,
53 std::string const& description,
54 std::string const& default_value);
55
56 CommandLineOption(
57 std::function<void(std::string const& value)> callback,
58 std::string const& option,
59 std::string const& description,
60 char const* default_value);
61
62 CommandLineOption(
63 std::function<void(bool value)> callback,
64 std::string const& option,
65 std::string const& description,
66 bool default_value);
67
68 CommandLineOption(
69 std::function<void(mir::optional_value<int> const& value)> callback,
70 std::string const& option,
71 std::string const& description);
72
73 CommandLineOption(
74 std::function<void(mir::optional_value<std::string> const& value)> callback,
75 std::string const& option,
76 std::string const& description);
77
78 CommandLineOption(
79 std::function<void(mir::optional_value<bool> const& value)> callback,
80 std::string const& option,
81 std::string const& description);
82
83 CommandLineOption(
84 std::function<void(bool is_set)> callback,
85 std::string const& option,
86 std::string const& description);
87
88 void operator()(mir::Server& server) const;
89
90 ~CommandLineOption();
91 CommandLineOption(CommandLineOption const&);
92 auto operator=(CommandLineOption const&) -> CommandLineOption&;
93
94private:
95 struct Self;
96 std::shared_ptr<Self> self;
97};
98}
99
100#endif //MIRAL_COMMAND_LINE_OPTION_H
0101
=== modified file 'include/miral/keymap.h'
--- include/miral/keymap.h 2016-10-11 13:09:35 +0000
+++ include/miral/keymap.h 2016-11-04 16:34:03 +0000
@@ -35,7 +35,8 @@
35 Keymap();35 Keymap();
3636
37 /// Specify a keymap.37 /// Specify a keymap.
38 /// Format is <language>[+<variant>]38 /// Format is <language>[+<variant>[+<options>]]
39 /// Options is a comma separated list.
39 /// e.g. "uk" or "us+dvorak"40 /// e.g. "uk" or "us+dvorak"
40 explicit Keymap(std::string const& keymap);41 explicit Keymap(std::string const& keymap);
41 ~Keymap();42 ~Keymap();
4243
=== modified file 'include/miral/window_manager_tools.h'
--- include/miral/window_manager_tools.h 2016-10-05 16:54:07 +0000
+++ include/miral/window_manager_tools.h 2016-11-04 16:34:03 +0000
@@ -115,6 +115,10 @@
115 /// Send close request to the window115 /// Send close request to the window
116 void ask_client_to_close(Window const& window);116 void ask_client_to_close(Window const& window);
117117
118 /// Close the window by force
119 /// \note ask_client_to_close() is the polite way
120 void force_close(Window const& window);
121
118 /// retrieve the active window122 /// retrieve the active window
119 auto active_window() const -> Window;123 auto active_window() const -> Window;
120124
121125
=== modified file 'miral-shell/CMakeLists.txt'
--- miral-shell/CMakeLists.txt 2016-10-06 15:36:15 +0000
+++ miral-shell/CMakeLists.txt 2016-11-04 16:34:03 +0000
@@ -22,8 +22,14 @@
22 tiling_window_manager.cpp tiling_window_manager.h22 tiling_window_manager.cpp tiling_window_manager.h
23 titlebar_window_manager.cpp titlebar_window_manager.h23 titlebar_window_manager.cpp titlebar_window_manager.h
24 titlebar_provider.cpp titlebar_provider.h24 titlebar_provider.cpp titlebar_provider.h
25 titlebar_config.cpp titlebar_config.h
25)26)
2627
28pkg_check_modules(FREETYPE freetype2 REQUIRED)
29target_include_directories(miral-shell PUBLIC ${FREETYPE_INCLUDE_DIRS})
30target_compile_definitions(miral-shell PUBLIC -DTYPO_SUPPORTS_FREETYPE)
31target_link_libraries(miral-shell ${FREETYPE_LIBRARIES})
32
27target_link_libraries(miral-shell33target_link_libraries(miral-shell
28 miral-spinner34 miral-spinner
29 miral35 miral
3036
=== modified file 'miral-shell/shell_main.cpp'
--- miral-shell/shell_main.cpp 2016-10-11 13:09:35 +0000
+++ miral-shell/shell_main.cpp 2016-11-04 16:34:03 +0000
@@ -18,6 +18,7 @@
1818
19#include "tiling_window_manager.h"19#include "tiling_window_manager.h"
20#include "titlebar_window_manager.h"20#include "titlebar_window_manager.h"
21#include "titlebar_config.h"
21#include "spinner/splash.h"22#include "spinner/splash.h"
2223
23#include <miral/display_configuration_option.h>24#include <miral/display_configuration_option.h>
@@ -25,6 +26,7 @@
25#include <miral/window_management_options.h>26#include <miral/window_management_options.h>
26#include <miral/append_event_filter.h>27#include <miral/append_event_filter.h>
27#include <miral/internal_client.h>28#include <miral/internal_client.h>
29#include <miral/command_line_option.h>
28#include <miral/cursor_theme.h>30#include <miral/cursor_theme.h>
29#include <miral/keymap.h>31#include <miral/keymap.h>
3032
@@ -80,6 +82,8 @@
80 outputs_monitor,82 outputs_monitor,
81 config_keymap,83 config_keymap,
82 AppendEventFilter{quit_on_ctrl_alt_bksp},84 AppendEventFilter{quit_on_ctrl_alt_bksp},
83 StartupInternalClient{"Intro", spinner}85 StartupInternalClient{"Intro", spinner},
86 CommandLineOption{[&](std::string const& typeface) { ::titlebar::font_file(typeface); },
87 "shell-titlebar-font", "font file to use for titlebars", ::titlebar::font_file()}
84 });88 });
85}89}
8690
=== added file 'miral-shell/titlebar_config.cpp'
--- miral-shell/titlebar_config.cpp 1970-01-01 00:00:00 +0000
+++ miral-shell/titlebar_config.cpp 2016-11-04 16:34:03 +0000
@@ -0,0 +1,38 @@
1/*
2 * Copyright © 2016 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#include "titlebar_config.h"
20#include <mutex>
21
22namespace
23{
24std::mutex mutex;
25std::string font_file{"/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf"};
26}
27
28void titlebar::font_file(std::string const& font_file)
29{
30 std::lock_guard<decltype(mutex)> lock{mutex};
31 ::font_file = font_file;
32}
33
34auto titlebar::font_file() -> std::string
35{
36 std::lock_guard<decltype(mutex)> lock{mutex};
37 return ::font_file;
38}
039
=== added file 'miral-shell/titlebar_config.h'
--- miral-shell/titlebar_config.h 1970-01-01 00:00:00 +0000
+++ miral-shell/titlebar_config.h 2016-11-04 16:34:03 +0000
@@ -0,0 +1,30 @@
1/*
2 * Copyright © 2016 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 MIRAL_TITLEBAR_CONFIG_H
20#define MIRAL_TITLEBAR_CONFIG_H
21
22#include <string>
23
24namespace titlebar
25{
26void font_file(std::string const& font_file);
27auto font_file() -> std::string;
28}
29
30#endif //MIRAL_TITLEBAR_CONFIG_H
031
=== modified file 'miral-shell/titlebar_provider.cpp'
--- miral-shell/titlebar_provider.cpp 2016-10-05 16:54:07 +0000
+++ miral-shell/titlebar_provider.cpp 2016-11-04 16:34:03 +0000
@@ -17,21 +17,47 @@
17 */17 */
1818
19#include "titlebar_provider.h"19#include "titlebar_provider.h"
20#include "titlebar_config.h"
2021
21#include <miral/toolkit/surface_spec.h>22#include <miral/toolkit/surface_spec.h>
2223
23#include <mir_toolkit/mir_buffer_stream.h>24#include <mir_toolkit/mir_buffer_stream.h>
2425
26#include <ft2build.h>
27#include FT_FREETYPE_H
28
29#include <locale>
30#include <codecvt>
31#include <string>
25#include <cstring>32#include <cstring>
26#include <sstream>33#include <sstream>
2734
35#include <iostream>
36
28namespace37namespace
29{38{
30int const title_bar_height = 10;39int const title_bar_height = 12;
3140
32void null_surface_callback(MirSurface*, void*) {}41void null_surface_callback(MirSurface*, void*) {}
3342
34void paint_surface(MirSurface* surface, int const intensity)43struct Printer
44{
45 Printer();
46 ~Printer();
47 Printer(Printer const&) = delete;
48 Printer& operator=(Printer const&) = delete;
49
50 void print(MirGraphicsRegion const& region, std::string const& title, int const intensity);
51
52private:
53 std::wstring_convert<std::codecvt_utf16<wchar_t>> converter;
54
55 bool working = false;
56 FT_Library lib;
57 FT_Face face;
58};
59
60void paint_surface(MirSurface* surface, std::string const& title, int const intensity)
35{61{
36 MirBufferStream* buffer_stream = mir_surface_get_buffer_stream(surface);62 MirBufferStream* buffer_stream = mir_surface_get_buffer_stream(surface);
3763
@@ -51,8 +77,77 @@
51 row += region.stride;77 row += region.stride;
52 }78 }
5379
80 static Printer printer;
81 printer.print(region, title, intensity);
82
54 mir_buffer_stream_swap_buffers_sync(buffer_stream);83 mir_buffer_stream_swap_buffers_sync(buffer_stream);
55}84}
85
86Printer::Printer()
87{
88 if (FT_Init_FreeType(&lib))
89 return;
90
91 if (FT_New_Face(lib, titlebar::font_file().c_str(), 0, &face))
92 {
93 std::cerr << "WARNING: failed to load titlebar font: \"" << titlebar::font_file() << "\"\n";
94 FT_Done_FreeType(lib);
95 return;
96 }
97
98 FT_Set_Pixel_Sizes(face, 0, 10);
99 working = true;
100}
101
102Printer::~Printer()
103{
104 if (working)
105 {
106 FT_Done_Face(face);
107 FT_Done_FreeType(lib);
108 }
109}
110
111void Printer::print(MirGraphicsRegion const& region, std::string const& title_, int const intensity)
112{
113 if (!working)
114 return;
115
116 auto title = converter.from_bytes(title_);
117
118 int base_x = 2;
119 int base_y = region.height-2;
120
121 for (auto const& ch : title)
122 {
123 FT_Load_Glyph(face, FT_Get_Char_Index(face, ch), FT_LOAD_DEFAULT);
124 auto const glyph = face->glyph;
125 FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL);
126
127 auto const& bitmap = glyph->bitmap;
128 auto const x = base_x + glyph->bitmap_left;
129
130 if (static_cast<int>(x + bitmap.width) <= region.width)
131 {
132 unsigned char* src = bitmap.buffer;
133
134 auto const y = base_y - glyph->bitmap_top;
135 char* dest = region.vaddr + y*region.stride + 4*x;
136
137 for (auto row = 0u; row != std::min(bitmap.rows, glyph->bitmap_top+2u); ++row)
138 {
139 for (auto col = 0u; col != bitmap.width; ++col)
140 memset(dest+ 4*col, (intensity*(0xff^src[col]))/0xff, 4);
141
142 src += bitmap.pitch;
143 dest += region.stride;
144 }
145 }
146
147 base_x += glyph->advance.x >> 6;
148 base_y += glyph->advance.y >> 6;
149 }
150}
56}151}
57152
58using namespace miral::toolkit;153using namespace miral::toolkit;
@@ -121,18 +216,22 @@
121 });216 });
122}217}
123218
124void TitlebarProvider::paint_titlebar_for(miral::Window const& window, int intensity)219void TitlebarProvider::paint_titlebar_for(miral::WindowInfo const& info, int intensity)
125{220{
126 if (auto data = find_titlebar_data(window))221 this->intensity = intensity;
222
223 if (auto data = find_titlebar_data(info.window()))
127 {224 {
225 auto const title = info.name();
226
128 if (auto surface = data->titlebar.load())227 if (auto surface = data->titlebar.load())
129 {228 {
130 enqueue_work([this, surface, intensity]{ paint_surface(surface, intensity); });229 enqueue_work([this, surface, title, intensity]{ paint_surface(surface, title, intensity); });
131 }230 }
132 else231 else
133 {232 {
134 data->on_create = [this, intensity](MirSurface* surface)233 data->on_create = [this, title, intensity](MirSurface* surface)
135 { enqueue_work([this, surface, intensity]{ paint_surface(surface, intensity); }); };234 { enqueue_work([this, surface, title, intensity]{ paint_surface(surface, title, intensity); }); };
136 }235 }
137 }236 }
138}237}
@@ -157,14 +256,18 @@
157 }256 }
158}257}
159258
160void TitlebarProvider::resize_titlebar_for(miral::Window const& window, Size const& size)259void TitlebarProvider::resize_titlebar_for(miral::WindowInfo const& window_info, Size const& size)
161{260{
261 auto const window = window_info.window();
262
162 if (window.size().width == size.width)263 if (window.size().width == size.width)
163 return;264 return;
164265
165 if (auto titlebar_window = find_titlebar_window(window))266 if (auto titlebar_window = find_titlebar_window(window))
166 {267 {
167 titlebar_window.resize({size.width, title_bar_height});268 titlebar_window.resize({size.width, title_bar_height});
269
270 repaint_titlebar_for(window_info);
168 }271 }
169}272}
170273
@@ -217,6 +320,18 @@
217 }320 }
218321
219 tools.modify_window(titlebar, modifications);322 tools.modify_window(titlebar, modifications);
323 repaint_titlebar_for(window_info);
324 }
325}
326
327void TitlebarProvider::repaint_titlebar_for(miral::WindowInfo const& window_info)
328{
329 if (auto data = find_titlebar_data(window_info.window()))
330 {
331 auto const title = window_info.name();
332
333 if (auto surface = data->titlebar.load())
334 enqueue_work([this, surface, title]{ paint_surface(surface, title, intensity); });
220 }335 }
221}336}
222337
223338
=== modified file 'miral-shell/titlebar_provider.h'
--- miral-shell/titlebar_provider.h 2016-08-10 11:48:02 +0000
+++ miral-shell/titlebar_provider.h 2016-11-04 16:34:03 +0000
@@ -67,9 +67,9 @@
6767
68 void create_titlebar_for(miral::Window const& window);68 void create_titlebar_for(miral::Window const& window);
69 void place_new_titlebar(miral::WindowSpecification& window_spec);69 void place_new_titlebar(miral::WindowSpecification& window_spec);
70 void paint_titlebar_for(miral::Window const& window, int intensity);70 void paint_titlebar_for(miral::WindowInfo const& window, int intensity);
71 void destroy_titlebar_for(miral::Window const& window);71 void destroy_titlebar_for(miral::Window const& window);
72 void resize_titlebar_for(miral::Window const& window, mir::geometry::Size const& size);72 void resize_titlebar_for(miral::WindowInfo const& window_info, mir::geometry::Size const& size);
73 void advise_new_titlebar(miral::WindowInfo const& window_info);73 void advise_new_titlebar(miral::WindowInfo const& window_info);
74 void advise_state_change(miral::WindowInfo const& window_info, MirSurfaceState state);74 void advise_state_change(miral::WindowInfo const& window_info, MirSurfaceState state);
7575
@@ -92,6 +92,7 @@
92 std::mutex mutable mutex;92 std::mutex mutable mutex;
93 miral::toolkit::Connection connection;93 miral::toolkit::Connection connection;
94 std::weak_ptr<mir::scene::Session> weak_session;94 std::weak_ptr<mir::scene::Session> weak_session;
95 std::atomic<int> intensity{0xff};
9596
96 SurfaceMap window_to_titlebar;97 SurfaceMap window_to_titlebar;
97 TitleMap windows_awaiting_titlebar;98 TitleMap windows_awaiting_titlebar;
@@ -99,6 +100,7 @@
99 static void insert(MirSurface* surface, Data* data);100 static void insert(MirSurface* surface, Data* data);
100 Data* find_titlebar_data(miral::Window const& window);101 Data* find_titlebar_data(miral::Window const& window);
101 miral::Window find_titlebar_window(miral::Window const& window) const;102 miral::Window find_titlebar_window(miral::Window const& window) const;
103 void repaint_titlebar_for(miral::WindowInfo const& window_info);
102};104};
103105
104106
105107
=== modified file 'miral-shell/titlebar_window_manager.cpp'
--- miral-shell/titlebar_window_manager.cpp 2016-10-06 08:31:39 +0000
+++ miral-shell/titlebar_window_manager.cpp 2016-11-04 16:34:03 +0000
@@ -31,7 +31,7 @@
3131
32namespace32namespace
33{33{
34int const title_bar_height = 10;34int const title_bar_height = 12;
35}35}
3636
37TitlebarWindowManagerPolicy::TitlebarWindowManagerPolicy(37TitlebarWindowManagerPolicy::TitlebarWindowManagerPolicy(
@@ -275,9 +275,9 @@
275 auto const parent = window_info.parent();275 auto const parent = window_info.parent();
276276
277 if (tools.active_window() == parent)277 if (tools.active_window() == parent)
278 titlebar_provider->paint_titlebar_for(parent, 0xFF);278 titlebar_provider->paint_titlebar_for(tools.info_for(parent), 0xFF);
279 else279 else
280 titlebar_provider->paint_titlebar_for(parent, 0x3F);280 titlebar_provider->paint_titlebar_for(tools.info_for(parent), 0x3F);
281 }281 }
282}282}
283283
@@ -293,14 +293,14 @@
293{293{
294 CanonicalWindowManagerPolicy::advise_focus_lost(info);294 CanonicalWindowManagerPolicy::advise_focus_lost(info);
295295
296 titlebar_provider->paint_titlebar_for(info.window(), 0x3F);296 titlebar_provider->paint_titlebar_for(info, 0x3F);
297}297}
298298
299void TitlebarWindowManagerPolicy::advise_focus_gained(WindowInfo const& info)299void TitlebarWindowManagerPolicy::advise_focus_gained(WindowInfo const& info)
300{300{
301 CanonicalWindowManagerPolicy::advise_focus_gained(info);301 CanonicalWindowManagerPolicy::advise_focus_gained(info);
302302
303 titlebar_provider->paint_titlebar_for(info.window(), 0xFF);303 titlebar_provider->paint_titlebar_for(info, 0xFF);
304304
305 // Frig to force the spinner to the top305 // Frig to force the spinner to the top
306 if (auto const spinner_session = spinner.session())306 if (auto const spinner_session = spinner.session())
@@ -323,7 +323,7 @@
323{323{
324 CanonicalWindowManagerPolicy::advise_resize(window_info, new_size);324 CanonicalWindowManagerPolicy::advise_resize(window_info, new_size);
325325
326 titlebar_provider->resize_titlebar_for(window_info.window(), new_size);326 titlebar_provider->resize_titlebar_for(window_info, new_size);
327}327}
328328
329void TitlebarWindowManagerPolicy::advise_delete_window(WindowInfo const& window_info)329void TitlebarWindowManagerPolicy::advise_delete_window(WindowInfo const& window_info)
330330
=== modified file 'miral/CMakeLists.txt'
--- miral/CMakeLists.txt 2016-10-16 16:14:18 +0000
+++ miral/CMakeLists.txt 2016-11-04 16:34:03 +0000
@@ -31,6 +31,7 @@
31 application_authorizer.cpp ${CMAKE_SOURCE_DIR}/include/miral/application_authorizer.h31 application_authorizer.cpp ${CMAKE_SOURCE_DIR}/include/miral/application_authorizer.h
32 application_info.cpp ${CMAKE_SOURCE_DIR}/include/miral/application_info.h32 application_info.cpp ${CMAKE_SOURCE_DIR}/include/miral/application_info.h
33 canonical_window_manager.cpp ${CMAKE_SOURCE_DIR}/include/miral/canonical_window_manager.h33 canonical_window_manager.cpp ${CMAKE_SOURCE_DIR}/include/miral/canonical_window_manager.h
34 command_line_option.cpp ${CMAKE_SOURCE_DIR}/include/miral/command_line_option.h
34 cursor_theme.cpp ${CMAKE_SOURCE_DIR}/include/miral/cursor_theme.h35 cursor_theme.cpp ${CMAKE_SOURCE_DIR}/include/miral/cursor_theme.h
35 keymap.cpp ${CMAKE_SOURCE_DIR}/include/miral/keymap.h36 keymap.cpp ${CMAKE_SOURCE_DIR}/include/miral/keymap.h
36 runner.cpp ${CMAKE_SOURCE_DIR}/include/miral/runner.h37 runner.cpp ${CMAKE_SOURCE_DIR}/include/miral/runner.h
@@ -70,6 +71,14 @@
70 LINK_DEPENDS ${symbol_map}71 LINK_DEPENDS ${symbol_map}
71)72)
7273
74
75add_custom_target(check-symbols ALL
76 DEPENDS miral ${PROJECT_SOURCE_DIR}/debian/libmiral1.symbols
77 COMMAND dpkg-gensymbols -e${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libmiral.so.1 -plibmiral1 | scripts/filter_symbols_diff.sh
78 WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
79 VERBATIM
80)
81
73set(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}")82set(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}")
74set(INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include/miral")83set(INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include/miral")
7584
7685
=== modified file 'miral/application.cpp'
--- miral/application.cpp 2016-07-07 14:24:32 +0000
+++ miral/application.cpp 2016-11-04 16:34:03 +0000
@@ -34,3 +34,18 @@
34 ::kill(pid, sig);34 ::kill(pid, sig);
35 }35 }
36}36}
37
38auto miral::name_of(Application const& application) -> std::string
39{
40 return application->name();
41}
42
43auto miral::pid_of(Application const& application) -> pid_t
44{
45 return application->process_id();
46}
47
48void miral::apply_lifecycle_state_to(Application const& application, MirLifecycleState state)
49{
50 application->set_lifecycle_state(state);
51}
3752
=== modified file 'miral/application_info.cpp'
--- miral/application_info.cpp 2016-06-08 21:20:40 +0000
+++ miral/application_info.cpp 2016-11-04 16:34:03 +0000
@@ -19,6 +19,8 @@
19#include "miral/application_info.h"19#include "miral/application_info.h"
20#include "miral/window.h"20#include "miral/window.h"
2121
22#include <mir/scene/session.h>
23
22struct miral::ApplicationInfo::Self24struct miral::ApplicationInfo::Self
23{25{
24 Self() = default;26 Self() = default;
@@ -52,6 +54,11 @@
52 return *this;54 return *this;
53}55}
5456
57auto miral::ApplicationInfo::name() const -> std::string
58{
59 return self->app ? self->app->name() : std::string{};
60}
61
55auto miral::ApplicationInfo::application() const -> Application62auto miral::ApplicationInfo::application() const -> Application
56{63{
57 return self->app;64 return self->app;
5865
=== modified file 'miral/basic_window_manager.cpp'
--- miral/basic_window_manager.cpp 2016-10-10 14:53:39 +0000
+++ miral/basic_window_manager.cpp 2016-11-04 16:34:03 +0000
@@ -36,7 +36,7 @@
3636
37namespace37namespace
38{38{
39int const title_bar_height = 10;39int const title_bar_height = 12;
4040
41struct Locker41struct Locker
42{42{
@@ -400,6 +400,14 @@
400 mir_surface->request_client_surface_close();400 mir_surface->request_client_surface_close();
401}401}
402402
403void miral::BasicWindowManager::force_close(Window const& window)
404{
405 auto application = window.application();
406
407 if (application && window)
408 remove_surface(application, window);
409}
410
403auto miral::BasicWindowManager::active_window() const -> Window411auto miral::BasicWindowManager::active_window() const -> Window
404{412{
405 return mru_active_windows.top();413 return mru_active_windows.top();
406414
=== modified file 'miral/basic_window_manager.h'
--- miral/basic_window_manager.h 2016-09-29 14:41:11 +0000
+++ miral/basic_window_manager.h 2016-11-04 16:34:03 +0000
@@ -112,6 +112,8 @@
112112
113 void ask_client_to_close(Window const& window) override;113 void ask_client_to_close(Window const& window) override;
114114
115 void force_close(Window const& window) override;
116
115 auto active_window() const -> Window override;117 auto active_window() const -> Window override;
116118
117 auto select_active_window(Window const& hint) -> Window override;119 auto select_active_window(Window const& hint) -> Window override;
118120
=== added file 'miral/command_line_option.cpp'
--- miral/command_line_option.cpp 1970-01-01 00:00:00 +0000
+++ miral/command_line_option.cpp 2016-11-04 16:34:03 +0000
@@ -0,0 +1,199 @@
1/*
2 * Copyright © 2016 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#include "miral/command_line_option.h"
20
21#include <mir/server.h>
22#include <mir/options/option.h>
23
24namespace
25{
26template<typename Type>
27struct OptionType;
28
29template<>
30struct OptionType<bool>
31{
32 auto static constexpr value = mir::OptionType::boolean;
33};
34
35template<>
36struct OptionType<void>
37{
38 auto static constexpr value = mir::OptionType::null;
39};
40
41template<>
42struct OptionType<std::string>
43{
44 auto static constexpr value = mir::OptionType::string;
45};
46
47template<>
48struct OptionType<int>
49{
50 auto static constexpr value = mir::OptionType::integer;
51};
52}
53
54struct miral::CommandLineOption::Self
55{
56 template<typename Value_t>
57 Self(std::function<void(Value_t value)> callback,
58 std::string const& option,
59 std::string const& description,
60 Value_t default_value) :
61 setup{[=](mir::Server& server)
62 { server.add_configuration_option(option, description, default_value); }},
63 callback{[=](mir::Server& server)
64 { callback(server.get_options()->get<Value_t>(option.c_str())); }}
65 {
66 }
67
68 template<typename Value_t>
69 Self(std::function<void(Value_t const& value)> callback,
70 std::string const& option,
71 std::string const& description,
72 Value_t const& default_value) :
73 setup{[=](mir::Server& server)
74 { server.add_configuration_option(option, description, default_value); }},
75 callback{[=](mir::Server& server)
76 { callback(server.get_options()->get<Value_t>(option.c_str())); }}
77 {
78 }
79
80 template<typename Value_t>
81 Self(std::function<void(mir::optional_value<Value_t> const& value)> callback,
82 std::string const& option,
83 std::string const& description) :
84 setup{[=](mir::Server& server)
85 { server.add_configuration_option(option, description, OptionType<Value_t>::value); }},
86 callback{[=](mir::Server& server)
87 {
88 mir::optional_value<Value_t> optional_value;
89 auto const options = server.get_options();
90 if (options->is_set(option.c_str()))
91 optional_value = server.get_options()->get<Value_t>(option.c_str());
92 callback(optional_value);
93 }}
94 {
95 }
96
97 Self(std::function<void(bool is_set)> callback,
98 std::string const& option,
99 std::string const& description) :
100 setup{[=](mir::Server& server)
101 { server.add_configuration_option(option, description, OptionType<void>::value); }},
102 callback{[=](mir::Server& server)
103 {
104 auto const options = server.get_options();
105 callback(options->is_set(option.c_str()));
106 }}
107 {
108 }
109
110 std::function<void(mir::Server& server)> setup;
111 std::function<void(mir::Server& server)> callback;
112};
113
114miral::CommandLineOption::CommandLineOption(
115 std::function<void(int value)> callback,
116 std::string const& option,
117 std::string const& description,
118 int default_value) :
119 self{std::make_shared<Self>(callback, option, description, default_value)}
120{
121}
122
123miral::CommandLineOption::CommandLineOption(
124 std::function<void(double value)> callback,
125 std::string const& option,
126 std::string const& description,
127 double default_value) :
128 self{std::make_shared<Self>(callback, option, description, default_value)}
129{
130}
131
132miral::CommandLineOption::CommandLineOption(
133 std::function<void(std::string const& value)> callback,
134 std::string const& option,
135 std::string const& description,
136 std::string const& default_value) :
137 self{std::make_shared<Self>(callback, option, description, default_value)}
138{
139}
140
141miral::CommandLineOption::CommandLineOption(
142 std::function<void(std::string const& value)> callback,
143 std::string const& option,
144 std::string const& description,
145 char const* default_value) :
146 self{std::make_shared<Self>(callback, option, description, std::string{default_value})}
147{
148}
149
150miral::CommandLineOption::CommandLineOption(
151 std::function<void(bool value)> callback,
152 std::string const& option,
153 std::string const& description,
154 bool default_value) :
155 self{std::make_shared<Self>(callback, option, description, default_value)}
156{
157}
158
159miral::CommandLineOption::CommandLineOption(
160 std::function<void(mir::optional_value<int> const& value)> callback,
161 std::string const& option,
162 std::string const& description) :
163 self{std::make_shared<Self>(callback, option, description)}
164{
165}
166
167miral::CommandLineOption::CommandLineOption(
168 std::function<void(mir::optional_value<std::string> const& value)> callback,
169 std::string const& option,
170 std::string const& description) :
171 self{std::make_shared<Self>(callback, option, description)}
172{
173}
174
175miral::CommandLineOption::CommandLineOption(
176 std::function<void(mir::optional_value<bool> const& value)> callback,
177 std::string const& option,
178 std::string const& description) :
179 self{std::make_shared<Self>(callback, option, description)}
180{
181}
182
183miral::CommandLineOption::CommandLineOption(
184 std::function<void(bool is_set)> callback,
185 std::string const& option,
186 std::string const& description) :
187 self{std::make_shared<Self>(callback, option, description)}
188{
189}
190
191void miral::CommandLineOption::operator()(mir::Server& server) const
192{
193 self->setup(server);
194 server.add_init_callback([&]{ self->callback(server); });
195}
196
197miral::CommandLineOption::~CommandLineOption() = default;
198miral::CommandLineOption::CommandLineOption(CommandLineOption const&) = default;
199auto miral::CommandLineOption::operator=(CommandLineOption const&) -> CommandLineOption& = default;
0200
=== modified file 'miral/display_configuration_option.cpp'
--- miral/display_configuration_option.cpp 2016-04-05 11:10:11 +0000
+++ miral/display_configuration_option.cpp 2016-11-04 16:34:03 +0000
@@ -58,13 +58,13 @@
58}58}
5959
60PixelFormatSelector::PixelFormatSelector(60PixelFormatSelector::PixelFormatSelector(
61 std::shared_ptr<DisplayConfigurationPolicy> const& base_policy,61 std::shared_ptr<mg::DisplayConfigurationPolicy> const& base_policy,
62 bool with_alpha) :62 bool with_alpha) :
63 base_policy{base_policy},63 base_policy{base_policy},
64 with_alpha{with_alpha}64 with_alpha{with_alpha}
65{}65{}
6666
67void PixelFormatSelector::apply_to(mg::DisplayConfiguration & conf)67void PixelFormatSelector::apply_to(mg::DisplayConfiguration& conf)
68{68{
69 base_policy->apply_to(conf);69 base_policy->apply_to(conf);
70 conf.for_each_output(70 conf.for_each_output(
7171
=== modified file 'miral/keymap.cpp'
--- miral/keymap.cpp 2016-10-12 10:30:01 +0000
+++ miral/keymap.cpp 2016-11-04 16:34:03 +0000
@@ -53,13 +53,20 @@
53 void set_keymap(std::string const& keymap)53 void set_keymap(std::string const& keymap)
54 {54 {
55 std::lock_guard<decltype(mutex)> lock{mutex};55 std::lock_guard<decltype(mutex)> lock{mutex};
5656 auto get_next_token = [km = keymap]() mutable
57 auto const i = keymap.find('+');57 {
5858 auto const i = km.find('+');
59 layout = keymap.substr(0, i);59 auto ret = km.substr(0,i);
6060 if (i != std::string::npos)
61 if (i != std::string::npos)61 km = km.substr(i+1, std::string::npos);
62 variant = keymap.substr(i + 1);62 else
63 km = "";
64 return ret;
65 };
66
67 layout = get_next_token();
68 variant = get_next_token();
69 options = get_next_token();
6370
64 for (auto const& keyboard : keyboards)71 for (auto const& keyboard : keyboards)
65 apply_keymap(keyboard);72 apply_keymap(keyboard);
@@ -110,6 +117,7 @@
110117
111 keymap.layout = layout;118 keymap.layout = layout;
112 keymap.variant = variant;119 keymap.variant = variant;
120 keymap.options = options;
113 keyboard->apply_keyboard_configuration(std::move(keymap));121 keyboard->apply_keyboard_configuration(std::move(keymap));
114 }122 }
115#else123#else
@@ -134,6 +142,7 @@
134 std::mutex mutable mutex;142 std::mutex mutable mutex;
135 std::string layout;143 std::string layout;
136 std::string variant;144 std::string variant;
145 std::string options;
137 std::vector<std::shared_ptr<mir::input::Device>> keyboards;146 std::vector<std::shared_ptr<mir::input::Device>> keyboards;
138};147};
139148
@@ -156,7 +165,7 @@
156void miral::Keymap::operator()(mir::Server& server) const165void miral::Keymap::operator()(mir::Server& server) const
157{166{
158 if (self->layout.empty())167 if (self->layout.empty())
159 server.add_configuration_option(keymap_option, "keymap <layout>[+<variant>], e,g, \"gb\" or \"cz+qwerty\"", keymap_default);168 server.add_configuration_option(keymap_option, "keymap <layout>[+<variant>[+<options>]], e,g, \"gb\" or \"cz+qwerty\" or \"de++compose:caps\"", keymap_default);
160169
161 server.add_init_callback([this, &server]170 server.add_init_callback([this, &server]
162 {171 {
163172
=== modified file 'miral/symbols.map'
--- miral/symbols.map 2016-10-11 11:51:49 +0000
+++ miral/symbols.map 2016-11-04 16:34:03 +0000
@@ -313,3 +313,19 @@
313 vtable?for?miral::Keymap;313 vtable?for?miral::Keymap;
314 };314 };
315} MIRAL_0.2;315} MIRAL_0.2;
316
317MIRAL_0.4 {
318global:
319 extern "C++" {
320 miral::ApplicationInfo::name*;
321 miral::CommandLineOption::?CommandLineOption*;
322 miral::CommandLineOption::CommandLineOption*;
323 miral::CommandLineOption::operator*;
324 miral::WindowManagerTools::force_close*;
325 miral::apply_lifecycle_state_to*;
326 miral::name_of*;
327 miral::pid_of*;
328 typeinfo?for?miral::CommandLineOption;
329 vtable?for?miral::CommandLineOption;
330 };
331} MIRAL_0.3;
316332
=== modified file 'miral/window_management_trace.cpp'
--- miral/window_management_trace.cpp 2016-10-04 13:58:00 +0000
+++ miral/window_management_trace.cpp 2016-11-04 16:34:03 +0000
@@ -363,6 +363,14 @@
363 wrapped.ask_client_to_close(window);363 wrapped.ask_client_to_close(window);
364}364}
365365
366void miral::WindowManagementTrace::force_close(miral::Window const& window)
367{
368 log_input();
369 mir::log_info("%s -> %s", __func__, dump_of(window).c_str());
370 trace_count++;
371 wrapped.force_close(window);
372}
373
366auto miral::WindowManagementTrace::active_window() const -> Window374auto miral::WindowManagementTrace::active_window() const -> Window
367{375{
368 log_input();376 log_input();
369377
=== modified file 'miral/window_management_trace.h'
--- miral/window_management_trace.h 2016-09-29 14:41:11 +0000
+++ miral/window_management_trace.h 2016-11-04 16:34:03 +0000
@@ -49,6 +49,7 @@
49 virtual auto info_for(Window const& window) const -> WindowInfo& override;49 virtual auto info_for(Window const& window) const -> WindowInfo& override;
5050
51 virtual void ask_client_to_close(Window const& window) override;51 virtual void ask_client_to_close(Window const& window) override;
52 virtual void force_close(Window const& window) override;
5253
53 virtual auto active_window() const -> Window override;54 virtual auto active_window() const -> Window override;
54 virtual auto select_active_window(Window const& hint) -> Window override;55 virtual auto select_active_window(Window const& hint) -> Window override;
5556
=== modified file 'miral/window_manager_tools.cpp'
--- miral/window_manager_tools.cpp 2016-10-05 16:54:07 +0000
+++ miral/window_manager_tools.cpp 2016-11-04 16:34:03 +0000
@@ -50,6 +50,9 @@
50void miral::WindowManagerTools::ask_client_to_close(Window const& window)50void miral::WindowManagerTools::ask_client_to_close(Window const& window)
51{ tools->ask_client_to_close(window); }51{ tools->ask_client_to_close(window); }
5252
53void miral::WindowManagerTools::force_close(Window const& window)
54{ tools->force_close(window); }
55
53auto miral::WindowManagerTools::active_window() const -> Window56auto miral::WindowManagerTools::active_window() const -> Window
54{ return tools->active_window(); }57{ return tools->active_window(); }
5558
5659
=== modified file 'miral/window_manager_tools_implementation.h'
--- miral/window_manager_tools_implementation.h 2016-09-29 14:41:11 +0000
+++ miral/window_manager_tools_implementation.h 2016-11-04 16:34:03 +0000
@@ -54,6 +54,7 @@
54 virtual auto info_for(Window const& window) const -> WindowInfo& = 0;54 virtual auto info_for(Window const& window) const -> WindowInfo& = 0;
5555
56 virtual void ask_client_to_close(Window const& window) = 0;56 virtual void ask_client_to_close(Window const& window) = 0;
57 virtual void force_close(Window const& window) = 0;
57 virtual auto active_window() const -> Window = 0;58 virtual auto active_window() const -> Window = 0;
58 virtual auto select_active_window(Window const& hint) -> Window = 0;59 virtual auto select_active_window(Window const& hint) -> Window = 0;
59 virtual void drag_active_window(mir::geometry::Displacement movement) = 0;60 virtual void drag_active_window(mir::geometry::Displacement movement) = 0;
6061
=== added file 'scripts/filter_symbols_diff.sh'
--- scripts/filter_symbols_diff.sh 1970-01-01 00:00:00 +0000
+++ scripts/filter_symbols_diff.sh 2016-11-04 16:34:03 +0000
@@ -0,0 +1,2 @@
1#!/bin/sh
2c++filt | sed 's/+ \([^@]*[^[:space:]]*\)\(.*\)/+ (c++)"\1"\2/'
03
=== modified file 'scripts/process_doxygen_xml.py'
--- scripts/process_doxygen_xml.py 2016-10-06 08:26:40 +0000
+++ scripts/process_doxygen_xml.py 2016-11-04 16:34:03 +0000
@@ -1,79 +1,87 @@
1#! /usr/bin/python1#! /usr/bin/python
2from xml.dom import minidom
3from sys import argv
4
5helptext = \
6"""This script processes the XML generated by "make doc" and produces summary information2"""This script processes the XML generated by "make doc" and produces summary information
7on symbols that libmiral intends to make public.3on symbols that libmiral intends to make public.
84
9To use: Go to your build folder and run "make symbols"""""5To use: Go to your build folder and run "make symbols"""""
106
11debug = False7from xml.dom import minidom
128from sys import argv
13def get_text(node):9
14 rc = []10HELPTEXT = __doc__
11DEBUG = False
12
13def _get_text(node):
14 substrings = []
15 for node in node.childNodes:15 for node in node.childNodes:
16 if node.nodeType == node.TEXT_NODE:16 if node.nodeType == node.TEXT_NODE:
17 rc.append(node.data)17 substrings.append(node.data)
18 elif node.nodeType == node.ELEMENT_NODE:18 elif node.nodeType == node.ELEMENT_NODE:
19 rc.append(get_text(node))19 substrings.append(_get_text(node))
20 return ''.join(rc)20 return ''.join(substrings)
2121
22def get_text_for_element(parent, tagname):22def _get_text_for_element(parent, tagname):
23 rc = []23 substrings = []
24 nodes = parent.getElementsByTagName(tagname);24
25 for node in nodes : rc.append(get_text(node))25 for node in parent.getElementsByTagName(tagname):
26 return ''.join(rc)26 substrings.append(_get_text(node))
2727
28def get_file_location(node):28 return ''.join(substrings)
29
30def _get_file_location(node):
29 for node in node.childNodes:31 for node in node.childNodes:
30 if node.nodeType == node.ELEMENT_NODE and node.tagName == 'location':32 if node.nodeType == node.ELEMENT_NODE and node.tagName == 'location':
31 return node.attributes['file'].value33 return node.attributes['file'].value
32 if debug: print 'no location in:', node34 if DEBUG:
35 print 'no location in:', node
33 return None36 return None
34 37
35def has_element(node, tagname):38def _has_element(node, tagname):
36 for node in node.childNodes:39 for node in node.childNodes:
37 if node.nodeType == node.ELEMENT_NODE and node.tagName in tagname:40 if node.nodeType == node.ELEMENT_NODE and node.tagName in tagname:
38 return True41 return True
39 return False42 return False
4043
41def print_attribs(node, attribs):44def _print_attribs(node, attribs):
42 for attrib in attribs : print ' ', attrib, '=', node.attributes[attrib].value45 for attrib in attribs:
4346 print ' ', attrib, '=', node.attributes[attrib].value
44def concat_text_from_tags(parent, tagnames):47
45 rc = []48def _concat_text_from_tags(parent, tagnames):
46 for tag in tagnames : rc.append(get_text_for_element(parent, tag))49 substrings = []
47 return ''.join(rc)50
48 51 for tag in tagnames:
49def print_location(node):52 substrings.append(_get_text_for_element(parent, tag))
50 print ' ', 'location', '=', get_file_location(node)53
5154 return ''.join(substrings)
52def get_attribs(node):55
56def _print_location(node):
57 print ' ', 'location', '=', _get_file_location(node)
58
59def _get_attribs(node):
53 kind = node.attributes['kind'].value60 kind = node.attributes['kind'].value
54 static = node.attributes['static'].value61 static = node.attributes['static'].value
55 prot = node.attributes['prot'].value62 prot = node.attributes['prot'].value
56 return (kind, static, prot)63 return kind, static, prot
5764
58# Special cases for publishing anyway:65COMPONENT_MAP = {}
59publish_special_cases = {}66SYMBOLS = {'public' : set(), 'private' : set()}
6067
61component_map = {}68def _report(publish, symbol):
62symbols = {'public' : set(), 'private' : set()}
63
64def report(publish, symbol):
65 symbol = symbol.replace('~', '?')69 symbol = symbol.replace('~', '?')
6670
67 if symbol in publish_special_cases: publish = True71 if publish:
6872 SYMBOLS['public'].add(symbol)
69 if publish: symbols['public'].add(symbol)73 else:
70 else: symbols['private'].add(symbol)74 SYMBOLS['private'].add(symbol)
7175
72 if not debug: return76 if not DEBUG:
73 if publish: print ' PUBLISH: {}'.format(symbol)77 return
74 else : print 'NOPUBLISH: {}'.format(symbol)78
7579 if publish:
76old_stanzas = '''MIRAL_0.1 {80 print ' PUBLISH: {}'.format(symbol)
81 else:
82 print 'NOPUBLISH: {}'.format(symbol)
83
84OLD_STANZAS = '''MIRAL_0.1 {
77global:85global:
78 # We need to specify the overload of miral::WindowManagerTools::modify_window86 # We need to specify the overload of miral::WindowManagerTools::modify_window
79 _ZN5miral18WindowManagerTools13modify_windowERNS_10WindowInfoERKNS_19WindowSpecificationE;87 _ZN5miral18WindowManagerTools13modify_windowERNS_10WindowInfoERKNS_19WindowSpecificationE;
@@ -378,123 +386,161 @@
378global:386global:
379 # We need to specify the overload of miral::WindowManagerTools::modify_window387 # We need to specify the overload of miral::WindowManagerTools::modify_window
380 _ZN5miral18WindowManagerTools13modify_windowERKNS_6WindowERKNS_19WindowSpecificationE;388 _ZN5miral18WindowManagerTools13modify_windowERKNS_6WindowERKNS_19WindowSpecificationE;
389 extern "C++" {
390 miral::Keymap::?Keymap*;
391 miral::Keymap::Keymap*;
392 miral::Keymap::operator*;
393 miral::Keymap::set_keymap*;
394 miral::WindowSpecification::userdata*;
395 typeinfo?for?miral::Keymap;
396 vtable?for?miral::Keymap;
397 };
398} MIRAL_0.2;
399
400MIRAL_0.4 {
401global:
381 extern "C++" {'''402 extern "C++" {'''
382403
383end_new_stanza = ''' };404END_NEW_STANZA = ''' };
384} MIRAL_0.2;'''405} MIRAL_0.3;'''
385406
386def print_report():407def _print_report():
387 print old_stanzas408 print OLD_STANZAS
388 for symbol in sorted(symbols['public']):409 for symbol in sorted(SYMBOLS['public']):
389 formatted_symbol = ' {};'.format(symbol)410 formatted_symbol = ' {};'.format(symbol)
390 if not formatted_symbol in old_stanzas:411 if formatted_symbol not in OLD_STANZAS:
391 print formatted_symbol412 print formatted_symbol
392 print end_new_stanza413 print END_NEW_STANZA
393414
394def print_debug_info(node, attributes):415def _print_debug_info(node, attributes):
395 if not debug: return416 if not DEBUG:
417 return
396 print418 print
397 print_attribs(node, attributes)419 _print_attribs(node, attributes)
398 print_location(node)420 _print_location(node)
399421
400def find_physical_component(location_file):422def _parse_member_def(context_name, node, is_class):
401 path_elements = location_file.split('/')423 kind = node.attributes['kind'].value
402 found = False424
403 for element in path_elements:425 if (kind in ['enum', 'typedef']
404 if found: return element426 or _has_element(node, ['templateparamlist'])
405 found = element in ['include', 'src']427 or kind in ['function'] and node.attributes['inline'].value == 'yes'):
406 if debug: print 'no component in:', location_file428 return
407 return None429
408 430 name = _concat_text_from_tags(node, ['name'])
409def parse_member_def(context_name, node, is_class):431
410 (kind, static, prot) = get_attribs(node)
411
412 if kind in ['enum', 'typedef']: return
413 if has_element(node, ['templateparamlist']): return
414 if kind in ['function'] and node.attributes['inline'].value == 'yes': return
415
416 name = concat_text_from_tags(node, ['name'])
417 if name in ['__attribute__']:432 if name in ['__attribute__']:
418 if debug: print ' ignoring doxygen mis-parsing:', concat_text_from_tags(node, ['argsstring'])433 if DEBUG:
434 print ' ignoring doxygen mis-parsing:', _concat_text_from_tags(node, ['argsstring'])
419 return435 return
420436
421 if name.startswith('operator'): name = 'operator'437 if name.startswith('operator'):
422 if not context_name == None: symbol = context_name + '::' + name438 name = 'operator'
423 else: symbol = name439
440 if not context_name is None:
441 symbol = context_name + '::' + name
442 else:
443 symbol = name
444
445 is_function = kind == 'function'
446
447 if is_function:
448 _print_debug_info(node, ['kind', 'prot', 'static', 'virt'])
449 else:
450 _print_debug_info(node, ['kind', 'prot', 'static'])
451
452 if DEBUG:
453 print ' is_class:', is_class
454
455 publish = _should_publish(is_class, is_function, node)
456
457 _report(publish, symbol + '*')
458
459 if is_function and node.attributes['virt'].value == 'virtual':
460 _report(publish, 'non-virtual?thunk?to?' + symbol + '*')
461
462
463def _should_publish(is_class, is_function, node):
464 (kind, static, prot) = _get_attribs(node)
424465
425 publish = True466 publish = True
426467
427 is_function = kind == 'function'468 if publish:
428 if publish: publish = kind != 'define'469 publish = kind != 'define'
429 if publish and is_class: publish = is_function or static == 'yes'470
471 if publish and is_class:
472 publish = is_function or static == 'yes'
473
430 if publish and prot == 'private':474 if publish and prot == 'private':
431 if is_function: publish = node.attributes['virt'].value == 'virtual'475 if is_function:
432 else: publish = False476 publish = node.attributes['virt'].value == 'virtual'
433477 else:
434 if publish and has_element(node, ['argsstring']): 478 publish = False
435 publish = not get_text_for_element(node, 'argsstring').endswith('=0')479
436 480 if publish and _has_element(node, ['argsstring']):
437 if is_function: print_debug_info(node, ['kind', 'prot', 'static', 'virt'])481 publish = not _get_text_for_element(node, 'argsstring').endswith('=0')
438 else: print_debug_info(node, ['kind', 'prot', 'static'])482
439 if debug: print ' is_class:', is_class483 return publish
440 report(publish, symbol + '*')484
441 if is_function and node.attributes['virt'].value == 'virtual': report(publish,485
442 'non-virtual?thunk?to?' + symbol + '*')486def _parse_compound_defs(xmldoc):
443487 compounddefs = xmldoc.getElementsByTagName('compounddef')
444def parse_compound_defs(xmldoc):
445 compounddefs = xmldoc.getElementsByTagName('compounddef')
446 for node in compounddefs:488 for node in compounddefs:
447 kind = node.attributes['kind'].value489 kind = node.attributes['kind'].value
448490
449 if kind in ['page', 'file', 'example', 'union']: continue491 if kind in ['page', 'file', 'example', 'union']:
450492 continue
451 if kind in ['group']: 493
452 for member in node.getElementsByTagName('memberdef') : 494 if kind in ['group']:
453 parse_member_def(None, member, False)495 for member in node.getElementsByTagName('memberdef'):
454 continue496 _parse_member_def(None, member, False)
455497 continue
456 if kind in ['namespace']: 498
457 symbol = concat_text_from_tags(node, ['compoundname'])499 if kind in ['namespace']:
458 for member in node.getElementsByTagName('memberdef') : 500 symbol = _concat_text_from_tags(node, ['compoundname'])
459 parse_member_def(symbol, member, False)501 for member in node.getElementsByTagName('memberdef'):
460 continue502 _parse_member_def(symbol, member, False)
461 503 continue
462 file = get_file_location(node)504
463 if debug: print ' from file:', file 505 filename = _get_file_location(node)
464 if '/examples/' in file or '/test/' in file or '[generated]' in file or '[STL]' in file:506
465 continue507 if DEBUG:
466508 print ' from file:', filename
467 if has_element(node, ['templateparamlist']): continue509
468510 if ('/examples/' in filename or '/test/' in filename or '[generated]' in filename
469 symbol = concat_text_from_tags(node, ['compoundname'])511 or '[STL]' in filename or _has_element(node, ['templateparamlist'])):
470 512 continue
513
514 symbol = _concat_text_from_tags(node, ['compoundname'])
515
471 publish = True516 publish = True
472517
473 if publish: 518 if publish:
474 if kind in ['class', 'struct']:519 if kind in ['class', 'struct']:
475 prot = node.attributes['prot'].value520 prot = node.attributes['prot'].value
476 publish = prot != 'private'521 publish = prot != 'private'
477 print_debug_info(node, ['kind', 'prot'])522 _print_debug_info(node, ['kind', 'prot'])
478 report(publish, 'vtable?for?' + symbol)523 _report(publish, 'vtable?for?' + symbol)
479 report(publish, 'typeinfo?for?' + symbol)524 _report(publish, 'typeinfo?for?' + symbol)
480525
481 if publish: 526 if publish:
482 for member in node.getElementsByTagName('memberdef') : 527 for member in node.getElementsByTagName('memberdef'):
483 parse_member_def(symbol, member, kind in ['class', 'struct'])528 _parse_member_def(symbol, member, kind in ['class', 'struct'])
484529
485if __name__ == "__main__":530if __name__ == "__main__":
486 if len(argv) == 1 or '-h' in argv or '--help' in argv:531 if len(argv) == 1 or '-h' in argv or '--help' in argv:
487 print helptext532 print HELPTEXT
488 exit()533 exit()
489534
490 for arg in argv[1:]:535 for arg in argv[1:]:
491 try:536 try:
492 if debug: print 'Processing:', arg537 if DEBUG:
493 xmldoc = minidom.parse(arg)538 print 'Processing:', arg
494 parse_compound_defs(xmldoc)539 _parse_compound_defs(minidom.parse(arg))
495 except Exception as error:540 except Exception as error:
496 print 'Error:', arg, error541 print 'Error:', arg, error
497542
498 if debug: print 'Processing complete'543 if DEBUG:
544 print 'Processing complete'
499545
500 print_report()546 _print_report()
501547
=== modified file 'tasks_for_the_interested_reader.md'
--- tasks_for_the_interested_reader.md 2016-09-21 16:36:56 +0000
+++ tasks_for_the_interested_reader.md 2016-11-04 16:34:03 +0000
@@ -37,9 +37,6 @@
37 - Titlebars. GTK+ apps provide their own titlebars, better integration is37 - Titlebars. GTK+ apps provide their own titlebars, better integration is
38 needed.38 needed.
39 39
40 - Keyboard layouts. It should be possible to configure and use non-US keyboard
41 layouts.
42
43 - Better integration of startup animation. A short animation is played on40 - Better integration of startup animation. A short animation is played on
44 startup. Ideally this should remain visible until a client is launched,41 startup. Ideally this should remain visible until a client is launched,
45 fade out over the top of the client and resume when the last client exits.42 fade out over the top of the client and resume when the last client exits.
@@ -72,9 +69,6 @@
72 - ability to track connected input devices69 - ability to track connected input devices
73 - ability to control cursor visibility70 - ability to control cursor visibility
74 71
75 - Cursor images. lp:qtmir stubs the cursor images and paints the cursor in its
76 compositor. Need to consider what ought to be supported here.
77
78 - Cut&Paste/Drag&Drop toolkits expect this functionality, but it isn't72 - Cut&Paste/Drag&Drop toolkits expect this functionality, but it isn't
79 provided by Mir. We ought to find a way to provide this.73 provided by Mir. We ought to find a way to provide this.
8074

Subscribers

People subscribed via source and target branches