kwin/src/wayland/utils.h
Vlad Zahorodnii d9eb05c9a7 Fix delayed global removal
Unfortunately, we cannot just simply unset the wl_global's user data.
The compositor still needs to process client requests after the global
has been removed, for example bind requests or the requests that create
new resources.

CCBUG: 435258
2021-05-12 10:59:45 +03:00

56 lines
1.3 KiB
C++

/*
SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#pragma once
#include <KWaylandServer/kwaylandserver_export.h>
#include <QRegion>
#include <limits>
#include <type_traits>
struct wl_resource;
namespace KWaylandServer
{
template <typename T>
struct SafeGlobalDeleter
{
static inline void cleanup(T *global)
{
if (global) {
global->remove();
}
}
};
template <typename T>
using ScopedGlobalPointer = QScopedPointer<T, SafeGlobalDeleter<T>>;
/**
* Returns an infinite region.
*/
inline QRegion KWAYLANDSERVER_EXPORT infiniteRegion()
{
return QRegion(std::numeric_limits<int>::min() / 2, // "/ 2" is to avoid integer overflows
std::numeric_limits<int>::min() / 2,
std::numeric_limits<int>::max(),
std::numeric_limits<int>::max());
}
template <typename T>
T resource_cast(::wl_resource *resource)
{
using ObjectType = std::remove_pointer_t<std::remove_cv_t<T>>;
if (auto resourceContainer = ObjectType::Resource::fromResource(resource)) {
return static_cast<T>(resourceContainer->object());
}
return T();
}
} // namespace KWaylandServer