xcb: implement and deprecate QWidget::setWindowIconText()

This is a little-used feature which only affects how minimized icons
are displayed on certain older window managers, and is not necessary
even then.  It has not been implemented in Qt 5 until now.

Task-number: QTBUG-44659
Change-Id: Ie6ead7a6f922878b349a096d905bf7f675dc2f31
Reviewed-by: Jørgen Lind <jorgen.lind@theqtcompany.com>
This commit is contained in:
Shawn Rutledge 2015-03-02 16:53:33 +01:00
parent 653bdcca8e
commit 8b0fcd8718
9 changed files with 56 additions and 10 deletions

View File

@ -150,7 +150,7 @@ QT_BEGIN_NAMESPACE
\value HoverLeave The mouse cursor leaves a hover widget (QHoverEvent).
\value HoverMove The mouse cursor moves inside a hover widget (QHoverEvent).
\value IconDrag The main icon of a window has been dragged away (QIconDragEvent).
\value IconTextChange Widget's icon text has been changed.
\value IconTextChange Widget's icon text has been changed. (Deprecated)
\value InputMethod An input method is being used (QInputMethodEvent).
\value InputMethodQuery A input method query event (QInputMethodQueryEvent)
\value KeyboardLayoutChange The keyboard layout has changed.

View File

@ -133,7 +133,7 @@ public:
EnabledChange = 98, // enabled state has changed
ActivationChange = 99, // window activation has changed
StyleChange = 100, // style has changed
IconTextChange = 101, // icon text has changed
IconTextChange = 101, // icon text has changed. Deprecated.
ModifiedChange = 102, // modified state has changed
MouseTrackingChange = 109, // mouse tracking state has changed

View File

@ -69,6 +69,13 @@ public:
return QXcbFunctionsHelper::callPlatformFunction<void, SetWmWindowType, QWindow *, WmWindowType>(setWmWindowTypeIdentifier(), window, type);
}
typedef void (*SetWmWindowIconText)(QWindow *window, const QString &text);
static const QByteArray setWmWindowIconTextIdentifier() { return QByteArrayLiteral("XcbSetWmWindowIconText"); }
static void setWmWindowIconText(QWindow *window, const QString &text)
{
return QXcbFunctionsHelper::callPlatformFunction<void, SetWmWindowIconText, QWindow *, const QString &>(setWmWindowIconTextIdentifier(), window, text);
}
typedef void (*SetParentRelativeBackPixmap)(const QWindow *window);
static const QByteArray setParentRelativeBackPixmapIdentifier() { return QByteArrayLiteral("XcbSetParentRelativeBackPixmap"); }
static void setParentRelativeBackPixmap(const QWindow *window)

View File

