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;
         }
 

Reply via email to