1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the plugins of the Qt Toolkit.
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.
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.
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.
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.
40 ****************************************************************************/
42 #include "qwaylandsubsurface.h"
44 #include "qwaylandwindow.h"
46 #include "wayland-sub-surface-extension-client-protocol.h"
48 #include <QtCore/QDebug>
50 QWaylandSubSurfaceExtension::QWaylandSubSurfaceExtension(QWaylandDisplay *display, uint32_t id)
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));
56 QWaylandSubSurface *QWaylandSubSurfaceExtension::getSubSurfaceAwareWindow(QWaylandWindow *window)
58 struct wl_surface *surface = window->wl_surface();
60 struct wl_sub_surface *sub_surface =
61 wl_sub_surface_extension_get_sub_surface_aware_surface(m_sub_surface_extension,surface);
63 return new QWaylandSubSurface(window,sub_surface);
67 QWaylandSubSurface::QWaylandSubSurface(QWaylandWindow *window, struct wl_sub_surface *sub_surface)
69 , m_sub_surface(sub_surface)
73 void QWaylandSubSurface::setParent(const QWaylandWindow *parent)
75 QWaylandSubSurface *parentSurface = parent? parent->subSurfaceWindow():0;
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);
83 static void setPositionToParent(QWaylandWindow *parentWaylandWindow)
85 QObjectList children = parentWaylandWindow->window()->children();
86 for (int i = 0; i < children.size(); i++) {
87 QWindow *childWindow = qobject_cast<QWindow *>(children.at(i));
91 if (childWindow->handle()) {
92 QWaylandWindow *waylandWindow = static_cast<QWaylandWindow *>(childWindow->handle());
93 waylandWindow->subSurfaceWindow()->setParent(parentWaylandWindow);
94 setPositionToParent(waylandWindow);
99 void QWaylandSubSurface::adjustPositionOfChildren()
101 QWindow *window = m_window->window();
102 if (window->parent()) {
103 qDebug() << "QWaylandSubSurface::adjustPositionOfChildren not called for toplevel window";
105 setPositionToParent(m_window);