@ -331,6 +331,9 @@ QFunctionPointer QXcbNativeInterface::platformFunction(const QByteArray &functio
if (function == QXcbWindowFunctions::setWmWindowTypeIdentifier())
return QFunctionPointer(QXcbWindowFunctions::SetWmWindowType(QXcbWindow::setWmWindowTypeStatic));
if (function == QXcbWindowFunctions::setWmWindowIconTextIdentifier())
return QFunctionPointer(QXcbWindowFunctions::SetWmWindowIconText(QXcbWindow::setWindowIconTextStatic));
if (function == QXcbWindowFunctions::setParentRelativeBackPixmapIdentifier())
return QFunctionPointer(QXcbWindowFunctions::SetParentRelativeBackPixmap(QXcbWindow::setParentRelativeBackPixmapStatic));

View File

@ -1393,10 +1393,22 @@ void QXcbWindow::setWindowTitle(const QString &title)
xcb_flush(xcb_connection());
}
void QXcbWindow::setWindowIconText(const QString &title)
{
const QByteArray ba = title.toUtf8();
Q_XCB_CALL(xcb_change_property(xcb_connection(),
XCB_PROP_MODE_REPLACE,
m_window,
atom(QXcbAtom::_NET_WM_ICON_NAME),
atom(QXcbAtom::UTF8_STRING),
8,
ba.length(),
ba.constData()));
}
void QXcbWindow::setWindowIcon(const QIcon &icon)
{
QVector<quint32> icon_data;
if (!icon.isNull()) {
QList<QSize> availableSizes = icon.availableSizes();
if (availableSizes.isEmpty()) {
@ -1561,6 +1573,12 @@ void QXcbWindow::setWmWindowTypeStatic(QWindow *window, QXcbWindowFunctions::WmW
window->setProperty(wm_window_type_property_id, QVariant::fromValue(static_cast<int>(windowTypes)));
}
void QXcbWindow::setWindowIconTextStatic(QWindow *window, const QString &text)
{
if (window->handle())
static_cast<QXcbWindow *>(window->handle())->setWindowIconText(text);
}
QXcbWindowFunctions::WmWindowTypes QXcbWindow::wmWindowTypes() const
{
QXcbWindowFunctions::WmWindowTypes result(0);

View File

@ -86,6 +86,7 @@ public:
QPoint mapFromGlobal(const QPoint &pos) const Q_DECL_OVERRIDE;
void setWindowTitle(const QString &title) Q_DECL_OVERRIDE;
void setWindowIconText(const QString &title);
void setWindowIcon(const QIcon &icon) Q_DECL_OVERRIDE;
void raise() Q_DECL_OVERRIDE;
void lower() Q_DECL_OVERRIDE;
@ -142,6 +143,8 @@ public:
QXcbWindowFunctions::WmWindowTypes wmWindowTypes() const;
void setWmWindowType(QXcbWindowFunctions::WmWindowTypes types);
static void setWindowIconTextStatic(QWindow *window, const QString &text);
static void setParentRelativeBackPixmapStatic(QWindow *window);
void setParentRelativeBackPixmap();

View File

@ -100,6 +100,7 @@
#include "qwindowcontainer_p.h"
#include <QtPlatformHeaders/qxcbwindowfunctions.h>
// widget/widget data creation count
//#define QWIDGET_EXTRA_DEBUG
@ -704,7 +705,7 @@ void QWidget::setAutoFillBackground(bool enabled)
close().
\row \li Top-level windows \li
\l windowModified, \l windowTitle, \l windowIcon, \l windowIconText,
\l windowModified, \l windowTitle, \l windowIcon,
\l isActiveWindow, activateWindow(), \l minimized, showMinimized(),
\l maximized, showMaximized(), \l fullScreen, showFullScreen(),
showNormal().
@ -5934,7 +5935,7 @@ void QWidget::unsetLocale()
window title, if set. This is done by the QPA plugin, so it is shown to the
user, but isn't part of the windowTitle string.
\sa windowIcon, windowIconText, windowModified, windowFilePath
\sa windowIcon, windowModified, windowFilePath
*/
QString QWidget::windowTitle() const
{
@ -6029,7 +6030,11 @@ void QWidgetPrivate::setWindowIconText_helper(const QString &title)
void QWidgetPrivate::setWindowIconText_sys(const QString &iconText)
{
Q_UNUSED(iconText);
Q_Q(QWidget);
// ### The QWidget property is deprecated, but the XCB window function is not.
// It should remain available for the rare application that needs it.
if (QWindow *window = q->windowHandle())
QXcbWindowFunctions::setWmWindowIconText(window, iconText);
}
/*!
@ -6039,6 +6044,9 @@ void QWidgetPrivate::setWindowIconText_sys(const QString &iconText)
new \a iconText as an argument.
\since 5.2
\obsolete
This signal is deprecated.
*/
void QWidget::setWindowIconText(const QString &iconText)
@ -6089,7 +6097,7 @@ void QWidget::setWindowTitle(const QString &title)
has been set, windowIcon() returns the application icon
(QApplication::windowIcon()).
\sa windowIconText, windowTitle
\sa windowTitle
*/
QIcon QWidget::windowIcon() const
{
@ -6149,10 +6157,15 @@ void QWidgetPrivate::setWindowIcon_sys()
/*!
\property QWidget::windowIconText
\brief the widget's icon text
\brief the text to be displayed on the icon of a minimized window
This property only makes sense for windows. If no icon
text has been set, this functions returns an empty string.
text has been set, this accessor returns an empty string.
It is only implemented on the X11 platform, and only certain
window managers use this window property.
\obsolete
This property is deprecated.
\sa windowIcon, windowTitle
*/

View File

@ -165,7 +165,7 @@ class Q_WIDGETS_EXPORT QWidget : public QObject, public QPaintDevice
Q_PROPERTY(bool acceptDrops READ acceptDrops WRITE setAcceptDrops)
Q_PROPERTY(QString windowTitle READ windowTitle WRITE setWindowTitle NOTIFY windowTitleChanged DESIGNABLE isWindow)
Q_PROPERTY(QIcon windowIcon READ windowIcon WRITE setWindowIcon NOTIFY windowIconChanged DESIGNABLE isWindow)
Q_PROPERTY(QString windowIconText READ windowIconText WRITE setWindowIconText NOTIFY windowIconTextChanged DESIGNABLE isWindow)
Q_PROPERTY(QString windowIconText READ windowIconText WRITE setWindowIconText NOTIFY windowIconTextChanged DESIGNABLE isWindow) // deprecated
Q_PROPERTY(double windowOpacity READ windowOpacity WRITE setWindowOpacity DESIGNABLE isWindow)
Q_PROPERTY(bool windowModified READ isWindowModified WRITE setWindowModified DESIGNABLE isWindow)
#ifndef QT_NO_TOOLTIP

View File

@ -50,6 +50,8 @@ PropertyWatcher::PropertyWatcher(QObject *subject, QString annotation, QWidget *
if (prop.isReadable()) {
PropertyField* field = new PropertyField(m_subject, prop);
m_layout->addRow(prop.name(), field);
if (!qstrcmp(prop.name(), "name"))
setWindowIconText(prop.read(subject).toString());
}
}
QPushButton *updateButton = new QPushButton("update");