diff -Nru breeze-5.25.5/CMakeLists.txt breeze-5.24.7/CMakeLists.txt --- breeze-5.25.5/CMakeLists.txt 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/CMakeLists.txt 2022-10-14 09:57:05.000000000 +0000 @@ -1,11 +1,11 @@ cmake_minimum_required(VERSION 3.16) project(breeze) -set(PROJECT_VERSION "5.25.5") +set(PROJECT_VERSION "5.24.7") set(PROJECT_VERSION_MAJOR 5) -set(KF5_MIN_VERSION "5.94") +set(KF5_MIN_VERSION "5.86") set(KDE_COMPILERSETTINGS_LEVEL "5.82") -set(QT_MIN_VERSION "5.15.2") +set(QT_MIN_VERSION "5.15.0") include(GenerateExportHeader) include(WriteBasicConfigVersionFile) @@ -16,11 +16,11 @@ include(CMakePackageConfigHelpers) include(ECMInstallIcons) +include(ECMPackageConfigHelpers) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) include(KDEClangFormat) -include(KDEGitCommitHooks) include(GtkUpdateIconCache) @@ -68,7 +68,6 @@ # add clang-format target for all our real source files file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES *.cpp *.h) kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES}) -kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/BreezeConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/BreezeConfigVersion.cmake" diff -Nru breeze-5.25.5/colors/BreezeClassic.colors breeze-5.24.7/colors/BreezeClassic.colors --- breeze-5.25.5/colors/BreezeClassic.colors 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/colors/BreezeClassic.colors 2022-10-14 09:57:05.000000000 +0000 @@ -140,8 +140,6 @@ Name[uk]=Класична Breeze Name[x-test]=xxBreeze Classicxx Name[zh_CN]=Breeze 微风经典 -accentActiveTitlebar=true -accentInactiveTitlebar=false shadeSortColumn=true [KDE] diff -Nru breeze-5.25.5/cursors/Breeze/Breeze/index.theme breeze-5.24.7/cursors/Breeze/Breeze/index.theme --- breeze-5.25.5/cursors/Breeze/Breeze/index.theme 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/cursors/Breeze/Breeze/index.theme 2022-10-14 09:57:05.000000000 +0000 @@ -83,7 +83,7 @@ Comment[ro]=Briză, de KDE VDG Comment[ru]=Breeze от KDE VDG Comment[sk]=Vánok od KDE VDG -Comment[sl]=Sapica; izdelali pri KDE VDG +Comment[sl]=Sapica s strani KDE VDG Comment[sv]=Breeze av KDE:s visuella designgrupp Comment[tg]=Насим аз KDE VDG Comment[tr]=KDE Görsel Tasarım Grubundan Esinti diff -Nru breeze-5.25.5/cursors/Breeze/build.sh breeze-5.24.7/cursors/Breeze/build.sh --- breeze-5.25.5/cursors/Breeze/build.sh 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/cursors/Breeze/build.sh 2022-10-14 09:57:05.000000000 +0000 @@ -61,15 +61,15 @@ echo -ne "\033[0KGenerating simple cursor pixmaps... $BASENAME\\r" if [ "$DIR1X/$BASENAME.png" -ot $RAWSVG ] ; then - inkscape -i $BASENAME -w 32 -h 32 -f $RAWSVG -e "$DIR1X/$BASENAME.png" > /dev/null + inkscape -i $BASENAME -d 90 -f $RAWSVG -e "$DIR1X/$BASENAME.png" > /dev/null fi if [ "$DIR1_5X/$BASENAME.png" -ot $RAWSVG ] ; then - inkscape -i $BASENAME -w 48 -h 48 -f $RAWSVG -e "$DIR1_5X/$BASENAME.png" > /dev/null + inkscape -i $BASENAME -d 135 -f $RAWSVG -e "$DIR1_5X/$BASENAME.png" > /dev/null fi if [ "$DIR2X/$BASENAME.png" -ot $RAWSVG ] ; then - inkscape -i $BASENAME -w 64 -h 64 -f $RAWSVG -e "$DIR2X/$BASENAME.png" > /dev/null + inkscape -i $BASENAME -d 180 -f $RAWSVG -e "$DIR2X/$BASENAME.png" > /dev/null fi done echo -e "\033[0KGenerating simple cursor pixmaps... DONE" @@ -81,27 +81,27 @@ echo -ne "\033[0KGenerating animated cursor pixmaps... $i / 23 \\r" if [ "$DIR1X/progress-$i.png" -ot $RAWSVG ] ; then - inkscape -i progress-$i -w 32 -h 32 -f $RAWSVG -e "$DIR1X/progress-$i.png" > /dev/null + inkscape -i progress-$i -d 90 -f $RAWSVG -e "$DIR1X/progress-$i.png" > /dev/null fi if [ "$DIR1_5X/progress-$i.png" -ot $RAWSVG ] ; then - inkscape -i progress-$i -w 48 -h 48 -f $RAWSVG -e "$DIR1_5X/progress-$i.png" > /dev/null + inkscape -i progress-$i -d 135 -f $RAWSVG -e "$DIR1_5X/progress-$i.png" > /dev/null fi if [ "$DIR2X/progress-$i.png" -ot $RAWSVG ] ; then - inkscape -i progress-$i -w 64 -h 64 -f $RAWSVG -e "$DIR2X/progress-$i.png" > /dev/null + inkscape -i progress-$i -d 180 -f $RAWSVG -e "$DIR2X/progress-$i.png" > /dev/null fi if [ "$DIR1X/wait-$i.png" -ot $RAWSVG ] ; then - inkscape -i wait-$i -w 32 -h 32 -f $RAWSVG -e "$DIR1X/wait-$i.png" > /dev/null + inkscape -i wait-$i -d 90 -f $RAWSVG -e "$DIR1X/wait-$i.png" > /dev/null fi if [ "$DIR1_5X/wait-$i.png" -ot $RAWSVG ] ; then - inkscape -i wait-$i -w 48 -h 48 -f $RAWSVG -e "$DIR1_5X/wait-$i.png" > /dev/null + inkscape -i wait-$i -d 135 -f $RAWSVG -e "$DIR1_5X/wait-$i.png" > /dev/null fi if [ "$DIR2X/wait-$i.png" -ot $RAWSVG ] ; then - inkscape -i wait-$i -w 64 -h 64 -f $RAWSVG -e "$DIR2X/wait-$i.png" > /dev/null + inkscape -i wait-$i -d 180 -f $RAWSVG -e "$DIR2X/wait-$i.png" > /dev/null fi done echo -e "\033[0KGenerating animated cursor pixmaps... DONE" diff -Nru breeze-5.25.5/cursors/Breeze/src/index.theme breeze-5.24.7/cursors/Breeze/src/index.theme --- breeze-5.25.5/cursors/Breeze/src/index.theme 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/cursors/Breeze/src/index.theme 2022-10-14 09:57:05.000000000 +0000 @@ -83,7 +83,7 @@ Comment[ro]=Briză, de KDE VDG Comment[ru]=Breeze от KDE VDG Comment[sk]=Vánok od KDE VDG -Comment[sl]=Sapica; izdelali pri KDE VDG +Comment[sl]=Sapica s strani KDE VDG Comment[sv]=Breeze av KDE:s visuella designgrupp Comment[tg]=Насим аз KDE VDG Comment[tr]=KDE Görsel Tasarım Grubundan Esinti diff -Nru breeze-5.25.5/cursors/Breeze_Snow/Breeze_Snow/index.theme breeze-5.24.7/cursors/Breeze_Snow/Breeze_Snow/index.theme --- breeze-5.25.5/cursors/Breeze_Snow/Breeze_Snow/index.theme 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/cursors/Breeze_Snow/Breeze_Snow/index.theme 2022-10-14 09:57:05.000000000 +0000 @@ -75,7 +75,7 @@ Comment[ro]=Briză, luminos, de KDE VDG Comment[ru]=Светлый вариант Breeze от KDE VDG Comment[sk]=Svetlý vánok od KDE VDG -Comment[sl]=Sapica, svetla; izdelali pri KDE VDG +Comment[sl]=Sapica lahka s strani KDE VDG Comment[sv]=Breeze ljus av KDE:s visuella designgrupp Comment[tg]=Насими сабук аз KDE VDG Comment[tr]=KDE Görsel Tasarım Grubundan Esinti diff -Nru breeze-5.25.5/cursors/Breeze_Snow/build.sh breeze-5.24.7/cursors/Breeze_Snow/build.sh --- breeze-5.25.5/cursors/Breeze_Snow/build.sh 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/cursors/Breeze_Snow/build.sh 2022-10-14 09:57:05.000000000 +0000 @@ -61,15 +61,15 @@ echo -ne "\033[0KGenerating simple cursor pixmaps... $BASENAME\\r" if [ "$DIR1X/$BASENAME.png" -ot $RAWSVG ] ; then - inkscape -i $BASENAME -w 32 -h 32 -f $RAWSVG -e "$DIR1X/$BASENAME.png" > /dev/null + inkscape -i $BASENAME -d 90 -f $RAWSVG -e "$DIR1X/$BASENAME.png" > /dev/null fi if [ "$DIR1_5X/$BASENAME.png" -ot $RAWSVG ] ; then - inkscape -i $BASENAME -w 48 -h 48 -f $RAWSVG -e "$DIR1_5X/$BASENAME.png" > /dev/null + inkscape -i $BASENAME -d 135 -f $RAWSVG -e "$DIR1_5X/$BASENAME.png" > /dev/null fi if [ "$DIR2X/$BASENAME.png" -ot $RAWSVG ] ; then - inkscape -i $BASENAME -w 64 -h 64 -f $RAWSVG -e "$DIR2X/$BASENAME.png" > /dev/null + inkscape -i $BASENAME -d 180 -f $RAWSVG -e "$DIR2X/$BASENAME.png" > /dev/null fi done echo -e "\033[0KGenerating simple cursor pixmaps... DONE" @@ -81,27 +81,27 @@ echo -ne "\033[0KGenerating animated cursor pixmaps... $i / 23 \\r" if [ "$DIR1X/progress-$i.png" -ot $RAWSVG ] ; then - inkscape -i progress-$i -w 32 -h 32 -f $RAWSVG -e "$DIR1X/progress-$i.png" > /dev/null + inkscape -i progress-$i -d 90 -f $RAWSVG -e "$DIR1X/progress-$i.png" > /dev/null fi if [ "$DIR1_5X/progress-$i.png" -ot $RAWSVG ] ; then - inkscape -i progress-$i -w 48 -h 48 -f $RAWSVG -e "$DIR1_5X/progress-$i.png" > /dev/null + inkscape -i progress-$i -d 135 -f $RAWSVG -e "$DIR1_5X/progress-$i.png" > /dev/null fi if [ "$DIR2X/progress-$i.png" -ot $RAWSVG ] ; then - inkscape -i progress-$i -w 64 -h 64 -f $RAWSVG -e "$DIR2X/progress-$i.png" > /dev/null + inkscape -i progress-$i -d 180 -f $RAWSVG -e "$DIR2X/progress-$i.png" > /dev/null fi if [ "$DIR1X/wait-$i.png" -ot $RAWSVG ] ; then - inkscape -i wait-$i -w 32 -h 32 -f $RAWSVG -e "$DIR1X/wait-$i.png" > /dev/null + inkscape -i wait-$i -d 90 -f $RAWSVG -e "$DIR1X/wait-$i.png" > /dev/null fi if [ "$DIR1_5X/wait-$i.png" -ot $RAWSVG ] ; then - inkscape -i wait-$i -w 48 -h 48 -f $RAWSVG -e "$DIR1_5X/wait-$i.png" > /dev/null + inkscape -i wait-$i -d 135 -f $RAWSVG -e "$DIR1_5X/wait-$i.png" > /dev/null fi if [ "$DIR2X/wait-$i.png" -ot $RAWSVG ] ; then - inkscape -i wait-$i -w 64 -h 64 -f $RAWSVG -e "$DIR2X/wait-$i.png" > /dev/null + inkscape -i wait-$i -d 180 -f $RAWSVG -e "$DIR2X/wait-$i.png" > /dev/null fi done echo -e "\033[0KGenerating animated cursor pixmaps... DONE" diff -Nru breeze-5.25.5/cursors/Breeze_Snow/src/index.theme breeze-5.24.7/cursors/Breeze_Snow/src/index.theme --- breeze-5.25.5/cursors/Breeze_Snow/src/index.theme 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/cursors/Breeze_Snow/src/index.theme 2022-10-14 09:57:05.000000000 +0000 @@ -75,7 +75,7 @@ Comment[ro]=Briză, luminos, de KDE VDG Comment[ru]=Светлый вариант Breeze от KDE VDG Comment[sk]=Svetlý vánok od KDE VDG -Comment[sl]=Sapica, svetla; izdelali pri KDE VDG +Comment[sl]=Sapica lahka s strani KDE VDG Comment[sv]=Breeze ljus av KDE:s visuella designgrupp Comment[tg]=Насими сабук аз KDE VDG Comment[tr]=KDE Görsel Tasarım Grubundan Esinti diff -Nru breeze-5.25.5/debian/breeze.lintian-overrides breeze-5.24.7/debian/breeze.lintian-overrides --- breeze-5.25.5/debian/breeze.lintian-overrides 2022-09-06 14:31:09.000000000 +0000 +++ breeze-5.24.7/debian/breeze.lintian-overrides 2022-10-14 11:45:12.000000000 +0000 @@ -1 +1 @@ -breeze: no-manual-page [usr/bin/breeze-settings5] +breeze: no-manual-page usr/bin/breeze-settings5 diff -Nru breeze-5.25.5/debian/changelog breeze-5.24.7/debian/changelog --- breeze-5.25.5/debian/changelog 2022-09-06 14:31:09.000000000 +0000 +++ breeze-5.24.7/debian/changelog 2022-10-14 11:45:12.000000000 +0000 @@ -1,114 +1,15 @@ -breeze (4:5.25.5-0ubuntu1~ubuntu22.04~ppa1) jammy; urgency=high +breeze (4:5.24.7-0ubuntu0.1~ubuntu22.04~ppa1) jammy; urgency=high - * New upstream release (5.25.5) + * New upstream bugfix release (5.24.7) (LP: #1992971) - -- Rik Mills Tue, 06 Sep 2022 15:31:09 +0100 + -- Rik Mills Fri, 14 Oct 2022 12:45:12 +0100 -breeze (4:5.25.4-1ubuntu1) kinetic; urgency=medium +breeze (4:5.24.6-0ubuntu0.1) jammy; urgency=medium - * Merge from Debian unstable. Remaining changes: - - Kubuntu Vcs and maintainer fields. + * New upstream bugfix release (5.24.6) + * SRU to 22.04 (LP: #1986447) - -- Rik Mills Thu, 04 Aug 2022 01:43:27 +0100 - -breeze (4:5.25.4-1) unstable; urgency=medium - - [ Aurélien COUDERC ] - * New upstream release (5.25.4). - - -- Aurélien COUDERC Tue, 02 Aug 2022 17:33:40 +0200 - -breeze (4:5.25.4-0ubuntu1) kinetic; urgency=medium - - * New upstream release (5.25.4) - - -- Rik Mills Tue, 02 Aug 2022 17:58:03 +0100 - -breeze (4:5.25.3-1) unstable; urgency=medium - - [ Aurélien COUDERC ] - * New upstream release (5.25.2). - * Remove now unused build dependency on libkf5package-dev and - libkf5wayland-dev. - * Adapt lintian overrides. - * New upstream release (5.25.3). - * Release to unstable - - -- Aurélien COUDERC Sun, 17 Jul 2022 15:28:38 +0200 - -breeze (4:5.25.3-0ubuntu1) kinetic; urgency=medium - - * New upstream release (5.25.3) - - -- Rik Mills Tue, 12 Jul 2022 14:42:41 +0100 - -breeze (4:5.25.2-0ubuntu1) kinetic; urgency=medium - - * New upstream release (5.25.2) - - -- Rik Mills Tue, 28 Jun 2022 14:15:41 +0100 - -breeze (4:5.25.1-1) experimental; urgency=medium - - [ Patrick Franz ] - * New upstream release (5.25.1). - * Tighten inter-Plasma dependencies. - - -- Patrick Franz Tue, 21 Jun 2022 21:46:49 +0200 - -breeze (4:5.25.1-0ubuntu1) kinetic; urgency=medium - - * New upstream release (5.25.1) - - -- Rik Mills Tue, 21 Jun 2022 16:25:59 +0100 - -breeze (4:5.25.0a-0ubuntu1) kinetic; urgency=medium - - * New upstream release (5.25.0) - - -- Rik Mills Tue, 14 Jun 2022 08:03:54 +0100 - -breeze (4:5.25.0-1) experimental; urgency=medium - - * New upstream release (5.25.0). - * Tighten cross-plasma components dependencies. - * Bump Standards-Version to 4.6.1, no change required. - - -- Aurélien COUDERC Tue, 14 Jun 2022 21:26:42 +0200 - -breeze (4:5.24.90-1) experimental; urgency=medium - - [ Aurélien COUDERC ] - * New upstream release (5.24.90). - - -- Aurélien COUDERC Fri, 20 May 2022 11:45:33 +0200 - -breeze (4:5.24.90-0ubuntu1) kinetic; urgency=medium - - * New upstream release (5.24.90) - * New build depend on kirigami2-dev - - -- Rik Mills Thu, 19 May 2022 18:38:31 +0100 - -breeze (4:5.24.5-1) unstable; urgency=medium - - [ Aurélien COUDERC ] - * New upstream release (5.24.5). - - -- Aurélien COUDERC Thu, 12 May 2022 21:40:08 +0200 - -breeze (4:5.24.5-0ubuntu1) kinetic; urgency=medium - - * New upstream release (5.24.5) - - -- Rik Mills Tue, 03 May 2022 15:47:08 +0100 - -breeze (4:5.24.4-1) unstable; urgency=medium - - [ Aurélien COUDERC ] - * New upstream release (5.24.4). - - -- Aurélien COUDERC Wed, 30 Mar 2022 14:02:53 +0200 + -- Rik Mills Tue, 16 Aug 2022 09:05:52 +0100 breeze (4:5.24.4-0ubuntu1) jammy; urgency=medium @@ -116,14 +17,6 @@ -- Rik Mills Wed, 30 Mar 2022 10:18:55 +0100 -breeze (4:5.24.3-1) unstable; urgency=medium - - [ Aurélien COUDERC ] - * New upstream release (5.24.3). - * Added myself to the uploaders. - - -- Aurélien COUDERC Thu, 10 Mar 2022 08:18:45 +0100 - breeze (4:5.24.3-0ubuntu1) jammy; urgency=medium * Update maintainer to Kubuntu Developers. @@ -131,16 +24,6 @@ -- Rik Mills Tue, 08 Mar 2022 12:13:27 +0000 -breeze (4:5.24.2-1) unstable; urgency=medium - - [ Patrick Franz ] - * New upstream release (5.24.2). - * Re-export signing key without extra signatures. - * Update B-Ds and deps with the info from cmake. - * Update d/copyright. - - -- Patrick Franz Sat, 26 Feb 2022 21:57:29 +0100 - breeze (4:5.24.2-0ubuntu1) jammy; urgency=medium * New upstream release (5.24.2) @@ -165,30 +48,12 @@ -- Rik Mills Fri, 14 Jan 2022 10:17:31 +0000 -breeze (4:5.23.5-1) unstable; urgency=medium - - [ Patrick Franz ] - * New upstream release (5.23.5). - * Update B-Ds. - - -- Patrick Franz Fri, 07 Jan 2022 17:22:08 +0100 - breeze (4:5.23.5-0ubuntu1) jammy; urgency=medium * New upstream release (5.23.5) -- Rik Mills Tue, 04 Jan 2022 10:39:18 +0000 -breeze (4:5.23.4-1) unstable; urgency=medium - - [ Norbert Preining ] - * New upstream release (5.23.4). - - [ Patrick Franz ] - * Update B-Ds. - - -- Patrick Franz Thu, 02 Dec 2021 21:58:38 +0100 - breeze (4:5.23.4-0ubuntu1) jammy; urgency=medium * New upstream release (5.23.4) diff -Nru breeze-5.25.5/debian/control breeze-5.24.7/debian/control --- breeze-5.25.5/debian/control 2022-09-06 14:31:09.000000000 +0000 +++ breeze-5.24.7/debian/control 2022-10-14 11:45:12.000000000 +0000 @@ -3,32 +3,32 @@ Priority: optional Maintainer: Kubuntu Developers XSBC-Original-Maintainer: Debian Qt/KDE Maintainers -Uploaders: Aurélien COUDERC , - Norbert Preining , +Uploaders: Scarlett Moore , Patrick Franz , - Scarlett Moore , + Norbert Preining , Build-Depends: cmake (>= 3.16~), debhelper-compat (= 13), - extra-cmake-modules (>= 5.94~), + extra-cmake-modules (>= 5.90.0~), gettext, - kirigami2-dev (>= 5.94~), - libkdecorations2-dev (>= 4:5.25.5~), - libkf5config-dev (>= 5.94~), - libkf5configwidgets-dev (>= 5.94~), - libkf5coreaddons-dev (>= 5.94~), - libkf5guiaddons-dev (>= 5.94~), - libkf5i18n-dev (>= 5.94~), - libkf5iconthemes-dev (>= 5.94~), - libkf5kcmutils-dev (>= 5.94~), - libkf5style-dev (>= 5.94~), - libkf5windowsystem-dev (>= 5.94~), - libqt5x11extras5-dev (>= 5.15.2~), + libkdecorations2-dev (>= 4:5.24.4~), + libkf5config-dev (>= 5.90.0~), + libkf5configwidgets-dev (>= 5.90.0~), + libkf5coreaddons-dev (>= 5.90.0~), + libkf5guiaddons-dev (>= 5.90.0~), + libkf5i18n-dev (>= 5.90.0~), + libkf5iconthemes-dev (>= 5.90.0~), + libkf5kcmutils-dev (>= 5.90.0~), + libkf5package-dev (>= 5.90.0~), + libkf5style-dev (>= 5.90.0~), + libkf5wayland-dev (>= 4:5.90.0~) [linux-any], + libkf5windowsystem-dev (>= 5.90.0~), + libqt5x11extras5-dev (>= 5.15.0~), libx11-dev, pkg-config, pkg-kde-tools (>= 0.15.15ubuntu1~), - qtbase5-dev (>= 5.15.2~), - qtdeclarative5-dev (>= 5.15.2~), -Standards-Version: 4.6.1 + qtbase5-dev (>= 5.15.0~), + qtdeclarative5-dev (>= 5.15.0~), +Standards-Version: 4.6.0 Homepage: https://invent.kde.org/?p=breeze.git/breeze Vcs-Browser: https://code.launchpad.net/~kubuntu-packagers/kubuntu-packaging/+git/breeze Vcs-Git: https://git.launchpad.net/~kubuntu-packagers/kubuntu-packaging/+git/breeze diff -Nru breeze-5.25.5/debian/copyright breeze-5.24.7/debian/copyright --- breeze-5.25.5/debian/copyright 2022-09-06 14:31:09.000000000 +0000 +++ breeze-5.24.7/debian/copyright 2022-10-14 11:45:12.000000000 +0000 @@ -17,6 +17,8 @@ Files: kdecoration/breezeexceptionlist.cpp kdecoration/breezeexceptionlist.h + kdecoration/config/breezeconfig.cpp + kdecoration/config/breezeconfig.h kdecoration/config/breezeconfigwidget.cpp kdecoration/config/breezeconfigwidget.h kdecoration/config/breezedetectwidget.cpp @@ -30,6 +32,8 @@ kdecoration/config/breezeitemmodel.cpp kdecoration/config/breezeitemmodel.h kdecoration/config/breezelistmodel.h + kstyle/config/breezeconfigdialog.cpp + kstyle/config/breezeconfigdialog.h kstyle/config/main.cpp Copyright: 2009-2010, Hugo Pereira Da Costa 2001, Karol Szwed @@ -39,6 +43,8 @@ Files: kdecoration/breeze.h kdecoration/breezebutton.cpp kdecoration/breezebutton.h + kdecoration/breezecolorsettings.cpp + kdecoration/breezecolorsettings.h kdecoration/breezedecoration.cpp kdecoration/breezedecoration.h kdecoration/breezesettingsprovider.cpp @@ -53,6 +59,13 @@ po/uk/breeze_style_config.po Copyright: 2014-2015, This_file_is_part_of_KDE License: LGPL-2.1+3+KDEeV + This file is distributed under the license LGPL version 2.1 or + version 3 or later versions approved by the membership of KDE e.V. + - + On Debian systems, the complete text of the GNU Lesser General Public License + version 2.1 can be found in `/usr/share/common-licenses/LGPL-2.1', likewise, + the complete text of the GNU Lesser General Public License version 3 can be + found in `/usr/share/common-licenses/LGPL-3'. Files: kstyle/animations/breezeheaderviewdata.cpp kstyle/animations/breezetabbardata.cpp @@ -60,8 +73,49 @@ Copyright: 2009-2014, Hugo Pereira Da Costa 2007, Thomas Luebking License: Expat_and_GPL-2+ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program; if not, write to the + Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . + --- + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. + - + On Debian systems, the complete text of the GNU General Public License + version 2 can be found in `/usr/share/common-licenses/GPL-2'. + +Files: qtquickcontrols/GroupBoxStyle.qml +Copyright: 2013, Digia Plc and/or its subsidiary(-ies) +License: BSD-3-clause Files: cursors/* + icons/* + icons-dark/* wallpapers/* Copyright: 2014 Uri Herrera and others Comment: Some svg files have outdated license information (CC-BY-SA) in @@ -112,9 +166,34 @@ Files: debian/* Copyright: 2014, Jonathan Riddell 2014, Scarlett Clark - 2022, Patrick Franz License: GPL-2+ +License: BSD-3-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names + of its contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + License: Expat Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to @@ -172,49 +251,3 @@ version 2 can be found in `/usr/share/common-licenses/GPL-2', likewise, the complete text of the GNU General Public License version 3 can be found in `/usr/share/common-licenses/GPL-3'. - -License: LGPL-2.1+3+KDEeV - This file is distributed under the license LGPL version 2.1 or - version 3 or later versions approved by the membership of KDE e.V. - - - On Debian systems, the complete text of the GNU Lesser General Public License - version 2.1 can be found in `/usr/share/common-licenses/LGPL-2.1', likewise, - the complete text of the GNU Lesser General Public License version 3 can be - found in `/usr/share/common-licenses/LGPL-3'. - -License: Expat_and_GPL-2+ - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - . - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - . - You should have received a copy of the GNU General Public License - along with this program; if not, write to the - Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . - --- - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - . - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. - - - On Debian systems, the complete text of the GNU General Public License - version 2 can be found in `/usr/share/common-licenses/GPL-2'. diff -Nru breeze-5.25.5/debian/salsa-ci.yml breeze-5.24.7/debian/salsa-ci.yml --- breeze-5.25.5/debian/salsa-ci.yml 2022-09-06 14:31:09.000000000 +0000 +++ breeze-5.24.7/debian/salsa-ci.yml 2022-10-14 11:45:12.000000000 +0000 @@ -1,7 +1,9 @@ include: -- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml -- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml + - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml + - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml variables: - EXTRA_REPOSITORY: debian/salsa/extra_repository.list - EXTRA_REPOSITORY_KEY: debian/salsa/qt-kde-team.debian.net.asc - SALSA_CI_REPROTEST_ARGS: --variations=-build-path + SALSA_CI_DISABLE_MISSING_BREAKS: 'no' + SALSA_CI_DISABLE_RC_BUGS: 'no' + SALSA_CI_REPROTEST_ARGS: '--variations=-build-path' + EXTRA_REPOSITORY: 'debian/salsa/extra_repository.list' + EXTRA_REPOSITORY_KEY: 'debian/salsa/qt-kde-team.debian.net.asc' diff -Nru breeze-5.25.5/debian/upstream/signing-key.asc breeze-5.24.7/debian/upstream/signing-key.asc --- breeze-5.25.5/debian/upstream/signing-key.asc 2022-09-06 14:31:09.000000000 +0000 +++ breeze-5.24.7/debian/upstream/signing-key.asc 2022-10-14 11:45:12.000000000 +0000 @@ -13,145 +13,632 @@ QdLEOXCbPbRG3q0OlSaOvETL7YkSY8c2N6yqmWaJvudpJ0VVPyIWa2xT53JTXgAD 4m1w8MThAZBZpJi852nQCByCsRC+3cofA7bQd60XLiFWgmnq+rlqryMlWvUmMmat e7U1NC5UsfH6ToXf/ZNZG+fMGE+ntYiHWRFr2tZMyXfUOrgHsAVMAE8v/xVtwS5e -VCAdM21GNG4d6XiF7T32GDzrEQm5AQ0EUbX5tAEIAL0uLkPxHbg9boIuVdahyy6F -BOcUf8xj3qj8FUGpRkcSSsoyvFTHZRTR+wwTPTaZzzzTFSITRGVv7vdKyl/A+SMw -/nlUVfB9xGvvCgzPGesUk9lmxX2DRVpoq9CyVIw0XXJQtNkC3O1yEws4zuDzHe99 -sfDvXpA1ikfN+Hgn3oLjCHHtWuTyXGKXUimzToDMqWentVkP1rzKPlin9XJ0KDT/ -axrrD9L5s4KCjHdWEQwG3miJDxQnlsAFDBj7Bs8DZZE+xdzx/l8qBKOxmXD9ohFp -4q0wXVV4QJMHtjhvhId9EN965drlYmMfusMCwavklBOWdR1MdSSBIYPS5eISmj0A -EQEAAYkBHwQYAQIACQUCUbX5tAIbDAAKCRD1Z1YFx04Cz4CzCACpN1l39Yzoniqx -laabcOrEbFjhKXlFXPm5TC+nj2iO8BieJLoltTcQL1nbxBHcxMkxUUJAVKBSmlh3 -BPjYJhXBNRvW/gamjaO+LoStXI+0vO4aOhkR0tLqA9/zQFM9uVPu6InS0N98oMaL -azyxnXuqEanCN7yWfKHKxmkKiVMB1RMaE+2TYQBKPfFukiX2vv3qByVez8qYGa98 -80x6fkrqFbPoJ2oDXEGGD0W7fkv1pZV/1XCuXV/qKz3htD3AQDuLijqt6sM9Oe7Y -Lsv5lqTb5DK6g2N9xvhTz64Z+j9bf44fbMReg3ub3GXlf9rFT8eDYfyYLJgWJ/1h -YZximth9 -=QnRI ------END PGP PUBLIC KEY BLOCK----- ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -=j9MJ ------END PGP PUBLIC KEY BLOCK----- ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -oS4= -=yOFv +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 +Gzm69GQcSVlMy4/+RMNYhS8+TqEu +=3EwO -----END PGP PUBLIC KEY BLOCK----- diff -Nru breeze-5.25.5/.git-blame-ignore-revs breeze-5.24.7/.git-blame-ignore-revs --- breeze-5.25.5/.git-blame-ignore-revs 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/.git-blame-ignore-revs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -# clang-format -32149dc002ae574ed41f111bf52712b1765b906b diff -Nru breeze-5.25.5/.gitlab-ci.yml breeze-5.24.7/.gitlab-ci.yml --- breeze-5.25.5/.gitlab-ci.yml 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/.gitlab-ci.yml 2022-10-14 09:57:05.000000000 +0000 @@ -4,5 +4,4 @@ include: - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux.yml - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd.yml - - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux-qt6.yml - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/windows.yml diff -Nru breeze-5.25.5/.kde-ci.yml breeze-5.24.7/.kde-ci.yml --- breeze-5.25.5/.kde-ci.yml 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/.kde-ci.yml 2022-10-14 09:57:05.000000000 +0000 @@ -5,6 +5,7 @@ - 'on': ['@all'] 'require': 'frameworks/extra-cmake-modules': '@latest' + 'frameworks/kauth': '@latest' 'frameworks/kcmutils': '@latest' 'frameworks/kcodecs': '@latest' 'frameworks/kconfig': '@latest' @@ -13,7 +14,6 @@ 'frameworks/kguiaddons': '@latest' 'frameworks/ki18n': '@latest' 'frameworks/kiconthemes': '@latest' - 'frameworks/kirigami': '@latest' 'frameworks/kservice': '@latest' 'frameworks/kstyle': '@latest' 'frameworks/kwidgetsaddons': '@latest' diff -Nru breeze-5.25.5/kdecoration/breezebutton.cpp breeze-5.24.7/kdecoration/breezebutton.cpp --- breeze-5.25.5/kdecoration/breezebutton.cpp 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/kdecoration/breezebutton.cpp 2022-10-14 09:57:05.000000000 +0000 @@ -6,391 +6,480 @@ */ #include "breezebutton.h" -#include #include +#include #include #include -#include #include +#include namespace Breeze { -using KDecoration2::ColorGroup; -using KDecoration2::ColorRole; -using KDecoration2::DecorationButtonType; - -//__________________________________________________________________ -Button::Button(DecorationButtonType type, Decoration *decoration, QObject *parent) - : DecorationButton(type, decoration, parent) - , m_animation(new QVariantAnimation(this)) -{ - // setup animation - // It is important start and end value are of the same type, hence 0.0 and not just 0 - m_animation->setStartValue(0.0); - m_animation->setEndValue(1.0); - m_animation->setEasingCurve(QEasingCurve::InOutQuad); - connect(m_animation, &QVariantAnimation::valueChanged, this, [this](const QVariant &value) { - setOpacity(value.toReal()); - }); - - // setup default geometry - const int height = decoration->buttonHeight(); - setGeometry(QRect(0, 0, height, height)); - setIconSize(QSize(height, height)); - - // connections - connect(decoration->client().toStrongRef().data(), SIGNAL(iconChanged(QIcon)), this, SLOT(update())); - connect(decoration->settings().data(), &KDecoration2::DecorationSettings::reconfigured, this, &Button::reconfigure); - connect(this, &KDecoration2::DecorationButton::hoveredChanged, this, &Button::updateAnimationState); - - reconfigure(); -} - -//__________________________________________________________________ -Button::Button(QObject *parent, const QVariantList &args) - : Button(args.at(0).value(), args.at(1).value(), parent) -{ - m_flag = FlagStandalone; - //! icon size must return to !valid because it was altered from the default constructor, - //! in Standalone mode the button is not using the decoration metrics but its geometry - m_iconSize = QSize(-1, -1); -} -//__________________________________________________________________ -Button *Button::create(DecorationButtonType type, KDecoration2::Decoration *decoration, QObject *parent) -{ - if (auto d = qobject_cast(decoration)) { - Button *b = new Button(type, d, parent); - const auto c = d->client().toStrongRef(); - switch (type) { - case DecorationButtonType::Close: - b->setVisible(c->isCloseable()); - QObject::connect(c.data(), &KDecoration2::DecoratedClient::closeableChanged, b, &Breeze::Button::setVisible); - break; - - case DecorationButtonType::Maximize: - b->setVisible(c->isMaximizeable()); - QObject::connect(c.data(), &KDecoration2::DecoratedClient::maximizeableChanged, b, &Breeze::Button::setVisible); - break; - - case DecorationButtonType::Minimize: - b->setVisible(c->isMinimizeable()); - QObject::connect(c.data(), &KDecoration2::DecoratedClient::minimizeableChanged, b, &Breeze::Button::setVisible); - break; - - case DecorationButtonType::ContextHelp: - b->setVisible(c->providesContextHelp()); - QObject::connect(c.data(), &KDecoration2::DecoratedClient::providesContextHelpChanged, b, &Breeze::Button::setVisible); - break; - - case DecorationButtonType::Shade: - b->setVisible(c->isShadeable()); - QObject::connect(c.data(), &KDecoration2::DecoratedClient::shadeableChanged, b, &Breeze::Button::setVisible); - break; - - case DecorationButtonType::Menu: - QObject::connect(c.data(), &KDecoration2::DecoratedClient::iconChanged, b, [b]() { - b->update(); - }); - break; + using KDecoration2::ColorRole; + using KDecoration2::ColorGroup; + using KDecoration2::DecorationButtonType; + + + //__________________________________________________________________ + Button::Button(DecorationButtonType type, Decoration* decoration, QObject* parent) + : DecorationButton(type, decoration, parent) + , m_animation( new QVariantAnimation( this ) ) + { + + // setup animation + // It is important start and end value are of the same type, hence 0.0 and not just 0 + m_animation->setStartValue( 0.0 ); + m_animation->setEndValue( 1.0 ); + m_animation->setEasingCurve( QEasingCurve::InOutQuad ); + connect(m_animation, &QVariantAnimation::valueChanged, this, [this](const QVariant &value) { + setOpacity(value.toReal()); + }); + + // setup default geometry + const int height = decoration->buttonHeight(); + setGeometry(QRect(0, 0, height, height)); + setIconSize(QSize( height, height )); + + // connections + connect(decoration->client().toStrongRef().data(), SIGNAL(iconChanged(QIcon)), this, SLOT(update())); + connect(decoration->settings().data(), &KDecoration2::DecorationSettings::reconfigured, this, &Button::reconfigure); + connect( this, &KDecoration2::DecorationButton::hoveredChanged, this, &Button::updateAnimationState ); - default: - break; - } + reconfigure(); - return b; } - return nullptr; -} + //__________________________________________________________________ + Button::Button(QObject *parent, const QVariantList &args) + : Button(args.at(0).value(), args.at(1).value(), parent) + { + m_flag = FlagStandalone; + //! icon size must return to !valid because it was altered from the default constructor, + //! in Standalone mode the button is not using the decoration metrics but its geometry + m_iconSize = QSize(-1, -1); + } + + //__________________________________________________________________ + Button *Button::create(DecorationButtonType type, KDecoration2::Decoration *decoration, QObject *parent) + { + if (auto d = qobject_cast(decoration)) + { + Button *b = new Button(type, d, parent); + const auto c = d->client().toStrongRef(); + switch( type ) + { + + case DecorationButtonType::Close: + b->setVisible( c->isCloseable() ); + QObject::connect(c.data(), &KDecoration2::DecoratedClient::closeableChanged, b, &Breeze::Button::setVisible ); + break; + + case DecorationButtonType::Maximize: + b->setVisible( c->isMaximizeable() ); + QObject::connect(c.data(), &KDecoration2::DecoratedClient::maximizeableChanged, b, &Breeze::Button::setVisible ); + break; + + case DecorationButtonType::Minimize: + b->setVisible( c->isMinimizeable() ); + QObject::connect(c.data(), &KDecoration2::DecoratedClient::minimizeableChanged, b, &Breeze::Button::setVisible ); + break; + + case DecorationButtonType::ContextHelp: + b->setVisible( c->providesContextHelp() ); + QObject::connect(c.data(), &KDecoration2::DecoratedClient::providesContextHelpChanged, b, &Breeze::Button::setVisible ); + break; + + case DecorationButtonType::Shade: + b->setVisible( c->isShadeable() ); + QObject::connect(c.data(), &KDecoration2::DecoratedClient::shadeableChanged, b, &Breeze::Button::setVisible ); + break; + + case DecorationButtonType::Menu: + QObject::connect(c.data(), &KDecoration2::DecoratedClient::iconChanged, b, [b]() { b->update(); }); + break; -//__________________________________________________________________ -void Button::paint(QPainter *painter, const QRect &repaintRegion) -{ - Q_UNUSED(repaintRegion) + default: break; - if (!decoration()) - return; + } - painter->save(); + return b; + } - // translate from offset - if (m_flag == FlagFirstInList) - painter->translate(m_offset); - else - painter->translate(0, m_offset.y()); - - if (!m_iconSize.isValid() || isStandAlone()) - m_iconSize = geometry().size().toSize(); - - // menu button - if (type() == DecorationButtonType::Menu) { - const QRectF iconRect(geometry().topLeft(), m_iconSize); - const auto c = decoration()->client().toStrongRef(); - if (auto deco = qobject_cast(decoration())) { - const QPalette activePalette = KIconLoader::global()->customPalette(); - QPalette palette = c->palette(); - palette.setColor(QPalette::WindowText, deco->fontColor()); - KIconLoader::global()->setCustomPalette(palette); - c->icon().paint(painter, iconRect.toRect()); - if (activePalette == QPalette()) { - KIconLoader::global()->resetPalette(); - } else { + return nullptr; + + } + + //__________________________________________________________________ + void Button::paint(QPainter *painter, const QRect &repaintRegion) + { + Q_UNUSED(repaintRegion) + + if (!decoration()) return; + + painter->save(); + + // translate from offset + if( m_flag == FlagFirstInList ) painter->translate( m_offset ); + else painter->translate( 0, m_offset.y() ); + + if( !m_iconSize.isValid() || isStandAlone() ) m_iconSize = geometry().size().toSize(); + + // menu button + if (type() == DecorationButtonType::Menu) + { + + const QRectF iconRect( geometry().topLeft(), m_iconSize ); + const auto c = decoration()->client().toStrongRef(); + if (auto deco = qobject_cast(decoration())) { + const QPalette activePalette = KIconLoader::global()->customPalette(); + QPalette palette = c->palette(); + palette.setColor(QPalette::WindowText, deco->fontColor()); KIconLoader::global()->setCustomPalette(palette); + c->icon().paint(painter, iconRect.toRect()); + if (activePalette == QPalette()) { + KIconLoader::global()->resetPalette(); + } else { + KIconLoader::global()->setCustomPalette(palette); + } + } else { + c->icon().paint(painter, iconRect.toRect()); } + } else { - c->icon().paint(painter, iconRect.toRect()); + + drawIcon( painter ); + } - } else { - drawIcon(painter); + painter->restore(); + } - painter->restore(); -} + //__________________________________________________________________ + void Button::drawIcon( QPainter *painter ) const + { + + painter->setRenderHints( QPainter::Antialiasing ); + + /* + scale painter so that its window matches QRect( -1, -1, 20, 20 ) + this makes all further rendering and scaling simpler + all further rendering is preformed inside QRect( 0, 0, 18, 18 ) + */ + painter->translate( geometry().topLeft() ); + + const qreal width( m_iconSize.width() ); + painter->scale( width/20, width/20 ); + painter->translate( 1, 1 ); + + // render background + const QColor backgroundColor( this->backgroundColor() ); + if( backgroundColor.isValid() ) + { + painter->setPen( Qt::NoPen ); + painter->setBrush( backgroundColor ); + painter->drawEllipse( QRectF( 0, 0, 18, 18 ) ); + } + + // render mark + const QColor foregroundColor( this->foregroundColor() ); + if( foregroundColor.isValid() ) + { + + // setup painter + QPen pen( foregroundColor ); + pen.setCapStyle( Qt::RoundCap ); + pen.setJoinStyle( Qt::MiterJoin ); + pen.setWidthF( PenWidth::Symbol*qMax((qreal)1.0, 20/width ) ); + + painter->setPen( pen ); + painter->setBrush( Qt::NoBrush ); + + switch( type() ) + { + + case DecorationButtonType::Close: + { + painter->drawLine( QPointF( 5, 5 ), QPointF( 13, 13 ) ); + painter->drawLine( 13, 5, 5, 13 ); + break; + } -//__________________________________________________________________ -void Button::drawIcon(QPainter *painter) const -{ - painter->setRenderHints(QPainter::Antialiasing); + case DecorationButtonType::Maximize: + { + if( isChecked() ) + { + pen.setJoinStyle( Qt::RoundJoin ); + painter->setPen( pen ); + + painter->drawPolygon( QVector{ + QPointF( 4, 9 ), + QPointF( 9, 4 ), + QPointF( 14, 9 ), + QPointF( 9, 14 )} ); + + } else { + painter->drawPolyline( QVector{ + QPointF( 4, 11 ), + QPointF( 9, 6 ), + QPointF( 14, 11 )}); + } + break; + } - /* - scale painter so that its window matches QRect( -1, -1, 20, 20 ) - this makes all further rendering and scaling simpler - all further rendering is preformed inside QRect( 0, 0, 18, 18 ) - */ - painter->translate(geometry().topLeft()); - - const qreal width(m_iconSize.width()); - painter->scale(width / 20, width / 20); - painter->translate(1, 1); - - // render background - const QColor backgroundColor(this->backgroundColor()); - if (backgroundColor.isValid()) { - painter->setPen(Qt::NoPen); - painter->setBrush(backgroundColor); - painter->drawEllipse(QRectF(0, 0, 18, 18)); - } + case DecorationButtonType::Minimize: + { + painter->drawPolyline( QVector{ + QPointF( 4, 7 ), + QPointF( 9, 12 ), + QPointF( 14, 7 ) }); + break; + } - // render mark - const QColor foregroundColor(this->foregroundColor()); - if (foregroundColor.isValid()) { - // setup painter - QPen pen(foregroundColor); - pen.setCapStyle(Qt::RoundCap); - pen.setJoinStyle(Qt::MiterJoin); - pen.setWidthF(PenWidth::Symbol * qMax((qreal)1.0, 20 / width)); - - painter->setPen(pen); - painter->setBrush(Qt::NoBrush); - - switch (type()) { - case DecorationButtonType::Close: { - painter->drawLine(QPointF(5, 5), QPointF(13, 13)); - painter->drawLine(13, 5, 5, 13); - break; - } + case DecorationButtonType::OnAllDesktops: + { + painter->setPen( Qt::NoPen ); + painter->setBrush( foregroundColor ); + + if( isChecked()) + { + + // outer ring + painter->drawEllipse( QRectF( 3, 3, 12, 12 ) ); + + // center dot + QColor backgroundColor( this->backgroundColor() ); + auto d = qobject_cast( decoration() ); + if( !backgroundColor.isValid() && d ) backgroundColor = d->titleBarColor(); + + if( backgroundColor.isValid() ) + { + painter->setBrush( backgroundColor ); + painter->drawEllipse( QRectF( 8, 8, 2, 2 ) ); + } + + } else { + + painter->drawPolygon( QVector { + QPointF( 6.5, 8.5 ), + QPointF( 12, 3 ), + QPointF( 15, 6 ), + QPointF( 9.5, 11.5 )} ); + + painter->setPen( pen ); + painter->drawLine( QPointF( 5.5, 7.5 ), QPointF( 10.5, 12.5 ) ); + painter->drawLine( QPointF( 12, 6 ), QPointF( 4.5, 13.5 ) ); + } + break; + } - case DecorationButtonType::Maximize: { - if (isChecked()) { - pen.setJoinStyle(Qt::RoundJoin); - painter->setPen(pen); + case DecorationButtonType::Shade: + { - painter->drawPolygon(QVector{QPointF(4, 9), QPointF(9, 4), QPointF(14, 9), QPointF(9, 14)}); + if (isChecked()) + { - } else { - painter->drawPolyline(QVector{QPointF(4, 11), QPointF(9, 6), QPointF(14, 11)}); - } - break; - } + painter->drawLine( QPointF( 4, 5.5 ), QPointF( 14, 5.5 ) ); + painter->drawPolyline( QVector { + QPointF( 4, 8 ), + QPointF( 9, 13 ), + QPointF( 14, 8 )} ); + + } else { + + painter->drawLine( QPointF( 4, 5.5 ), QPointF( 14, 5.5 ) ); + painter->drawPolyline( QVector { + QPointF( 4, 13 ), + QPointF( 9, 8 ), + QPointF( 14, 13 ) }); + } - case DecorationButtonType::Minimize: { - painter->drawPolyline(QVector{QPointF(4, 7), QPointF(9, 12), QPointF(14, 7)}); - break; - } + break; - case DecorationButtonType::OnAllDesktops: { - painter->setPen(Qt::NoPen); - painter->setBrush(foregroundColor); - - if (isChecked()) { - // outer ring - painter->drawEllipse(QRectF(3, 3, 12, 12)); - - // center dot - QColor backgroundColor(this->backgroundColor()); - auto d = qobject_cast(decoration()); - if (!backgroundColor.isValid() && d) - backgroundColor = d->titleBarColor(); - - if (backgroundColor.isValid()) { - painter->setBrush(backgroundColor); - painter->drawEllipse(QRectF(8, 8, 2, 2)); } - } else { - painter->drawPolygon(QVector{QPointF(6.5, 8.5), QPointF(12, 3), QPointF(15, 6), QPointF(9.5, 11.5)}); + case DecorationButtonType::KeepBelow: + { - painter->setPen(pen); - painter->drawLine(QPointF(5.5, 7.5), QPointF(10.5, 12.5)); - painter->drawLine(QPointF(12, 6), QPointF(4.5, 13.5)); - } - break; - } + painter->drawPolyline( QVector { + QPointF( 4, 5 ), + QPointF( 9, 10 ), + QPointF( 14, 5 ) }); + + painter->drawPolyline( QVector { + QPointF( 4, 9 ), + QPointF( 9, 14 ), + QPointF( 14, 9 ) }); + break; + + } - case DecorationButtonType::Shade: { - if (isChecked()) { - painter->drawLine(QPointF(4, 5.5), QPointF(14, 5.5)); - painter->drawPolyline(QVector{QPointF(4, 8), QPointF(9, 13), QPointF(14, 8)}); + case DecorationButtonType::KeepAbove: + { + painter->drawPolyline( QVector { + QPointF( 4, 9 ), + QPointF( 9, 4 ), + QPointF( 14, 9 ) }); + + painter->drawPolyline( QVector { + QPointF( 4, 13 ), + QPointF( 9, 8 ), + QPointF( 14, 13 ) }); + break; + } + + + case DecorationButtonType::ApplicationMenu: + { + painter->drawRect( QRectF( 3.5, 4.5, 11, 1 ) ); + painter->drawRect( QRectF( 3.5, 8.5, 11, 1 ) ); + painter->drawRect( QRectF( 3.5, 12.5, 11, 1 ) ); + break; + } + + case DecorationButtonType::ContextHelp: + { + QPainterPath path; + path.moveTo( 5, 6 ); + path.arcTo( QRectF( 5, 3.5, 8, 5 ), 180, -180 ); + path.cubicTo( QPointF(12.5, 9.5), QPointF( 9, 7.5 ), QPointF( 9, 11.5 ) ); + painter->drawPath( path ); + + painter->drawRect( QRectF( 9, 15, 0.5, 0.5 ) ); + + break; + } + + default: break; - } else { - painter->drawLine(QPointF(4, 5.5), QPointF(14, 5.5)); - painter->drawPolyline(QVector{QPointF(4, 13), QPointF(9, 8), QPointF(14, 13)}); } - break; } - case DecorationButtonType::KeepBelow: { - painter->drawPolyline(QVector{QPointF(4, 5), QPointF(9, 10), QPointF(14, 5)}); + } - painter->drawPolyline(QVector{QPointF(4, 9), QPointF(9, 14), QPointF(14, 9)}); - break; - } + //__________________________________________________________________ + QColor Button::foregroundColor() const + { + auto d = qobject_cast( decoration() ); + if( !d ) { - case DecorationButtonType::KeepAbove: { - painter->drawPolyline(QVector{QPointF(4, 9), QPointF(9, 4), QPointF(14, 9)}); + return QColor(); - painter->drawPolyline(QVector{QPointF(4, 13), QPointF(9, 8), QPointF(14, 13)}); - break; - } + } else if( isPressed() ) { - case DecorationButtonType::ApplicationMenu: { - painter->drawRect(QRectF(3.5, 4.5, 11, 1)); - painter->drawRect(QRectF(3.5, 8.5, 11, 1)); - painter->drawRect(QRectF(3.5, 12.5, 11, 1)); - break; - } + return d->titleBarColor(); - case DecorationButtonType::ContextHelp: { - QPainterPath path; - path.moveTo(5, 6); - path.arcTo(QRectF(5, 3.5, 8, 5), 180, -180); - path.cubicTo(QPointF(12.5, 9.5), QPointF(9, 7.5), QPointF(9, 11.5)); - painter->drawPath(path); + } else if( type() == DecorationButtonType::Close && d->internalSettings()->outlineCloseButton() ) { - painter->drawRect(QRectF(9, 15, 0.5, 0.5)); + return d->titleBarColor(); - break; - } + } else if( ( type() == DecorationButtonType::KeepBelow || type() == DecorationButtonType::KeepAbove || type() == DecorationButtonType::Shade ) && isChecked() ) { + + return d->titleBarColor(); + + } else if( m_animation->state() == QAbstractAnimation::Running ) { + + return KColorUtils::mix( d->fontColor(), d->titleBarColor(), m_opacity ); + + } else if( isHovered() ) { + + return d->titleBarColor(); + + } else { + + return d->fontColor(); - default: - break; } + } -} -//__________________________________________________________________ -QColor Button::foregroundColor() const -{ - auto d = qobject_cast(decoration()); - if (!d) { - return QColor(); + //__________________________________________________________________ + QColor Button::backgroundColor() const + { + auto d = qobject_cast( decoration() ); + if( !d ) { - } else if (isPressed()) { - return d->titleBarColor(); + return QColor(); - } else if (type() == DecorationButtonType::Close && d->internalSettings()->outlineCloseButton()) { - return d->titleBarColor(); + } - } else if ((type() == DecorationButtonType::KeepBelow || type() == DecorationButtonType::KeepAbove || type() == DecorationButtonType::Shade) - && isChecked()) { - return d->titleBarColor(); + auto c = d->client().toStrongRef(); + QColor redColor( c->color( ColorGroup::Warning, ColorRole::Foreground ) ); - } else if (m_animation->state() == QAbstractAnimation::Running) { - return KColorUtils::mix(d->fontColor(), d->titleBarColor(), m_opacity); + if( isPressed() ) { - } else if (isHovered()) { - return d->titleBarColor(); + if( type() == DecorationButtonType::Close ) return redColor.darker(); + else return KColorUtils::mix( d->titleBarColor(), d->fontColor(), 0.3 ); - } else { - return d->fontColor(); - } -} + } else if( ( type() == DecorationButtonType::KeepBelow || type() == DecorationButtonType::KeepAbove || type() == DecorationButtonType::Shade ) && isChecked() ) { -//__________________________________________________________________ -QColor Button::backgroundColor() const -{ - auto d = qobject_cast(decoration()); - if (!d) { - return QColor(); - } + return d->fontColor(); + + } else if( m_animation->state() == QAbstractAnimation::Running ) { - auto c = d->client().toStrongRef(); - QColor redColor(c->color(ColorGroup::Warning, ColorRole::Foreground)); + if( type() == DecorationButtonType::Close ) + { + if( d->internalSettings()->outlineCloseButton() ) + { - if (isPressed()) { - if (type() == DecorationButtonType::Close) - return redColor.darker(); - else - return KColorUtils::mix(d->titleBarColor(), d->fontColor(), 0.3); - - } else if ((type() == DecorationButtonType::KeepBelow || type() == DecorationButtonType::KeepAbove || type() == DecorationButtonType::Shade) - && isChecked()) { - return d->fontColor(); - - } else if (m_animation->state() == QAbstractAnimation::Running) { - if (type() == DecorationButtonType::Close) { - if (d->internalSettings()->outlineCloseButton()) { - return c->isActive() ? KColorUtils::mix(redColor, redColor.lighter(), m_opacity) : KColorUtils::mix(redColor.lighter(), redColor, m_opacity); + return c->isActive() ? KColorUtils::mix( redColor, redColor.lighter(), m_opacity ) : KColorUtils::mix( redColor.lighter(), redColor, m_opacity ); + + } else { + + QColor color( redColor.lighter() ); + color.setAlpha( color.alpha()*m_opacity ); + return color; + + } } else { - QColor color(redColor.lighter()); - color.setAlpha(color.alpha() * m_opacity); + + QColor color( d->fontColor() ); + color.setAlpha( color.alpha()*m_opacity ); return color; + } + } else if( isHovered() ) { + + if( type() == DecorationButtonType::Close ) return c->isActive() ? redColor.lighter() : redColor; + else return d->fontColor(); + + } else if( type() == DecorationButtonType::Close && d->internalSettings()->outlineCloseButton() ) { + + return c->isActive() ? redColor : d->fontColor(); + } else { - QColor color(d->fontColor()); - color.setAlpha(color.alpha() * m_opacity); - return color; + + return QColor(); + } - } else if (isHovered()) { - if (type() == DecorationButtonType::Close) - return c->isActive() ? redColor.lighter() : redColor; - else - return d->fontColor(); + } - } else if (type() == DecorationButtonType::Close && d->internalSettings()->outlineCloseButton()) { - return c->isActive() ? redColor : d->fontColor(); + //________________________________________________________________ + void Button::reconfigure() + { + + // animation + auto d = qobject_cast(decoration()); + if( d ) m_animation->setDuration( d->animationsDuration() ); - } else { - return QColor(); } -} -//________________________________________________________________ -void Button::reconfigure() -{ - // animation - auto d = qobject_cast(decoration()); - if (d) - m_animation->setDuration(d->animationsDuration()); -} + //__________________________________________________________________ + void Button::updateAnimationState( bool hovered ) + { -//__________________________________________________________________ -void Button::updateAnimationState(bool hovered) -{ - auto d = qobject_cast(decoration()); - if (!(d && d->animationsDuration() > 0)) - return; - - m_animation->setDirection(hovered ? QAbstractAnimation::Forward : QAbstractAnimation::Backward); - if (m_animation->state() != QAbstractAnimation::Running) - m_animation->start(); -} + auto d = qobject_cast(decoration()); + if( !(d && d->animationsDuration() > 0 ) ) return; + + m_animation->setDirection( hovered ? QAbstractAnimation::Forward : QAbstractAnimation::Backward ); + if( m_animation->state() != QAbstractAnimation::Running ) m_animation->start(); + + } } // namespace diff -Nru breeze-5.25.5/kdecoration/breezebutton.h breeze-5.24.7/kdecoration/breezebutton.h --- breeze-5.25.5/kdecoration/breezebutton.h 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/kdecoration/breezebutton.h 2022-10-14 09:57:05.000000000 +0000 @@ -2,13 +2,13 @@ #define BREEZE_BUTTONS_H /* - * SPDX-FileCopyrightText: 2014 Martin Gräßlin - * SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa - * - * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL - */ -#include "breezedecoration.h" +* SPDX-FileCopyrightText: 2014 Martin Gräßlin +* SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa +* +* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL +*/ #include +#include "breezedecoration.h" #include #include @@ -17,119 +17,107 @@ namespace Breeze { -class Button : public KDecoration2::DecorationButton -{ - Q_OBJECT -public: - //* constructor - explicit Button(QObject *parent, const QVariantList &args); - - //* destructor - virtual ~Button() = default; - - //* button creation - static Button *create(KDecoration2::DecorationButtonType type, KDecoration2::Decoration *decoration, QObject *parent); - - //* render - virtual void paint(QPainter *painter, const QRect &repaintRegion) override; - - //* flag - enum Flag { - FlagNone, - FlagStandalone, - FlagFirstInList, - FlagLastInList, - }; - - //* flag - void setFlag(Flag value) + class Button : public KDecoration2::DecorationButton { - m_flag = value; - } + Q_OBJECT - //* standalone buttons - bool isStandAlone() const - { - return m_flag == FlagStandalone; - } + public: - //* offset - void setOffset(const QPointF &value) - { - m_offset = value; - } + //* constructor + explicit Button(QObject *parent, const QVariantList &args); - //* horizontal offset, for rendering - void setHorizontalOffset(qreal value) - { - m_offset.setX(value); - } + //* destructor + virtual ~Button() = default; - //* vertical offset, for rendering - void setVerticalOffset(qreal value) - { - m_offset.setY(value); - } + //* button creation + static Button *create(KDecoration2::DecorationButtonType type, KDecoration2::Decoration *decoration, QObject *parent); - //* set icon size - void setIconSize(const QSize &value) - { - m_iconSize = value; - } + //* render + virtual void paint(QPainter *painter, const QRect &repaintRegion) override; - //*@name active state change animation - //@{ - void setOpacity(qreal value) - { - if (m_opacity == value) - return; - m_opacity = value; - update(); - } + //* flag + enum Flag + { + FlagNone, + FlagStandalone, + FlagFirstInList, + FlagLastInList, + }; - qreal opacity() const - { - return m_opacity; - } + //* flag + void setFlag( Flag value ) + { m_flag = value; } + + //* standalone buttons + bool isStandAlone() const { return m_flag == FlagStandalone; } + + //* offset + void setOffset( const QPointF& value ) + { m_offset = value; } + + //* horizontal offset, for rendering + void setHorizontalOffset( qreal value ) + { m_offset.setX( value ); } + + //* vertical offset, for rendering + void setVerticalOffset( qreal value ) + { m_offset.setY( value ); } - //@} + //* set icon size + void setIconSize( const QSize& value ) + { m_iconSize = value; } -private Q_SLOTS: + //*@name active state change animation + //@{ + void setOpacity( qreal value ) + { + if( m_opacity == value ) return; + m_opacity = value; + update(); + } - //* apply configuration changes - void reconfigure(); + qreal opacity() const + { return m_opacity; } - //* animation state - void updateAnimationState(bool); + //@} -private: - //* private constructor - explicit Button(KDecoration2::DecorationButtonType type, Decoration *decoration, QObject *parent = nullptr); + private Q_SLOTS: - //* draw button icon - void drawIcon(QPainter *) const; + //* apply configuration changes + void reconfigure(); - //*@name colors - //@{ - QColor foregroundColor() const; - QColor backgroundColor() const; - //@} + //* animation state + void updateAnimationState(bool); - Flag m_flag = FlagNone; + private: - //* active state change animation - QVariantAnimation *m_animation; + //* private constructor + explicit Button(KDecoration2::DecorationButtonType type, Decoration *decoration, QObject *parent = nullptr); - //* vertical offset (for rendering) - QPointF m_offset; + //* draw button icon + void drawIcon( QPainter *) const; - //* icon size - QSize m_iconSize; + //*@name colors + //@{ + QColor foregroundColor() const; + QColor backgroundColor() const; + //@} - //* active state change opacity - qreal m_opacity = 0; -}; + Flag m_flag = FlagNone; + + //* active state change animation + QVariantAnimation *m_animation; + + //* vertical offset (for rendering) + QPointF m_offset; + + //* icon size + QSize m_iconSize; + + //* active state change opacity + qreal m_opacity = 0; + }; } // namespace diff -Nru breeze-5.25.5/kdecoration/breezedecoration.cpp breeze-5.24.7/kdecoration/breezedecoration.cpp --- breeze-5.25.5/kdecoration/breezedecoration.cpp 2022-09-06 11:58:32.000000000 +0000 +++ breeze-5.24.7/kdecoration/breezedecoration.cpp 2022-10-14 09:57:05.000000000 +0000 @@ -1,11 +1,11 @@ /* - * SPDX-FileCopyrightText: 2014 Martin Gräßlin - * SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa - * SPDX-FileCopyrightText: 2018 Vlad Zahorodnii - * SPDX-FileCopyrightText: 2021 Paul McAuley - * - * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL - */ +* SPDX-FileCopyrightText: 2014 Martin Gräßlin +* SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa +* SPDX-FileCopyrightText: 2018 Vlad Zahorodnii +* SPDX-FileCopyrightText: 2021 Paul McAuley +* +* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL +*/ #include "breezedecoration.h" @@ -21,852 +21,863 @@ #include #include -#include #include -#include +#include #include +#include -#include -#include -#include -#include #include #include #include +#include #if BREEZE_HAVE_X11 -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) -#include -#else #include #endif -#endif #include -K_PLUGIN_FACTORY_WITH_JSON(BreezeDecoFactory, "breeze.json", registerPlugin(); registerPlugin(); - registerPlugin();) +K_PLUGIN_FACTORY_WITH_JSON( + BreezeDecoFactory, + "breeze.json", + registerPlugin(); + registerPlugin(); + registerPlugin(); +) namespace { -struct ShadowParams { - ShadowParams() - : offset(QPoint(0, 0)) - , radius(0) - , opacity(0) + struct ShadowParams { + ShadowParams() + : offset(QPoint(0, 0)) + , radius(0) + , opacity(0) {} + + ShadowParams(const QPoint &offset, int radius, qreal opacity) + : offset(offset) + , radius(radius) + , opacity(opacity) {} + + QPoint offset; + int radius; + qreal opacity; + }; + + struct CompositeShadowParams { + CompositeShadowParams() = default; + + CompositeShadowParams( + const QPoint &offset, + const ShadowParams &shadow1, + const ShadowParams &shadow2) + : offset(offset) + , shadow1(shadow1) + , shadow2(shadow2) {} + + bool isNone() const { + return qMax(shadow1.radius, shadow2.radius) == 0; + } + + QPoint offset; + ShadowParams shadow1; + ShadowParams shadow2; + }; + + const CompositeShadowParams s_shadowParams[] = { + // None + CompositeShadowParams(), + // Small + CompositeShadowParams( + QPoint(0, 4), + ShadowParams(QPoint(0, 0), 16, 1), + ShadowParams(QPoint(0, -2), 8, 0.4)), + // Medium + CompositeShadowParams( + QPoint(0, 8), + ShadowParams(QPoint(0, 0), 32, 0.9), + ShadowParams(QPoint(0, -4), 16, 0.3)), + // Large + CompositeShadowParams( + QPoint(0, 12), + ShadowParams(QPoint(0, 0), 48, 0.8), + ShadowParams(QPoint(0, -6), 24, 0.2)), + // Very large + CompositeShadowParams( + QPoint(0, 16), + ShadowParams(QPoint(0, 0), 64, 0.7), + ShadowParams(QPoint(0, -8), 32, 0.1)), + }; + + inline CompositeShadowParams lookupShadowParams(int size) { + switch (size) { + case Breeze::InternalSettings::ShadowNone: + return s_shadowParams[0]; + case Breeze::InternalSettings::ShadowSmall: + return s_shadowParams[1]; + case Breeze::InternalSettings::ShadowMedium: + return s_shadowParams[2]; + case Breeze::InternalSettings::ShadowLarge: + return s_shadowParams[3]; + case Breeze::InternalSettings::ShadowVeryLarge: + return s_shadowParams[4]; + default: + // Fallback to the Large size. + return s_shadowParams[3]; + } } +} - ShadowParams(const QPoint &offset, int radius, qreal opacity) - : offset(offset) - , radius(radius) - , opacity(opacity) +namespace Breeze +{ + + using KDecoration2::ColorRole; + using KDecoration2::ColorGroup; + + //________________________________________________________________ + static int g_sDecoCount = 0; + static int g_shadowSizeEnum = InternalSettings::ShadowLarge; + static int g_shadowStrength = 255; + static QColor g_shadowColor = Qt::black; + static QSharedPointer g_sShadow; + static QSharedPointer g_sShadowInactive; + + //________________________________________________________________ + Decoration::Decoration(QObject *parent, const QVariantList &args) + : KDecoration2::Decoration(parent, args) + , m_animation( new QVariantAnimation( this ) ) + , m_shadowAnimation( new QVariantAnimation( this ) ) { + g_sDecoCount++; } - QPoint offset; - int radius; - qreal opacity; -}; + //________________________________________________________________ + Decoration::~Decoration() + { + g_sDecoCount--; + if (g_sDecoCount == 0) { + // last deco destroyed, clean up shadow + g_sShadow.clear(); + } -struct CompositeShadowParams { - CompositeShadowParams() = default; + deleteSizeGrip(); + + } - CompositeShadowParams(const QPoint &offset, const ShadowParams &shadow1, const ShadowParams &shadow2) - : offset(offset) - , shadow1(shadow1) - , shadow2(shadow2) + //________________________________________________________________ + void Decoration::setOpacity( qreal value ) { + if( m_opacity == value ) return; + m_opacity = value; + update(); + + if( m_sizeGrip ) m_sizeGrip->update(); } - bool isNone() const + //________________________________________________________________ + QColor Decoration::titleBarColor() const { - return qMax(shadow1.radius, shadow2.radius) == 0; + + const auto c = client().toStrongRef(); + if( hideTitleBar() ) return c->color( ColorGroup::Inactive, ColorRole::TitleBar ); + else if( m_animation->state() == QAbstractAnimation::Running ) + { + return KColorUtils::mix( + c->color( ColorGroup::Inactive, ColorRole::TitleBar ), + c->color( ColorGroup::Active, ColorRole::TitleBar ), + m_opacity ); + } else return c->color( c->isActive() ? ColorGroup::Active : ColorGroup::Inactive, ColorRole::TitleBar ); + } - QPoint offset; - ShadowParams shadow1; - ShadowParams shadow2; -}; + //________________________________________________________________ + QColor Decoration::fontColor() const + { -const CompositeShadowParams s_shadowParams[] = { - // None - CompositeShadowParams(), - // Small - CompositeShadowParams(QPoint(0, 4), ShadowParams(QPoint(0, 0), 16, 1), ShadowParams(QPoint(0, -2), 8, 0.4)), - // Medium - CompositeShadowParams(QPoint(0, 8), ShadowParams(QPoint(0, 0), 32, 0.9), ShadowParams(QPoint(0, -4), 16, 0.3)), - // Large - CompositeShadowParams(QPoint(0, 12), ShadowParams(QPoint(0, 0), 48, 0.8), ShadowParams(QPoint(0, -6), 24, 0.2)), - // Very large - CompositeShadowParams(QPoint(0, 16), ShadowParams(QPoint(0, 0), 64, 0.7), ShadowParams(QPoint(0, -8), 32, 0.1)), -}; + const auto c = client().toStrongRef(); + if( m_animation->state() == QAbstractAnimation::Running ) + { + return KColorUtils::mix( + c->color( ColorGroup::Inactive, ColorRole::Foreground ), + c->color( ColorGroup::Active, ColorRole::Foreground ), + m_opacity ); + } else return c->color( c->isActive() ? ColorGroup::Active : ColorGroup::Inactive, ColorRole::Foreground ); -inline CompositeShadowParams lookupShadowParams(int size) -{ - switch (size) { - case Breeze::InternalSettings::ShadowNone: - return s_shadowParams[0]; - case Breeze::InternalSettings::ShadowSmall: - return s_shadowParams[1]; - case Breeze::InternalSettings::ShadowMedium: - return s_shadowParams[2]; - case Breeze::InternalSettings::ShadowLarge: - return s_shadowParams[3]; - case Breeze::InternalSettings::ShadowVeryLarge: - return s_shadowParams[4]; - default: - // Fallback to the Large size. - return s_shadowParams[3]; } -} -} -namespace Breeze -{ -using KDecoration2::ColorGroup; -using KDecoration2::ColorRole; + //________________________________________________________________ + void Decoration::init() + { + const auto c = client().toStrongRef(); + + // active state change animation + // It is important start and end value are of the same type, hence 0.0 and not just 0 + m_animation->setStartValue( 0.0 ); + m_animation->setEndValue( 1.0 ); + // Linear to have the same easing as Breeze animations + m_animation->setEasingCurve( QEasingCurve::Linear ); + connect(m_animation, &QVariantAnimation::valueChanged, this, [this](const QVariant &value) { + setOpacity(value.toReal()); + }); + + m_shadowAnimation->setStartValue( 0.0 ); + m_shadowAnimation->setEndValue( 1.0 ); + m_shadowAnimation->setEasingCurve( QEasingCurve::OutCubic ); + connect(m_shadowAnimation, &QVariantAnimation::valueChanged, this, [this](const QVariant& value) { + m_shadowOpacity = value.toReal(); + updateShadow(); + }); + + // use DBus connection to update on breeze configuration change + auto dbus = QDBusConnection::sessionBus(); + dbus.connect( QString(), + QStringLiteral( "/KGlobalSettings" ), + QStringLiteral( "org.kde.KGlobalSettings" ), + QStringLiteral( "notifyChange" ), this, SLOT(reconfigure()) ); + + reconfigure(); + updateTitleBar(); + auto s = settings(); + connect(s.data(), &KDecoration2::DecorationSettings::borderSizeChanged, this, &Decoration::recalculateBorders); + + // a change in font might cause the borders to change + connect(s.data(), &KDecoration2::DecorationSettings::fontChanged, this, &Decoration::recalculateBorders); + connect(s.data(), &KDecoration2::DecorationSettings::spacingChanged, this, &Decoration::recalculateBorders); + + // buttons + connect(s.data(), &KDecoration2::DecorationSettings::spacingChanged, this, &Decoration::updateButtonsGeometryDelayed); + connect(s.data(), &KDecoration2::DecorationSettings::decorationButtonsLeftChanged, this, &Decoration::updateButtonsGeometryDelayed); + connect(s.data(), &KDecoration2::DecorationSettings::decorationButtonsRightChanged, this, &Decoration::updateButtonsGeometryDelayed); + + // full reconfiguration + connect(s.data(), &KDecoration2::DecorationSettings::reconfigured, this, &Decoration::reconfigure); + connect(s.data(), &KDecoration2::DecorationSettings::reconfigured, SettingsProvider::self(), &SettingsProvider::reconfigure, Qt::UniqueConnection ); + connect(s.data(), &KDecoration2::DecorationSettings::reconfigured, this, &Decoration::updateButtonsGeometryDelayed); + + connect(c.data(), &KDecoration2::DecoratedClient::adjacentScreenEdgesChanged, this, &Decoration::recalculateBorders); + connect(c.data(), &KDecoration2::DecoratedClient::maximizedHorizontallyChanged, this, &Decoration::recalculateBorders); + connect(c.data(), &KDecoration2::DecoratedClient::maximizedVerticallyChanged, this, &Decoration::recalculateBorders); + connect(c.data(), &KDecoration2::DecoratedClient::shadedChanged, this, &Decoration::recalculateBorders); + connect(c.data(), &KDecoration2::DecoratedClient::captionChanged, this, + [this]() + { + // update the caption area + update(titleBar()); + } + ); + + connect(c.data(), &KDecoration2::DecoratedClient::activeChanged, this, &Decoration::updateAnimationState); + connect(c.data(), &KDecoration2::DecoratedClient::widthChanged, this, &Decoration::updateTitleBar); + connect(c.data(), &KDecoration2::DecoratedClient::maximizedChanged, this, &Decoration::updateTitleBar); + connect(c.data(), &KDecoration2::DecoratedClient::maximizedChanged, this, &Decoration::setOpaque); + + connect(c.data(), &KDecoration2::DecoratedClient::widthChanged, this, &Decoration::updateButtonsGeometry); + connect(c.data(), &KDecoration2::DecoratedClient::maximizedChanged, this, &Decoration::updateButtonsGeometry); + connect(c.data(), &KDecoration2::DecoratedClient::adjacentScreenEdgesChanged, this, &Decoration::updateButtonsGeometry); + connect(c.data(), &KDecoration2::DecoratedClient::shadedChanged, this, &Decoration::updateButtonsGeometry); -//________________________________________________________________ -static int g_sDecoCount = 0; -static int g_shadowSizeEnum = InternalSettings::ShadowLarge; -static int g_shadowStrength = 255; -static QColor g_shadowColor = Qt::black; -static QSharedPointer g_sShadow; -static QSharedPointer g_sShadowInactive; - -//________________________________________________________________ -Decoration::Decoration(QObject *parent, const QVariantList &args) - : KDecoration2::Decoration(parent, args) - , m_animation(new QVariantAnimation(this)) - , m_shadowAnimation(new QVariantAnimation(this)) -{ - g_sDecoCount++; -} + createButtons(); + updateShadow(); + } -//________________________________________________________________ -Decoration::~Decoration() -{ - g_sDecoCount--; - if (g_sDecoCount == 0) { - // last deco destroyed, clean up shadow - g_sShadow.clear(); + //________________________________________________________________ + void Decoration::updateTitleBar() + { + auto s = settings(); + const auto c = client().toStrongRef(); + const bool maximized = isMaximized(); + const int width = maximized ? c->width() : c->width() - 2*s->largeSpacing()*Metrics::TitleBar_SideMargin; + const int height = maximized ? borderTop() : borderTop() - s->smallSpacing()*Metrics::TitleBar_TopMargin; + const int x = maximized ? 0 : s->largeSpacing()*Metrics::TitleBar_SideMargin; + const int y = maximized ? 0 : s->smallSpacing()*Metrics::TitleBar_TopMargin; + setTitleBar(QRect(x, y, width, height)); } - deleteSizeGrip(); -} + //________________________________________________________________ + void Decoration::updateAnimationState() + { + if( m_shadowAnimation->duration() > 0 ) + { -//________________________________________________________________ -void Decoration::setOpacity(qreal value) -{ - if (m_opacity == value) - return; - m_opacity = value; - update(); + const auto c = client().toStrongRef(); + m_shadowAnimation->setDirection( c->isActive() ? QAbstractAnimation::Forward : QAbstractAnimation::Backward ); + m_shadowAnimation->setEasingCurve( c->isActive() ? QEasingCurve::OutCubic : QEasingCurve::InCubic ); + if( m_shadowAnimation->state() != QAbstractAnimation::Running ) m_shadowAnimation->start(); - if (m_sizeGrip) - m_sizeGrip->update(); -} + } else { -//________________________________________________________________ -QColor Decoration::titleBarColor() const -{ - const auto c = client().toStrongRef(); - if (hideTitleBar()) - return c->color(ColorGroup::Inactive, ColorRole::TitleBar); - else if (m_animation->state() == QAbstractAnimation::Running) { - return KColorUtils::mix(c->color(ColorGroup::Inactive, ColorRole::TitleBar), c->color(ColorGroup::Active, ColorRole::TitleBar), m_opacity); - } else - return c->color(c->isActive() ? ColorGroup::Active : ColorGroup::Inactive, ColorRole::TitleBar); -} + updateShadow(); -//________________________________________________________________ -QColor Decoration::fontColor() const -{ - const auto c = client().toStrongRef(); - if (m_animation->state() == QAbstractAnimation::Running) { - return KColorUtils::mix(c->color(ColorGroup::Inactive, ColorRole::Foreground), c->color(ColorGroup::Active, ColorRole::Foreground), m_opacity); - } else - return c->color(c->isActive() ? ColorGroup::Active : ColorGroup::Inactive, ColorRole::Foreground); -} + } -//________________________________________________________________ -void Decoration::init() -{ - const auto c = client().toStrongRef(); + if( m_animation->duration() > 0 ) + { - // active state change animation - // It is important start and end value are of the same type, hence 0.0 and not just 0 - m_animation->setStartValue(0.0); - m_animation->setEndValue(1.0); - // Linear to have the same easing as Breeze animations - m_animation->setEasingCurve(QEasingCurve::Linear); - connect(m_animation, &QVariantAnimation::valueChanged, this, [this](const QVariant &value) { - setOpacity(value.toReal()); - }); - - m_shadowAnimation->setStartValue(0.0); - m_shadowAnimation->setEndValue(1.0); - m_shadowAnimation->setEasingCurve(QEasingCurve::OutCubic); - connect(m_shadowAnimation, &QVariantAnimation::valueChanged, this, [this](const QVariant &value) { - m_shadowOpacity = value.toReal(); - updateShadow(); - }); + const auto c = client().toStrongRef(); + m_animation->setDirection( c->isActive() ? QAbstractAnimation::Forward : QAbstractAnimation::Backward ); + if( m_animation->state() != QAbstractAnimation::Running ) m_animation->start(); - // use DBus connection to update on breeze configuration change - auto dbus = QDBusConnection::sessionBus(); - dbus.connect(QString(), - QStringLiteral("/KGlobalSettings"), - QStringLiteral("org.kde.KGlobalSettings"), - QStringLiteral("notifyChange"), - this, - SLOT(reconfigure())); - - dbus.connect(QStringLiteral("org.kde.KWin"), - QStringLiteral("/org/kde/KWin"), - QStringLiteral("org.kde.KWin.TabletModeManager"), - QStringLiteral("tabletModeChanged"), - QStringLiteral("b"), - this, - SLOT(onTabletModeChanged(bool))); - - auto message = QDBusMessage::createMethodCall(QStringLiteral("org.kde.KWin"), - QStringLiteral("/org/kde/KWin"), - QStringLiteral("org.freedesktop.DBus.Properties"), - QStringLiteral("Get")); - message.setArguments({QStringLiteral("org.kde.KWin.TabletModeManager"), QStringLiteral("tabletMode")}); - auto call = new QDBusPendingCallWatcher(dbus.asyncCall(message), this); - connect(call, &QDBusPendingCallWatcher::finished, this, [this, call]() { - QDBusPendingReply reply = *call; - if (!reply.isError()) { - onTabletModeChanged(reply.value().toBool()); - } - - call->deleteLater(); - }); - - reconfigure(); - updateTitleBar(); - auto s = settings(); - connect(s.data(), &KDecoration2::DecorationSettings::borderSizeChanged, this, &Decoration::recalculateBorders); - - // a change in font might cause the borders to change - connect(s.data(), &KDecoration2::DecorationSettings::fontChanged, this, &Decoration::recalculateBorders); - connect(s.data(), &KDecoration2::DecorationSettings::spacingChanged, this, &Decoration::recalculateBorders); - - // buttons - connect(s.data(), &KDecoration2::DecorationSettings::spacingChanged, this, &Decoration::updateButtonsGeometryDelayed); - connect(s.data(), &KDecoration2::DecorationSettings::decorationButtonsLeftChanged, this, &Decoration::updateButtonsGeometryDelayed); - connect(s.data(), &KDecoration2::DecorationSettings::decorationButtonsRightChanged, this, &Decoration::updateButtonsGeometryDelayed); - - // full reconfiguration - connect(s.data(), &KDecoration2::DecorationSettings::reconfigured, this, &Decoration::reconfigure); - connect(s.data(), &KDecoration2::DecorationSettings::reconfigured, SettingsProvider::self(), &SettingsProvider::reconfigure, Qt::UniqueConnection); - connect(s.data(), &KDecoration2::DecorationSettings::reconfigured, this, &Decoration::updateButtonsGeometryDelayed); - - connect(c.data(), &KDecoration2::DecoratedClient::adjacentScreenEdgesChanged, this, &Decoration::recalculateBorders); - connect(c.data(), &KDecoration2::DecoratedClient::maximizedHorizontallyChanged, this, &Decoration::recalculateBorders); - connect(c.data(), &KDecoration2::DecoratedClient::maximizedVerticallyChanged, this, &Decoration::recalculateBorders); - connect(c.data(), &KDecoration2::DecoratedClient::shadedChanged, this, &Decoration::recalculateBorders); - connect(c.data(), &KDecoration2::DecoratedClient::captionChanged, this, [this]() { - // update the caption area - update(titleBar()); - }); - - connect(c.data(), &KDecoration2::DecoratedClient::activeChanged, this, &Decoration::updateAnimationState); - connect(c.data(), &KDecoration2::DecoratedClient::widthChanged, this, &Decoration::updateTitleBar); - connect(c.data(), &KDecoration2::DecoratedClient::maximizedChanged, this, &Decoration::updateTitleBar); - connect(c.data(), &KDecoration2::DecoratedClient::maximizedChanged, this, &Decoration::setOpaque); - - connect(c.data(), &KDecoration2::DecoratedClient::widthChanged, this, &Decoration::updateButtonsGeometry); - connect(c.data(), &KDecoration2::DecoratedClient::maximizedChanged, this, &Decoration::updateButtonsGeometry); - connect(c.data(), &KDecoration2::DecoratedClient::adjacentScreenEdgesChanged, this, &Decoration::updateButtonsGeometry); - connect(c.data(), &KDecoration2::DecoratedClient::shadedChanged, this, &Decoration::updateButtonsGeometry); + } else { - createButtons(); - updateShadow(); -} + update(); -//________________________________________________________________ -void Decoration::updateTitleBar() -{ - // The titlebar rect has margins around it so the window can be resized by dragging a decoration edge. - auto s = settings(); - const auto c = client().toStrongRef(); - const bool maximized = isMaximized(); - const int width = maximized ? c->width() : c->width() - 2 * s->smallSpacing() * Metrics::TitleBar_SideMargin; - const int height = maximized ? borderTop() : borderTop() - s->smallSpacing() * Metrics::TitleBar_TopMargin; - const int x = maximized ? 0 : s->smallSpacing() * Metrics::TitleBar_SideMargin; - const int y = maximized ? 0 : s->smallSpacing() * Metrics::TitleBar_TopMargin; - setTitleBar(QRect(x, y, width, height)); -} + } + } -//________________________________________________________________ -void Decoration::updateAnimationState() -{ - if (m_shadowAnimation->duration() > 0) { + //________________________________________________________________ + void Decoration::updateSizeGripVisibility() + { const auto c = client().toStrongRef(); - m_shadowAnimation->setDirection(c->isActive() ? QAbstractAnimation::Forward : QAbstractAnimation::Backward); - m_shadowAnimation->setEasingCurve(c->isActive() ? QEasingCurve::OutCubic : QEasingCurve::InCubic); - if (m_shadowAnimation->state() != QAbstractAnimation::Running) - m_shadowAnimation->start(); + if( m_sizeGrip ) + { m_sizeGrip->setVisible( c->isResizeable() && !isMaximized() && !c->isShaded() ); } + } + + //________________________________________________________________ + int Decoration::borderSize(bool bottom) const + { + const int baseSize = settings()->smallSpacing(); + if( m_internalSettings && (m_internalSettings->mask() & BorderSize ) ) + { + switch (m_internalSettings->borderSize()) { + case InternalSettings::BorderNone: return 0; + case InternalSettings::BorderNoSides: return bottom ? qMax(4, baseSize) : 0; + default: + case InternalSettings::BorderTiny: return bottom ? qMax(4, baseSize) : baseSize; + case InternalSettings::BorderNormal: return baseSize*2; + case InternalSettings::BorderLarge: return baseSize*3; + case InternalSettings::BorderVeryLarge: return baseSize*4; + case InternalSettings::BorderHuge: return baseSize*5; + case InternalSettings::BorderVeryHuge: return baseSize*6; + case InternalSettings::BorderOversized: return baseSize*10; + } + + } else { + + switch (settings()->borderSize()) { + case KDecoration2::BorderSize::None: return 0; + case KDecoration2::BorderSize::NoSides: return bottom ? qMax(4, baseSize) : 0; + default: + case KDecoration2::BorderSize::Tiny: return bottom ? qMax(4, baseSize) : baseSize; + case KDecoration2::BorderSize::Normal: return baseSize*2; + case KDecoration2::BorderSize::Large: return baseSize*3; + case KDecoration2::BorderSize::VeryLarge: return baseSize*4; + case KDecoration2::BorderSize::Huge: return baseSize*5; + case KDecoration2::BorderSize::VeryHuge: return baseSize*6; + case KDecoration2::BorderSize::Oversized: return baseSize*10; + + } + + } + } + + //________________________________________________________________ + void Decoration::reconfigure() + { + + m_internalSettings = SettingsProvider::self()->internalSettings( this ); + + setScaledCornerRadius(); + + // animation + + KSharedConfig::Ptr config = KSharedConfig::openConfig(); + const KConfigGroup cg(config, QStringLiteral("KDE")); + + m_animation->setDuration(0); + // Syncing anis between client and decoration is troublesome, so we're not using + // any animations right now. + // m_animation->setDuration( cg.readEntry("AnimationDurationFactor", 1.0f) * 100.0f ); + + // But the shadow is fine to animate like this! + m_shadowAnimation->setDuration( cg.readEntry("AnimationDurationFactor", 1.0f) * 100.0f ); + + // borders + recalculateBorders(); - } else { + // shadow updateShadow(); + + // size grip + if( hasNoBorders() && m_internalSettings->drawSizeGrip() ) createSizeGrip(); + else deleteSizeGrip(); + } - if (m_animation->duration() > 0) { + //________________________________________________________________ + void Decoration::recalculateBorders() + { const auto c = client().toStrongRef(); - m_animation->setDirection(c->isActive() ? QAbstractAnimation::Forward : QAbstractAnimation::Backward); - if (m_animation->state() != QAbstractAnimation::Running) - m_animation->start(); + auto s = settings(); - } else { - update(); - } -} + // left, right and bottom borders + const int left = isLeftEdge() ? 0 : borderSize(); + const int right = isRightEdge() ? 0 : borderSize(); + const int bottom = (c->isShaded() || isBottomEdge()) ? 0 : borderSize(true); + + int top = 0; + if( hideTitleBar() ) top = bottom; + else { + + QFontMetrics fm(s->font()); + top += qMax(fm.height(), buttonHeight() ); + + // padding below + // extra pixel is used for the active window outline + const int baseSize = s->smallSpacing(); + top += baseSize*Metrics::TitleBar_BottomMargin + 1; -//________________________________________________________________ -void Decoration::updateSizeGripVisibility() -{ - const auto c = client().toStrongRef(); - if (m_sizeGrip) { - m_sizeGrip->setVisible(c->isResizeable() && !isMaximized() && !c->isShaded()); - } -} + // padding above + top += baseSize*Metrics::TitleBar_TopMargin; + + } + + setBorders(QMargins(left, top, right, bottom)); + + // extended sizes + const int extSize = s->largeSpacing(); + int extSides = 0; + int extBottom = 0; + if( hasNoBorders() ) + { + if( !isMaximizedHorizontally() ) extSides = extSize; + if( !isMaximizedVertically() ) extBottom = extSize; + + } else if( hasNoSideBorders() && !isMaximizedHorizontally() ) { + + extSides = extSize; -//________________________________________________________________ -int Decoration::borderSize(bool bottom) const -{ - const int baseSize = settings()->smallSpacing(); - if (m_internalSettings && (m_internalSettings->mask() & BorderSize)) { - switch (m_internalSettings->borderSize()) { - case InternalSettings::BorderNone: - return 0; - case InternalSettings::BorderNoSides: - return bottom ? qMax(4, baseSize) : 0; - default: - case InternalSettings::BorderTiny: - return bottom ? qMax(4, baseSize) : baseSize; - case InternalSettings::BorderNormal: - return baseSize * 2; - case InternalSettings::BorderLarge: - return baseSize * 3; - case InternalSettings::BorderVeryLarge: - return baseSize * 4; - case InternalSettings::BorderHuge: - return baseSize * 5; - case InternalSettings::BorderVeryHuge: - return baseSize * 6; - case InternalSettings::BorderOversized: - return baseSize * 10; - } - - } else { - switch (settings()->borderSize()) { - case KDecoration2::BorderSize::None: - return 0; - case KDecoration2::BorderSize::NoSides: - return bottom ? qMax(4, baseSize) : 0; - default: - case KDecoration2::BorderSize::Tiny: - return bottom ? qMax(4, baseSize) : baseSize; - case KDecoration2::BorderSize::Normal: - return baseSize * 2; - case KDecoration2::BorderSize::Large: - return baseSize * 3; - case KDecoration2::BorderSize::VeryLarge: - return baseSize * 4; - case KDecoration2::BorderSize::Huge: - return baseSize * 5; - case KDecoration2::BorderSize::VeryHuge: - return baseSize * 6; - case KDecoration2::BorderSize::Oversized: - return baseSize * 10; } + + setResizeOnlyBorders(QMargins(extSides, 0, extSides, extBottom)); } -} -//________________________________________________________________ -void Decoration::reconfigure() -{ - m_internalSettings = SettingsProvider::self()->internalSettings(this); + //________________________________________________________________ + void Decoration::createButtons() + { + m_leftButtons = new KDecoration2::DecorationButtonGroup(KDecoration2::DecorationButtonGroup::Position::Left, this, &Button::create); + m_rightButtons = new KDecoration2::DecorationButtonGroup(KDecoration2::DecorationButtonGroup::Position::Right, this, &Button::create); + updateButtonsGeometry(); + } - setScaledCornerRadius(); + //________________________________________________________________ + void Decoration::updateButtonsGeometryDelayed() + { QTimer::singleShot( 0, this, &Decoration::updateButtonsGeometry ); } - // animation + //________________________________________________________________ + void Decoration::updateButtonsGeometry() + { + const auto s = settings(); - KSharedConfig::Ptr config = KSharedConfig::openConfig(); - const KConfigGroup cg(config, QStringLiteral("KDE")); + // adjust button position + const int bHeight = captionHeight() + (isTopEdge() ? s->smallSpacing()*Metrics::TitleBar_TopMargin:0); + const int bWidth = buttonHeight(); + const int verticalOffset = (isTopEdge() ? s->smallSpacing()*Metrics::TitleBar_TopMargin:0) + (captionHeight()-buttonHeight())/2; + foreach( const QPointer& button, m_leftButtons->buttons() + m_rightButtons->buttons() ) + { + button.data()->setGeometry( QRectF( QPoint( 0, 0 ), QSizeF( bWidth, bHeight ) ) ); + static_cast( button.data() )->setOffset( QPointF( 0, verticalOffset ) ); + static_cast( button.data() )->setIconSize( QSize( bWidth, bWidth ) ); + } - m_animation->setDuration(0); - // Syncing anis between client and decoration is troublesome, so we're not using - // any animations right now. - // m_animation->setDuration( cg.readEntry("AnimationDurationFactor", 1.0f) * 100.0f ); + // left buttons + if( !m_leftButtons->buttons().isEmpty() ) + { + + // spacing + m_leftButtons->setSpacing(s->smallSpacing()*Metrics::TitleBar_ButtonSpacing); + + // padding + const int vPadding = isTopEdge() ? 0 : s->smallSpacing()*Metrics::TitleBar_TopMargin; + const int hPadding = s->smallSpacing()*Metrics::TitleBar_SideMargin; + if( isLeftEdge() ) + { + // add offsets on the side buttons, to preserve padding, but satisfy Fitts law + auto button = static_cast( m_leftButtons->buttons().front().data() ); + button->setGeometry( QRectF( QPoint( 0, 0 ), QSizeF( bWidth + hPadding, bHeight ) ) ); + button->setFlag( Button::FlagFirstInList ); + button->setHorizontalOffset( hPadding ); - // But the shadow is fine to animate like this! - m_shadowAnimation->setDuration(cg.readEntry("AnimationDurationFactor", 1.0f) * 100.0f); + m_leftButtons->setPos(QPointF(0, vPadding)); - // borders - recalculateBorders(); + } else m_leftButtons->setPos(QPointF(hPadding + borderLeft(), vPadding)); - // shadow - updateShadow(); + } - // size grip - if (hasNoBorders() && m_internalSettings->drawSizeGrip()) - createSizeGrip(); - else - deleteSizeGrip(); -} + // right buttons + if( !m_rightButtons->buttons().isEmpty() ) + { + + // spacing + m_rightButtons->setSpacing(s->smallSpacing()*Metrics::TitleBar_ButtonSpacing); + + // padding + const int vPadding = isTopEdge() ? 0 : s->smallSpacing()*Metrics::TitleBar_TopMargin; + const int hPadding = s->smallSpacing()*Metrics::TitleBar_SideMargin; + if( isRightEdge() ) + { + + auto button = static_cast( m_rightButtons->buttons().back().data() ); + button->setGeometry( QRectF( QPoint( 0, 0 ), QSizeF( bWidth + hPadding, bHeight ) ) ); + button->setFlag( Button::FlagLastInList ); -//________________________________________________________________ -void Decoration::recalculateBorders() -{ - const auto c = client().toStrongRef(); - auto s = settings(); + m_rightButtons->setPos(QPointF(size().width() - m_rightButtons->geometry().width(), vPadding)); - // left, right and bottom borders - const int left = isLeftEdge() ? 0 : borderSize(); - const int right = isRightEdge() ? 0 : borderSize(); - const int bottom = (c->isShaded() || isBottomEdge()) ? 0 : borderSize(true); - - int top = 0; - if (hideTitleBar()) - top = bottom; - else { - QFontMetrics fm(s->font()); - top += qMax(fm.height(), buttonHeight()); - - // padding below - // extra pixel is used for the active window outline - const int baseSize = s->smallSpacing(); - top += baseSize * Metrics::TitleBar_BottomMargin + 1; - - // padding above - top += baseSize * Metrics::TitleBar_TopMargin; - } - - setBorders(QMargins(left, top, right, bottom)); - - // extended sizes - const int extSize = s->largeSpacing(); - int extSides = 0; - int extBottom = 0; - if (hasNoBorders()) { - if (!isMaximizedHorizontally()) - extSides = extSize; - if (!isMaximizedVertically()) - extBottom = extSize; + } else m_rightButtons->setPos(QPointF(size().width() - m_rightButtons->geometry().width() - hPadding - borderRight(), vPadding)); + + } + + update(); - } else if (hasNoSideBorders() && !isMaximizedHorizontally()) { - extSides = extSize; } - setResizeOnlyBorders(QMargins(extSides, 0, extSides, extBottom)); -} + //________________________________________________________________ + void Decoration::paint(QPainter *painter, const QRect &repaintRegion) + { + // TODO: optimize based on repaintRegion + auto c = client().toStrongRef(); + auto s = settings(); -//________________________________________________________________ -void Decoration::createButtons() -{ - m_leftButtons = new KDecoration2::DecorationButtonGroup(KDecoration2::DecorationButtonGroup::Position::Left, this, &Button::create); - m_rightButtons = new KDecoration2::DecorationButtonGroup(KDecoration2::DecorationButtonGroup::Position::Right, this, &Button::create); - updateButtonsGeometry(); -} + // paint background + if( !c->isShaded() ) + { + painter->fillRect(rect(), Qt::transparent); + painter->save(); + painter->setRenderHint(QPainter::Antialiasing); + painter->setPen(Qt::NoPen); + painter->setBrush( c->color( c->isActive() ? ColorGroup::Active : ColorGroup::Inactive, ColorRole::Frame ) ); -//________________________________________________________________ -void Decoration::updateButtonsGeometryDelayed() -{ - QTimer::singleShot(0, this, &Decoration::updateButtonsGeometry); -} + // clip away the top part + if( !hideTitleBar() ) painter->setClipRect(0, borderTop(), size().width(), size().height() - borderTop(), Qt::IntersectClip); -//________________________________________________________________ -void Decoration::updateButtonsGeometry() -{ - const auto s = settings(); + if( s->isAlphaChannelSupported() ) painter->drawRoundedRect(rect(), m_scaledCornerRadius, m_scaledCornerRadius); + else painter->drawRect( rect() ); - // adjust button position - const int bHeight = captionHeight() + (isTopEdge() ? s->smallSpacing() * Metrics::TitleBar_TopMargin : 0); - const int bWidth = buttonHeight(); - const int verticalOffset = (isTopEdge() ? s->smallSpacing() * Metrics::TitleBar_TopMargin : 0) + (captionHeight() - buttonHeight()) / 2; - foreach (const QPointer &button, m_leftButtons->buttons() + m_rightButtons->buttons()) { - button.data()->setGeometry(QRectF(QPoint(0, 0), QSizeF(bWidth, bHeight))); - static_cast