Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
// Qt-Security score:significant reason:default
5
6
#
include
"qwaylandxdgtopleveliconv1_p.h"
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
15
QT_BEGIN_NAMESPACE
16
17
namespace
QtWaylandClient
{
18
19
class
QWaylandXdgToplevelIconV1
:
public
QtWayland
::
xdg_toplevel_icon_v1
20
{
21
public
:
22
QWaylandXdgToplevelIconV1
(::xdg_toplevel_icon_v1 *object, QWaylandDisplay *display)
23
:
QtWayland
::
xdg_toplevel_icon_v1
(
object
), mDisplay(display)
24
{
25
}
26
27
~
QWaylandXdgToplevelIconV1
()
override
{
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
44
private
:
45
QWaylandDisplay *mDisplay;
46
std
::
vector
<
std
::
unique_ptr
<
QWaylandShmBuffer
>>
mBuffers
;
47
};
48
49
QWaylandXdgToplevelIconManagerV1
::
QWaylandXdgToplevelIconManagerV1
(QWaylandDisplay *display,
50
wl_registry *registry,
51
uint32_t id,
int
version)
52
:
QtWayland
::
xdg_toplevel_icon_manager_v1
(
registry
,
id
,
version
), mDisplay(display)
53
{
54
}
55
56
QWaylandXdgToplevelIconManagerV1
::~
QWaylandXdgToplevelIconManagerV1
()
57
{
58
destroy();
59
}
60
61
void
QWaylandXdgToplevelIconManagerV1
::
xdg_toplevel_icon_manager_v1_icon_size
(int32_t size)
62
{
63
mPreferredSizes.push_back(size);
64
}
65
66
void
QWaylandXdgToplevelIconManagerV1
::
xdg_toplevel_icon_manager_v1_done
() { }
67
68
void
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
117
QT_END_NAMESPACE
QtWaylandClient::QWaylandXdgToplevelIconManagerV1
Definition
qwaylandxdgtopleveliconv1_p.h:22
QtWaylandClient::QWaylandXdgToplevelIconManagerV1::setIcon
void setIcon(const QIcon &icon, ::xdg_toplevel *window)
Definition
qwaylandxdgtopleveliconv1.cpp:68
QtWaylandClient::QWaylandXdgToplevelIconManagerV1::QWaylandXdgToplevelIconManagerV1
QWaylandXdgToplevelIconManagerV1(QWaylandDisplay *display, wl_registry *registry, uint32_t id, int version)
Definition
qwaylandxdgtopleveliconv1.cpp:49
QtWaylandClient::QWaylandXdgToplevelIconManagerV1::~QWaylandXdgToplevelIconManagerV1
~QWaylandXdgToplevelIconManagerV1() override
Definition
qwaylandxdgtopleveliconv1.cpp:56
QtWaylandClient::QWaylandXdgToplevelIconManagerV1::xdg_toplevel_icon_manager_v1_done
void xdg_toplevel_icon_manager_v1_done() override
Definition
qwaylandxdgtopleveliconv1.cpp:66
QtWaylandClient::QWaylandXdgToplevelIconManagerV1::xdg_toplevel_icon_manager_v1_icon_size
void xdg_toplevel_icon_manager_v1_icon_size(int32_t size) override
Definition
qwaylandxdgtopleveliconv1.cpp:61
QtWaylandClient::QWaylandXdgToplevelIconV1
Definition
qwaylandxdgtopleveliconv1.cpp:20
QtWaylandClient::QWaylandXdgToplevelIconV1::~QWaylandXdgToplevelIconV1
~QWaylandXdgToplevelIconV1() override
Definition
qwaylandxdgtopleveliconv1.cpp:27
QtWaylandClient::QWaylandXdgToplevelIconV1::addPixmap
void addPixmap(const QPixmap &pixmap)
Definition
qwaylandxdgtopleveliconv1.cpp:31
QtWaylandClient::QWaylandXdgToplevelIconV1::QWaylandXdgToplevelIconV1
QWaylandXdgToplevelIconV1(::xdg_toplevel_icon_v1 *object, QWaylandDisplay *display)
Definition
qwaylandxdgtopleveliconv1.cpp:22
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QtWaylandClient
Definition
qwaylandclientextension.h:16
qtbase
src
plugins
platforms
wayland
plugins
shellintegration
xdg-shell
qwaylandxdgtopleveliconv1.cpp
Generated on
for Qt by
1.18.0