Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwaylandxdgtopleveliconv1.cpp
Go to the documentation of this file.
1// Copyright (C) 2024 David Reondo <kde@david-redondo.de>
2// Copyright (C) 2024 David Edmundson <davidedmundson@kde.org>
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4
6
7#include <QtWaylandClient/private/qwaylanddisplay_p.h>
8#include <QtWaylandClient/private/qwaylandshmbackingstore_p.h>
9
10#include <QIcon>
11#include <QDir>
12#include <QPainter>
13
15
16namespace QtWaylandClient {
17
19{
20public:
21 QWaylandXdgToplevelIconV1(::xdg_toplevel_icon_v1 *object, QWaylandDisplay *display)
22 : QtWayland::xdg_toplevel_icon_v1(object), mDisplay(display)
23 {
24 }
25
27 destroy();
28 }
29
30 void addPixmap(const QPixmap &pixmap)
31 {
32 Q_ASSERT(!pixmap.isNull());
33 const QSize squareSize = pixmap.size().expandedTo(pixmap.size().transposed());
34 auto buffer = std::make_unique<QWaylandShmBuffer>(mDisplay, squareSize, QImage::Format_ARGB32, pixmap.devicePixelRatio());
35 QRect targetRect = pixmap.rect();
36 targetRect.moveCenter(buffer->image()->rect().center());
37 QPainter painter(buffer->image());
38 painter.drawPixmap(targetRect, pixmap, pixmap.rect());
39 add_buffer(buffer->buffer(), buffer->scale());
40 mBuffers.push_back(std::move(buffer));
41 }
42
43private:
44 QWaylandDisplay *mDisplay;
46};
47
49 wl_registry *registry,
50 uint32_t id, int version)
52{
53}
54
59
61{
62 mPreferredSizes.push_back(size);
63}
64
66
67void QWaylandXdgToplevelIconManagerV1::setIcon(const QIcon &icon, xdg_toplevel *window)
68{
69 if (icon.isNull()) {
70 set_icon(window, nullptr);
71 return;
72 }
73
74 auto toplevelIcon = std::make_unique<QWaylandXdgToplevelIconV1>(create_icon(), mDisplay);
75
76 const QString name = icon.name();
77 const bool validName = !name.isEmpty() && !QDir::isAbsolutePath(name);
78 if (validName) {
79 toplevelIcon->set_name(name);
80 }
81
82 QList<QSize> iconSizes = icon.availableSizes();
83 // if icon has no default size (an SVG)
84 if (iconSizes.isEmpty()) {
85 iconSizes.reserve(mPreferredSizes.size());
86 for (int size : std::as_const(mPreferredSizes)) {
87 iconSizes.append(QSize(size, size));
88 }
89 }
90 // if the compositor hasn't sent a preferred size
91 if (iconSizes.isEmpty()) {
92 iconSizes.append(QSize(64, 64));
93 }
94
95 bool hasPixmaps = false;
96 for (const QSize &size : std::as_const(iconSizes)) {
97 const QPixmap pixmap = icon.pixmap(size, 1.0);
98 if (pixmap.isNull()) {
99 qCWarning(lcQpaWayland) << "QWaylandXdgToplevelIconManagerV1: Failed to get pixmap of size" << size << "for icon" << icon;
100 continue;
101 }
102
103 toplevelIcon->addPixmap(pixmap);
104 hasPixmaps = true;
105 }
106
107 if (validName || hasPixmaps) {
108 set_icon(window, toplevelIcon->object());
109 } else {
110 set_icon(window, nullptr);
111 }
112}
113
114} // namespace QtWaylandClient
115
116QT_END_NAMESPACE
void setIcon(const QIcon &icon, ::xdg_toplevel *window)
QWaylandXdgToplevelIconManagerV1(QWaylandDisplay *display, wl_registry *registry, uint32_t id, int version)
QWaylandXdgToplevelIconV1(::xdg_toplevel_icon_v1 *object, QWaylandDisplay *display)
Combined button and popup list for selecting options.