on xenial help sign in
check for surfaces
7d9e47dNick Dedekind
plugins/WindowManager/TopLevelWindowModel.cpp+10−2
@@ -35,7 +35,7 @@
35#include <qtmir/mirserverapplication.h>
35#include <qtmir/mirserverapplication.h>
36#include <qtmir/windowmodelnotifier.h>
36#include <qtmir/windowmodelnotifier.h>
37
37
38−Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
38+Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel")
39
39
40#define DEBUG_MSG qCDebug(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
40#define DEBUG_MSG qCDebug(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
41#define INFO_MSG qCInfo(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
41#define INFO_MSG qCInfo(TOPLEVELWINDOWMODEL).nospace().noquote() << __func__
@@ -136,6 +136,7 @@ void TopLevelWindowModel::setWorkspace(Workspace *workspace)
136
136
137 if (m_workspace) {
137 if (m_workspace) {
138 m_windowModel.clear();
138 m_windowModel.clear();
139+ m_allSurfaces.clear();
139 if (m_applicationManager) {
140 if (m_applicationManager) {
140 disconnect(m_applicationManager, 0, this, 0);
141 disconnect(m_applicationManager, 0, this, 0);
141 }
142 }
@@ -237,6 +238,7 @@ void TopLevelWindowModel::prependSurfaceHelper(unityapi::MirSurfaceInterface *su
237 Window *window = createWindow(surface);
238 Window *window = createWindow(surface);
238
239
239 m_windowModel.prepend(ModelEntry(window, application));
240 m_windowModel.prepend(ModelEntry(window, application));
241+ m_allSurfaces.insert(surface);
240 if (surface) {
242 if (surface) {
241 connectSurface(surface);
243 connectSurface(surface);
242 }
244 }
@@ -371,6 +373,7 @@ void TopLevelWindowModel::onSurfaceDestroyed(unityapi::MirSurfaceInterface *surf
371 auto window = m_windowModel[i].window;
373 auto window = m_windowModel[i].window;
372 window->setSurface(nullptr);
374 window->setSurface(nullptr);
373 window->setFocused(false);
375 window->setFocused(false);
376+ m_allSurfaces.remove(surface);
374 INFO_MSG << " Removed surface from entry. After: " << toString();
377 INFO_MSG << " Removed surface from entry. After: " << toString();
375 }
378 }
376}
379}
@@ -397,7 +400,7 @@ void TopLevelWindowModel::onSurfacesAddedToWorkspace(const std::shared_ptr<miral
397 if (workspace != m_workspace->workspace()) return;
400 if (workspace != m_workspace->workspace()) return;
398
401
399 Q_FOREACH(auto surface, surfaces) {
402 Q_FOREACH(auto surface, surfaces) {
400− DEBUG_MSG << "(" << surface << ")";
403+ if (m_allSurfaces.contains(surface)) continue;
401
404
402 if (surface->parentSurface()) {
405 if (surface->parentSurface()) {
403 // Wrap it in a Window so that we keep focusedWindow() up to date.
406 // Wrap it in a Window so that we keep focusedWindow() up to date.
@@ -444,6 +447,7 @@ void TopLevelWindowModel::removeAt(int index)
444 window->setFocused(false);
447 window->setFocused(false);
445
448
446 m_windowModel.removeAt(index);
449 m_windowModel.removeAt(index);
450+ m_allSurfaces.remove(window->surface());
447
451
448 if (m_modelState == RemovingState) {
452 if (m_modelState == RemovingState) {
449 endRemoveRows();
453 endRemoveRows();
@@ -765,7 +769,11 @@ void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
765
769
766void TopLevelWindowModel::refreshWindows()
770void TopLevelWindowModel::refreshWindows()
767{
771{
772+ DEBUG_MSG << "()";
773+
768 m_windowModel.clear();
774 m_windowModel.clear();
775+ m_allSurfaces.clear();
776+
769 WindowManagementPolicy::instance()->forEachWindowInWorkspace(m_workspace->workspace(), [this](const miral::Window &window) {
777 WindowManagementPolicy::instance()->forEachWindowInWorkspace(m_workspace->workspace(), [this](const miral::Window &window) {
770 auto surface = m_surfaceManager->surfaceFor(window);
778 auto surface = m_surfaceManager->surfaceFor(window);
771 if (surface) {
779 if (surface) {
plugins/WindowManager/TopLevelWindowModel.h+3−1
@@ -250,10 +250,12 @@ private:
250 bool removeOnceSurfaceDestroyed{false};
250 bool removeOnceSurfaceDestroyed{false};
251 };
251 };
252
252
253− Workspace* m_workspace{nullptr};
254 QVector<ModelEntry> m_windowModel;
253 QVector<ModelEntry> m_windowModel;
255 Window* m_inputMethodWindow{nullptr};
254 Window* m_inputMethodWindow{nullptr};
256 Window* m_focusedWindow{nullptr};
255 Window* m_focusedWindow{nullptr};
256+ Workspace* m_workspace{nullptr};
257+ // track all the surfaces we've been told about.
258+ QSet<unity::shell::application::MirSurfaceInterface*> m_allSurfaces;
257
259
258 int m_nextId{1};
260 int m_nextId{1};
259 // Just something big enough that we don't risk running out of unused id numbers.
261 // Just something big enough that we don't risk running out of unused id numbers.
src/libunity8-private/windowmanagementpolicy.cpp+7−6
@@ -41,8 +41,9 @@ void WindowManagementPolicy::advise_new_window(miral::WindowInfo const& window_i
41
41
42 auto const parent = window_info.parent();
42 auto const parent = window_info.parent();
43
43
44− if (!parent && m_activeWorkspace)
44+ auto activeWorkspace = m_activeWorkspace.lock();
45+ if (!parent && activeWorkspace)
45− tools.add_tree_to_workspace(window_info.window(), m_activeWorkspace);
46+ tools.add_tree_to_workspace(window_info.window(), activeWorkspace);
46}
47}
47
48
48std::shared_ptr<miral::Workspace> WindowManagementPolicy::createWorkspace()
49std::shared_ptr<miral::Workspace> WindowManagementPolicy::createWorkspace()
@@ -50,8 +51,8 @@ std::shared_ptr<miral::Workspace> WindowManagementPolicy::createWorkspace()
50 auto workspace = tools.create_workspace();
51 auto workspace = tools.create_workspace();
51 m_workspaces.insert(workspace);
52 m_workspaces.insert(workspace);
52
53
53− if (m_activeWorkspace == m_dummyWorkspace) {
54+ if (m_activeWorkspace.lock() == m_dummyWorkspace) {
54− tools.move_workspace_content_to_workspace(workspace, m_dummyWorkspace);
55+ moveWorkspaceContentToWorkspace(workspace, m_dummyWorkspace);
55 m_activeWorkspace = workspace;
56 m_activeWorkspace = workspace;
56 }
57 }
57 return workspace;
58 return workspace;
@@ -64,7 +65,7 @@ void WindowManagementPolicy::releaseWorkspace(const std::shared_ptr<miral::Works
64
65
65 if (m_workspaces.size() == 0) {
66 if (m_workspaces.size() == 0) {
66 m_activeWorkspace = m_dummyWorkspace;
67 m_activeWorkspace = m_dummyWorkspace;
67− tools.move_workspace_content_to_workspace(m_dummyWorkspace, workspace);
68+ moveWorkspaceContentToWorkspace(m_dummyWorkspace, workspace);
68 }
69 }
69}
70}
70
71
@@ -80,7 +81,7 @@ void WindowManagementPolicy::moveWorkspaceContentToWorkspace(const std::shared_p
80
81
81void WindowManagementPolicy::setActiveWorkspace(const std::shared_ptr<miral::Workspace> &workspace)
82void WindowManagementPolicy::setActiveWorkspace(const std::shared_ptr<miral::Workspace> &workspace)
82{
83{
83− if (workspace == m_activeWorkspace)
84+ if (m_activeWorkspace.lock() == workspace)
84 return;
85 return;
85 m_activeWorkspace = workspace ? workspace : m_dummyWorkspace;
86 m_activeWorkspace = workspace ? workspace : m_dummyWorkspace;
86}
87}
src/libunity8-private/windowmanagementpolicy.h+2−6
@@ -17,15 +17,12 @@
17#ifndef UNITY_WINDOWMANAGEMENTPOLICY_H
17#ifndef UNITY_WINDOWMANAGEMENTPOLICY_H
18#define UNITY_WINDOWMANAGEMENTPOLICY_H
18#define UNITY_WINDOWMANAGEMENTPOLICY_H
19
19
20−#include <QObject>
21#include <qtmir/windowmanagementpolicy.h>
20#include <qtmir/windowmanagementpolicy.h>
22
21
23#include <unordered_set>
22#include <unordered_set>
24
23
25−class Q_DECL_EXPORT WindowManagementPolicy : public QObject,
24+class Q_DECL_EXPORT WindowManagementPolicy : public qtmir::WindowManagementPolicy
26− public qtmir::WindowManagementPolicy
27{
25{
28− Q_OBJECT
29public:
26public:
30 WindowManagementPolicy(const miral::WindowManagerTools &tools, qtmir::WindowManagementPolicyPrivate& dd);
27 WindowManagementPolicy(const miral::WindowManagerTools &tools, qtmir::WindowManagementPolicyPrivate& dd);
31
28
@@ -43,12 +40,11 @@ public:
43 void moveWorkspaceContentToWorkspace(const std::shared_ptr<miral::Workspace> &toWorkspace,
40 void moveWorkspaceContentToWorkspace(const std::shared_ptr<miral::Workspace> &toWorkspace,
44 const std::shared_ptr<miral::Workspace> &fromWorkspace);
41 const std::shared_ptr<miral::Workspace> &fromWorkspace);
45
42
46−public Q_SLOTS:
47 void setActiveWorkspace(const std::shared_ptr<miral::Workspace>& workspace);
43 void setActiveWorkspace(const std::shared_ptr<miral::Workspace>& workspace);
48
44
49private:
45private:
50 static WindowManagementPolicy* m_self;
46 static WindowManagementPolicy* m_self;
51− std::shared_ptr<miral::Workspace> m_activeWorkspace;
47+ std::weak_ptr<miral::Workspace> m_activeWorkspace;
52
48
53 std::unordered_set<std::shared_ptr<miral::Workspace>> m_workspaces;
49 std::unordered_set<std::shared_ptr<miral::Workspace>> m_workspaces;
54 const std::shared_ptr<miral::Workspace> m_dummyWorkspace;
50 const std::shared_ptr<miral::Workspace> m_dummyWorkspace;