on 669c2af help sign in
237 lines 5.5 kB history raw
1/*
2 * Copyright (C) 2016 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
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 */
17#include "Window.h"
19// unity-api
20#include <unity/shell/application/MirSurfaceInterface.h>
22#include <QQmlEngine>
23#include <QTextStream>
25namespace unityapi = unity::shell::application;
27Q_LOGGING_CATEGORY(UNITY_WINDOW, "unity.window", QtWarningMsg)
29#define DEBUG_MSG qCDebug(UNITY_WINDOW).nospace() << qPrintable(toString()) << "::" << __func__
31Window::Window(int id, QObject *parent)
32 : QObject(parent)
33 , m_id(id)
35 DEBUG_MSG << "()";
36 QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
39Window::~Window()
41 DEBUG_MSG << "()";
44QPoint Window::position() const
46 return m_position;
49QPoint Window::requestedPosition() const
51 return m_requestedPosition;
54void Window::setRequestedPosition(const QPoint &value)
56 m_positionRequested = true;
57 if (value != m_requestedPosition) {
58 m_requestedPosition = value;
59 Q_EMIT requestedPositionChanged(m_requestedPosition);
60 if (m_surface) {
61 m_surface->setRequestedPosition(value);
62 } else {
63 // fake-miral: always comply
64 m_position = m_requestedPosition;
65 Q_EMIT positionChanged(m_position);
66 }
67 }
70Mir::State Window::state() const
72 return m_state;
75bool Window::focused() const
77 return m_focused;
80bool Window::confinesMousePointer() const
82 if (m_surface) {
83 return m_surface->confinesMousePointer();
84 } else {
85 return false;
86 }
89int Window::id() const
91 return m_id;
94unityapi::MirSurfaceInterface* Window::surface() const
96 return m_surface;
99void Window::requestState(Mir::State state)
101 m_stateRequested = true;
102 if (m_surface) {
103 m_surface->requestState(state);
104 } else if (m_state != state) {
105 m_state = state;
106 Q_EMIT stateChanged(m_state);
107 }
110void Window::close()
112 if (m_surface) {
113 m_surface->close();
114 } else {
115 Q_EMIT closeRequested();
116 }
119void Window::activate()
121 DEBUG_MSG << "()";
122 if (m_surface) {
123 m_surface->activate();
124 } else {
125 Q_EMIT emptyWindowActivated();
126 }
129void Window::setSurface(unityapi::MirSurfaceInterface *surface)
131 DEBUG_MSG << "(" << surface << ")";
132 if (m_surface) {
133 disconnect(m_surface, 0, this, 0);
134 }
136 m_surface = surface;
138 if (m_surface) {
139 connect(surface, &unityapi::MirSurfaceInterface::focusRequested, this, [this]() {
140 Q_EMIT focusRequested();
141 });
143 connect(surface, &unityapi::MirSurfaceInterface::closeRequested, this, &Window::closeRequested);
145 connect(surface, &unityapi::MirSurfaceInterface::positionChanged, this, [this]() {
146 updatePosition();
147 });
149 connect(surface, &unityapi::MirSurfaceInterface::stateChanged, this, [this]() {
150 updateState();
151 });
153 connect(surface, &unityapi::MirSurfaceInterface::focusedChanged, this, [this]() {
154 updateFocused();
155 });
157 // bring it up to speed
158 if (m_positionRequested) {
159 m_surface->setRequestedPosition(m_requestedPosition);
160 }
161 if (m_stateRequested && m_surface->state() == Mir::RestoredState) {
162 m_surface->requestState(m_state);
163 }
165 // and sync with surface
166 updatePosition();
167 updateState();
168 updateFocused();
169 }
171 Q_EMIT surfaceChanged(surface);
174void Window::updatePosition()
176 if (m_surface->position() != m_position) {
177 m_position = m_surface->position();
178 Q_EMIT positionChanged(m_position);
179 }
182void Window::updateState()
184 if (m_surface->state() != m_state) {
185 m_state = m_surface->state();
186 Q_EMIT stateChanged(m_state);
187 }
190void Window::updateFocused()
192 if (m_surface->focused() != m_focused) {
193 m_focused = m_surface->focused();
194 Q_EMIT focusedChanged(m_focused);
195 }
198void Window::setFocused(bool value)
200 if (value != m_focused) {
201 DEBUG_MSG << "(" << value << ")";
202 m_focused = value;
203 Q_EMIT focusedChanged(m_focused);
204 // when we have a surface we get focus changes from updateFocused() instead
205 Q_ASSERT(!m_surface);
206 }
209QString Window::toString() const
211 QString result;
212 {
213 QTextStream stream(&result);
214 stream << "Window["<<(void*)this<<", id="<<id()<<", ";
215 if (surface()) {
216 stream << "MirSurface["<<(void*)surface()<<",\""<<surface()->name()<<"\"]";
217 } else {
218 stream << "null";
219 }
220 stream << "]";
221 }
222 return result;
225QDebug operator<<(QDebug dbg, const Window *window)
227 QDebugStateSaver saver(dbg);
228 dbg.nospace();
230 if (window) {
231 dbg << qPrintable(window->toString());
232 } else {
233 dbg << (void*)(window);
234 }
236 return dbg;