Revert "Suppress QWindowSystemInterface inclusion warnings."
[profile/ivi/qtwayland.git] / src / plugins / platforms / wayland / qwaylandsubsurface.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the plugins of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "qwaylandsubsurface.h"
43
44 #include "qwaylandwindow.h"
45
46 #include "wayland-sub-surface-extension-client-protocol.h"
47
48 #include <QtCore/QDebug>
49
50 QWaylandSubSurfaceExtension::QWaylandSubSurfaceExtension(QWaylandDisplay *display, uint32_t id)
51 {
52     m_sub_surface_extension = static_cast<struct wl_sub_surface_extension *>(
53                 wl_display_bind(display->wl_display(),id, &wl_sub_surface_extension_interface));
54 }
55
56 QWaylandSubSurface *QWaylandSubSurfaceExtension::getSubSurfaceAwareWindow(QWaylandWindow *window)
57 {
58     struct wl_surface *surface = window->wl_surface();
59     Q_ASSERT(surface);
60     struct wl_sub_surface *sub_surface =
61             wl_sub_surface_extension_get_sub_surface_aware_surface(m_sub_surface_extension,surface);
62
63     return new QWaylandSubSurface(window,sub_surface);
64
65 }
66
67 QWaylandSubSurface::QWaylandSubSurface(QWaylandWindow *window, struct wl_sub_surface *sub_surface)
68     : m_window(window)
69     , m_sub_surface(sub_surface)
70 {
71 }
72
73 void QWaylandSubSurface::setParent(const QWaylandWindow *parent)
74 {
75     QWaylandSubSurface *parentSurface = parent? parent->subSurfaceWindow():0;
76     if (parentSurface) {
77         int x = m_window->geometry().x() + parent->frameMargins().left();
78         int y = m_window->geometry().y() + parent->frameMargins().top();
79         wl_sub_surface_attach_sub_surface(parentSurface->m_sub_surface,m_sub_surface,x,y);
80     }
81 }
82
83 static void setPositionToParent(QWaylandWindow *parentWaylandWindow)
84 {
85     QObjectList children = parentWaylandWindow->window()->children();
86     for (int i = 0; i < children.size(); i++) {
87         QWindow *childWindow = qobject_cast<QWindow *>(children.at(i));
88         if (!childWindow)
89             continue;
90
91         if (childWindow->handle()) {
92             QWaylandWindow *waylandWindow = static_cast<QWaylandWindow *>(childWindow->handle());
93             waylandWindow->subSurfaceWindow()->setParent(parentWaylandWindow);
94             setPositionToParent(waylandWindow);
95         }
96     }
97 }
98
99 void QWaylandSubSurface::adjustPositionOfChildren()
100 {
101     QWindow *window = m_window->window();
102     if (window->parent()) {
103         qDebug() << "QWaylandSubSurface::adjustPositionOfChildren not called for toplevel window";
104     }
105     setPositionToParent(m_window);
106 }