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-03-16 14:15:41 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kf6-kguiaddons (Old) and /work/SRC/openSUSE:Factory/.kf6-kguiaddons.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kf6-kguiaddons" Mon Mar 16 14:15:41 2026 rev:27 rq:1338918 version:6.24.0 Changes: -------- --- /work/SRC/openSUSE:Factory/kf6-kguiaddons/kf6-kguiaddons.changes 2026-03-04 21:03:35.252391673 +0100 +++ /work/SRC/openSUSE:Factory/.kf6-kguiaddons.new.8177/kf6-kguiaddons.changes 2026-03-16 14:18:06.775213115 +0100 @@ -1,0 +2,20 @@ +Mon Mar 9 08:07:32 UTC 2026 - Christophe Marin <[email protected]> + +- Update to 6.24.0 + * New feature release + * For more details please see: + * https://kde.org/announcements/frameworks/6/6.24.0 +- Changes since 6.23.0: + * Update dependency version to 6.24.0 + * clipboard: Use buffered writes for data transfer + * add manual large clipboard tests + * ksysteminhibitor: Support Windows through PowerCreateRequest API + * Remove unneeded Qt version check + * kiconutils: remove now unnecessary Qt version check + * clipboard: Hold mutex before dispatching any wayland events (kde#515465) + * Mark WindowInsetsController as singleton in the documentation + * CMake: Find Qt6::GuiPrivate when USE_DBUS is enabled + * KKeySequenceRecorder: Accept some more keys that can be used with Shift + * Update version to 6.24.0 + +------------------------------------------------------------------- Old: ---- kguiaddons-6.23.1.tar.xz kguiaddons-6.23.1.tar.xz.sig New: ---- kguiaddons-6.24.0.tar.xz kguiaddons-6.24.0.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kf6-kguiaddons.spec ++++++ --- /var/tmp/diff_new_pack.CtSheu/_old 2026-03-16 14:18:07.483243131 +0100 +++ /var/tmp/diff_new_pack.CtSheu/_new 2026-03-16 14:18:07.487243300 +0100 @@ -32,12 +32,11 @@ %define mypython_sitearch %{expand:%%%{mypython}_sitearch} %endif -# Full KF6 version (e.g. 6.23.0) -# %%{!?_kf6_version: %%global _kf6_version %%{version}} -%global _kf6_version 6.23.0 +# Full KF6 version (e.g. 6.24.0) +%{!?_kf6_version: %global _kf6_version %{version}} %bcond_without released Name: kf6-kguiaddons -Version: 6.23.1 +Version: 6.24.0 Release: 0 Summary: Utilities for graphical user interfaces License: LGPL-2.1-or-later ++++++ kguiaddons-6.23.1.tar.xz -> kguiaddons-6.24.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/CMakeLists.txt new/kguiaddons-6.24.0/CMakeLists.txt --- old/kguiaddons-6.23.1/CMakeLists.txt 2026-03-02 16:31:07.000000000 +0100 +++ new/kguiaddons-6.24.0/CMakeLists.txt 2026-03-07 21:30:37.000000000 +0100 @@ -1,10 +1,10 @@ cmake_minimum_required(VERSION 3.27) -set(KF_VERSION "6.23.1") # handled by release scripts +set(KF_VERSION "6.24.0") # handled by release scripts project(KGuiAddons VERSION ${KF_VERSION}) include(FeatureSummary) -find_package(ECM 6.23.0 NO_MODULE) +find_package(ECM 6.24.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) @@ -75,6 +75,11 @@ option(USE_DBUS "Build components using DBus (get color scheme information via XDG portals)" ${USE_DBUS_DEFAULT}) if(USE_DBUS) find_package(Qt6DBus ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE) + if (Qt6Gui_VERSION VERSION_GREATER_EQUAL "6.10.0") + find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE) + else() + find_package(Qt6Gui ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE COMPONENTS Private) + endif() set(WITH_DBUS ON) endif() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/src/CMakeLists.txt new/kguiaddons-6.24.0/src/CMakeLists.txt --- old/kguiaddons-6.23.1/src/CMakeLists.txt 2026-03-02 16:31:07.000000000 +0100 +++ new/kguiaddons-6.24.0/src/CMakeLists.txt 2026-03-07 21:30:37.000000000 +0100 @@ -64,7 +64,10 @@ ) if(WIN32) - target_sources(KF6GuiAddons PRIVATE colors/kcolorschemewatcher_win.cpp) + target_sources(KF6GuiAddons PRIVATE + colors/kcolorschemewatcher_win.cpp + util/ksysteminhibitor_windows.cpp + ) target_link_libraries(KF6GuiAddons PRIVATE advapi32) endif() @@ -79,22 +82,19 @@ colors/kcolorschemewatcher_xdg.cpp util/ksysteminhibitor_dbus.cpp ) - target_link_libraries(KF6GuiAddons PRIVATE Qt6::DBus) + target_link_libraries(KF6GuiAddons PRIVATE Qt6::DBus Qt6::GuiPrivate) target_compile_definitions(KF6GuiAddons PRIVATE WITH_DBUS) endif() if(WITH_WAYLAND) - if (Qt6_VERSION VERSION_GREATER_EQUAL "6.8.0") - set(private_code_option "PRIVATE_CODE") - endif() qt_generate_wayland_protocol_client_sources(KF6GuiAddons + PRIVATE_CODE FILES "${CMAKE_CURRENT_SOURCE_DIR}/recorder/keyboard-shortcuts-inhibit-unstable-v1.xml" "${CMAKE_CURRENT_SOURCE_DIR}/systemclipboard/wlr-data-control-unstable-v1.xml" "${PLASMA_WAYLAND_PROTOCOLS_DIR}/keystate.xml" "${WaylandProtocols_DATADIR}/staging/ext-data-control/ext-data-control-v1.xml" "${Wayland_DATADIR}/wayland.xml" - ${private_code_option} ) target_sources(KF6GuiAddons PRIVATE recorder/waylandinhibition.cpp @@ -103,6 +103,7 @@ util/kmodifierkeyinfoprovider_wayland.cpp recorder/waylandinhibition_p.h systemclipboard/waylandclipboard_p.h + systemclipboard/waylandpipewriterhelper.cpp systemclipboard/wlrwaylandclipboard_p.h util/kmodifierkeyinfoprovider_wayland.h ) @@ -122,7 +123,7 @@ add_subdirectory(android) endif() -if (NOT WITH_DBUS AND NOT ANDROID) +if (NOT WITH_DBUS AND NOT ANDROID AND NOT WIN32) target_sources(KF6GuiAddons PRIVATE util/ksysteminhibitor_dummy.cpp ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/src/colors/kwindowinsetscontroller.h new/kguiaddons-6.24.0/src/colors/kwindowinsetscontroller.h --- old/kguiaddons-6.23.1/src/colors/kwindowinsetscontroller.h 2026-03-02 16:31:07.000000000 +0100 +++ new/kguiaddons-6.24.0/src/colors/kwindowinsetscontroller.h 2026-03-07 21:30:37.000000000 +0100 @@ -15,7 +15,7 @@ class KWindowInsetsControllerPrivate; /*! - * \qmltype WindowInsetsController + * \qmlsingletontype WindowInsetsController * \inqmlmodule org.kde.guiaddons * \nativetype KWindowInsetsController * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/src/recorder/kkeysequencerecorder.cpp new/kguiaddons-6.24.0/src/recorder/kkeysequencerecorder.cpp --- old/kguiaddons-6.23.1/src/recorder/kkeysequencerecorder.cpp 2026-03-02 16:31:07.000000000 +0100 +++ new/kguiaddons-6.24.0/src/recorder/kkeysequencerecorder.cpp 2026-03-07 21:30:37.000000000 +0100 @@ -218,6 +218,12 @@ case Qt::Key_Xfer: case Qt::Key_ZoomIn: case Qt::Key_ZoomOut: + case Qt::Key_Cancel: + case Qt::Key_New: + case Qt::Key_Open: + case Qt::Key_Find: + case Qt::Key_Undo: + case Qt::Key_Redo: case Qt::Key_Away: case Qt::Key_Messenger: case Qt::Key_WebCam: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/src/systemclipboard/waylandclipboard.cpp new/kguiaddons-6.24.0/src/systemclipboard/waylandclipboard.cpp --- old/kguiaddons-6.23.1/src/systemclipboard/waylandclipboard.cpp 2026-03-02 16:31:07.000000000 +0100 +++ new/kguiaddons-6.24.0/src/systemclipboard/waylandclipboard.cpp 2026-03-07 21:30:37.000000000 +0100 @@ -22,14 +22,19 @@ #include <errno.h> #include <fcntl.h> +#include <limits.h> #include <poll.h> #include <signal.h> #include <string.h> #include <unistd.h> +#include "waylandpipewriterhelper_p.h" + #include "qwayland-wayland.h" #include "qwayland-ext-data-control-v1.h" +using namespace std::chrono; + /** * Wayland clipboard wraps ext_data_control an additional is used as we need to avoid * deadlocks if an application tries to read the normal clipboard whilst it owns the data control. @@ -272,7 +277,7 @@ pfds[0].events = POLLIN; while (true) { - const int ready = poll(pfds, 1, 1000); + const int ready = poll(pfds, 1, 100000); if (ready < 0) { if (errno != EINTR) { qWarning("DataControlOffer: poll() failed for mimeType %s: %s", qPrintable(mimeType), strerror(errno)); @@ -374,27 +379,21 @@ ba = m_mimeData->data(send_mime_type); } - QFile c; - if (!c.open(fd, QFile::WriteOnly, QFile::AutoCloseHandle)) { - return; - } - // Create a sigpipe handler that does nothing, or clients may be forced to terminate - // if the pipe is closed in the other end. - struct sigaction action, oldAction; - action.sa_handler = SIG_IGN; - sigemptyset(&action.sa_mask); - action.sa_flags = 0; - sigaction(SIGPIPE, &action, &oldAction); - const int flags = fcntl(fd, F_GETFL, 0); - if (flags & O_NONBLOCK) { - fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); // Unset O_NONBLOCK to fix pasting to XWayland windows - } - const qint64 written = c.write(ba); - sigaction(SIGPIPE, &oldAction, nullptr); - - if (written != ba.size()) { - qWarning() << "Failed to send all clipobard data; sent" << written << "bytes out of" << ba.size(); + auto rc = WaylandPipeWriterHelper::safeWriteWithTimeout(fd, ba.constData(), ba.size(), PIPE_BUF, 5s); + switch (rc) { + case WaylandPipeWriterHelper::SafeWriteResult::Ok: + break; + case WaylandPipeWriterHelper::SafeWriteResult::Timeout: + qWarning() << "QWaylandDataSource: timeout writing to pipe"; + break; + case WaylandPipeWriterHelper::SafeWriteResult::Closed: + qWarning() << "QWaylandDataSource: peer closed pipe"; + break; + case WaylandPipeWriterHelper::SafeWriteResult::Error: + qWarning() << "QWaylandDataSource: write() failed"; + break; } + close(fd); } void DataControlSource::ext_data_control_source_v1_cancelled() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/src/systemclipboard/waylandpipewriterhelper.cpp new/kguiaddons-6.24.0/src/systemclipboard/waylandpipewriterhelper.cpp --- old/kguiaddons-6.23.1/src/systemclipboard/waylandpipewriterhelper.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/kguiaddons-6.24.0/src/systemclipboard/waylandpipewriterhelper.cpp 2026-03-07 21:30:37.000000000 +0100 @@ -0,0 +1,42 @@ +// Copyright (C) 2026 UnionTech Software Technology Co., Ltd. +// SPDX-License-Identifier: LGPL-3.0-only + +#include "waylandpipewriterhelper_p.h" +#include <QtCore/private/qcore_unix_p.h> + +WaylandPipeWriterHelper::SafeWriteResult +WaylandPipeWriterHelper::safeWriteWithTimeout(int fd, const char *data, qsizetype len, qsizetype chunkSize, std::chrono::nanoseconds timeout) +{ + if (len == 0) + return SafeWriteResult::Ok; + + struct pollfd pfd; + pfd.fd = fd; + pfd.events = POLLOUT; + + QDeadlineTimer deadline(timeout); + qsizetype offset = 0; + while (offset < len) { + int ready = qt_safe_poll(&pfd, 1, deadline); + if (ready < 0) { + return SafeWriteResult::Error; + } else if (ready == 0 || deadline.hasExpired()) { + return SafeWriteResult::Timeout; + } else { + const qsizetype toWrite = qMin(chunkSize, len - offset); + ssize_t n = qt_safe_write_nosignal(fd, data + offset, toWrite); + if (n > 0) { + offset += n; + continue; + } else if (n < 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) + continue; + if (errno == EPIPE) + return SafeWriteResult::Closed; + return SafeWriteResult::Error; + } + } + } + + return SafeWriteResult::Ok; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/src/systemclipboard/waylandpipewriterhelper_p.h new/kguiaddons-6.24.0/src/systemclipboard/waylandpipewriterhelper_p.h --- old/kguiaddons-6.23.1/src/systemclipboard/waylandpipewriterhelper_p.h 1970-01-01 01:00:00.000000000 +0100 +++ new/kguiaddons-6.24.0/src/systemclipboard/waylandpipewriterhelper_p.h 2026-03-07 21:30:37.000000000 +0100 @@ -0,0 +1,21 @@ +// Copyright (C) 2026 UnionTech Software Technology Co., Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef WAYLANDPIPEWRITERHELPER_P_H +#define WAYLANDPIPEWRITERHELPER_P_H + +#include <QtCore/qtypes.h> +#include <chrono> + +namespace WaylandPipeWriterHelper +{ +enum class SafeWriteResult { + Ok, + Timeout, + Closed, + Error, +}; +SafeWriteResult safeWriteWithTimeout(int fd, const char *data, qsizetype len, qsizetype chunkSize, std::chrono::nanoseconds timeout); +}; + +#endif // WAYLANDPIPEWRITERHELPER_P_H diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/src/util/kiconutils.cpp new/kguiaddons-6.24.0/src/util/kiconutils.cpp --- old/kguiaddons-6.23.1/src/util/kiconutils.cpp 2026-03-02 16:31:07.000000000 +0100 +++ new/kguiaddons-6.24.0/src/util/kiconutils.cpp 2026-03-07 21:30:37.000000000 +0100 @@ -10,9 +10,7 @@ #include <QHash> #include <QIconEngine> -#include <QLibraryInfo> #include <QPainter> -#include <QVersionNumber> class KOverlayIconEngine : public QIconEngine { @@ -108,12 +106,8 @@ if (id == QIconEngine::ScaledPixmapHook) { auto *info = reinterpret_cast<ScaledPixmapArgument *>(data); - QSize phyiscalSize = info->size; // Since https://codereview.qt-project.org/c/qt/qtbase/+/563553 size is in logical pixels - if (QLibraryInfo::version() >= QVersionNumber(6, 8, 0)) { - phyiscalSize *= info->scale; - } - + QSize phyiscalSize = info->size * info->scale; QPixmap pixmap(phyiscalSize); pixmap.setDevicePixelRatio(info->scale); pixmap.fill(Qt::transparent); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/src/util/ksysteminhibitor_windows.cpp new/kguiaddons-6.24.0/src/util/ksysteminhibitor_windows.cpp --- old/kguiaddons-6.23.1/src/util/ksysteminhibitor_windows.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/kguiaddons-6.24.0/src/util/ksysteminhibitor_windows.cpp 2026-03-07 21:30:37.000000000 +0100 @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL +// SPDX-FileCopyrightText: 2026 Kai Uwe Broulik <[email protected]> + +#include "ksysteminhibitor.h" + +#include <windows.h> + +#include "kguiaddons_debug.h" + +using namespace Qt::StringLiterals; + +class KSystemInhibitorPrivate +{ +public: + HANDLE m_handle = INVALID_HANDLE_VALUE; +}; + +KSystemInhibitor::KSystemInhibitor(const QString &reason, Types types, [[maybe_unused]] QWindow *window, QObject *parent) + : QObject(parent) + , d(std::make_unique<KSystemInhibitorPrivate>()) +{ + REASON_CONTEXT context{}; + context.Version = POWER_REQUEST_CONTEXT_VERSION; + context.Flags = POWER_REQUEST_CONTEXT_SIMPLE_STRING; + context.Reason.SimpleReasonString = reason.toStdWString().data(); + + HANDLE handle = PowerCreateRequest(&context); + if (handle == INVALID_HANDLE_VALUE) { + qCWarning(KGUIADDONS_LOG) << "KSystemInhibitor Error: Failed to create power request:" << GetLastError(); + return; + } + + if (types & KSystemInhibitor::Type::Suspend) { + if (!PowerSetRequest(handle, PowerRequestExecutionRequired)) { + qCWarning(KGUIADDONS_LOG) << "KSystemInhibitor Error: Failed to set ExecutionRequired:" << GetLastError(); + } + } + + if (types & KSystemInhibitor::Type::Idle) { + if (!PowerSetRequest(handle, PowerRequestDisplayRequired)) { + qCWarning(KGUIADDONS_LOG) << "KSystemInhibitor Error: Failed to set DisplayRequired:" << GetLastError(); + } + } + + d->m_handle = handle; +} + +KSystemInhibitor::~KSystemInhibitor() +{ + if (d->m_handle != INVALID_HANDLE_VALUE) { + PowerClearRequest(d->m_handle, PowerRequestExecutionRequired); + PowerClearRequest(d->m_handle, PowerRequestDisplayRequired); + CloseHandle(d->m_handle); + } +} + +#include "moc_ksysteminhibitor.cpp" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/tests/CMakeLists.txt new/kguiaddons-6.24.0/tests/CMakeLists.txt --- old/kguiaddons-6.23.1/tests/CMakeLists.txt 2026-03-02 16:31:07.000000000 +0100 +++ new/kguiaddons-6.24.0/tests/CMakeLists.txt 2026-03-07 21:30:37.000000000 +0100 @@ -21,4 +21,5 @@ kcolorschemewatchertest kcountryflagemojiiconenginedemo clipboardtest + clipboardpixmaptest ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kguiaddons-6.23.1/tests/clipboardpixmaptest.cpp new/kguiaddons-6.24.0/tests/clipboardpixmaptest.cpp --- old/kguiaddons-6.23.1/tests/clipboardpixmaptest.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/kguiaddons-6.24.0/tests/clipboardpixmaptest.cpp 2026-03-07 21:30:37.000000000 +0100 @@ -0,0 +1,34 @@ +/* + SPDX-FileCopyrightText: 2026 David Edmundson <[email protected]> + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include <KSystemClipboard> + +#include <QApplication> +#include <QClipboard> +#include <QMimeData> +#include <QPixmap> +#include <QTimer> + +// Check that we can send massive content without any timeouts + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + QPixmap pixmap(8000, 8000); + pixmap.fill(Qt::red); + + auto mimeData = new QMimeData; + mimeData->setImageData(pixmap); + + auto clipboard = KSystemClipboard::instance(); + clipboard->setMimeData(mimeData, QClipboard::Clipboard); + + QTimer::singleShot(5000, &app, [&app]() { + app.quit(); + }); + + return app.exec(); +}
