2 * Copyright (C) 2017 Canonical, Ltd.
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Lesser General Public License version 3, as published by
6 * the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10 * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17#include "ScreenAttached.h"
18#include "ScreenWindow.h"
24ScreenAttached::ScreenAttached(QObject *owner)
28 if (auto item = qobject_cast<QQuickItem*>(owner)) {
29 connect(item, &QQuickItem::windowChanged, this, &ScreenAttached::windowChanged);
30 windowChanged(item->window());
31 } else if (auto window = qobject_cast<QQuickWindow*>(owner)) {
32 windowChanged(window);
36WorkspaceModel *ScreenAttached::workspaces() const
38 if (!m_screen) return nullptr;
39 return m_screen->workspaces();
42Workspace *ScreenAttached::currentWorkspace() const
44 if (!m_screen) return nullptr;
45 return m_screen->currentWorkspace();
48void ScreenAttached::setCurrentWorkspace(Workspace *workspace)
50 if (!m_screen) return;
51 return m_screen->setCurrentWorkspace(workspace);
54void ScreenAttached::windowChanged(QQuickWindow *window)
57 disconnect(m_window, &QWindow::screenChanged, this, &ScreenAttached::screenChanged);
61 auto screenWindow = qobject_cast<ScreenWindow*>(window);
64 screenChanged2(screenWindow->screenWrapper());
65 connect(screenWindow, &ScreenWindow::screenWrapperChanged, this, &ScreenAttached::screenChanged2);
67 screenChanged(window ? window->screen() : NULL);
69 connect(window, &QWindow::screenChanged, this, &ScreenAttached::screenChanged);
74void ScreenAttached::screenChanged(QScreen *qscreen)
76 // Find a screen that matches.
77 // Should only get here in mocks if we don't have a ScreenWindow
78 Screen* screen{nullptr};
79 Q_FOREACH(auto s, ConcreteScreens::self()->list()) {
80 if (s->qscreen() == qscreen) {
84 screenChanged2(screen);
87void ScreenAttached::screenChanged2(Screen* screen)
89 if (screen == m_screen) return;
91 Screen* oldScreen = m_screen;
95 oldScreen->disconnect(this);
98 return; //Don't bother emitting signals, because the new values are garbage anyways
100 if (!oldScreen || screen->isActive() != oldScreen->isActive())
101 Q_EMIT activeChanged(screen->isActive());
102 if (!oldScreen || screen->used() != oldScreen->used())
103 Q_EMIT usedChanged();
104 if (!oldScreen || screen->name() != oldScreen->name())
105 Q_EMIT nameChanged();
106 if (!oldScreen || screen->outputType() != oldScreen->outputType())
107 Q_EMIT outputTypeChanged();
108 if (!oldScreen || screen->scale() != oldScreen->scale())
109 Q_EMIT scaleChanged();
110 if (!oldScreen || screen->formFactor() != oldScreen->formFactor())
111 Q_EMIT formFactorChanged();
112 if (!oldScreen || screen->powerMode() != oldScreen->powerMode())
113 Q_EMIT powerModeChanged();
114 if (!oldScreen || screen->orientation() != oldScreen->orientation())
115 Q_EMIT orientationChanged();
116 if (!oldScreen || screen->position() != oldScreen->position())
117 Q_EMIT positionChanged();
118 if (!oldScreen || screen->currentModeIndex() != oldScreen->currentModeIndex())
119 Q_EMIT currentModeIndexChanged();
120 if (!oldScreen || screen->physicalSize() != oldScreen->physicalSize())
121 Q_EMIT physicalSizeChanged();
122 if (!oldScreen || screen->currentWorkspace() != oldScreen->currentWorkspace())
123 Q_EMIT currentWorkspaceChanged(currentWorkspace());
126 QVector<qtmir::ScreenMode*> oldModes;
127 auto oldModesQmlList = oldScreen->availableModes();
128 for (int i = 0; i < oldModesQmlList.count(&oldModesQmlList); i++) {
129 oldModes << oldModesQmlList.at(&oldModesQmlList, i);
132 QVector<qtmir::ScreenMode*> newModes;
133 auto newModesQmlList = screen->availableModes();
134 for (int i = 0; i < newModesQmlList.count(&newModesQmlList); i++) {
135 newModes << newModesQmlList.at(&newModesQmlList, i);
138 if (newModes != newModes) {
139 Q_EMIT availableModesChanged();
142 Q_EMIT availableModesChanged();
145 connectToScreen(screen);
148ScreenAttached *WMScreen::qmlAttachedProperties(QObject *owner)
150 return new ScreenAttached(owner);
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list