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
7
8#include <QtWaylandClient/private/qwaylanddisplay_p.h>
9#include <QtWaylandClient/private/qwaylandshmbackingstore_p.h>
10
11#include <QIcon>
12#include <QDir>
13#include <QPainter>
14
16
17namespace QtWaylandClient {
18
20{
21public:
22 QWaylandXdgToplevelIconV1(::xdg_toplevel_icon_v1 *object, QWaylandDisplay *display)
23 : QtWayland::xdg_toplevel_icon_v1(object), mDisplay(display)
24 {
25 }
26
28 destroy();
29 }
30
31 void addPixmap(const QPixmap &pixmap)
32 {
33 Q_ASSERT(!pixmap.isNull());
34 const QSize squareSize = pixmap.size().expandedTo(pixmap.size().transposed());
35 auto buffer = std::make_unique<QWaylandShmBuffer>(mDisplay, squareSize, QImage::Format_ARGB32, pixmap.devicePixelRatio());
36 QRect targetRect = pixmap.rect();
37 targetRect.moveCenter(buffer->image()->rect().center());
38 QPainter painter(buffer->image());
39 painter.drawPixmap(targetRect, pixmap, pixmap.rect());
40 add_buffer(buffer->buffer(), buffer->scale());
41 mBuffers.push_back(std::move(buffer));
42 }
43
44private:
45 QWaylandDisplay *mDisplay;
47};
48
50 wl_registry *registry,
51 uint32_t id, int version)
53{
54}
55
60
62{
63 mPreferredSizes.push_back(size);
64}
65
67
68void QWaylandXdgToplevelIconManagerV1::setIcon(const QIcon &icon, xdg_toplevel *window)
69{
70 if (icon.isNull()) {
71 set_icon(window, nullptr);
72 return;
73 }
74
75 auto toplevelIcon = std::make_unique<QWaylandXdgToplevelIconV1>(create_icon(), mDisplay);
76
77 const QString name = icon.name();
78 const bool validName = !name.isEmpty() && !QDir::isAbsolutePath(name);
79 if (validName) {
80 toplevelIcon->set_name(name);
81 }
82
83 QList<QSize> iconSizes = icon.availableSizes();
84 // if icon has no default size (an SVG)
85 if (iconSizes.isEmpty()) {
86 iconSizes.reserve(mPreferredSizes.size());
87 for (int size : std::as_const(mPreferredSizes)) {
88 iconSizes.append(QSize(size, size));
89 }
90 }
91 // if the compositor hasn't sent a preferred size
92 if (iconSizes.isEmpty()) {
93 iconSizes.append(QSize(64, 64));
94 }
95
96 bool hasPixmaps = false;
97 for (const QSize &size : std::as_const(iconSizes)) {
98 const QPixmap pixmap = icon.pixmap(size, 1.0);
99 if (pixmap.isNull()) {
100 qCWarning(lcQpaWayland) << "QWaylandXdgToplevelIconManagerV1: Failed to get pixmap of size" << size << "for icon" << icon;
101 continue;
102 }
103
104 toplevelIcon->addPixmap(pixmap);
105 hasPixmaps = true;
106 }
107
108 if (validName || hasPixmaps) {
109 set_icon(window, toplevelIcon->object());
110 } else {
111 set_icon(window, nullptr);
112 }
113}
114
115} // namespace QtWaylandClient
116
117QT_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)