~alan-griffiths/miral/workaround-1667645

« back to all changes in this revision

Viewing changes to miral/basic_window_manager.h

  • Committer: Alan Griffiths
  • Date: 2017-02-17 12:46:18 UTC
  • mfrom: (497.7.45 miral4)
  • Revision ID: alan@octopull.co.uk-20170217124618-vqlhp26kejycwtz6
[libmiral] Support for shells implementing workspaces

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * Copyright © 2015-2016 Canonical Ltd.
 
2
 * Copyright © 2015-2017 Canonical Ltd.
3
3
 *
4
4
 * This program is free software: you can redistribute it and/or modify it
5
5
 * under the terms of the GNU General Public License version 3,
31
31
#include <mir/shell/abstract_shell.h>
32
32
#include <mir/shell/window_manager.h>
33
33
 
 
34
#include <boost/bimap.hpp>
 
35
#include <boost/bimap/multiset_of.hpp>
 
36
 
34
37
#include <map>
35
38
#include <mutex>
36
39
 
41
44
 
42
45
namespace miral
43
46
{
 
47
class WorkspacePolicy;
44
48
using mir::shell::SurfaceSet;
45
49
using WindowManagementPolicyBuilder =
46
50
    std::function<std::unique_ptr<miral::WindowManagementPolicy>(miral::WindowManagerTools const& tools)>;
97
101
        MirWindowAttrib attrib,
98
102
        int value) override;
99
103
 
 
104
    auto create_workspace() -> std::shared_ptr<Workspace> override;
 
105
 
 
106
    void add_tree_to_workspace(Window const& window, std::shared_ptr<Workspace> const& workspace) override;
 
107
 
 
108
    void remove_tree_from_workspace(Window const& window, std::shared_ptr<Workspace> const& workspace) override;
 
109
 
 
110
    void for_each_workspace_containing(
 
111
        Window const& window,
 
112
        std::function<void(std::shared_ptr<Workspace> const& workspace)> const& callback) override;
 
113
 
 
114
    void for_each_window_in_workspace(
 
115
        std::shared_ptr<Workspace> const& workspace, std::function<void(Window const&)> const& callback) override;
 
116
 
100
117
    auto count_applications() const -> unsigned int override;
101
118
 
102
119
    void for_each_application(std::function<void(ApplicationInfo& info)> const& functor) override;
149
166
    std::shared_ptr<mir::shell::DisplayLayout> const display_layout;
150
167
    std::shared_ptr<mir::shell::PersistentSurfaceStore> const persistent_surface_store;
151
168
    std::unique_ptr<WindowManagementPolicy> const policy;
 
169
    WorkspacePolicy* const workspace_policy;
152
170
 
153
171
    std::mutex mutex;
154
172
    SessionInfoMap app_info;
160
178
    using FullscreenSurfaces = std::set<Window>;
161
179
    FullscreenSurfaces fullscreen_surfaces;
162
180
 
 
181
    friend class Workspace;
 
182
    using wwbimap_t = boost::bimap<
 
183
        boost::bimaps::multiset_of<std::weak_ptr<Workspace>, std::owner_less<std::weak_ptr<Workspace>>>,
 
184
        boost::bimaps::multiset_of<Window>>;
 
185
 
 
186
    wwbimap_t workspaces_to_windows;
 
187
 
 
188
    // Workspaces may die without any sync with the BWM mutex
 
189
    struct DeadWorkspaces
 
190
    {
 
191
        std::mutex mutable dead_workspaces_mutex;
 
192
        std::vector<std::weak_ptr<Workspace>> workspaces;
 
193
    } dead_workspaces;
 
194
 
 
195
    struct Locker;
 
196
 
163
197
    void update_event_timestamp(MirKeyboardEvent const* kev);
164
198
    void update_event_timestamp(MirPointerEvent const* pev);
165
199
    void update_event_timestamp(MirTouchEvent const* tev);
166
200
 
167
201
    auto can_activate_window_for_session(miral::Application const& session) -> bool;
 
202
    auto can_activate_window_for_session_in_workspace(
 
203
        miral::Application const& session,
 
204
        std::vector<std::shared_ptr<Workspace>> const& workspaces) -> bool;
168
205
 
169
206
    auto place_new_surface(ApplicationInfo const& app_info, WindowSpecification parameters) -> WindowSpecification;
170
207
    auto place_relative(mir::geometry::Rectangle const& parent, miral::WindowSpecification const& parameters, Size size)
177
214
    void set_state(miral::WindowInfo& window_info, MirWindowState value);
178
215
    auto fullscreen_rect_for(WindowInfo const& window_info) const -> Rectangle;
179
216
    void remove_window(Application const& application, miral::WindowInfo const& info);
 
217
    void refocus(Application const& application, Window const& parent,
 
218
                 std::vector<std::shared_ptr<Workspace>> const& workspaces_containing_window);
 
219
    auto workspaces_containing(Window const& window) const -> std::vector<std::shared_ptr<Workspace>>;
180
220
};
181
221
}
182
222