Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kf6-kguiaddons for openSUSE:Factory checked in at 2026-08-17 16:56:36 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kf6-kguiaddons (Old) and /work/SRC/openSUSE:Factory/.kf6-kguiaddons.new.1258 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kf6-kguiaddons" Mon Aug 17 16:56:36 2026 rev:32 rq:1371381 version:6.29.0 Changes: -------- --- /work/SRC/openSUSE:Factory/kf6-kguiaddons/kf6-kguiaddons.changes 2026-07-15 16:36:16.239589458 +0200 +++ /work/SRC/openSUSE:Factory/.kf6-kguiaddons.new.1258/kf6-kguiaddons.changes 2026-08-17 16:59:30.330118946 +0200 @@ -1,0 +2,15 @@ +Sun Aug 9 10:38:33 UTC 2026 - Christophe Marin <[email protected]> + +- Update to 6.29.0 + * New feature release + * For more details please see: + * https://kde.org/announcements/frameworks/6/6.29.0 +- Changes since 6.28.0: + * Update dependency version to 6.29.0 + * Add missing since information + * Add KSystemClipboard::ownsClipboard + * waylandclipboard: Properly clean up device and manager + * kiconutils: Fix overlay emblem size and placement on non-square icons + * Update version to 6.29.0 + +------------------------------------------------------------------- Old: ---- kguiaddons-6.28.0.tar.xz kguiaddons-6.28.0.tar.xz.sig New: ---- kguiaddons-6.29.0.tar.xz kguiaddons-6.29.0.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kf6-kguiaddons.spec ++++++ --- /var/tmp/diff_new_pack.oGEGBj/_old 2026-08-17 16:59:31.023143432 +0200 +++ /var/tmp/diff_new_pack.oGEGBj/_new 2026-08-17 16:59:31.025143503 +0200 @@ -28,11 +28,11 @@ %define mypython_sitearch %{expand:%%%{mypython}_sitearch} %endif -# Full KF6 version (e.g. 6.28.0) +# Full KF6 version (e.g. 6.29.0) %{!?_kf6_version: %global _kf6_version %{version}} %bcond_without released Name: kf6-kguiaddons -Version: 6.28.0 +Version: 6.29.0 Release: 0 Summary: Utilities for graphical user interfaces License: LGPL-2.1-or-later ++++++ kguiaddons-6.28.0.tar.xz -> kguiaddons-6.29.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/CMakeLists.txt new/kguiaddons-6.29.0/CMakeLists.txt --- old/kguiaddons-6.28.0/CMakeLists.txt 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/CMakeLists.txt 2026-08-07 22:40:29.000000000 +0200 @@ -1,10 +1,10 @@ cmake_minimum_required(VERSION 3.29) -set(KF_VERSION "6.28.0") # handled by release scripts +set(KF_VERSION "6.29.0") # handled by release scripts project(KGuiAddons VERSION ${KF_VERSION}) include(FeatureSummary) -find_package(ECM 6.28.0 NO_MODULE) +find_package(ECM 6.29.0 NO_MODULE) set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules") feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/autotests/kiconutilstest.cpp new/kguiaddons-6.29.0/autotests/kiconutilstest.cpp --- old/kguiaddons-6.28.0/autotests/kiconutilstest.cpp 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/autotests/kiconutilstest.cpp 2026-08-07 22:40:29.000000000 +0200 @@ -188,4 +188,54 @@ QCOMPARE(redPixels / (result.devicePixelRatio() * result.devicePixelRatio()), 6144); } +void KIconUtilsTest::addOverlayNonSquareTest() +{ + // A non-square base icon is painted centered and aspect-ratio-preserving, so it + // does not fill the (square) requested rect. The overlay must hug the icon's + // corner, not the corner of the rect, otherwise it detaches from the icon. + QPixmap tall(64, 256); + tall.fill(Qt::red); + const QIcon icon(tall); + + QPixmap overlay(64, 64); + overlay.fill(Qt::blue); + const QIcon overlayIcon(overlay); + + const QIcon iconWithOverlay = KIconUtils::addOverlay(icon, overlayIcon, Qt::BottomRightCorner); + + QPixmap target(64, 64); + target.fill(Qt::transparent); + QPainter p(&target); + iconWithOverlay.paint(&p, target.rect(), Qt::AlignCenter, QIcon::Normal, QIcon::Off); + p.end(); + + const QImage result = target.toImage(); + + // Bounding boxes of the base icon (red) and the overlay (blue). + QRect redBox; + QRect blueBox; + for (int y = 0; y < result.height(); ++y) { + for (int x = 0; x < result.width(); ++x) { + const QRgb px = result.pixel(x, y); + if (qBlue(px) == 255 && qRed(px) == 0) { + blueBox = blueBox.isNull() ? QRect(x, y, 1, 1) : blueBox.united(QRect(x, y, 1, 1)); + } else if (qRed(px) == 255 && qBlue(px) == 0) { + redBox = redBox.isNull() ? QRect(x, y, 1, 1) : redBox.united(QRect(x, y, 1, 1)); + } + } + } + + QVERIFY(!redBox.isNull()); + QVERIFY(!blueBox.isNull()); + + // The base icon is narrower than the rect (tall aspect ratio, centered). + QVERIFY(redBox.width() < result.width()); + + // The bottom-right overlay must sit at the icon's corner, i.e. within the + // icon's horizontal span, not detached towards an edge of the rect. + QVERIFY(blueBox.left() >= redBox.left()); + QVERIFY(blueBox.right() <= redBox.right()); + QVERIFY(blueBox.bottom() <= redBox.bottom()); +} + #include "moc_kiconutilstest.cpp" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/autotests/kiconutilstest.h new/kguiaddons-6.29.0/autotests/kiconutilstest.h --- old/kguiaddons-6.28.0/autotests/kiconutilstest.h 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/autotests/kiconutilstest.h 2026-08-07 22:40:29.000000000 +0200 @@ -15,6 +15,7 @@ private Q_SLOTS: void addOverlayTest(); void addOverlaysTest(); + void addOverlayNonSquareTest(); }; #endif // KICONUTILSTEST_H diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/geo-scheme-handler/google-maps-geo-handler.desktop new/kguiaddons-6.29.0/src/geo-scheme-handler/google-maps-geo-handler.desktop --- old/kguiaddons-6.28.0/src/geo-scheme-handler/google-maps-geo-handler.desktop 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/geo-scheme-handler/google-maps-geo-handler.desktop 2026-08-07 22:40:29.000000000 +0200 @@ -27,6 +27,7 @@ Name[ko]=Google 지도 Name[lt]=„Google“ žemėlapiai Name[lv]=Google Maps +Name[nan_TW@latin]=Google Tē-tôo Name[nl]=Google Maps Name[nn]=Google Maps Name[pl]=Mapy Google diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/geo-scheme-handler/openstreetmap-geo-handler.desktop new/kguiaddons-6.29.0/src/geo-scheme-handler/openstreetmap-geo-handler.desktop --- old/kguiaddons-6.28.0/src/geo-scheme-handler/openstreetmap-geo-handler.desktop 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/geo-scheme-handler/openstreetmap-geo-handler.desktop 2026-08-07 22:40:29.000000000 +0200 @@ -27,6 +27,7 @@ Name[ko]=OpenStreetMap Name[lt]=OpenStreetMap Name[lv]=OpenStreetMap +Name[nan_TW@latin]=OpenStreetMap Name[nl]=OpenStreetMap Name[nn]=OpenStreetMap Name[pl]=OpenStreetMap diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/geo-scheme-handler/wheelmap-geo-handler.desktop new/kguiaddons-6.29.0/src/geo-scheme-handler/wheelmap-geo-handler.desktop --- old/kguiaddons-6.28.0/src/geo-scheme-handler/wheelmap-geo-handler.desktop 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/geo-scheme-handler/wheelmap-geo-handler.desktop 2026-08-07 22:40:29.000000000 +0200 @@ -27,6 +27,7 @@ Name[ko]=wheelmap.org Name[lt]=wheelmap.org Name[lv]=wheelmap.org +Name[nan_TW@latin]=wheelmap.org Name[nl]=wheelmap.org Name[nn]=wheelmap.org Name[pl]=wheelmap.org diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/systemclipboard/ksystemclipboard.cpp new/kguiaddons-6.29.0/src/systemclipboard/ksystemclipboard.cpp --- old/kguiaddons-6.28.0/src/systemclipboard/ksystemclipboard.cpp 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/systemclipboard/ksystemclipboard.cpp 2026-08-07 22:40:29.000000000 +0200 @@ -53,6 +53,40 @@ return QString(); } +bool KSystemClipboard::ownsSelection() const +{ + // This is a fake virtual, but we're limited due to ABI concerns. + // In hindsight I should have added a facade +#ifdef WITH_WAYLAND + if (const auto waylandClipboard = qobject_cast<const WaylandClipboard *>(this)) { + return waylandClipboard->ownsSelection(); + } + if (const auto wlrWaylandClipboard = qobject_cast<const WlrWaylandClipboard *>(this)) { + return wlrWaylandClipboard->ownsSelection(); + } +#endif + if (const auto qtClipboard = qobject_cast<const QtClipboard *>(this)) { + return qtClipboard->ownsSelection(); + } + return false; +} + +bool KSystemClipboard::ownsClipboard() const +{ +#ifdef WITH_WAYLAND + if (const auto waylandClipboard = qobject_cast<const WaylandClipboard *>(this)) { + return waylandClipboard->ownsClipboard(); + } + if (const auto wlrWaylandClipboard = qobject_cast<const WlrWaylandClipboard *>(this)) { + return wlrWaylandClipboard->ownsClipboard(); + } +#endif + if (const auto qtClipboard = qobject_cast<const QtClipboard *>(this)) { + return qtClipboard->ownsClipboard(); + } + return false; +} + KSystemClipboard::KSystemClipboard(QObject *parent) : QObject(parent) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/systemclipboard/ksystemclipboard.h new/kguiaddons-6.29.0/src/systemclipboard/ksystemclipboard.h --- old/kguiaddons-6.28.0/src/systemclipboard/ksystemclipboard.h 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/systemclipboard/ksystemclipboard.h 2026-08-07 22:40:29.000000000 +0200 @@ -54,6 +54,18 @@ * Similar to QClipboard::text(QClipboard::Mode mode) */ QString text(QClipboard::Mode mode); + /*! + * Returns true if this process owns the current primary selection. + * + * \since 6.29 + */ + bool ownsSelection() const; + /*! + * Returns true if this process owns the current clipboard selection. + * + * \since 6.29 + */ + bool ownsClipboard() const; Q_SIGNALS: /*! * Emitted when the clipboard changes similar to QClipboard::changed diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/systemclipboard/qtclipboard.cpp new/kguiaddons-6.29.0/src/systemclipboard/qtclipboard.cpp --- old/kguiaddons-6.28.0/src/systemclipboard/qtclipboard.cpp 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/systemclipboard/qtclipboard.cpp 2026-08-07 22:40:29.000000000 +0200 @@ -29,3 +29,13 @@ { return qGuiApp->clipboard()->mimeData(mode); } + +bool QtClipboard::ownsSelection() const +{ + return qGuiApp->clipboard()->ownsSelection(); +} + +bool QtClipboard::ownsClipboard() const +{ + return qGuiApp->clipboard()->ownsClipboard(); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/systemclipboard/qtclipboard_p.h new/kguiaddons-6.29.0/src/systemclipboard/qtclipboard_p.h --- old/kguiaddons-6.28.0/src/systemclipboard/qtclipboard_p.h 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/systemclipboard/qtclipboard_p.h 2026-08-07 22:40:29.000000000 +0200 @@ -11,11 +11,14 @@ class QtClipboard : public KSystemClipboard { + Q_OBJECT public: explicit QtClipboard(QObject *parent); void setMimeData(QMimeData *mime, QClipboard::Mode mode) override; void clear(QClipboard::Mode mode) override; const QMimeData *mimeData(QClipboard::Mode mode) const override; + bool ownsSelection() const; + bool ownsClipboard() const; }; #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/systemclipboard/waylandclipboard.cpp new/kguiaddons-6.29.0/src/systemclipboard/waylandclipboard.cpp --- old/kguiaddons-6.28.0/src/systemclipboard/waylandclipboard.cpp 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/systemclipboard/waylandclipboard.cpp 2026-08-07 22:40:29.000000000 +0200 @@ -617,9 +617,10 @@ m_thread->start(); } else { - m_device.reset(); m_thread->requestInterruption(); m_thread->wait(); + m_device.reset(); + m_manager->destroy(); m_thread.reset(); } }); @@ -730,5 +731,15 @@ return nullptr; } +bool WaylandClipboard::ownsSelection() const +{ + return m_device && m_device->primarySelection(); +} + +bool WaylandClipboard::ownsClipboard() const +{ + return m_device && m_device->selection(); +} + #include "moc_waylandclipboard_p.cpp" #include "waylandclipboard.moc" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/systemclipboard/waylandclipboard_p.h new/kguiaddons-6.29.0/src/systemclipboard/waylandclipboard_p.h --- old/kguiaddons-6.28.0/src/systemclipboard/waylandclipboard_p.h 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/systemclipboard/waylandclipboard_p.h 2026-08-07 22:40:29.000000000 +0200 @@ -24,6 +24,8 @@ void setMimeData(QMimeData *mime, QClipboard::Mode mode) override; void clear(QClipboard::Mode mode) override; const QMimeData *mimeData(QClipboard::Mode mode) const override; + bool ownsSelection() const; + bool ownsClipboard() const; bool isValid(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/systemclipboard/wlrwaylandclipboard.cpp new/kguiaddons-6.29.0/src/systemclipboard/wlrwaylandclipboard.cpp --- old/kguiaddons-6.28.0/src/systemclipboard/wlrwaylandclipboard.cpp 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/systemclipboard/wlrwaylandclipboard.cpp 2026-08-07 22:40:29.000000000 +0200 @@ -726,4 +726,20 @@ return nullptr; } +bool WlrWaylandClipboard::ownsSelection() const +{ + if (!m_device) { + return false; + } + return m_device->primarySelection(); +} + +bool WlrWaylandClipboard::ownsClipboard() const +{ + if (!m_device) { + return false; + } + return m_device->selection(); +} + #include "wlrwaylandclipboard.moc" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/systemclipboard/wlrwaylandclipboard_p.h new/kguiaddons-6.29.0/src/systemclipboard/wlrwaylandclipboard_p.h --- old/kguiaddons-6.28.0/src/systemclipboard/wlrwaylandclipboard_p.h 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/systemclipboard/wlrwaylandclipboard_p.h 2026-08-07 22:40:29.000000000 +0200 @@ -17,12 +17,15 @@ class WlrWaylandClipboard : public KSystemClipboard { + Q_OBJECT public: ~WlrWaylandClipboard(); static WlrWaylandClipboard *create(QObject *parent); void setMimeData(QMimeData *mime, QClipboard::Mode mode) override; void clear(QClipboard::Mode mode) override; const QMimeData *mimeData(QClipboard::Mode mode) const override; + bool ownsSelection() const; + bool ownsClipboard() const; bool isValid(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.28.0/src/util/kiconutils.cpp new/kguiaddons-6.29.0/src/util/kiconutils.cpp --- old/kguiaddons-6.28.0/src/util/kiconutils.cpp 2026-07-03 12:55:06.000000000 +0200 +++ new/kguiaddons-6.29.0/src/util/kiconutils.cpp 2026-08-07 22:40:29.000000000 +0200 @@ -32,7 +32,6 @@ private: QIcon m_base; QHash<Qt::Corner, QIcon> m_overlays; - qreal m_dpr = 1.0; }; KOverlayIconEngine::KOverlayIconEngine(const QIcon &icon, const QIcon &overlay, Qt::Corner position) @@ -115,7 +114,6 @@ const QRect logicalRect(0, 0, phyiscalSize.width() / info->scale, phyiscalSize.height() / info->scale); QPainter p(&pixmap); - m_dpr = info->scale; paint(&p, logicalRect, info->mode, info->state); info->pixmap = pixmap; @@ -133,8 +131,20 @@ return; } - const int width = rect.width(); - const int height = rect.height(); + // Use the painter's device pixel ratio so the overlays are sharp regardless of + // how the engine is painted (QIcon::paint(), pixmap() or the scaled-pixmap hook). + const qreal dpr = painter->device() ? painter->device()->devicePixelRatioF() : 1.0; + + // Anchor the overlays to the base icon as it is actually painted (centered and + // aspect-ratio-preserving within rect) rather than to rect, so they stay in the + // corners of the icon for non-square or smaller-than-rect icons. + QRect iconRect(QPoint(0, 0), m_base.actualSize(rect.size(), mode, state).boundedTo(rect.size())); + iconRect.moveCenter(rect.center()); + + const int left = iconRect.left(); + const int top = iconRect.top(); + const int width = iconRect.width(); + const int height = iconRect.height(); const int iconSize = qMin(width, height); // Determine the overlay icon size int overlaySize; @@ -151,11 +161,13 @@ } else { overlaySize = (int)(iconSize / 4); } + // Never let the overlay be larger than the icon it is drawn on. + overlaySize = qMin(overlaySize, iconSize); // Iterate over stored overlays QHash<Qt::Corner, QIcon>::const_iterator i = m_overlays.constBegin(); while (i != m_overlays.constEnd()) { - const QPixmap overlayPixmap = i.value().pixmap(QSize{overlaySize, overlaySize}, m_dpr, mode, state); + const QPixmap overlayPixmap = i.value().pixmap(QSize{overlaySize, overlaySize}, dpr, mode, state); if (overlayPixmap.isNull()) { ++i; continue; @@ -164,16 +176,16 @@ QPoint startPoint; switch (i.key()) { case Qt::BottomLeftCorner: - startPoint = QPoint(2, height - overlaySize - 2); + startPoint = QPoint(left + 2, top + height - overlaySize - 2); break; case Qt::BottomRightCorner: - startPoint = QPoint(width - overlaySize - 2, height - overlaySize - 2); + startPoint = QPoint(left + width - overlaySize - 2, top + height - overlaySize - 2); break; case Qt::TopRightCorner: - startPoint = QPoint(width - overlaySize - 2, 2); + startPoint = QPoint(left + width - overlaySize - 2, top + 2); break; case Qt::TopLeftCorner: - startPoint = QPoint(2, 2); + startPoint = QPoint(left + 2, top + 2); break; }
