From 5c287474541c865cc9e3e7caa1a6b819041d8279 Mon Sep 17 00:00:00 2001 From: Jorgen Lind Date: Fri, 2 May 2014 11:04:49 +0200 Subject: Use QtPlatformHeaders to set platform specific functionality This involves exposing a new function in the QPlatformNativeInterface which gets a public function for QGuiApplication Proof of concept is done through implementing _NET_WM_WINDOW_TYPE setters for xcb Change-Id: Ic9544e775fb71cc9b30273595ec41b1cdb1c9d64 Reviewed-by: Laszlo Agocs --- src/platformheaders/doc/qtplatformheaders.qdocconf | 4 +- .../doc/snippets/qxcbwindowfunctions/main.cpp | 61 +++++++++++++++ src/platformheaders/doc/src/qtplatformheaders.qdoc | 14 ++++ src/platformheaders/platformheaders.pro | 1 + .../xcbfunctions/qxcbwindowfunctions.h | 88 ++++++++++++++++++++++ .../xcbfunctions/qxcbwindowfunctions.qdoc | 79 +++++++++++++++++++ src/platformheaders/xcbfunctions/xcbfunctions.pri | 1 + 7 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 src/platformheaders/doc/snippets/qxcbwindowfunctions/main.cpp create mode 100644 src/platformheaders/xcbfunctions/qxcbwindowfunctions.h create mode 100644 src/platformheaders/xcbfunctions/qxcbwindowfunctions.qdoc create mode 100644 src/platformheaders/xcbfunctions/xcbfunctions.pri (limited to 'src/platformheaders') diff --git a/src/platformheaders/doc/qtplatformheaders.qdocconf b/src/platformheaders/doc/qtplatformheaders.qdocconf index dfef69f892..65fe660b40 100644 --- a/src/platformheaders/doc/qtplatformheaders.qdocconf +++ b/src/platformheaders/doc/qtplatformheaders.qdocconf @@ -12,7 +12,9 @@ project = QtPlatformHeaders headerdirs += .. sourcedirs += .. -exampledirs += .. +exampledirs += .. \ + snippets + imagedirs += images depends += qtdoc qtcore qtgui qtwidgets diff --git a/src/platformheaders/doc/snippets/qxcbwindowfunctions/main.cpp b/src/platformheaders/doc/snippets/qxcbwindowfunctions/main.cpp new file mode 100644 index 0000000000..d4cb965bda --- /dev/null +++ b/src/platformheaders/doc/snippets/qxcbwindowfunctions/main.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +//! [0] +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + QPushButton topLevelWidget("Hello World!"); + topLevelWidget.winId(); //have to create the QWindow + + QWindow *tlwWindow = topLevelWidget.windowHandle(); + + QXcbWindowFunctions::setWmWindowType(tlwWindow, QXcbWindowFunctions::Dock); + + topLevelWidget.show(); + + return app.exec(); +} +//! [0] + diff --git a/src/platformheaders/doc/src/qtplatformheaders.qdoc b/src/platformheaders/doc/src/qtplatformheaders.qdoc index 4ed740d296..74df288d3d 100644 --- a/src/platformheaders/doc/src/qtplatformheaders.qdoc +++ b/src/platformheaders/doc/src/qtplatformheaders.qdoc @@ -61,8 +61,22 @@ platforms a different class will be used. These classes are all placed in the Qt Platform Headers module. + Platform headers can be used in conjunction with + QGuiApplication::platformFunction() to give a type safe interface to + platform specific functionality. It is possible for headers defined in + QtPlatformHeaders to define typedefs for functions that can be returned by + a platform plugin from QGuiApplication::platformFunction(). Headers in + QtPlatformHeaders can also implement wrapper functions for the function + pointer, giving a static function that can be called from any context after + the platform integration has been created. An implementation of this + pattern is QXcbWindowFunctions::setWmWindowType(). This function retrieves + a function pointer from QGuiApplication::platformFunction, and executes + that function if the requested function was returned. + \note Similar to the other QPA APIs, there are no binary compatibility guarantees for these classes, meaning that an application using these classes is only guaranteed to work with the Qt version it was developed against. Unlike QPA however, source compatibility is guaranteed. + + \sa QXcbWindowFunctions */ diff --git a/src/platformheaders/platformheaders.pro b/src/platformheaders/platformheaders.pro index daf63e7f6c..f99afc4998 100644 --- a/src/platformheaders/platformheaders.pro +++ b/src/platformheaders/platformheaders.pro @@ -4,6 +4,7 @@ VERSION = $$MODULE_VERSION MODULE_INCNAME = QtPlatformHeaders include(nativecontexts/nativecontexts.pri) +include(xcbfunctions/xcbfunctions.pri) QMAKE_DOCS = $$PWD/doc/qtplatformheaders.qdocconf diff --git a/src/platformheaders/xcbfunctions/qxcbwindowfunctions.h b/src/platformheaders/xcbfunctions/qxcbwindowfunctions.h new file mode 100644 index 0000000000..48fc0c13b6 --- /dev/null +++ b/src/platformheaders/xcbfunctions/qxcbwindowfunctions.h @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QXCBWINDOWFUNCTIONS_H +#define QXCBWINDOWFUNCTIONS_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QWindow; + +class QXcbWindowFunctions { +public: + enum WmWindowType { + Normal = 0x000001, + Desktop = 0x000002, + Dock = 0x000004, + Toolbar = 0x000008, + Menu = 0x000010, + Utility = 0x000020, + Splash = 0x000040, + Dialog = 0x000080, + DropDownMenu = 0x000100, + PopupMenu = 0x000200, + Tooltip = 0x000400, + Notification = 0x000800, + Combo = 0x001000, + Dnd = 0x002000, + KdeOverride = 0x004000 + }; + + Q_DECLARE_FLAGS(WmWindowTypes, WmWindowType) + + typedef void (*SetWmWindowType)(QWindow *window, QXcbWindowFunctions::WmWindowTypes windowType); + static const QByteArray setWmWindowTypeIdentifier() { return QByteArrayLiteral("XcbSetWmWindowType"); } + + static void setWmWindowType(QWindow *window, WmWindowType type) + { + SetWmWindowType func = reinterpret_cast(QGuiApplication::platformFunction(setWmWindowTypeIdentifier())); + if (func) + func(window, type); + } +}; + + +QT_END_NAMESPACE + +#endif // QXCBWINDOWFUNCTIONS_H diff --git a/src/platformheaders/xcbfunctions/qxcbwindowfunctions.qdoc b/src/platformheaders/xcbfunctions/qxcbwindowfunctions.qdoc new file mode 100644 index 0000000000..76af207b3f --- /dev/null +++ b/src/platformheaders/xcbfunctions/qxcbwindowfunctions.qdoc @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \class QXcbWindowFunctions + \inmodule QtPlatformHeaders + + \brief The QXcbWindowFunctions class is an inline class containing + miscellaneous functionality for xcb window specific functionality. + + A commen usage pattern is as follows: + \snippet qxcbwindowfunctions/main.cpp 0 +*/ + +/*! + \enum QXcbWindowFunctions::WmWindowType + + This enum represents the supported WM_WINDOW_TYPE atoms. + + \value Normal + \value Desktop + \value Dock + \value Toolbar + \value Menu + \value Utility + \value Splash + \value Dialog + \value DropDownMenu + \value PopupMenu + \value Tooltip + \value Notification + \value Combo + \value Dnd + \value KdeOverride +*/ + +/*! + \typedef QXcbWindowFunctions::SetWmWindowType + + This is the typedef for the function returned by QGuiApplication::platformFunction when passed setWmWindowTypeIdentifier. +*/ + +/*! + \fn QByteArray QXcbWindowFunctions::setWmWindowTypeIdentifier() + + This function returnes the bytearray that can be used to query + QGuiApplication::platformFunction to retrieve the SetWmWindowType function. +*/ + +/*! + \fn void QXcbWindowFunctions::setWmWindowType(QWindow *window, WmWindowType type) + + This is a convenience function that can be used directly instead of resolving the function pointer. + \a window and \a type will be relayed to the function retrieved by QGuiApplication +*/ diff --git a/src/platformheaders/xcbfunctions/xcbfunctions.pri b/src/platformheaders/xcbfunctions/xcbfunctions.pri new file mode 100644 index 0000000000..8844913cd1 --- /dev/null +++ b/src/platformheaders/xcbfunctions/xcbfunctions.pri @@ -0,0 +1 @@ +HEADERS += $$PWD/qxcbwindowfunctions.h -- cgit v1.2.3