/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** 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 The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/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: https://www.gnu.org/licenses/fdl-1.3.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 common usage pattern is as follows:
    \snippet qxcbwindowfunctions/main.cpp 0

    \note There is no binary compatibility guarantee for this class,
    meaning that an application using it is only guaranteed to work with the Qt
    version it was developed against.
*/

/*!
    \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 the
    value returned by setWmWindowTypeIdentifier().
*/

/*!
    \fn QByteArray QXcbWindowFunctions::setWmWindowTypeIdentifier()

    This function returns the byte array 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.
*/

/*!
    \typedef QXcbWindowFunctions::SetWmWindowRole
    \since 5.6.2

    This is the typedef for the function returned by
    QGuiApplication::platformFunction when passed the
    value returned by setWmWindowRoleIdentifier().
*/

/*!
    \fn QByteArray QXcbWindowFunctions::setWmWindowRoleIdentifier()
    \since 5.6.2

    This function returns the byte array that can be used to query
    QGuiApplication::platformFunction to retrieve the SetWmWindowRole function.
*/

/*!
    \fn void QXcbWindowFunctions::setWmWindowRole(QWindow *window, const QByteArray &role)
    \since 5.6.2

    Sets the WM_WINDOW_ROLE property from \a role on the corresponding
    X11 window.

    This is a convenience function that can be used directly instead
    of resolving the function pointer. \a window and \a role will be
    relayed to the function retrieved by QGuiApplication.
*/

/*!
    \typedef QXcbWindowFunctions::SetWmWindowIconText

    This is the typedef for the function returned by
    QGuiApplication::platformFunction when passed the
    value returned by setWmWindowIconTextIdentifier().
*/

/*!
    \fn const QByteArray QXcbWindowFunctions::setWmWindowIconTextIdentifier()

    This function returns the byte array that can be used to query
    QGuiApplication::platformFunction to retrieve the SetWmWindowIconText function.
*/

/*!
    \fn void QXcbWindowFunctions::setWmWindowIconText(QWindow *window, const QString& text)

    This is a convenience function that can be used directly instead
    of resolving the function pointer.  \a window and \a text will be
    relayed to the function retrieved by QGuiApplication.
*/

/*!
    \typedef QXcbWindowFunctions::VisualId

    This is the typedef for the function returned by
    QGuiApplication::platformFunction when passed the
    value returned by visualIdIdentifier().
*/

/*!
    \fn const QByteArray QXcbWindowFunctions::visualIdIdentifier()

    This function returns the byte array that can be used to query
    QGuiApplication::platformFunction to retrieve the VisualId function.
*/

/*!
    \fn uint QXcbWindowFunctions::visualId(QWindow *window)

    This is a convenience function that can be used directly instead
    of resolving the function pointer.  \a window will be
    relayed to the function retrieved by QGuiApplication.

    Returns the unsigned integer result of calling the function or
    UINT_MAX if the function was not found.
*/

