QWaylandDisplay: replace a QMap<pair<QString,int>, pointer*> with a std::vector<{QString, int, unique_ptr}>
The vector is sorted, so lookup performance is the same, or better. Insertion performance is worse, of course, at least in big-O terms, but probably not in practice. But now the good part: saves a stunning 7.2KiB (0.6%) in text size on optimized AMD 64 Linux GCC 9.1 builds. Change-Id: Ie604f83d7d51111430db1d0bb89d8cc3a52301bf Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
3addd499bd
commit
c962b8c2df
@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
|
|
||||||
namespace QtWaylandClient {
|
namespace QtWaylandClient {
|
||||||
|
|
||||||
QWaylandCursorTheme *QWaylandCursorTheme::create(QWaylandShm *shm, int size, const QString &themeName)
|
std::unique_ptr<QWaylandCursorTheme> QWaylandCursorTheme::create(QWaylandShm *shm, int size, const QString &themeName)
|
||||||
{
|
{
|
||||||
QByteArray nameBytes = themeName.toLocal8Bit();
|
QByteArray nameBytes = themeName.toLocal8Bit();
|
||||||
struct ::wl_cursor_theme *theme = wl_cursor_theme_load(nameBytes.constData(), size, shm->object());
|
struct ::wl_cursor_theme *theme = wl_cursor_theme_load(nameBytes.constData(), size, shm->object());
|
||||||
@ -64,7 +64,7 @@ QWaylandCursorTheme *QWaylandCursorTheme::create(QWaylandShm *shm, int size, con
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new QWaylandCursorTheme(theme);
|
return std::unique_ptr<QWaylandCursorTheme>{new QWaylandCursorTheme(theme)};
|
||||||
}
|
}
|
||||||
|
|
||||||
QWaylandCursorTheme::~QWaylandCursorTheme()
|
QWaylandCursorTheme::~QWaylandCursorTheme()
|
||||||
|
@ -57,6 +57,8 @@
|
|||||||
|
|
||||||
#if QT_CONFIG(cursor)
|
#if QT_CONFIG(cursor)
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
struct wl_cursor;
|
struct wl_cursor;
|
||||||
struct wl_cursor_image;
|
struct wl_cursor_image;
|
||||||
struct wl_cursor_theme;
|
struct wl_cursor_theme;
|
||||||
@ -73,7 +75,7 @@ class QWaylandShm;
|
|||||||
class Q_WAYLAND_CLIENT_EXPORT QWaylandCursorTheme
|
class Q_WAYLAND_CLIENT_EXPORT QWaylandCursorTheme
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static QWaylandCursorTheme *create(QWaylandShm *shm, int size, const QString &themeName);
|
static std::unique_ptr<QWaylandCursorTheme> create(QWaylandShm *shm, int size, const QString &themeName);
|
||||||
~QWaylandCursorTheme();
|
~QWaylandCursorTheme();
|
||||||
::wl_cursor *cursor(Qt::CursorShape shape);
|
::wl_cursor *cursor(Qt::CursorShape shape);
|
||||||
|
|
||||||
|
@ -85,6 +85,8 @@
|
|||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <tuple> // for std::tie
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
namespace QtWaylandClient {
|
namespace QtWaylandClient {
|
||||||
@ -183,7 +185,7 @@ QWaylandDisplay::~QWaylandDisplay(void)
|
|||||||
delete mDndSelectionHandler.take();
|
delete mDndSelectionHandler.take();
|
||||||
#endif
|
#endif
|
||||||
#if QT_CONFIG(cursor)
|
#if QT_CONFIG(cursor)
|
||||||
qDeleteAll(mCursorThemes);
|
mCursorThemes.clear();
|
||||||
#endif
|
#endif
|
||||||
if (mDisplay)
|
if (mDisplay)
|
||||||
wl_display_disconnect(mDisplay);
|
wl_display_disconnect(mDisplay);
|
||||||
@ -602,15 +604,30 @@ QWaylandCursor *QWaylandDisplay::waylandCursor()
|
|||||||
return mCursor.data();
|
return mCursor.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto QWaylandDisplay::findExistingCursorTheme(const QString &name, int pixelSize) const noexcept
|
||||||
|
-> FindExistingCursorThemeResult
|
||||||
|
{
|
||||||
|
const auto byNameAndSize = [](const WaylandCursorTheme &lhs, const WaylandCursorTheme &rhs) {
|
||||||
|
return std::tie(lhs.pixelSize, lhs.name) < std::tie(rhs.pixelSize, rhs.name);
|
||||||
|
};
|
||||||
|
|
||||||
|
const WaylandCursorTheme prototype = {name, pixelSize, nullptr};
|
||||||
|
|
||||||
|
const auto it = std::lower_bound(mCursorThemes.cbegin(), mCursorThemes.cend(), prototype, byNameAndSize);
|
||||||
|
if (it != mCursorThemes.cend() && it->name == name && it->pixelSize == pixelSize)
|
||||||
|
return {it, true};
|
||||||
|
else
|
||||||
|
return {it, false};
|
||||||
|
}
|
||||||
|
|
||||||
QWaylandCursorTheme *QWaylandDisplay::loadCursorTheme(const QString &name, int pixelSize)
|
QWaylandCursorTheme *QWaylandDisplay::loadCursorTheme(const QString &name, int pixelSize)
|
||||||
{
|
{
|
||||||
if (auto *theme = mCursorThemes.value({name, pixelSize}, nullptr))
|
const auto result = findExistingCursorTheme(name, pixelSize);
|
||||||
return theme;
|
if (result.found)
|
||||||
|
return result.theme();
|
||||||
|
|
||||||
if (auto *theme = QWaylandCursorTheme::create(shm(), pixelSize, name)) {
|
if (auto theme = QWaylandCursorTheme::create(shm(), pixelSize, name))
|
||||||
mCursorThemes[{name, pixelSize}] = theme;
|
return mCursorThemes.insert(result.position, {name, pixelSize, std::move(theme)})->theme.get();
|
||||||
return theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -238,7 +238,22 @@ private:
|
|||||||
QList<Listener> mRegistryListeners;
|
QList<Listener> mRegistryListeners;
|
||||||
QWaylandIntegration *mWaylandIntegration = nullptr;
|
QWaylandIntegration *mWaylandIntegration = nullptr;
|
||||||
#if QT_CONFIG(cursor)
|
#if QT_CONFIG(cursor)
|
||||||
QMap<std::pair<QString, int>, QWaylandCursorTheme *> mCursorThemes; // theme name and size
|
struct WaylandCursorTheme {
|
||||||
|
QString name;
|
||||||
|
int pixelSize;
|
||||||
|
std::unique_ptr<QWaylandCursorTheme> theme;
|
||||||
|
};
|
||||||
|
std::vector<WaylandCursorTheme> mCursorThemes;
|
||||||
|
|
||||||
|
struct FindExistingCursorThemeResult {
|
||||||
|
std::vector<WaylandCursorTheme>::const_iterator position;
|
||||||
|
bool found;
|
||||||
|
|
||||||
|
QWaylandCursorTheme *theme() const noexcept
|
||||||
|
{ return found ? position->theme.get() : nullptr; }
|
||||||
|
};
|
||||||
|
FindExistingCursorThemeResult findExistingCursorTheme(const QString &name, int pixelSize) const;
|
||||||
|
|
||||||
QScopedPointer<QWaylandCursor> mCursor;
|
QScopedPointer<QWaylandCursor> mCursor;
|
||||||
#endif
|
#endif
|
||||||
#if QT_CONFIG(wayland_datadevice)
|
#if QT_CONFIG(wayland_datadevice)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user