Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kvantum for openSUSE:Factory checked in at 2026-11-11 16:26:42 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kvantum (Old) and /work/SRC/openSUSE:Factory/.kvantum.new.3759290 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kvantum" Wed Nov 11 16:26:42 2026 rev:27 rq:1396623 version:1.1.9 Changes: -------- --- /work/SRC/openSUSE:Factory/kvantum/kvantum.changes 2026-06-03 20:26:00.598140155 +0200 +++ /work/SRC/openSUSE:Factory/.kvantum.new.3759290/kvantum.changes 2026-11-11 16:26:43.340376290 +0100 @@ -1,0 +2,20 @@ +Tue Nov 10 19:08:36 UTC 2026 - Konstantin Voinov <[email protected]> + +- Version 1.1.9 + * Check genuine mouse events before window dragging. + * Workaround for a Qt bug that may report a highlighted action in + a menu while there is none. + * Removed the workaround for RTL menus of Qt 6.11 (the problems seem + to be fixed in Qt 6.11.2). + * Added an option for compiling Kvantum without X11 dependency. + If it is enabled, Kvantum will still work on X11 but without + compositing. It is only for Qt6. + * Consider the window's device pixel ratio when getting pixmap from + icon (in `getPixmapFromIcon()`). + * Added a workaround for a regression that started with the blur + effect of KWin 6.5 and rarely resulted in artifacts on resizing, + especially on tiling. + * Added a workaround to Kvantum Manager for local URLs in Qt 6.12, + which could not open them without a scheme. + +------------------------------------------------------------------- Old: ---- kvantum-1.1.8.tar.gz New: ---- kvantum-1.1.9.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kvantum.spec ++++++ --- /var/tmp/diff_new_pack.j0DY0n/_old 2026-11-11 16:26:44.122409087 +0100 +++ /var/tmp/diff_new_pack.j0DY0n/_new 2026-11-11 16:26:44.124409170 +0100 @@ -31,7 +31,7 @@ %define dsc_suffix Qt5 %endif Name: kvantum%{?pkg_suffix} -Version: 1.1.8 +Version: 1.1.9 Release: 0 Summary: SVG-based theme engine for Qt5 and Qt6 License: GPL-3.0-or-later ++++++ kvantum-1.1.8.tar.gz -> kvantum-1.1.9.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/CMakeLists.txt new/Kvantum-1.1.9/Kvantum/CMakeLists.txt --- old/Kvantum-1.1.8/Kvantum/CMakeLists.txt 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/CMakeLists.txt 2026-10-31 20:59:15.000000000 +0100 @@ -10,6 +10,7 @@ option(ENABLE_QT4 "Building Qt4 plugin." OFF) option(ENABLE_QT5 "Building Qt5 plugin." OFF) option(WITHOUT_KF "Compiling without KDE Frameworks..." OFF) +option(WITHOUT_X11 "Compiling without X11..." OFF) add_subdirectory(style) if(NOT ENABLE_QT4) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/ChangeLog new/Kvantum-1.1.9/Kvantum/ChangeLog --- old/Kvantum-1.1.8/Kvantum/ChangeLog 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/ChangeLog 2026-10-31 20:59:15.000000000 +0100 @@ -1,3 +1,13 @@ +V1.1.9 +--------- + * Check genuine mouse events before window dragging. + * Workaround for a Qt bug that may report a highlighted action in a menu while there is none. + * Removed the workaround for RTL menus of Qt 6.11 (the problems seem to be fixed in Qt 6.11.2). + * Added an option for compiling Kvantum without X11 dependency. If it is enabled, Kvantum will still work on X11 but without compositing. It is only for Qt6. + * Consider the window's device pixel ratio when getting pixmap from icon (in `getPixmapFromIcon()`). + * Added a workaround for a regression that started with the blur effect of KWin 6.5 and rarely resulted in artifacts on resizing, especially on tiling. + * Added a workaround to Kvantum Manager for local URLs in Qt 6.12, which could not open them without a scheme. + V1.1.8 --------- * Covered a rare edge case of finding the parent menubar of a menu. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/INSTALL.md new/Kvantum-1.1.9/Kvantum/INSTALL.md --- old/Kvantum-1.1.8/Kvantum/INSTALL.md 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/INSTALL.md 2026-10-31 20:59:15.000000000 +0100 @@ -21,7 +21,7 @@ - [LXQt](#in-lxqt) - [Other DEs](#in-other-des) - [Using other themes](#using-other-themes) - - [Blur effect (KWin)](#blur-effect-kwin) + - [Blur effect (KWin and some Wayland compositors)](#blur-effect-kwin-and-some-wayland-compositors) - [Notes for theme makers](#notes-for-theme-makers) - [GTK](#gtk) @@ -44,7 +44,7 @@ * `gcc` (or gcc-multilib for multilib systems) * `libx11` and `libxext` (for X11) * `qt6-base` and `qt6-svg` (for Qt6) - * `kwindowsystem` + * `kwindowsystem` (for blur effect) * `qt6-tools` (for localization if you need it) To install Kvantum directly, you have the choice to install the stable package **or**, preferably, the git package. Respectively, execute: @@ -64,7 +64,7 @@ * `g++` * `libx11-dev` and `libxext-dev` (for X11) * `qt6-base-dev` and `qt6-svg-dev` (for Qt6) - * `libkf6windowsystem-dev` + * `libkf6windowsystem-dev` (for blur effect) * `qt6-base-dev-tools` (for localization if you need it) In Ubuntu, you can install Kvantum directly with: @@ -150,9 +150,11 @@ In some distros, you may need to be more explicit and use `cmake .. -DCMAKE_INSTALL_PREFIX=/usr` for installing Kvantum under `/usr`, in contrast to `/usr/local`. The latter place may not be good in Linux distros and could cause troubles later. -NOTE 1. Kvantum needs `kwindowsystem` only to support some KWin effects (like blur effect). `kwindowsystem` is a small package which does not depend on KDE itself. However, if you do not need those effects, you could use `cmake .. -DWITHOUT_KF=ON`. +NOTE 1. Kvantum needs `kwindowsystem` only to support the blur effect (under KWin and some Wayland compositors). `kwindowsystem` is a small package which does not depend on KDE itself. However, if you do not need blurring, you could use `cmake .. -DWITHOUT_KF=ON`. -NOTE 2: You can also compile Kvantum's Qt5 plugin by using `cmake .. -DENABLE_QT5=ON`, but you need `qt5-x11extras` (or whatever the name of its dev package is in your distro) in addition to the Qt5 counterparts of the required packages. +NOTE 2. Kvantum can be compiled without X11 dependency by using `cmake .. -DWITHOUT_X11=ON`. If this option is enabled, Kvantum will still work on X11 but without compositing. By default, Kvantum is compiled with X11 dependency. + +NOTE 3. You can also compile Kvantum's Qt5 plugin by using `cmake .. -DENABLE_QT5=ON`, but you need `qt5-x11extras` (or whatever the name of its dev package is in your distro) in addition to the Qt5 counterparts of the required packages. ## Installation @@ -203,13 +205,13 @@ For the running parts of KDE/LXQt to recognize the new Kvantum theme, the easiest way is logging out and in again. -### Blur effect (KWin) +### Blur effect (KWin and some Wayland compositors) -The blur effect of any compositor can be used with Kvantum when its active theme has translucent backgrounds. However, Kvantum can control KWin's blur effect with translucent menus and tooltips as well as explicitly translucent windows (like those of QTerminal, Konsole or LXQt Panel). Enabling blur options in *Kvantum Manager* has effect only when KWin's blur effect is enabled; otherwise, there will be no blurring or another compositor will control how translucent backgrounds are blurred. +Kvantum can control the blur effect of KWin and some Wayland compositors (like Niri). *Kvantum Manager* has blur options for translucent windows, menus and tooltips as well as explicitly translucent windows (like LXQt Panel). -In the case of compositors other than KWin, it is preferable that menus and tooltips have neither shadow nor blurring because those compositors cannot distinguish the shadows which Kvantum gives to menus and tooltips. But, if disabling menu/tooltip shadow and blurring is not possible with them, *Kvantum Manager → Configure Active Theme → Compositing & General Look → Shadowless menus and tooltips* could be checked as a workaround. +In the case of compositors which impose their own blur effect and menu/tooltip shadows, it is preferable to exclude menus/tooltips in their settings, because those compositors cannot distinguish the shadows which Kvantum may give to menus/tooltips. But, if they do not have such settings, *Kvantum Manager → Configure Active Theme → Compositing & General Look → Shadowless menus and tooltips* could be checked as a workaround. -Under X11, make sure that you never have two compositors running together! KWin is highly recommended, whether with KDE or with LXQt. It supports both X11 and Wayland and has a decent blur effect. +Under X11, make sure that you never have two compositors running together! ### Notes for theme makers diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/NEWS new/Kvantum-1.1.9/Kvantum/NEWS --- old/Kvantum-1.1.8/Kvantum/NEWS 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/NEWS 2026-10-31 20:59:15.000000000 +0100 @@ -1,5 +1,5 @@ Latest version: - 10 May 2026, V1.1.8 + 31 Oct 2026, V1.1.9 See "ChangeLog" for changes. Binary files old/Kvantum-1.1.8/Kvantum/doc/Theme-Making.pdf and new/Kvantum-1.1.9/Kvantum/doc/Theme-Making.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/kvantummanager/KvantumManager.cpp new/Kvantum-1.1.9/Kvantum/kvantummanager/KvantumManager.cpp --- old/Kvantum-1.1.8/Kvantum/kvantummanager/KvantumManager.cpp 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/kvantummanager/KvantumManager.cpp 2026-10-31 20:59:15.000000000 +0100 @@ -1779,10 +1779,10 @@ { if (userConfigFile_.isEmpty()) return; QUrl url (userConfigFile_); - /* QDesktopServices::openUrl() may resort to "xdg-open", which isn't - the best choice. "gio" is always reliable, so we check it first. */ + /* "gio" is always reliable, so we check it first. */ if (!QProcess::startDetached ("gio", QStringList() << "open" << url.toString())) - QDesktopServices::openUrl (url); + QDesktopServices::openUrl (url.scheme().isEmpty() ? QUrl::fromLocalFile(userConfigFile_) // workaround for Qt 6.12 + : url); } /*************************/ /* Gets the comment and sets the state of the "deleteTheme" button. */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/kvantummanager/data/translations/kvantummanager_zh_CN.ts new/Kvantum-1.1.9/Kvantum/kvantummanager/data/translations/kvantummanager_zh_CN.ts --- old/Kvantum-1.1.8/Kvantum/kvantummanager/data/translations/kvantummanager_zh_CN.ts 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/kvantummanager/data/translations/kvantummanager_zh_CN.ts 2026-10-31 20:59:15.000000000 +0100 @@ -1413,7 +1413,8 @@ <location filename="../../kvantummanager.ui" line="2135"/> <source>Each executable name can be either a simple string or a regular expression.</source> - <translation type="unfinished"></translation> + <translation>每个可执行名称可以是 +简单字符串或正则表达式。</translation> </message> <message> <location filename="../../kvantummanager.ui" line="2139"/> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/kvantummanager/main.cpp new/Kvantum-1.1.9/Kvantum/kvantummanager/main.cpp --- old/Kvantum-1.1.8/Kvantum/kvantummanager/main.cpp 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/kvantummanager/main.cpp 2026-10-31 20:59:15.000000000 +0100 @@ -27,7 +27,7 @@ int main (int argc, char *argv[]) { const QString name = "Kvantum Manager"; - const QString version = "1.1.8"; + const QString version = "1.1.9"; QStringList options; for (int i = 1; i < argc; ++i) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/style/CMakeLists.txt new/Kvantum-1.1.9/Kvantum/style/CMakeLists.txt --- old/Kvantum-1.1.8/Kvantum/style/CMakeLists.txt 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/style/CMakeLists.txt 2026-10-31 20:59:15.000000000 +0100 @@ -10,20 +10,23 @@ if(NOT WITHOUT_KF) find_package(KF6WindowSystem "${KF6_MINIMUM_VERSION}" REQUIRED) endif() + if(NOT WITHOUT_X11) + find_package(X11 REQUIRED) + endif() else() set(QT_VERSION_MAJOR 5) + find_package(X11 REQUIRED) find_package(Qt5 "${QT5_MINIMUM_VERSION}" REQUIRED COMPONENTS Core Gui Widgets Svg X11Extras) endif() else() set(QT_VERSION_MAJOR 4) find_package(Qt4 4.8.7 REQUIRED) + find_package(X11 REQUIRED) include(${QT_USE_FILE}) add_definitions(${QT_DEFINITIONS}) endif() -find_package(X11 REQUIRED) - set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -36,10 +39,16 @@ ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) set(KVANTUM_STYLE_DIR "${_Qt6_PLUGIN_INSTALL_DIR}/styles/") - include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} - ${Qt6Core_INCLUDE_DIRS} ${Qt6Widgets_INCLUDE_DIRS} - ${Qt6Gui_INCLUDE_DIRS} ${Qt6Svg_INCLUDE_DIRS} - ${X11_INCLUDE_DIR}) + if(WITHOUT_X11) + include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} + ${Qt6Core_INCLUDE_DIRS} ${Qt6Widgets_INCLUDE_DIRS} + ${Qt6Gui_INCLUDE_DIRS} ${Qt6Svg_INCLUDE_DIRS}) + else() + include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} + ${Qt6Core_INCLUDE_DIRS} ${Qt6Widgets_INCLUDE_DIRS} + ${Qt6Gui_INCLUDE_DIRS} ${Qt6Svg_INCLUDE_DIRS} + ${X11_INCLUDE_DIR}) + endif() elseif(QT_VERSION_MAJOR EQUAL 5) get_target_property(REAL_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) @@ -68,6 +77,10 @@ add_definitions(-DNO_KF) endif() +if(WITHOUT_X11) + add_definitions(-DNO_X11) +endif() + if(QT_VERSION_MAJOR EQUAL 6) set(kvantum_SOURCES Kvantum.cpp @@ -118,19 +131,34 @@ endif() if(QT_VERSION_MAJOR EQUAL 6) - if(WITHOUT_KF) - target_link_libraries(kvantum ${Qt6Core_LIBRARIES} - ${Qt6Gui_LIBRARIES} - ${Qt6Widgets_LIBRARIES} - ${Qt6Svg_LIBRARIES} - ${X11_LIBRARIES}) + if(WITHOUT_X11) + if(WITHOUT_KF) + target_link_libraries(kvantum ${Qt6Core_LIBRARIES} + ${Qt6Gui_LIBRARIES} + ${Qt6Widgets_LIBRARIES} + ${Qt6Svg_LIBRARIES}) + else() + target_link_libraries(kvantum ${Qt6Core_LIBRARIES} + ${Qt6Gui_LIBRARIES} + ${Qt6Widgets_LIBRARIES} + ${Qt6Svg_LIBRARIES} + KF6::WindowSystem) + endif() else() - target_link_libraries(kvantum ${Qt6Core_LIBRARIES} - ${Qt6Gui_LIBRARIES} - ${Qt6Widgets_LIBRARIES} - ${Qt6Svg_LIBRARIES} - ${X11_LIBRARIES} - KF6::WindowSystem) + if(WITHOUT_KF) + target_link_libraries(kvantum ${Qt6Core_LIBRARIES} + ${Qt6Gui_LIBRARIES} + ${Qt6Widgets_LIBRARIES} + ${Qt6Svg_LIBRARIES} + ${X11_LIBRARIES}) + else() + target_link_libraries(kvantum ${Qt6Core_LIBRARIES} + ${Qt6Gui_LIBRARIES} + ${Qt6Widgets_LIBRARIES} + ${Qt6Svg_LIBRARIES} + ${X11_LIBRARIES} + KF6::WindowSystem) + endif() endif() elseif(QT_VERSION_MAJOR EQUAL 5) target_link_libraries(kvantum ${Qt5Core_LIBRARIES} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/style/Kvantum.cpp new/Kvantum-1.1.9/Kvantum/style/Kvantum.cpp --- old/Kvantum-1.1.8/Kvantum/style/Kvantum.cpp 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/style/Kvantum.cpp 2026-10-31 20:59:15.000000000 +0100 @@ -3319,7 +3319,7 @@ if (!widget // it's NULL with QML || sa || widget->inherits("QWellArray") // color dialog's color rects - || widget->inherits("QComboBoxPrivateContainer")) // frame for combo popups + || widget->inherits("QComboBoxPrivateContainer")) // frame for combo popups (called by drawControl(CE_ShapedFrame,...) { bool pcmanfmInactiveView(false); if (widget) @@ -5950,7 +5950,7 @@ } } QSize iconSize = combo != nullptr ? combo->iconSize() : QSize(smallIconSize, smallIconSize); - QPixmap px = getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), iconstate, iconSize); + QPixmap px = getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), iconstate, iconSize, widget, painter); if (px.isNull()) // with a non-null icon iconSpace = iconSize.width() + lspec.tispace; QRect r = option->rect.adjusted(rtl ? 0 : iconSpace+checkSpace, @@ -6184,7 +6184,7 @@ if (hasIcon) { QPixmap px = getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), - iconstate, opt->decorationSize); + iconstate, opt->decorationSize, widget, painter); o.icon = QIcon(px); } drawViewItem(&o,painter,widget); @@ -6231,14 +6231,14 @@ getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), iconstate, - opt->decorationSize), + opt->decorationSize, widget, painter), tintPercentage); o.icon = QIcon(px); } else { QPixmap px = getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), - iconstate, opt->decorationSize); + iconstate, opt->decorationSize, widget, painter); o.icon = QIcon(px); } } @@ -6260,7 +6260,7 @@ if (hasIcon) { QPixmap px = getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), - iconstate, opt->decorationSize); + iconstate, opt->decorationSize, widget, painter); o.icon = QIcon(px); } drawViewItem(&o,painter,widget); @@ -6283,7 +6283,7 @@ if (hasIcon) { QPixmap px = getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), - iconstate, opt->decorationSize); + iconstate, opt->decorationSize, widget, painter); o.icon = QIcon(px); } drawViewItem(&o,painter,widget); @@ -6303,7 +6303,7 @@ isWidgetInactive(widget), lspec), iconstate, - opt->decorationSize), + opt->decorationSize, widget, painter), opacityPercentage); o.icon = QIcon(px); drawViewItem(&o,painter,widget); @@ -6464,7 +6464,7 @@ { int icnSize = pixelMetric(PM_SmallIconSize); QSize iconSize(icnSize,icnSize); - QPixmap px = getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec),iconstate,iconSize); + QPixmap px = getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec),iconstate,iconSize, widget, painter); renderLabel(option,painter,r, fspec,lspec, talign,QString(),QPalette::WindowText, @@ -6687,7 +6687,7 @@ talign,opt->text,QPalette::WindowText, state, isInactive, - getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), iconstate, opt->iconSize), + getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), iconstate, opt->iconSize, widget, painter), opt->iconSize, Qt::ToolButtonTextBesideIcon, false); } @@ -6726,7 +6726,7 @@ talign,opt->text,QPalette::WindowText, state, isInactive, - getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), iconstate, opt->iconSize), + getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), iconstate, opt->iconSize, widget, painter), opt->iconSize, Qt::ToolButtonTextBesideIcon, false); } @@ -6844,7 +6844,7 @@ talign,opt->currentText,QPalette::ButtonText, state, isInactive, - getPixmapFromIcon(opt->currentIcon, getIconMode(state,isInactive,lspec), iconstate, opt->iconSize), + getPixmapFromIcon(opt->currentIcon, getIconMode(state,isInactive,lspec), iconstate, opt->iconSize, widget, painter), opt->iconSize); } @@ -7516,7 +7516,7 @@ talign,txt,QPalette::WindowText, state, isInactive, - getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), iconstate, iconSize), + getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), iconstate, iconSize, widget, painter), iconSize); if ((opt->state & State_HasFocus) @@ -7633,7 +7633,7 @@ QPixmap px = getPixmapFromIcon(opt->icon, getIconMode(state,isInactive,lspec), iconstate, - QSize(smallIconSize,smallIconSize)); + QSize(smallIconSize,smallIconSize), widget, painter); /* first get the correct pixmap and palette */ QColor col; @@ -9213,7 +9213,7 @@ opt->text,QPalette::ButtonText, state, isInactive, - getPixmapFromIcon(opt->icon,getIconMode(state,isInactive,lspec),iconstate,iconSize), + getPixmapFromIcon(opt->icon,getIconMode(state,isInactive,lspec),iconstate,iconSize, widget, painter), iconSize); } @@ -9839,7 +9839,7 @@ standardPalette().color(QPalette::Window)) ? -1 : state, isInactive, lspec), - iconstate, opt->iconSize), + iconstate, opt->iconSize, widget, painter), opt->iconSize); if(isDefaultBtn) painter->restore(); @@ -10802,7 +10802,7 @@ standardPalette().color(QPalette::Window)) ? -1 : state, isInactive, lspec), - iconstate, iconSize), + iconstate, iconSize, widget, painter), iconSize,tialign); iAlignment |= Qt::AlignLeft; } @@ -10997,7 +10997,7 @@ painter->restore(); } else - QCommonStyle::drawControl(element,option,painter,widget); + QCommonStyle::drawControl(element,option,painter,widget); // calls drawPrimitive(PE_Frame,...) } } @@ -12045,7 +12045,7 @@ } QPixmap icn = getPixmapFromIcon(opt->currentIcon, getIconMode(state,status.contains(KL1("-inactive")),lspec), - iconstate, opt->iconSize); + iconstate, opt->iconSize, widget, painter); QRect iconRect = alignedRect(option->direction, Qt::AlignVCenter | Qt::AlignLeft, opt->iconSize, @@ -12777,7 +12777,7 @@ Qt::AlignCenter,title,QPalette::WindowText, tbStatus == "normal" ? 1 : 2, false, - getPixmapFromIcon(o.icon,Normal,QIcon::Off,iconSize), + getPixmapFromIcon(o.icon,Normal,QIcon::Off,iconSize, widget, painter), iconSize); } @@ -12901,7 +12901,7 @@ btnOpt.rect = subControlRect(CC_MdiControls, option, SC_MdiCloseButton, widget); //drawPrimitive(PE_PanelButtonCommand, &btnOpt, painter, widget); QPixmap pm = getPixmapFromIcon(standardIcon(SP_TitleBarCloseButton,&btnOpt,widget), - iconmode,iconstate,QSize(btnSize,btnSize)); + iconmode,iconstate,QSize(btnSize,btnSize), widget, painter); drawItemPixmap(painter, btnOpt.rect, Qt::AlignCenter, pm); } if (option->subControls & QStyle::SC_MdiNormalButton) @@ -12930,7 +12930,7 @@ btnOpt.rect = subControlRect(CC_MdiControls, option, SC_MdiNormalButton, widget); //drawPrimitive(PE_PanelButtonCommand, &btnOpt, painter, widget); QPixmap pm = getPixmapFromIcon(standardIcon(SP_TitleBarNormalButton,&btnOpt,widget), - iconmode,iconstate,QSize(btnSize,btnSize)); + iconmode,iconstate,QSize(btnSize,btnSize), widget, painter); drawItemPixmap(painter, btnOpt.rect, Qt::AlignCenter, pm); } if (option->subControls & QStyle::SC_MdiMinButton) @@ -12959,7 +12959,7 @@ btnOpt.rect = subControlRect(CC_MdiControls, option, SC_MdiMinButton, widget); //drawPrimitive(PE_PanelButtonCommand, &btnOpt, painter, widget); QPixmap pm = getPixmapFromIcon(standardIcon(SP_TitleBarMinButton,&btnOpt,widget), - iconmode,iconstate,QSize(btnSize,btnSize)); + iconmode,iconstate,QSize(btnSize,btnSize), widget, painter); drawItemPixmap(painter, btnOpt.rect, Qt::AlignCenter, pm); } @@ -15056,7 +15056,7 @@ const label_spec &lspec, // label spec const size_spec &sspec, // size spec const QString &text, - const QSize iconSize, + const QSize &iconSize, const Qt::ToolButtonStyle tialign // text-icon alignment ) const { @@ -16912,7 +16912,9 @@ QPixmap Style::getPixmapFromIcon(const QIcon &icon, const KvIconMode iconmode, const QIcon::State iconstate, - QSize iconSize) const + const QSize &iconSize, + const QWidget *w, + const QPainter *p) const { if (icon.isNull()) return QPixmap(); QIcon::Mode icnMode; @@ -16925,7 +16927,14 @@ else// if (iconmode == Selected || iconmode == DisabledSelected) icnMode = QIcon::Selected; - QPixmap px = icon.pixmap(iconSize,icnMode,iconstate); + /* The window's device pixel ratio is especially needed with multi-screen setups + on Wayland. Without it, the maximum ratio of all screens would be used. */ + QWindow *win = w ? w->window()->windowHandle() : nullptr; + qreal pixelRatio = win ? win->devicePixelRatio() + : p && p->device() ? p->device()->devicePixelRatio() // QML + : qApp->devicePixelRatio(); + + QPixmap px = icon.pixmap(iconSize, pixelRatio, icnMode, iconstate); if (iconmode == Disabled || iconmode == DisabledSelected) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/style/Kvantum.h new/Kvantum-1.1.9/Kvantum/style/Kvantum.h --- old/Kvantum-1.1.8/Kvantum/style/Kvantum.h 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/style/Kvantum.h 2026-10-31 20:59:15.000000000 +0100 @@ -286,7 +286,9 @@ QPixmap getPixmapFromIcon(const QIcon &icon, const KvIconMode iconmode, const QIcon::State iconstate, - QSize iconSize) const; + const QSize &iconSize, + const QWidget *w, + const QPainter *p = nullptr) const; /* Returns a pixmap tinted by the highlight color. */ QPixmap tintedPixmap(const QStyleOption *option, @@ -306,7 +308,7 @@ const label_spec &lspec, const size_spec &sspec, const QString &text, - const QSize iconSize, + const QSize &iconSize, const Qt::ToolButtonStyle tialign = Qt::ToolButtonTextBesideIcon // text-icon alignment ) const; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/style/blur/blurhelper.cpp new/Kvantum-1.1.9/Kvantum/style/blur/blurhelper.cpp --- old/Kvantum-1.1.8/Kvantum/style/blur/blurhelper.cpp 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/style/blur/blurhelper.cpp 2026-10-31 20:59:15.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2024 <[email protected]> + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2026 <[email protected]> * * Kvantum is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -23,9 +23,11 @@ #include <QWindow> #ifdef NO_KF +#ifndef NO_X11 #include <QApplication> #include <X11/Xlib.h> #include <X11/Xatom.h> +#endif #else #include <KWindowEffects> #endif @@ -37,6 +39,7 @@ bool onlyActiveWindow) : QObject (parent) { #ifdef NO_KF +#ifndef NO_X11 isX11_ = (QString::compare(QGuiApplication::platformName(), "xcb", Qt::CaseInsensitive) == 0); if (isX11_) { @@ -48,6 +51,7 @@ else atom_blur_ = None; #endif +#endif contrast_ = qBound (static_cast<qreal>(0), contrast, static_cast<qreal>(2)); intensity_ = qBound (static_cast<qreal>(0), intensity, static_cast<qreal>(2)); @@ -240,12 +244,14 @@ qreal dpr = 1; #ifdef NO_KF +#ifndef NO_X11 if (isX11_) { QWindow *win = widget->window()->windowHandle(); dpr = win ? win->devicePixelRatio() : qApp->devicePixelRatio(); } #endif +#endif /* blurring may not be suitable when the available painting area is restricted by a widget mask */ @@ -327,20 +333,25 @@ void BlurHelper::update (QWidget* widget) const { #ifdef NO_KF +#ifdef NO_X11 + return; +#else if (!isX11_) return; #endif +#endif QWindow *win = widget->windowHandle(); if (win == nullptr) return; - const QRegion region (blurRegion (widget)); + QRegion region (blurRegion (widget)); if (region.isEmpty()) clear (widget); else { #ifdef NO_KF +#ifndef NO_X11 if (!widget->internalWinId()) return; Display *display = nullptr; @@ -357,7 +368,13 @@ atom_blur_, XA_CARDINAL, 32, PropModeReplace, reinterpret_cast<const unsigned char*>(data.constData()), data.size()); +#endif #else + /* NOTE: This is a workaround for a regression that started with KWin 6.5 + and rarely resulted in artifacts on resizing, especially on tiling. */ + if (region == widget->rect()) + region = QRegion(); + KWindowEffects::enableBlurBehind (win, true, region); /* NOTE: The contrast effect isn't used with menus and tooltips because their borders may be anti-aliased. */ @@ -380,6 +397,10 @@ void BlurHelper::clear (QWidget* widget) const { #ifdef NO_KF +#ifdef NO_X11 + return; +#endif +#ifndef NO_X11 if (!isX11_) return; Display *display = nullptr; @@ -387,6 +408,7 @@ display = x11NativeInterfce->display(); if (display && widget->internalWinId()) XDeleteProperty (display, widget->internalWinId(), atom_blur_); +#endif #else QWindow *win = widget->windowHandle(); if (win != nullptr) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/style/blur/blurhelper.h new/Kvantum-1.1.9/Kvantum/style/blur/blurhelper.h --- old/Kvantum-1.1.8/Kvantum/style/blur/blurhelper.h 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/style/blur/blurhelper.h 2026-10-31 20:59:15.000000000 +0100 @@ -1,7 +1,7 @@ // Some functions were adapted from Oxygen-Transparent -> oxygenblurhelper.h /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2024 <[email protected]> + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2026 <[email protected]> * * Kvantum is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -28,8 +28,10 @@ #include <QRegion> #ifdef NO_KF +#ifndef NO_X11 #include <X11/Xdefs.h> #endif +#endif namespace Kvantum { /* A class for blurring the region behind a translucent window in KDE. */ @@ -123,10 +125,12 @@ bool onlyActiveWindow_; #ifdef NO_KF +#ifndef NO_X11 /* The required atom. */ Atom atom_blur_; bool isX11_; #endif +#endif }; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/style/drag/windowmanager.cpp new/Kvantum-1.1.9/Kvantum/style/drag/windowmanager.cpp --- old/Kvantum-1.1.8/Kvantum/style/drag/windowmanager.cpp 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/style/drag/windowmanager.cpp 2026-10-31 20:59:15.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2024 <[email protected]> + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2024-2026 <[email protected]> * * Kvantum is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -281,6 +281,8 @@ bool WindowManager::mousePressEvent (QObject *object, QEvent *event) { QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); + if (mouseEvent->source() != Qt::MouseEventNotSynthesized) + return false; // not a genuine mouse event if (!(mouseEvent->modifiers() == Qt::NoModifier && mouseEvent->button() == Qt::LeftButton)) return false; @@ -475,6 +477,8 @@ if (!dragInProgress_) { QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); + if (mouseEvent->source() != Qt::MouseEventNotSynthesized) + return false; // not a genuine mouse event if (dragAboutToStart_) { dragAboutToStart_ = false; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/style/eventFiltering.cpp new/Kvantum-1.1.9/Kvantum/style/eventFiltering.cpp --- old/Kvantum-1.1.8/Kvantum/style/eventFiltering.cpp 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/style/eventFiltering.cpp 2026-10-31 20:59:15.000000000 +0100 @@ -293,7 +293,7 @@ ? -1 : state, isInactive, lspec), cbtn->isChecked() ? QIcon::On : QIcon::Off, - cbtn->iconSize())); + cbtn->iconSize(), w)); int textflags = Qt::TextShowMnemonic; if (!styleHint(QStyle::SH_UnderlineShortcut, &option, cbtn)) @@ -982,8 +982,13 @@ /* "magical" condition for a submenu */ QPoint parentMenuCorner; QMenu *parentMenu = qobject_cast<QMenu*>(QApplication::activePopupWidget()); - /* this is a workaround for KDE global menu */ - if (parentMenu && parentMenu->activeAction() == nullptr) parentMenu = nullptr; + /* this is a workaround for KDE global menu and also + for a Qt bug which may report an active action while there is none */ + if (parentMenu && (parentMenu->activeAction() == nullptr + || parentMenu->activeAction()->menu() != menu)) + { + parentMenu = nullptr; + } if (parentMenu == nullptr) { // search for a detached menu with an active action const QWidgetList topLevels = QApplication::topLevelWidgets(); @@ -993,7 +998,8 @@ if (auto topMenu = qobject_cast<QMenu*>(topWidget)) { if (topWidget->testAttribute(Qt::WA_X11NetWmWindowTypeMenu) - && topMenu->activeAction()) + && topMenu->activeAction() + && topMenu->activeAction()->menu() == menu) { parentMenu = topMenu; parentMenuCorner = parentMenu->mapToGlobal(QPoint(0,0)); @@ -1032,7 +1038,6 @@ } } - bool isWaylandMenu = false; bool isWaylandSubMenu = false; bool isWaylandMenuBarMenu = false; #if (QT_VERSION >= QT_VERSION_CHECK(6,11,0)) @@ -1162,9 +1167,6 @@ } else { -#if (QT_VERSION >= QT_VERSION_CHECK(6,11,0)) - isWaylandMenu = true; -#endif QRect pg; if (QWidget *p = w->parentWidget()) pg = p->window()->geometry(); @@ -1265,9 +1267,6 @@ } else // the global position is unknown under Wayland { -#if (QT_VERSION >= QT_VERSION_CHECK(6,11,0)) - isWaylandMenu = true; -#endif /* snap to the parent window's top/left side if needed and, as the last resort, consider the cursor position */ QRect pg; @@ -1363,27 +1362,6 @@ } } } - else if (isWaylandMenu && sc != nullptr && w->layoutDirection() == Qt::RightToLeft - && menu->menuAction()) - { // RTL context menus of Qt 6.11 are terrible - if (QWindow *win = w->windowHandle()) - { - QRect geom(0, 0, 1, 1); - QPoint curPos = QCursor::pos(sc); - if (curPos.x() == g.left()) - { // workaround for a weird RTL issue in Qt - dX += menuShadow_.at(2) + menuShadow_.at(0); - DX = qRound(dX); - } - if (QWidget *p = w->parentWidget()) - curPos = p->window()->mapFromGlobal(curPos); - geom.moveTopRight(curPos); - win->setProperty("_q_waylandPopupAnchorRect", geom.translated(DX, DY)); - - uint constraintAdjustment = 1 | 2; - win->setProperty("_q_waylandPopupConstraintAdjustment", constraintAdjustment); - } - } /* This workaround isn't needed anymore. It didn't work with Wayland either. */ // prevent the menu from switching to another screen diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/style/standardIcons.cpp new/Kvantum-1.1.9/Kvantum/style/standardIcons.cpp --- old/Kvantum-1.1.8/Kvantum/style/standardIcons.cpp 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/style/standardIcons.cpp 2026-10-31 20:59:15.000000000 +0100 @@ -113,7 +113,7 @@ if (!icn.isNull()) { if (option || widget) - { // also correct the color of the symbolic clear icon (-> CE_ToolBar) + { // also correct the color of the symbolic clear icon (-> CE_ToolBar) if (enoughContrast(standardPalette().color(QPalette::Active,QPalette::Text), option ? option->palette.color(QPalette::Active,QPalette::Text) : widget->palette().color(QPalette::Active,QPalette::Text))) @@ -122,7 +122,7 @@ QPixmap px = getPixmapFromIcon(icn, (option ? (option->state & State_Enabled) : widget->isEnabled()) ? Selected : DisabledSelected, - QIcon::On, QSize(s,s)); + QIcon::On, QSize(s,s), widget); icn = QIcon(px); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Kvantum-1.1.8/Kvantum/style/themeconfig/ThemeConfig.cpp new/Kvantum-1.1.9/Kvantum/style/themeconfig/ThemeConfig.cpp --- old/Kvantum-1.1.8/Kvantum/style/themeconfig/ThemeConfig.cpp 2026-05-09 22:40:42.000000000 +0200 +++ new/Kvantum-1.1.9/Kvantum/style/themeconfig/ThemeConfig.cpp 2026-10-31 20:59:15.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2024 <[email protected]> + * Copyright (C) Pedram Pourang (aka Tsu Jan) 2014-2026 <[email protected]> * * Kvantum is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -20,10 +20,12 @@ #include <QApplication> #include "ThemeConfig.h" +#ifndef NO_X11 #if defined Q_WS_X11 || defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_NETBSD || defined Q_OS_HURD #include <X11/Xlib.h> #include <X11/Xatom.h> #endif +#endif namespace Kvantum { @@ -579,6 +581,7 @@ { bool compositing(false); +#ifndef NO_X11 #if defined Q_WS_X11 || defined Q_OS_LINUX || defined Q_OS_FREEBSD || defined Q_OS_OPENBSD || defined Q_OS_NETBSD || defined Q_OS_HURD if (isX11_) { @@ -598,6 +601,10 @@ compositing = true; } #endif +#else + if (QString::compare(QGuiApplication::platformName(), "wayland", Qt::CaseInsensitive) == 0) + compositing = true; +#endif /* no blurring or window translucency without compositing */ if (compositing)
